RK3588 NPU モデル推論精度の最適化と精度低下原因の特定手順

NPU 推論における精度ロスの検証プロセス

モデル変換フローにおいて、元々の学習精度から推論時の精度が低下する現象は珍しくありません。この差異が生じる具体的な要因を特定し、非量化バージョンとの対比を通じて最適な設定を見つけることが重要です。本稿では、Rockchip の公式ドキュメントおよびテスト実績に基づき、RK3588 環境における精度調整の標準的なアプローチを解説します。

シミュレーション環境と実機検証の前提条件

浮動小数点数または量子化モデルの信頼性を確保するためには、以下の階層構造を順に確認する必要があります。

  1. エミュレーター(シミュレーター)での出力値が正解していることが、板端デバイスでの推論結果正確さの前提条件です。
  2. FP16(Half Precision)モデルで正常動作することが、INT8 などの整数量子化モデルにおける精度保証の前提条件となります。

したがって、まずは `build` メソッド内で `do_quantization` パラメータを無効化し、FP16 モデルを生成します。その上で出力が期待通りでない場合は、以下の構成パラメータを見直す必要があります。

  • 構成情報: `mean_values`、`std_values`、入力サイズリスト `input_size_list`、および入出力テンソルの定義。
  • 推論設定: 入力データのフォーマット。Python 環境においては `cv2.imread` で読み込まれる画像データは通常 BGR フォーマットですが、RKNN への入力は RGB を想定しているケースが多いため、色空間変換が必要です。
  • レイアウト指定: デフォルトの `data_format` は NHWC ですが、外部データを直接使用する際には、そのデータ配置(Layout)を考慮して明示的に設定する必要があります。

量子化モデルのパラメータ設定

FP16 モデルの確認が完了後、実際の量子化プロセスへと移行します。ここで精度劣化が見られる場合、主な影響因子は以下の通りです。

量化 dtype の選択
Toolkit バージョン 2-1.3.0 ではデフォルトとして `asymmetric_quantized-8` が採用されています。現在、`asymmetric_quantized-16` への対応は限定的です。計算コストと性能バランスを考慮すると、16 ビット量子化よりも非量化 FP16 ルートの方が適切な場合もあるため、`do_quantization=False` とした設定も検討対象とします。

校正用データセット(Dataset)
`build` 時に指定する校正集は、実際の運用環境に近い画像を選ぶべきです。過剰あるいは不足したサンプル数、および分布の違いが精度低下を招きます。一般的には 50〜200 枚程度が推奨範囲とされます。

その他設定項目
CAF F E 形式モデルの場合、`quant_img_RGB2BGR` オプションの利用を検討します。また、アルゴリズムの種類、手法、最適化レベル `optimization_level` も試行錯誤の対象となります。

精度分析ツールの活用

推論精度を詳細に比較するために `accuracy_analysis` コマンドを利用できます。これは `build` またはハイブリッド量子化ステップ実行後にのみ利用可能です。

# モデル構築
print('--> Building model')
status = rknn.build(do_quantization=True, dataset='/path/to/calibration_images')
if status != 0:
    print('Model build failed!')
    exit(status)

# 精度解析
print('--> Analyzing accuracy')
result = rknn.accuracy_analysis(
    inputs=['./sample_data/input_image.jpg'],
    target='rk3588'
)
if result != 0:
    print('Analysis failed!')
    exit(result)

上記コマンドは、元の参照モデル(ゴールデン)と、シミュレータあるいはランタイムでの出力値間の誤差を計算します。ログ出力における余弦類似度(Cosine Similarity)は重要な指標となります。0.99 を下回るとわずかな不整合、0.98 を切れば明確なエラーと判断されることが一般的です。

layer_name     quant_error              runtime_error   
           entire    per_layer      simu_err  golden_err     
--------------------------------------------------------
images       1.000000  1.000000       1.000000  1.000000       
conv_254     1.000000  1.000000       1.000000  1.000000       
conv_256     1.000000  1.000000       0.999999  0.999999       
conv_257     0.999999  1.000000       0.999990  0.999991       <--注目点

各レイヤーの `golden_err` 値を確認することで、どの演算層で誤差が大きくなっているかを特定できます。

入出力データと設定の見直し

精度問題が発生した場合、以下の変数を再確認してください。

  • 画像入力:OpenCV 等を使用している場合、チャンネル順序が一致しているか。
  • config 設定:`quantized_algorithm` や `quantized_method` はデフォルト値が必ずしも最良とは限りません。
  • 浮動小数点数形式:FP32、FP16、INT8 の間での挙動違いを理解しておく。

なお、ToolKit 2.0 の 1.3.0 以降および最新の 1.5.0 でも、直接の浮動小数点 16 ビット(float16)量子化サポートは制限されています。意図通りに FP16 で処理させたい場合は、量子化フラグをオフにして FP16 プレスerving として扱います。

混合量子化の適用

単純な量子化ではなく、重要度の高い層のみ高精密度に保つ混合量子化も選択肢の一つです。プロポーザル設定を行うことで、AI チップが自動的に最適な量子化パターンを選択するように誘導できます。

QAT(Quantization Aware Training)の実装

推論時の精度維持が困難な場合は、訓練段階からのアプローチである QAT を検討します。これは、訓練プロセス中に擬似的な量子化ノード(`fake_quant`)を挿入し、乗算・加算の際の丸めやクランプ操作を模擬することで、最終的な INT8 モデルに対する適合度を高める手法です。

PyTorch 1.3 以降では標準の API でこれを実装可能であり、コードの変更箇所も最小限に抑えられます。全計算が浮動小数点で行われるため、最終的な重みの量子化前に十分な精度を得ることができます。

技術的要約

RK3588 におけるツールキット 1.3.0 および 1.5.0 の特性を踏まえると、以下の点が主要な結論となります。

  1. 量化 OFF 時(デフォルト FP16)でも精度ロスは抑制されやすい反面、メモリ使用量や推理時間の増加を伴います。
  2. 設定パラメータ `quantized_algorithm`、`quantized_method`、`optimization_level` は、デフォルトから変更することで精度改善が期待できる場合があります。

非量化(FP16)ビルド時に `accuracy_analysis` を実行すれば、ONNX エクスポートや PyTorch 直接推論との類似性が高く出やすくなります。一方で INT8 量子化を行う場合は、校正データセットの質や設定値の微調整が不可欠です。

タグ: rknn-toolkit rk3588 npu-optimization floating-point pytorch-quantization

8月7日 13:23 投稿