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

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

Vitis AIのFPGA向けの量子化で精度ロスを防ぐFast Finetuningという機能があります。

但しPCのメモリが有る程度必要でした。(今回だと28GB程度)

低スペックPCには難しく、普通の量子化をした旨を紹介します。

 

スポンサーリンク

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

3D物体検出のモデルを量子化してみました。

Xilinxのサンプルを基にFast FinetuningをONにした量子化をしてみました。

但し、PCのメモリが足りなくエラーが出て止まりました。

 

結局は普通の量子化をして対応したのですが、エラーの内容含めて紹介します。

 

実行環境

下記の環境で実行しました。

最終的にはXilinxのFPGAに実装したいため、Vitis AI上の環境で学習しています。

  • Vitis AI 2.5 + nuScenes_PointPillarsのライブラリ
  • 第6回AIエッジコンテストのデータセット

 

PC環境は下記となります。3D物体検出の学習を行うには大分貧弱なPCです。

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

 

3D物体検出の学習まで対応済

学習・評価に必要なデータセットの用意・前処理は下記記事で対応済です。

nuScenes formatのLidar点群の前処理をしてみたメモ

nuScenes formatのLidar点群の前処理をしてみたメモ
nuScenes形式のデータセットの学習前の前処理をしてみました。 3D物体検出をするために、LIDAR点群を処理しています。 データセットの入れ方から、プログラムの実行まで紹介します。

 

下記記事で実際に学習してモデル(.pth)ファイルまで作成しています。

LIDAR点群の3D物体検出の学習に失敗したメモ

LIDAR点群の3D物体検出の学習に失敗したメモ
自動車のLIDAR点群データを使った3D物体検出の学習を試してみました。 ただ、Xilinxからサンプルで提供されている学習済のモデル(重み)には勝てず…。 色々と試して失敗した内容含めて紹介します。 LIDAR点群の3D物体検出の学習に失...

 

またnuScenes(mini)の公式のデータでも同様に対応できました。

下記記事でVitis AIの使ったサンプル、またDocker上のコマンド含めて紹介しています。

nuScenes miniのdatasetを試してみる

nuScenes miniのdatasetを試してみる
nuScenesのデータセットは数百Gbyteと莫大です。 nuScenes miniならば数Gbyteのため、テストレベルなら簡単に使えます。 ダウンロードして、Vitis AI環境下で簡単に評価まで実施してみました。

 

Fast Finetuningで発生したエラー

XilinxのnuScenes_PointPillarsのサンプルでは量子化のスクリプトが用意されています。

スクリプトの中身を確認してみます。(下記はrun_quant.shの一部抜粋です)

Fast Finetuningの目的をコメント文で「量子化での精度向上」と記載していました。

 

量子化のプログラムにオプションとして赤字の「--fast_finetune」が用意されています。

python code/mmdetection3d/tools/quant.py ${Q_CONFIG} ${WEIGHTS} --quant_mode ${MODE} --quant_dir ${Q_DIR} --calib_len 400 --fast_finetune

 

実際にスクリプトをそのまま動かしてみますと、エラーが発生しました。

量子化の途中で処理が止められていました。

run_quant.sh: line 42: 8802 Killed

 

どうやら普通の量子化と違って、PCのメモリをかなり使用するようです。

今回の3D物体検出のモデルのデフォルトの量子化だと28GBほど必要そうでした。

ただ筆者のPCメモリが16GBのため、Fast Finetuningを使った量子化は諦めました。

(他にもパラメータなど弄って調整してみましたが、16GB以下には出来ず…)

 

一応PC上の仮想メモリを増やして対応できるかも確認してみましたが、ダメでした。

下記コマンドのようにVitis AIのdocker起動前に実行しています。

PCのメモリ16GB+仮想メモリ16GBでは同様にエラーが出ました。

 

通常の量子化では対応できました

量子化によって精度ロスは発生するかもしれませんが、通常の量子化で対応しました。

スクリプト(run_quant.sh)には通常の量子化がコメントアウトされていました。

Fast Finetuningの方をコメントアウトして、通常の方でxmodel出力まで対応します。

 

また量子化の際に使うデータセットでキャリブレーションが取れます。

但し、この設定を一旦デフォルトの400から1にしています。「--calib_len 1」箇所です。

理由は量子化の際にGPUメモリ不足エラーが発生するためです。

python code/mmdetection3d/tools/quant.py ${Q_CONFIG} ${WEIGHTS} --quant_mode ${MODE} --quant_dir ${Q_DIR} --calib_len 1

 

最終的には、FPGAの量子化をしてコンパイルに必要なxmodelの出力まで出来ました。

(今回のPointPillarsでは2個のxmodelがモデルが出力されています)

[VAIQ_NOTE]: =>Successfully convert 'MVXFasterRCNN_quant_0' to xmodel.(quantized/MVXFasterRCNN_quant_0_int.xmodel)

[VAIQ_NOTE]: =>Successfully convert 'MVXFasterRCNN_quant_1' to xmodel.(quantized/MVXFasterRCNN_quant_1_int.xmodel)

 

 

量子化での精度ロスを確認してみる

今回の量子化前後でどれほど精度ロスが出たのか確認してみます。条件は下記です。

  • Vitis AI 2.5 + nuScenes_PointPillarsのライブラリ
  • 第6回AIエッジコンテストのLIDAR点群のデータセット(3d_labels)
  • 量子化したモデルはライブラリで提供のもの(pointpillars-nus.pth)

 

量子化前の評価

量子化前は自動車(car)はAP_0.665、人(pedestrian)はAP_0.046という評価結果でした。

 

量子化後の評価

量子化後は自動車(car)はAP_0.647、人(pedestrian)はAP_0.056という評価結果でした。

ある程度評価出来ている自動車(car)を前後で比較すると、確かに精度ロスが発生してました。

AP_0.665 → AP_0.647

 

まとめ

3D物体検出で学習したモデルをFPGAに向けて、量子化することが出来ました。

次の記事ではFPGAに使えるように、(半分失敗した)コンパイルまでの記事を紹介します。

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

Vitis AIでPytorchのcompileをしてみたメモ
Vitis AIのPytorchのモデル(.xmodel)をコンパイルしてみました。 練習を兼ねて、複数の物体検出(YOLOX、PointPillars)のモデルでテストしています。

 

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

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

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

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

 

コメント