Module-LLMのNPU用モデルへ変換する(MobilenetV2編)


## 目的
　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
```


```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をインストールします。

https://qiita.com/nnn112358/private/37a4dac27bca23ec7754#pulsar2%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

### quick_start_exampleのダウンロード

モデルのコンパイルとシミュレーション実行に必要なオリジナルモデル、データ、画像、シミュレーションツールを、次のリンクからダウンロードできるファイルの中に、quick_start_exampleフォルダ内に用意しています。
サンプルファイルをダウンロードをクリックし、ダウンロードしたファイルを解凍してdockerの/dataパスにコピーします。


 [quick_start_example.zip](https://github.com/xiguadong/assets/releases/download/v0.1/quick_start_example.zip)


```
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でモデル変換を行うための設定ファイルを記載しているものです。今回の設定は以下のようになっています。


```mobilenet_v2_build_config.json
{
  "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