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

 

コメント