Vitis AIでPytorchのcompileをしてみたメモ

本サイトはアフィリエイト広告を利用しています。
AI

Vitis AIのPytorchのモデル(.xmodel)をコンパイルしてみました。

練習を兼ねて、複数の物体検出(YOLOX、PointPillars)のモデルでテストしています。

FPGA(KV260)向けにコンパイルしたコマンド例含めて紹介します。

 

スポンサーリンク

Vitis AIでPytorchのcompileをしてみたメモ

FPGA(KV260)向けにVitis AIのPytorchのモデル(.xmodel)をコンパイルしました。

複数の物体検出(YOLOX、PointPillars)のモデルで練習した例を紹介します。

 

実行環境

Vitis AI 2.5の環境でコンパイルしました。PC環境は下記となります。

  • CPU…Core i5 6400
  • GPU…NVIDIA GeForce GTX 1650(メモリ4GB)
  • メモリ…16GB
  • SSD…500GB

 

Vitis AIのコンパイルに関してはCPUで実行されますのでGPUが無くても大丈夫です。

GPU用のdocker上でコンパイルしても、実際にはCPUで実施されていました。

 

物体検出のモデルをコンパイルします

今回の一番の目的は、3D物体検出のモデルをFPGA向けにコンパイルすることです。

下記記事にて学習したモデル(.pth)をFPGA向けのモデル(.xmodel)に量子化済です。

量子化のFast Finetuningをメモリ不足で諦めたメモ

量子化のFast Finetuningをメモリ不足で諦めたメモ
Vitis AIのFPGA向けの量子化で精度ロスを防ぐFast Finetuningという機能があります。 但しPCのメモリが有る程度必要でした。(今回だと28GB程度) 低スペックPCには難しく、普通の量子化をした旨を紹介します。

 

ただし、3D物体検出(PointPillars)のモデルは特殊な形です。

※量子化する際に2個のモデル(.xmodel)に分かれています。

そのため、一般的な物体検出(YOLOX)の1個のモデルでもテストしてみます。

 

DPUCZDX8G_ISA1_B4096

今回はKV260というFPGAの評価ボード向けにコンパイルします。

KV260で使えるAI向けのDPUが「DPUCZDX8G」という型番になります。

その中でも容量がB4096,B3136…と分かれています。

 

今回使用するのは「DPUCZDX8G_ISA1_B4096」です。

KV260で使える中では一番大きなDPUサイズです。

(Vitis AIがKV260向けに提供しているコンパイル済のモデルもB4096です)

 

「DPUCZDX8G_ISA1_B4096」を指定するモデルが下記となります。

コンパイル実行する際にarch.jsonのファイル名で使います。中身は型番が書いているだけです。

{"fingerprint":"0x101000016010407"}

 

Vitis AI 2.0以前のプラットフォームは注意

Vitis AI 2.0から2.5にかけて、コンパイルに使うモデル名が大きく変更されています。

コンパイルする際に実際にFPGAに使うモデル名(arch.json)を指定します。

従来の2.0以前までコンパイルできたモデル名で2.5だと出来ないケースがあります。

 

※今回は使いませんが、もし古いプラットフォーム向けにコンパイルしたい場合

古いVitis AIをpullするかチェックアウトするしかないと思います。

Vitis AI 2.5環境下では公式が下記を紹介していました。

 https://github.com/Xilinx/Vitis-AI/tree/2.5#previous-vitis-ai-version

 

実際に下記例で古いVitis AI CPU版(1.4)のdocker環境を実行できました。

./docker_run.sh xilinx/vitis-ai-cpu:1.4.1.978

 

YOLOX(物体検出)のモデルをコンパイル

YOLOXのVitis AI 2.5のライブラリに関しては下記のyamlにリンク先があります。

(B4096でコンパイル済のモデルのリンク先も記載されています)

 https://github.com/Xilinx/Vitis-AI/tree/2.5/model_zoo/model-list/pt_yolox_TT100K_640_640_73G_2.5

 

下記のようにライブラリ自体はダウロード・解凍して確認できます。

量子化前・後のモデル(重み)ファイルが用意されています。

wget https://www.xilinx.com/bin/public/openDownload?filename=tsd_yolox_pt-zcu102_zcu104_kv260-r2.5.0.tar.gz
tar -xzvf openDownload\?filename\=tsd_yolox_pt-zcu102_zcu104_kv260-r2.5.0.tar.gz 
cd pt_yolox_TT100K_640_640_73G_2.5/
ls

 

またVitis AIのPytorch用のConda環境下でコンパイルは実行します。

コンパイルする量子化後モデル(.xmodel)は「/quantized」のフォルダ内に入っています。

Vitis-AI /workspace/pt_yolox_TT100K_640_640_73G_2.5 > conda activate vitis-ai-pytorch
(vitis-ai-pytorch) Vitis-AI /workspace/pt_yolox_TT100K_640_640_73G_2.5 >

 

出力するファイル名・フォルダ名を「tsd_yolox_pt」としています

※フォルダ内にモデルを指定するarch.jsonを置いて実行しています

