メインコンテンツまでスキップ

グラフ手術

ほとんどのモデルは、その演算子とテンソルの形状がModel Compilerでサポートされている場合、直接コンパイルできます。モデルを変更する前に、モデル互換性リストを確認し、まず標準のコンパイルフローを試してください。

グラフ手術は、モデルをクリーンにコンパイルしたり、SiMaデバイス上で効率的に実行するために、特定のグラフ変更が必要な場合の高度なステップです。元のPythonモデルコードでそれらの変更を行い、モデルを再度エクスポートするか、エクスポートされたONNXグラフを直接編集できます。

SDKには、CodexとClaude用の事前に構築されたsima-model-surgeryスキルが付属しています。エージェントにモデルを検査させると、互換性をチェックし、必要なグラフの編集を提案および適用し、結果を検証し、モデルを次のコンパイル試行に備えることができます。このスキルは、特にYOLOモデルで役立ちます。グラフ手術によって、コンパイラの互換性を向上させ、SiMaランタイム用にモデルの出力を最適化できます。

たとえば、次のように質問します。

Use the sima-model-surgery skill to inspect my YOLO model, optimize unsupported
graph sections, and validate the modified model.

グラフ手術を理解する​

グラフ手術は、ニューラルネットワークの計算グラフの構造を変更します。モデルに対して量子化、コンパイル、またはデプロイメントの前に、特定の変更を加える必要がある場合に利用します。

一般的な理由としては、以下のようなものがあります。

  • 事前に学習済みのモデルをカスタマイズします。
  • Model Compiler でサポートされていない演算子を別のものに置き換えてください。
  • 効率的なコンパイルを妨げるグラフ演算を再構成または書き換えます。
  • モデルのグラフを最適化し、より多くのモデル処理をMLAで実行できるようにします。
  • 特定のデバイスや展開環境の制約に合わせて、モデルを調整します。

変更を適用する場所を選択してください。​

Model Compilerは、追加の演算子のサポートを含めて、定期的に更新されます。 一部のモデルでは、すべてのレイヤーがMLAで実行される前に、またはモデルが目標とするパフォーマンスに達する前に、グラフの修正が必要な場合があります。

可能な場合は、エクスポートされたモデルを生成したPyTorchまたはTensorFlowモジュールなど、ソースモデルコードで変更を行ってください。ソースレベルでの書き換えは、通常、レビュー、テスト、および保守が容易です。

ソースレベルでの変更が現実的でない場合は、エクスポートされたONNXグラフを直接編集します。このページの残りの部分は、ONNXグラフ構造に焦点を当てます。なぜなら、ONNXは、Model Compilerによって使用される交換フォーマットだからです。

たとえば、4次元でないテンソルを4次元に再形成したり、サポートされていない演算子をサポートされている代替演算子に置き換えたりすることができます。

Model Compilerには、sima-utilsパッケージが含まれています。グラフを変更する前に、ONNXヘルパーモジュールをインポートしてください。

from sima_utils.onnx import onnx_helpers as oh

Model Compiler API に関する情報は、のAFE API リファレンス を参照してください。

MLAの対象範囲を分析する。​

SiMa MLSoC 以下の実行バックエンドを使用します。

  • 現代言語協会
  • CVU(EV74)
  • APU(A65)

コンパイル中に、Model Compiler は、可能な限り、MLA(Machine Learning Accelerator)に演算子を割り当てます。MLAで実行できない演算子は、CVU(Computer Vision Unit)またはAPU(Application Processing Unit)にマッピングされます。これにより、モデルが複数のMLAセグメントに分割され、複数の.elfファイルが生成される可能性があります。

最高のパフォーマンスを得るには、モデルを修正して、より多くの部分をMLAで実行するようにします。モデル全体がMLAにマッピングされる場合、コンパイルによって単一の.elfファイルが生成されます。

まず、MLAにマッピングされないレイヤーを特定します。次に、どの演算子を置き換えるか、または再構成するかを決定します。これには、Model Compiler の出力と、ML演算子、DSP(Digital Signal Processing)処理、およびMLAのサポートに関する知識が必要です。

