NXPサポートチームの皆様、こんにちは。
i.MX RT1170 上でTensorFlow Lite for Microcontrollers(TFLM)を使用して大規模な音響音声認識(ASR)モデルを実行している際に、推論精度や動作に問題が発生しています 。
モデルと必要なテンソル領域が内部SRAMの容量を超えるため、両方とも外部SDRAMに明示的に配置されます。アプリケーションはメモリ障害やクラッシュを起こすことなくスムーズに動作しますが、モデルの数学的な出力は正しくありません。
環境:
MCU: MIMXRT1170 (Cortex-M7)
OS: FreeRTOS
フレームワーク:eIQ / TFLM
メモリ:モデルとテンソルアリーナはすべて外部SDRAMに格納されます
問題の説明:
モデルデータを外部SDRAMにロードし、MPUを設定します。
TFLMマイクロインタープリタが初期化され、AllocateTensors()が正常に完了しました(kTfLiteOk)。
事前に計算された浮動小数点特徴量を入力テンソルに入力します。DMA/メモリの一貫性を確保するため、推論の前に入力バッファのDCacheを手動で無効化します。
interpreter.Invoke() はクラッシュやハードフォールトを起こすことなく正常に実行され、完了します。
問題点:インタープリタによって返される出力ロジットが、デスクトップPCで全く同じモデルと入力データを実行した場合と比較して、完全に間違っている(または空白である)。
トラブルシューティング手順:
入力検証:MCUテンソルに入力されたバイト単位の入力データが、正常に動作したPC Pythonベースラインで使用された入力データと完全に一致することを確認しました。
キャッシュ管理:SDRAM領域用にMPUを設定し、推論前にDCacheが無効化されるようにすることで、Cortex-M7が古いメモリを読み取らないようにしました。
OpResolver: モデルに必要なすべての TFLite 操作が登録され、サポートされていることを確認しました。
チームへの質問:
NXPのTFLM実装において、大規模なマトリックス演算を外部SDRAMのみで実行する場合、既知の精度損失問題や数学的な不一致はありますか?
Cortex-M7では、TFLMが重み/活性化を正確に計算できるようにするために、外部SDRAMに対して特定のMPU属性構成(例:強順序メモリ対通常メモリ)が必要ですか?
TFLMに密結合メモリ(DTC/ITC)外での操作を実行させる場合、無効にすべきeIQハードウェアアクセラレータの特定のフラグはありますか?
MCUの出力とPCの基準値との間のこの不一致をデバッグするためのアドバイスをいただければ大変ありがたいです。
ありがとう、
プリイェシュ・シャヒ
こんにちは 、
ご提供いただいた説明から判断すると、この問題は数値精度の制限というよりも、キャッシュの一貫性の問題に関連している可能性が高いと思われます。推論前に入力バッファのDCacheを無効にするのではなく、共有バッファやDMA更新バッファにはキャッシュ不可能な領域を使用することをお勧めします。次のアプリケーション ノートでは、キャッシュ不可能なメモリ領域の設定方法と使用方法についてさらに詳しく説明しています: i.MXRT でのキャッシュ不可能なメモリの使用。代わりにこちらの方法を試してみて、効果があるかどうか教えてください。
お客様からの具体的なご質問にお答えします。
1. 外部SDRAM上で大規模なマトリックス演算を完全に実装する場合に、精度損失の問題が発生することを示す文書化されたデータはありません。
2. 通常のデータとして使用される外部SDRAMについては、キャッシュ不可として構成できるようにするために、通常のメモリとして構成することをお勧めします。
3. 内部 RAM 外で TFLM 操作が正しく実行されることを保証するための正しいパスとして文書化された特定のアクセラレータ フラグはありません。これは、問題がモデルの実際の動作よりもキャッシュメモリの処理に関連している可能性が高いもう一つの理由です。
BR、
エドウィン。
こんにちは、エドウィンさん。
問題の特定に成功し、CMSIS-NN最適化カーネル内の数学的な破損バグであることを確認しました(特に、当社のASRモデルが大きく依存している拡張畳み込みに影響があります)。
私たちの証拠:
1.SDRAMキャッシュをアクティブに保ち、DMA転送に安全なDTCMバッファを使用しながら、純粋に標準のC++リファレンスカーネルを使用して「libtflm.a」を再コンパイルしました(コンパイル時に「cmsis_nn」ディレクトリを省略しました)。
2. CMSIS-NNをバイパスすると、モデルはすぐに正しい音声トークンのデコードに成功し始めました。例えば、チャンク7は正しく「[easy]」を出力し、チャンク10は正しく「[ch]」を出力します。
3. プリコンパイル済みの CMSIS-NN ライブラリに戻すと、実行速度は 537 ms に低下しますが、出力はすべてのチャンクにわたって完全に空の括弧に戻ってしまいます。
これにより、メモリ設定、キャッシュ構成、およびDMAバッファが完全に正しいこと、そしてCMSIS-NN最適化畳み込み/深層畳み込みパス内で非ユニティ膨張(膨張率が1より大きい)を処理する際に数学的なエラーが発生していることが確認されました。
私たちの質問:
- arm_convolve_s8 および arm_depthwise_conv_s8 における拡張畳み込み (拡張率が 1 より大きい) の公式バグ修正が含まれている eIQ SDK / CMSIS-NN ミドルウェアのバージョンはどれですか?
- CMSIS-NNカーネルを修正したパッチまたは更新版のlibtflm.aを提供していただけますか?そうすれば、完全な精度と最適化された537ミリ秒の推論速度の両方を実現できます。
よろしくお願いいたします。
プリイェシュ・シャヒ