vai_c_xir -x quantized/YOLOX_0_int.xmodel -a arch.json -n tsd_yolox_pt -o ./tsd_yolox_pt

(vitis-ai-pytorch) Vitis-AI /workspace/pt_yolox_TT100K_640_640_73G_2.5 > vai_c_xir -x quantized/YOLOX_0_int.xmodel -a arch.json -n tsd_yolox_pt -o ./tsd_yolox_pt
**************************************************
* VITIS_AI Compilation - Xilinx Inc.
**************************************************
[UNILOG][INFO] Compile mode: dpu
[UNILOG][INFO] Debug mode: function
[UNILOG][INFO] Target architecture: DPUCZDX8G_ISA1_B4096
[UNILOG][INFO] Graph name: YOLOX_0, with op num: 780
[UNILOG][INFO] Begin to compile...
[UNILOG][INFO] Total device subgraph number 5, DPU subgraph number 1
[UNILOG][INFO] Compile done.
[UNILOG][INFO] The meta json is saved to "/workspace/pt_yolox_TT100K_640_640_73G_2.5/./tsd_yolox_pt/meta.json"
[UNILOG][INFO] The compiled xmodel is saved to "/workspace/pt_yolox_TT100K_640_640_73G_2.5/./tsd_yolox_pt/tsd_yolox_pt.xmodel"
[UNILOG][INFO] The compiled xmodel's md5sum is 3617ab082e95cd399501e98b513fd277, and has been saved to "/workspace/pt_yolox_TT100K_640_640_73G_2.5/./tsd_yolox_pt/md5sum.txt"

 

無事、コンパイルされたモデルが出力されました。

tsd_yolox_ptのフォルダが作成されて、tsd_yolox_pt.xmodelがコンパイル後のファイルです。

一緒にメタファイル(meta.json)、チェックサム(md5sum.txt)も出力されます。

 

PointPillars(3D物体検出)のモデルをコンパイル

PointPillarsも同様にコンパイルしていきます。

nuScenes用のもあり、Vitis AIサンプルは下記のyaml内のリンクからダウンロードできます。

(B4096でコンパイル済のモデルのリンク先も記載されています)

 https://github.com/Xilinx/Vitis-AI/tree/2.5/model_zoo/model-list/pt_pointpillars_nuscenes_40000_64_108G_2.5

 

wget https://www.xilinx.com/bin/public/openDownload?filename=pt_pointpillars_nuscenes_40000_64_108G_2.5.zip
unzip openDownload?filename=pt_pointpillars_nuscenes_40000_64_108G_2.5.zip

 

CPUの処理含むモデルは直接コンパイルできなかった

PointPillars + nuScenesの量子化後のモデルは2つに分かれています。

サンプルだと「/quantized」のフォルダ中にあります。

特殊な形で、一つ目のモデルは最後の処理(OP)でCPUが絡んできます。

  • MVXFasterRCNN_quant_0_int.xmodel ←CPUの処理(OP)が最後に入っている
  • MVXFasterRCNN_quant_1_int.xmodel

 

Xilinxの公式にも、今回の特殊なCustom_OPの手順が記載されています。

 https://docs.xilinx.com/r/2.5-English/ug1414-vitis-ai/Custom-OP-Workflow

コンパイル前のxmodelのOPを弄る必要があるということです。

(失敗に終わりましたが…)また別の記事で紹介します。

 

1個目の「MVXFasterRCNN_quant_0_int.xmodel」はコンパイル出来ませんでした。

実際にコンパイルすると、途中のBegin to compile...で固まります。

(サンプルでも、筆者オリジナルの量子化後のモデル(.xmodel)でも同様な結果でした)

vai_c_xir --xmodel quantized/MVXFasterRCNN_quant_0_int.xmodel --arch arch.json --net_name pointpillars_nuscenes_40000_64_0_pt --output_dir ./pointpillars_nuscenes_40000_64_0_pt

(vitis-ai-pytorch) Vitis-AI /workspace/pt_pointpillars_nuscenes_40000_64_108G_2.5 > vai_c_xir --xmodel quantized/MVXFasterRCNN_quant_0_int.xmodel --arch arch.json --net_name pointpillars_nuscenes_40000_64_0_pt --output_dir ./pointpillars_nuscenes_40000_64_0_pt
**************************************************
* VITIS_AI Compilation - Xilinx Inc.
**************************************************
[UNILOG][INFO] Compile mode: dpu
[UNILOG][INFO] Debug mode: function
[UNILOG][INFO] Target architecture: DPUCZDX8G_ISA1_B4096
[UNILOG][INFO] Graph name: MVXFasterRCNN_quant_0, with op num: 11
[UNILOG][INFO] Begin to compile...

 

1個目に関しては、一旦Xilinxから提供されているコンパイル済のモデルを流用します。

2個目の「MVXFasterRCNN_quant_1_int.xmodel」はコンパイル出来ました。

vai_c_xir --xmodel quantized/MVXFasterRCNN_quant_1_int.xmodel --arch arch.json --net_name pointpillars_nuscenes_40000_64_1_pt --output_dir ./pointpillars_nuscenes_40000_64_1_pt

