目的
Module-LLMのNPUでMobileNetv2のモデルを実行する手順を説明します。
Module-LLMのNPUでMobileNetv2のモデルを高速に実行するには、INT8形式に量子化してモデルサイズを縮小する必要があります。
Pulsar2というツールを使用してモデルを量子化します。手順は以下の通りです:
MobileNetv2モデルのONNX出力
Pythonパッケージ管理ツール(pip)のインストールで,Pytorchとonnxをインストールします。
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
pip install onnx onnx-simplifier
python mobilenetv2_export_onnx.py
import torch
model = torch.hub.load('pytorch/vision:v0.10.0', 'mobilenet_v2', pretrained=True)
model.eval() # モデルを評価モードに設定
# テスト用の入力データを作成(1枚の画像を想定)
x = torch.randn(1, 3, 224, 224) # バッチサイズ1、RGB3チャンネル、224x224ピクセル
# ONNXファイルにエクスポート
torch.onnx.export(model, # エクスポートするモデル
x, # モデルの入力として使用するダミーデータ
"mobilenetv2.onnx", # 出力ファイル名
export_params=True, # モデルパラメータをエクスポートする
verbose=True, # 詳細な出力を表示
opset_version=11) # ONNXのバージョン指定
必要に応じて、onnx-simplifierを使用してモデルを最適化します。
mobilenetv2の場合、すでに最適化されているため、この手順は必須ではありません。
# モデルの最適化
python -m onnxsim mobilenetv2.onnx mobilenetv2-sim.onnx
以上の手順により、PyTorchモデルをONNX形式に変換し、必要に応じて最適化することができました。
Pulsar2のインストール
こちらを参照して、Pulsar2をインストールします。
quick_start_exampleのダウンロード
モデルのコンパイルとシミュレーション実行に必要なオリジナルモデル、データ、画像、シミュレーションツールを、次のリンクからダウンロードできるファイルの中に、quick_start_exampleフォルダ内に用意しています。
サンプルファイルをダウンロードをクリックし、ダウンロードしたファイルを解凍してdockerの/dataパスにコピーします。
root@xxx:~/data# ls
config dataset model output pulsar2-run-helper
# model: オリジナルのONNXモデルを格納します(事前にonnxsimを使用して最適化済み)
# dataset: オフライン量子化キャリブレーション(PTQ Calibration)に必要なデータセットの圧縮ファイルを格納します(tar、tar.gz、gzなどの一般的な圧縮形式に対応)
# config: 実行に必要な設定ファイルconfig.jsonを格納します
# output: 結果出力を格納します
# pulsar2-run-helper: X86環境でのaxmodelのシミュレーション実行をサポートする
modelフォルダの下に、mobilenetv2-sim.onnxをコピーします。
MobileNetv2モデルのAXモデルへの変換
Pulsar2がインストールされている、Dockerを起動します。
$ sudo docker run -it --net host --rm -v $PWD:/data pulsar2:temp-58aa62e4
Pulsar2のbuildコマンドで、onnxモデルをModule-LLM(ax630c)のNPUに対応するaxモデルへ変換することができます。
# pulsar2 build --input model/mobilenetv2-sim.onnx --output_dir output --config config/mobilenet_v2_build_config.json.json --target_hardware AX620E
# cp output/compiled.axmodel model/mobilenetv2-sim.axmodel
mobilenet_v2_build_config.jsonは、pulsar2でモデル変換を行うための設定ファイルを記載しているものです。今回の設定は以下のようになっています。
{
"model_type": "ONNX",
"npu_mode": "NPU1",
"quant": {
"input_configs": [
{
"tensor_name": "input",
"calibration_dataset": "./dataset/imagenet-32-images.tar",
"calibration_size": 32,
"calibration_mean": [103.939, 116.779, 123.68],
"calibration_std": [58.0, 58.0, 58.0]
}
],
"calibration_method": "MinMax",
"precision_analysis": false
},
"input_processors": [
{
"tensor_name": "input",
"tensor_format": "BGR",
"src_format": "BGR",
"src_dtype": "U8",
"src_layout": "NHWC",
"csc_mode": "NoCSC"
}
],
"compiler": {
"check": 0
}
}
モデルが生成できていることを確認します。
$ ls model/*.axmodel
mobilenetv2-sim.axmodel
参考リンク
@nnn112358/M5_LLM_Module_Report
https://github.com/nnn112358/M5_LLM_Module_Report
pulsar2-docs
https://pulsar2-docs.readthedocs.io/en/latest/index.html
https://axera-pi-zero-docs-cn.readthedocs.io/zh-cn/latest/doc_guide_algorithm.html