グラフを修正する​

グラフの編集を行う場合は、以下のワークフローを使用してください。

  1. Model Compiler を使用して、モデルをコンパイルします。
  2. MLAにマッピングされないレイヤーを特定します。SiMa IRグラフを保存し、確認します。 Netron で詳細なログを有効にするか、Model Compiler の詳細なログ記録を有効にします。
  3. 特定されたレイヤーを修正します。もしそのレイヤーがモデル全体にわたって存在する場合、 まずモデルを分割し、次にセクションごとに変更を加えます。
  4. 変更したモデルを保存します。モデルを分割した場合は、変更したモデルを結合してください。 サブグラフ。
  5. 元のモデルと修正したモデルを使用して推論を実行し、その結果を比較してください。 出力。
  6. 変更されたモデルを、Model Compiler を使用してコンパイルします。
  7. MLAの完全なカバレッジが有効な状態でコンパイルを実行し、単一の.elfファイルが生成されることを確認してください。 それが目標です。

Reshape、Slice、Concat、およびTransposeなどのデータのリシェイプに関する変更の場合、元の出力と変更後の出力は数値的に一致する必要があります。変更によって計算の順序が変更される場合、完全に一致することは期待されません。そのような場合は、数値的な差とモデルレベルの精度を評価してください。

MLA演算子のサポートについては、モデル互換性を参照してください。

ONNX グラフ構造を確認してください。​

ONNXは、Protocol Buffersをベースとしたオープン仕様です。ONNXモデルには、以下のものが含まれます。

  • 拡張可能な計算グラフモデル
  • 標準データ型
  • 組み込み演算子

グラフモデルとデータ型は、ONNX 中間表現(IR)を構成します。組み込み演算子は、OPSET仕様によって定義されます。

 ONNX IR階層

ONNX グラフは、モデルの計算を定義します。これには、入力と出力を通じて有向非巡回グラフを形成するノードが含まれます。これは、他の深層学習フレームワークにおける「ネットワーク」または「グラフ」と同等です。

ONNX グラフエンティティは、名前によって参照されます。

  • 値の名前には、グラフの入力、グラフの出力、ノードの入力、ノードの出力などが含まれます。 および定数。
  • ノード名は、別の名前空間を使用します。
  • あるノードの出力と別のノードの入力が同じものを参照する場合、グラフのエッジが存在します。 同じ値を持つ名前。

グラフのフィールドにアクセスします。​

モデルを読み込んだ後、以下の方法でグラフレベルのフィールドにアクセスします。

  • model.graph.node:ノード
  • model.graph.input: グラフへの入力
  • model.graph.output: グラフの出力
  • model.graph.initializer: 定数

グラフ全体のコンポーネントを削除、変更、または追加できます。

ノードレベルのフィールドには、以下からアクセスできます。

  • node.name:ノード名
  • node.op_type:演算子の種類
  • node.input: ノードの入力
  • node.output: ノードの出力
  • node.attribute:ノード属性

ノードレベルのコンポーネントを削除、変更、または追加できます。

変更されたモデルを検証する。​

ONNXファイルは、protobufメッセージです。protobufメッセージを読み書きできるツールであれば、どのツールでもこのファイルの内容を確認できます。ONNXモデルを検証するには、onnx.checker.check_modelを使用します。

モデルチェッカーは、以下の項目を検証します。

  • IRバージョンの互換性
  • OPSETとの互換性
  • モデルの一貫性

グラフの変更操作後、および変更されたモデルをディスクに保存する前に、必ずモデルチェッカーを実行してください。

以下の最終的な検証ワークフローを使用してください。

  1. ONNX モデルを読み込みます。
  2. グラフの構造を変更します。
  3. 既存の推論形状情報を削除します。
  4. 変更されたモデルを onnx.checker.check_model を使用して検証します。
  5. 変更したモデルを保存します。
  6. 変更されたモデルの精度を確認してください。