(vitis-ai-pytorch) Vitis-AI /workspace/pt_pointpillars_nuscenes_40000_64_108G_2.5 > vai_c_xir --xmodel quantized/MVXFasterRCNN_quant_1_int.xmodel --arch arch.json --net_name pointpillars_nuscenes_40000_64_1_pt --output_dir ./pointpillars_nuscenes_40000_64_1_pt
**************************************************
* VITIS_AI Compilation - Xilinx Inc.
**************************************************
[UNILOG][INFO] Compile mode: dpu
[UNILOG][INFO] Debug mode: function
[UNILOG][INFO] Target architecture: DPUCZDX8G_ISA1_B4096
[UNILOG][INFO] Graph name: MVXFasterRCNN_quant_1, with op num: 152
[UNILOG][INFO] Begin to compile...
[UNILOG][INFO] Total device subgraph number 5, DPU subgraph number 1
[UNILOG][INFO] Compile done.
[UNILOG][INFO] The meta json is saved to "/workspace/pt_pointpillars_nuscenes_40000_64_108G_2.5/./pointpillars_nuscenes_40000_64_1_pt/meta.json"
[UNILOG][INFO] The compiled xmodel is saved to "/workspace/pt_pointpillars_nuscenes_40000_64_108G_2.5/./pointpillars_nuscenes_40000_64_1_pt/pointpillars_nuscenes_40000_64_1_pt.xmodel"
[UNILOG][INFO] The compiled xmodel's md5sum is a35ccc326dd733bbbe5a5d908b040272, and has been saved to "/workspace/pt_pointpillars_nuscenes_40000_64_108G_2.5/./pointpillars_nuscenes_40000_64_1_pt/md5sum.txt"

 

vai_c_xirのオプション

今回Vitis AIのvai_c_xirを使ってコンパイルしました。

基本は量子化後のモデル(.xmodel)を全ての処理(OP)をコンパイルします。

但しオプションを使えば、一部だけ実施できる旨も紹介します。(本当に小ネタです。)

 

Xilinxの公式のドキュメントでは、下記に記載されています。

 https://docs.xilinx.com/r/2.5-English/ug1414-vitis-ai/VAI_C-Usage

Use --options '{"output_ops": "op_name0,op_name1"}' to specify output ops

 

例えば、モデル名のノード名はNetronで確認できます。

途中の箇所のノードの名前を指定することで、途中までのコンパイルとなります。

下記例ですとデフォルトのvai_c_xirと比較すると、op numが11→9となっています。

Graph name: MVXFasterRCNN_quant_0, with op num: 11 → 9

(vitis-ai-pytorch) Vitis-AI /workspace/pt_pointpillars_nuscenes_40000_64_108G_2.5 > vai_c_xir --xmodel quantized/MVXFasterRCNN_quant_0_int.xmodel --arch arch.json --net_name pointpiars_nuscenes_40000_64_0_pt --output_dir ./pointpillars_nuscenes_40000_64_0_pt --options '{"output_ops":"MVXFasterRCNN_quant__MVXFasterRCNN_quant_HardVFE_deploy_trans_input_quant_pts_voxel_encoder__VFELayer_deploy_quant_vfe_layers__ModuleList_0__ReLU_relu__3063_fix"}'
**************************************************
* VITIS_AI Compilation - Xilinx Inc.
**************************************************
[UNILOG][INFO] xir::Op{name = MVXFasterRCNN_quant__MVXFasterRCNN_quant_HardVFE_deploy_trans_input_quant_pts_voxel_encoder__VFELayer_deploy_quant_vfe_layers__ModuleList_0__ReLU_relu__3063_fix, type = fix} has been assigned to be an output op.
[UNILOG][INFO] Compile mode: dpu
[UNILOG][INFO] Debug mode: function
[UNILOG][INFO] Target architecture: DPUCZDX8G_ISA1_B4096
[UNILOG][INFO] Graph name: MVXFasterRCNN_quant_0, with op num: 9
[UNILOG][INFO] Begin to compile...

 

まとめ

量子化後のモデルをFPGA(KV260)用にコンパイルすることが出来ました。

次からは実際にKV260で3D含めた物体検出をテストしていきます。

下記記事にてYOLOX(物体検出)のテストをしています。(リンク先はこちら)

KV260でYOLOX+DPUの物体検出をしてみたメモ

KV260でYOLOX+DPUの物体検出をしてみたメモ
FPGAでYOLOXの物体検出をしてみました。 使用したFPGAの評価ボードはKV260です。 Vitis AIのサンプルを使って簡単にテストした内容を紹介します。

 

今回の記事含めて、第6回AIエッジコンテストの一環でした。

下記にてコンテストでテスト・実施したことのまとめを紹介しています。

第6回AIエッジコンテストが凄く難しいけど勉強になった感想

第6回AIエッジコンテストが凄く難しいけど勉強になった感想
第6回AIエッジコンテストに参加していました。 RISC-Vを使って、画像とLIDAR点群からの3D物体検出が課題でした。 ただ貴重な勉強の機会になりましたし、自身への忘備録としても内容を紹介します。

コメント