グラフ手術
ほとんどのモデルは、その演算子とテンソルの形状が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のサポートに関する知識が必要です。
グラフを修正する
グラフの編集を行う場合は、以下のワークフローを使用してください。
- Model Compiler を使用して、モデルをコンパイルします。
- MLAにマッピングされないレイヤーを特定します。SiMa IRグラフを保存し、確認します。 Netron で詳細なログを有効にするか、Model Compiler の詳細なログ記録を有効にします。
- 特定されたレイヤーを修正します。もしそのレイヤーがモデル全体にわたって存在する場合、 まずモデルを分割し、次にセクションごとに変更を加えます。
- 変更したモデルを保存します。モデルを分割した場合は、変更したモデルを結合してください。 サブグラフ。
- 元のモデルと修正したモデルを使用して推論を実行し、その結果を比較してください。 出力。
- 変更されたモデルを、Model Compiler を使用してコンパイルしま す。
- MLAの完全なカバレッジが有効な状態でコンパイルを実行し、単一の
.elfファイルが生成されることを確認してください。 それが目標です。
Reshape、Slice、Concat、およびTransposeなどのデータのリシェイプに関する変更の場合、元の出力と変更後の出力は数値的に一致する必要があります。変更によって計算の順序が変更される場合、完全に一致することは期待されません。そのような場合は、数値的な差とモデルレベルの精度を評価してください。
MLA演算子のサポートについては、モデル互換性を参照してください。
ONNX グラフ構造を確認してください。
ONNXは、Protocol Buffersをベースとしたオープン仕様です。ONNXモデルには、以下のものが含まれます。
- 拡張可能な計算グラフモデル
- 標準データ型
- 組み込み演算子
グラフモデルとデータ型は、ONNX 中間表現(IR)を構成します。組み込み演算子は、OPSET仕様によって定義されます。

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との互換性
- モデルの一貫性
グラフの変更操作後、および変更されたモデルをディスクに保存する前に、必ずモデルチェッカーを実行してください。
以下の最終的な検証ワークフローを使用してください。
- ONNX モデルを読み込みます。
- グラフの構造を変更します。
- 既存の推論形状情報を削除します。
- 変更されたモデルを
onnx.checker.check_modelを使用して検証します。 - 変更したモデルを保存します。
- 変更されたモデルの精度を確認してください。