mnn量子化

3101 ワード

参照先:https://zhuanlan.zhihu.com/p/73207495
https://blog.csdn.net/qq_37643960/article/details/97182962
今日MNNは新しいツールパッケージであるCNNネットワーク量子化ツール(quantization)を更新し,著者らも最初にテストを行った.量子化前のCNNネットワークサイズは約5.7 Mであり,rk 3399(android-8.1)のinference速度は約45 msであった.MNNが提供するquantizationツールを用いて量子化した後,モデルサイズは1.5 Mに減少し,rk 3399におけるinference速度は29 msであった.
使用の流れは非常に友好的で、まずMNNが提供する量子化ツールを使用してCNNのモデルパラメータファイルを量子化符号化し、符号化後のモデルはMNNが提供するinference-apiから直接呼び出すことができ、入力と入力はfloat 32を行うinferenceと同様に、インタフェースと呼び出し方式は何の変更も必要なく、現在のターゲットプラットフォームは主にCPU上のint 8に対して加速している.したがって,遅延に要求される小さなモデルが多く,GPUや他の補助計算のコプロセッサがプラットフォームに適切に存在しない場合,量子化モデルと量子化int 8推定を用いてネットワークの性能効率をさらに向上させることが考えられる.
具体的な量子化のアルゴリズムと過程は,後続の文章で皆さんと議論する.次に、実際の操作に入ります.まず、最近のバージョンのMNNコードに同期します.すでにcloneを通過している場合は、次のコマンドを実行して同期すればいいです.
git pull

MNNのホームディレクトリに入る、コンパイルを行う前に、CMakeListを開くことを確認する必要がある.txtの次のオプションは、次のとおりです.
MNN_USE_INT8_FASTはこのパラメータなしでもコンパイルできます
option(MNN_BUILD_QUANTOOLS "Build Quantized Tools or not" ON)
option(MNN_USE_INT8_FAST "Enable Int8 Fast Optimization" ON)

次に、プロジェクトに必要なschemaファイルを生成し、フォルダをコンパイルします.
以前にbuildディレクトリがある場合は、buildディレクトリを空にするか、バックアップ後に空にする必要があります.
./schema/generate.sh
mkdir build && cd build && cmake .. && make -j4

ビルドディレクトリにquantizedが表示されますoutファイル、これがコンパイルされた量子化ツールです.使用は簡単で、MNNでも使用例が示されており、コマンドラインで実行されます.
./quantized.out face_det_300.mnn face_det_300_quant.mnn face_det.json 

ここでjsonファイルは量子化されたいくつかの事前定義パラメータであり、私のプロファイルを参照することができます.MNNの量子化ツールは,所与の平均分散の白化動作を行う際にO=(image−mean)*normalの方式を用い,我々がよく見られるstdで割るのと同じである.また、pathディレクトリは1つ指定する必要があります.そうしないと、プログラムが実行中にクラッシュする可能性があります(もちろん、量子化されたソースコードを変更することもできます).より良好な量子化精度を得るためには、与えられたpathのフォルダ内のデータのdomainは、トレーニングモデルのデータdomainと一致する必要がある.あるいはいっそ訓練データをいくつか選択してこのディレクトリの下に置いて、理論上のデータが多ければ多いほど効果的で、量子化の速度は遅くなります.筆者は実験中にカタログの下に100枚の画像データを置いた.
{
    "format":"RGB",
    "mean":[
        123.0,
        123.0,
        123.0
    ],
    "normal":[
        0.017,
        0.017,
        0.017
    ],
    "width":224,
    "height":224,
    "path":"../resource/images"
}

量子化されたモデルファイルface_が得られたdet_300_quant.mnn以降は,直接推定に用いることができる.PCでテストしたい場合は、コンパイルされたbenchmarkを使用します.outファイルでいいからface_det_300_quant.mnnとface_det_300.mnnは一緒にテストフォルダのパスの下に入れて、次のコマンドを実行すればいいです.
./benchmark.out models_folder [loop_count] [forwardtype]

ここでmodels_folderはface_det_300_quant.mnnが存在するディレクトリ、loop_countはループの回数、forwardtypeは推定のタイプで、cpu、opencl、opengl、vulkanなどがあります.ここでforwardtypeは0を選択すればいいです.作成したテストスクリプトは以下の通りです.
./benchmark.out ./models 10 0

あとでface_が見えますdet_300_quant.mnnとface_det_300.mnnのテストは平均的に時間がかかりました.
また,本論文で開始した実験結果はandroid−8.1システムに基づくrk 3399プラットフォームであることに注意すべきである.PCでは必ずしも良い加速効果が得られるとは限らず,量子化されたモデルの正確性しか保証できない.
  • 最後の
  • AndroidプラットフォームでのMNNの導入方法に興味があれば、私が前に書いた2つの文章を参考にして導入し、MNNのtf-MobilenetSSD-cpp導入プロセスとMNNのtflite-MobilenetSSD-c++導入プロセスを詳しく理解することができます.また、コメントやコラムへの注目を歓迎します.ありがとうございます.