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のファイル名で使います。中身は型番が書いているだけです。

 

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

 

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

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

 

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

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

 

出力するファイル名・フォルダ名を「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

 

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

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

 

 

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

 

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

 

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

 

まとめ

量子化後のモデルを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物体検出が課題でした。 ただ貴重な勉強の機会になりましたし、自身への忘備録としても内容を紹介します。

コメント