HiSilicon NPUでYOLOとResNetの最適化をマスターする
あなたはHiSilicon NPUのモデルから最高のパフォーマンスを得たいと思っています。これは難しい作業です。あなたはperformanを見るかもしれません
あなたはHiSilicon NPUであなたのモデルから最高のパフォーマンスを得たいと思っています。これは難しい作業です。パフォーマンスのボトルネックやハードウェアの使用不足が発生する可能性があります。Ascend NPUアーキテクチャには、独自の課題があります。たとえば、メモリアクセス遅延を隠すために大規模なスレッドレベルの並列処理を使用しませんを参照してください。
ゴール: このガイドでは、YOLO/ResNetを最適化するための完全なワークフローを提供します。モデルを準備し、Ascend Tensor Compilerで変換し、INT8量子化を適用し、ピーク効率のためにAscendCLを使用してそれらを展開する方法を学びます。🚀
重要なポイント
- モデルを準備するHiSilicon NPUを参照してください。ONNX形式に変換します。小さくて速くするために剪定します。
- Ascend Tensor Compiler (ATC) を使用して、ONNXモデルを変換します。これにより、NPU用に最適化された「.om」ファイルが作成されます。
- INT8量子化を適用してパフォーマンスを向上させます。ポストトレーニング量子化 (PTQ) または量子化アウェアトレーニング (QAT) を使用します。
- モデルの遅い部分を見つけるには、Ascend Profilerを使用します。これにより、パフォーマンスの問題を修正できます。
- デプロイします。最適化モデルAscendCLを使用します。レイテンシとFPSを測定して速度を確認します。
変換のためのYOLO/RESNETの準備と楽観化
最初のステップは、HiSilicon NPUのモデルを準備することです。よく準備されたモデルはスムーズに変換され、より良いパフォーマンスを発揮します。この準備にはいくつかの重要な段階が含まれます。
- モデル変換: トレーニングしたモデルをNPU互換形式に変換します。アセンドTensor Compiler (ATC) は、このプロセスに役立ちます。
- オペレータ適応: モデルにカスタム演算子がある場合があります。ネイティブにサポートされていない場合は、これらをNPUに適合させる必要があります。
- モデル推論: 変換されたモデルをNPUにデプロイします。これには、モデルをロードし、予測を取得するためにデータを供給することが含まれます。
- パフォーマンス最適化: 量子化や演算子融合などの手法で、パフォーマンスをさらに向上させることができます。
ResNetをYOLOバックボーンとして使用する
ResNetアーキテクチャをYOLOモデルのバックボーンとして使用できます。ResNetは、画像から複雑な特徴を抽出するのに優れています。この電力にはコストがかかります。ResNetは、かなりの計算上の重みを追加します。これにより、次のステップであるプルーニングが、リソースに制約のあるデバイスでYOLO/ResNetを最適化するために非常に重要になります。
NPU互換性のための剪定
剪定は、ニューラルネットワークから不要な接続またはニューロンを削除します。このプロセスは、精度を大きく損なうことなく、より小さく高速なモデルを作成します。剪定されたモデルは、より少ないパラメータおよび操作を有する。これはそれをNPUのために理想的にし、減らすメモリ使用法と推論のスピードアップ。これは、YOLO/ResNetを最適化するための重要な手法です。
モデルのONNXへのエクスポート
モデルをOpen Neural Network Exchange (ONNX) 形式にエクスポートする必要があります。ONNXは、ATCツールが理解できる中間フォーマットです。簡単なコマンドを使用してPyTorchモデルを簡単にエクスポートできます。
例: YOLOv8nモデルをONNXにエクスポートします。
# このコマンドはPyTorchモデルから「yolov8n.onnx」を作成します Yoloエクスポートモデル = yolov8n.pt形式 = onnx注: エクスポート中にエラーが発生する可能性があります。のような問題
サポートされていないONNXデータ型: INT64または形状のミスマッチFusedMatMulは一般的です。多くの場合、入力テンソルのサイズが正しいことを確認するか、エクスポートする前にデータ型を変換することで、これらを修正できます。
ONNXグラフの検証
常にエクスポートされたONNXファイルを確認する必要があります。このチェックは、変換に進む前にモデル構造が正しいことを確認します。いくつかのツールがこの最終準備ステップに役立ちます。⚙️
- ネトロン: これはビジュアルツールです。アップロードできます
を参照してください。Onnxモデルグラフ全体を表示するファイル。各レイヤーのプロパティ、入力、および出力を検査できます。 - ONNXチェッカー: これはPythonライブラリです。を使用できます。
Onnx.checker.check_model()スクリプト内の関数。モデルの構造が有効であることをプログラムで確認し、問題が見つかった場合はエラーが発生します。
ATCとのモデル変換
ONNXモデルを準備した後、次のタスクは、HiSilicon NPUが理解できる形式に変換することです。を使用しますアセントテンソルコンパイラ (ATC)この重要なステップのために。ATCは、CANN (Compute Architecture for Neural Networks) ツールチェーン内の強力なツールです。
その主な仕事は、モデルを高度に最適化されたオフラインモデルに変換することです。
- ATCは、Huawei CANNツールチェーンのコア変換ツールです。
- これを使用して、一般的なフレームワークのモデルをAscend互換形式に適応させます。
- トレーニングしたAIモデルをHuawei Ascendハードウェアに効率的にデプロイするのに役立ちます。
この変換プロセスにより、を参照してください。Omファイルは、NPUにデプロイする最終的な実行可能モデルです。
基本的なATC変換
検証済みの基本コマンドから始めることができますを参照してください。Onnxファイルを作成します。このコマンドは、ATCに入力モデル、元のフレームワーク、目的の出力ファイル名、およびターゲットAscendチップバージョンを通知します。
💡オフラインモデルとは (
を参照してください。Om)? オフラインモデルは、特定のハードウェアターゲット用に前処理および最適化されたファイルです。これには、オペレーターフュージョンやメモリ最適化などのタスクが含まれます。つまり、NPUは推論中に最小限のセットアップ時間で実行できます。
ここには基本がありますAtcコマンドラインの例:
Atc -- model = yolov8n.onnx \
-- Framework = 5 \
-- Output = yolov8n \
-- Soc_version = Ascend310
このコマンドの各部分が何をするかを分解しましょう:
| フラグ | 説明 |
|---|---|
-- モデル | 入力へのパスを指定します。を参照してください。Onnxファイルを作成します。 |
-- Framework = 5 | モデルがONNX形式であることをATCに伝えます。 (その他の値はCaffeなど) |
-- 出力 | 出力のベース名を定義します。を参照してください。Omファイル (拡張機能は不要)。 |
-- Soc_version | のように、ターゲットのAscendプロセッサを指定します。Ascend310またはAscend710を参照してください。 |
入力の設定
モデルは、送信するデータの正確なサイズと形式を知る必要があります。特定のフラグを使用してATC変換中にこれを設定します。このステップは、パフォーマンスとランタイムエラーの防止に不可欠です。
を使用します。-- Input_shapeフラグを入力テンソルの次元を定義します。一貫したパフォーマンスのために固定バッチサイズを設定したり、柔軟性のために動的バッチサイズを設定したりできます。
- 静的バッチサイズ:
"-- Input_shape = images:1,3,640,640"(1のバッチ) - ダイナミックバッチサイズ:
"-- Input_shape = images:-1,3,640,640"(可変バッチサイズ)
データレイアウトも指定する必要があります。PyTorchで訓練されたほとんどのコンピュータビジョンモデルは、NCHW形式です。このレイアウトは、テンソルデータを (サンプル数、チャンネル、高さ、幅) として整理します。これを正しく行うことは、NPUがメモリ内のデータにアクセスする方法に影響するため、計算効率にとって不可欠です。を使用できます。-- Input_formatこれを設定するフラグ。
入力設定の強化されたコマンドは次のとおりです。
Atc -- model = yolov8n.onnx \
-- Framework = 5 \
-- Output = yolov8n \
-- Input_format = NCHW \
-- Input_shape = "images:1,3,640,640" \
-- Soc_version = Ascend310
サポートされていないOpsの処理
モデルに、ATCがネイティブにサポートしていない特殊なレイヤーまたは操作 (「ops」) が含まれている場合があります。これが発生すると、変換は失敗します。あなたはこれを解決するための強力なツールを持っています:テンソルブーストエンジン (TBE)を参照してください。TBEを使用すると、Ascend NPUが実行できる方法でカスタム演算子を定義して実装できます。⚙️
TBEでカスタム演算子を開発することは、いくつかの段階を含む高度なプロセスです。
- DSLモジュール: 最初に演算子のコア数理論理を書きます。ドメイン固有の言語を使用して、計算ステップとデータフローを定義します。
- スケジューリングモジュール: 次に、ロジックを効率的に実行する方法をハードウェアに伝えます。これには、メモリアクセスとパフォーマンスを最適化するためにデータ (タイリング) をセグメント化する方法を計画することが含まれます。
- IRモジュール: TBEは、オペレータの中間表現 (IR) を生成します。これは、コンパイラが理解して最適化を開始できる標準化された形式です。
- コンパイラ転送モジュール: コンパイラはIRを取得し、さらに最適化を適用します。ダブルバッファリングやスマートメモリの割り当てなどの手法を使用して、オペレーターが特定のNPUハードウェアに対応する準備をします。
- CodeGenモジュール最後に、CodeGenモジュールはCのようなコードファイルを生成します。このファイルは、CANNフレームワークがNPUで直接ロードして実行できる実行可能演算子にコンパイルされます。
⚠️ 注意カスタム演算子を作成するには、演算子の機能と基盤となるNPUアーキテクチャの両方を深く理解する必要があります。あなたは常に最初に公式のCANNオペレーターリストをチェックするべきです。サポートされている代替手段が見つからない場合にのみ、カスタム演算子を作成します。
高度な楽観化と調整
モデルを変換しました。これで、HiSilicon NPUの真のパワーをアンロックできます。高度な最適化手法により、モデルのパフォーマンスがピークに達します。この段階では、モデルの精度を下げ、ランタイムの動作を分析してボトルネックを見つけて修正することに重点を置いています。
HiSiliconのDaVinciアーキテクチャのようなNPUは、特定の数学演算を加速するように構築されています。モデルは、最大速度を達成するために、畳み込み、プーリング、およびアクティブ化にこれらの「NPUフレンドリー」演算子を使用する必要があります。NPUでサポートされていない操作は、低速のCPUで実行されるため、パフォーマンスのボトルネックが発生します。量子化は、モデルをよりNPUフレンドリーにする重要な手法です。たとえば、モデルの数値の精度が32ビット浮動小数点 (FP32) から8ビット整数 (INT8) に低下します。この変更により、モデルが小さくなり、高速になります。 An AIベンチマークテストこの影響を明確に示しています。FP32を使用して毎秒12フレームで実行されるモデルは、INT8量子化で最適化すると、毎秒30フレームを達成できます。を参照してください。
トレーニング后の量子化 (PTQ)
ポストトレーニング量子化 (PTQ) は、YOLO/ResNetを最適化するための強力な手法です。すでに訓練されたFP32モデルに適用します。これに使用する主なツールは、Ascend Model Compression Toolkit (AMCT) です。PTQは、モデルを再トレーニングせずにパフォーマンスを大幅に向上させるための迅速かつ簡単な方法であるため、人気があります。
ただし、PTQによってモデルの精度が低下することがあります。YOLOv8 Nanoのようなモデルでは、推論精度がわずかに低下する場合があります。 場合によっては、特に小さなモデルでは、この精度の損失がより大きくなる可能性があります。 静的なINT8量子化は、絶対mAP50-95の精度が約3〜7% 低下する可能性があります。
PTQからの精度損失が高すぎる場合は、別のオプションがあります。量子化-Awareトレーニング (QAT)を参照してください。QATは、トレーニングプロセス自体の間に量子化のシミュレーションを導入します。これにより、モデルは精度損失を補正する方法を学ぶことができ、多くの場合、最終精度が向上します。
| 特徴 | トレーニング后の量子化 (PTQ) | 量子化-Awareトレーニング (QAT) |
|---|---|---|
| 応募ステージ | 事前に訓練されたモデルに適用される | モデルトレーニングプロセスに直接組み込まれる |
| 再トレーニングが必要 | いいえ、再訓練する必要はありません | はい、量子化に適応するには長いトレーニング時間が必要です |
| 複雑さ | よりシンプルで高速に実装する | トレーニング中の量子化をシミュレートするため、より複雑 |
| 精度への影響 | 顕著な精度低下をもたらす可能性があります | 多くの場合、量子化された推論を最適化することにより、より良い精度を実現します |
- PTQを選ぶモデルを再トレーニングできない場合、または大幅な速度向上のためにわずかな精度低下が許容される場合。
- QATを選択精度が最優先事項であり、より長く、より複雑なトレーニングサイクルのためのリソースがある場合。
キャリブレーションデータセットの準備
PTQを実行するには、校正データセットを参照してください。これは、AMCTが使用する入力データ (例えば、画像) の小さな代表的な集合である。このデータをモデルで実行して、アクティベーション値の範囲を分析します。この情報は、あまり多くの情報を失うことなく、FP32値をINT8に変換するための最適なスケーリング係数を計算するのに役立ちます。
良好なキャリブレーションデータセットを作成することは、量子化を成功させるために重要である。
- 量を超える品質: 大量のデータセットは必要ありません。周りのセット1024多様でよく準備された画像しばしば十分です。単により多くの画像を使用することは必ずしも良いとは限りません。アンバランスまたは冗長なデータセットは、キャリブレーション統計を歪める可能性があります。これにより、量子化されたモデルは、実世界の推論中にパフォーマンスが低下する可能性があります。
- 表現はキーです: キャリブレーション画像は、モデルが本番で表示するさまざまなデータを反映する必要があります。さまざまな照明条件、オブジェクトサイズ、背景の画像を含めて、キャリブレーションプロセスの堅牢性を確保します。
適切に選択されたキャリブレーションセットは、YOLO/ResNetを最適化する際の効果的な量子化の基礎です。
Ascend Profilerによるプロファイリング
モデルを変換して量子化した後、そのパフォーマンスを測定する必要があります。アセンドプロファイラーは、残りのパフォーマンスのボトルネックを見つけるために使用するツールです。それはあなたのモデルがNPUで実行する方法の詳細な内訳を提供します。
プロファイラーのデータを使用して、重要な質問に答えることができます。
- どのオペレーターが最も時間をかけていますか?
- NPUではなくCPUで予期せず実行されている演算子はありますか?
- ホストとデバイスの間に非効率的なデータ移動はありますか?
Ascend Profilerには、この分析の2つの重要なコンポーネントがあります。
-
タイムライン分析: このビューでは、モデルの実行を低レベルで視覚的に表現できます。タイムライン上の各色のブロックは、オペレータの開始時間と継続時間を示します。で実行されている演算子を正確に確認できます。AICORE(メインNPU) 、AICPU、またはHOSTCPUを参照してください。これにより、実行時間の長い演算子を特定することができます。このタイムラインデータをJSONファイルとしてダウンロードし、次のようなツールで開くことができます。
Chrome: // トレースより深い外観のために。 -
オペレータ性能分析: このコンポーネントは高レベルの統計を提供します。演算子の実行時間をテーブルとチャートに表示し、期間で並べ替えます。どのオペレータータイプ (AICOREとAICPUなど) と、どの特定のオペレーターが最も時間を費やしているかをすばやく確認できます。これは、モデルのランタイムのかなりの部分がいくつかの遅い操作に費やされているかどうかを識別するのに最適です。
これら2つのビューを一緒に使用することで、パフォーマンスの問題を効果的に診断できます。たとえば、カスタムまたはサポートされていない演算子がHOSTCPUで実行されていることをプロファイラーが示している場合、そのためのカスタムTBE演算子を作成すると大幅なスピードアップが得られる可能性があります。
展開と影響
モデルを最適化しました。これで、HiSilicon NPUに展開します。この最終段階では、モデルを実行して実際の予測を行います。を使用します計算言語をAscend(AscendCL) ハードウェアと通信し、モデルの最終的なパフォーマンスを測定します。
AscendCLを使用したデバイスの初期化
まず、推論のためにNPUを設定する必要があります。これを行うにはAscendCLを使用します。Python Ascend Computing Language (pyACL) は、このプロセスを簡単にするPython APIライブラリです。Pythonコードから直接Ascend AIプロセッサを制御できます。
モデルを実行するための標準ワークフローは明確なシーケンスに従います:
- PyACLを初期化: PyACLライブラリを起動して、システムリソースを準備します。
- リソースの割り当て: アプリケーションに必要なランタイムリソースを確保します。
- データ転送: 画像などの入力データをデバイスのメモリに移動します。
- プロセスデータ: サイズ変更など、直前の画像変更を実行できます。
- モデルの実行: あなたはあなたの
を参照してください。Omモデル化し、推論プロセスを実行します。 - 割り当てを破棄する: 推論が完了すると、ランタイムリソースを解放します。
- PyACLを非初期化: すべてのリソースを解放するためにライブラリをシャットダウンします。
推論コードの書き込み
推論スクリプトは、これらすべてのステップをまとめます。このコードは、モデルをロードし、データをフィードし、予測を取得するエンジンです。
💡推論のためのpyACLの使用 The
PyACLライブラリは、このタスクのメインツールです。その機能を使用して、デバイスの管理、メモリの処理、ロードを参照してください。Omモデルを作成し、実行します。Python環境内の推論パイプライン全体を完全に制御できます。
スクリプトは、前処理された入力データをロードし、NPUに送信し、モデルの実行をトリガーしてから、モデルからの出力を処理します。
ベンチマーク性能
デプロイ後、モデルのパフォーマンスを測定する必要があります。これにより、モデルの実行速度がわかります。この評価には2つの重要なメトリックが不可欠です。
- レイテンシ: これは、モデルが1つの入力を処理するのにかかる時間で、ミリ秒 (ms) で測定されます。より低いレイテンシはより良いです。
- フレーム毎秒 (FPS): これは、モデルが1秒間に処理できる入力数を測定します。より高いFPSはよりよい。
これら2つのメトリックは直接関連しています。30 FPSで実行されるリアルタイムビデオアプリケーションの場合、モデルのレイテンシは33.3ms未満でなければなりません。を参照してください。他の重要なレイテンシメトリックも、より深い洞察を与えることができますを参照してください。
- 最初のトークンまでの時間: 最初の出力を取得するのにかかる時間。
- 総生成時間: 入力からフル出力までのエンドツーエンド時間。
これらの数値を測定すると、最適化作業が成功したことを確認できます。🚀
NPU最適化のための完全なワークフローをマスターしました。このガイドは、4つの重要な段階を説明しました。
- モデルの準備
- ATC変換
- 量子化チューニング
- AscendCLデプロイ
この構造化されたプロセスに従うことは、コンピュータビジョンモデルの完全なパフォーマンスのロックを解除するための鍵ですHiSiliconハードウェアを参照してください。
今、あなた自身のプロジェクトにこれらのテクニックを適用してください! 詳細については、CANNの公式ドキュメントまたはコミュニティフォーラムを参照してください。頑張って!🚀
よくある質問
PTQとQATの主な違いは何ですか?
トレーニング後の量子化 (PTQ) を既にトレーニング済みのモデルに適用します。それは速いですが、精度を下げることができます。トレーニングプロセスでは、QAT (Quantization-Aware Training) を使用します。この方法には時間がかかりますが、精度を高く保つことがよくあります。
ONNXが変換に適した形式なのはなぜですか?
ONNXをユニバーサル形式として使用します。Ascend Tensor Compiler (ATC) はONNXファイルを理解します。これにより、PyTorchのようなフレームワークからモデルを簡単に変換できます。を参照してください。OmNPUが実行できる形式です。
ATC変換が失敗した場合はどうすればよいですか?
ATC障害は、多くの場合、モデルにサポートされていない演算子があることを意味します。まず、エラーログの手がかりを確認します。この問題を解決するには、Tensor Boost Engine (TBE) を使用してカスタム演算子を作成する必要があります。⚙️
校正データセットにはいくつの画像が必要ですか?
何千もの画像は必要ありません。多くの場合、約1024枚の画像の多様なセットで十分です。重要なのは品質であり、量ではありません。キャリブレーションデータは、モデルが本番で表示するものを表す必要があります。





