ONNX (Open Neural Network Exchange)
ONNXは、学習済みモデルを標準演算子のグラフとして保存するオープンフォーマットです。そのため、PyTorchで学習したモデルをさまざまなランタイムで実行できます。
ONNX(オープンニューラルネットワーク交換)は、機械学習モデル用のオープン標準ファイル形式です。.onnxファイルは、標準オペレーターの計算グラフと重みを組み合わせて学習済みモデルを保存するため、PyTorchなど、あるフレームワークでトレーニングしたモデルを、さまざまなランタイムや多様なハードウェアで実行できます。FacebookとMicrosoftは2017年9月にONNXを立ち上げました。2019年11月以降、Linux FoundationのAI部門であるLF AI & Dataの卒業プロジェクトとなっています。ONNXは通常、トレーニングからモデルデプロイへの受け渡しに使われます。エクスポートした1つのファイルを、ONNX Runtime、TensorRT、OpenVINO、および多くのエッジAIアクセラレーターのコンパイラーで使用できます。
ONNXファイルの内容#
ONNXモデルはProtocol Buffersでシリアライズされ、次の4つの要素を含みます。
- グラフ:
Conv、MatMul、Reluなどのオペレーターを呼び出すノードが、名前付きテンソルで接続されています。グラフの入力と出力にはデータ型と形状があり、各次元は固定値にも、可変バッチサイズなどのシンボリック値にもできます。 - イニシャライザー: 学習済み重みです。Protocol Buffersでは単一ファイルの上限が2 GBのため、大きなモデルでは重みを
.onnxファイルと同じ場所にある外部データファイルに保存します。 - Opsetバージョン: オペレーターはopsetごとにバージョン管理されており、ランタイムはモデルのエクスポート時に使用したopsetをサポートしている必要があります。新しいopsetは、古いオペレーターを変更せずに新しいオペレーターを追加します。たとえば、opset 23では
Attentionオペレーターが追加されました。 - メタデータ: プロデューサー名、モデルバージョン、クラス名などのカスタムなキーと値のペアです。
2つ目のオペレータードメインであるONNX-MLは、ツリーアンサンブルや線形分類器などの従来型モデルを対象としています。そのため、skl2onnxやonnxmltoolsなどのコンバーターを使って、scikit-learn、LightGBM、XGBoostのモデルを同じ形式にエクスポートできます。Netronなどのビューアーでは、グラフをノードごとに表示できます。実際には、ONNXは多くのトレーニングフレームワークと多数のランタイムの間に位置します。
ONNXモデルの実行#
Microsoftのオープンソース推論エンジンであるONNX Runtimeは、サーバー、デスクトップ、スマートフォン、ブラウザーでONNXファイルを実行します。モデルの読み込み時に、定数畳み込みや、畳み込みとその後に続くバッチ正規化の融合など、グラフの最適化を行います。その後、グラフの各部分を、使用するハードウェア向けの実行プロバイダーに渡します。たとえば、NVIDIAのGPUではCUDAまたはTensorRT、IntelハードウェアではOpenVINO、Windows GPUではDirectML、AppleデバイスではCore ML、QualcommのNPUではQNN、ブラウザーではWebGPUを使用します。Microsoftのローカル推論フレームワークであるWindows MLはONNX Runtime上で動作します。TensorRTやOpenVINOなどの他のエンジンは、ONNXファイルを読み込んで独自の形式にコンパイルします。
Ultralytics YOLO26はmodel.export(format="onnx")を使用してONNXにエクスポートされ、UltralyticsのTensorRTエクスポートは同じONNXファイルからエンジンを構築します。エクスポートしたファイルはPyTorchなしでONNX Runtime上で実行できます。
import onnxruntime as ort
from ultralytics import YOLO
# シンボリックなバッチ、高さ、幅の次元を指定してYOLO26nをONNXにエクスポートする
model = YOLO("yolo26n.pt")
onnx_path = model.export(format="onnx", dynamic=True)
# PyTorchもUltralyticsも不要なONNX Runtimeでグラフを読み込む
session = ort.InferenceSession(onnx_path, providers=["CPUExecutionProvider"])
for tensor in session.get_inputs() + session.get_outputs():
print(tensor.name, tensor.shape)グラフの入力images(シンボリックなバッチ、高さ、幅の次元)と、生の予測出力output0が出力されます。これが、あらゆるONNXランタイムでモデルに入力を渡し、結果を読み取るために使用するシグネチャです。
ONNXと関連フォーマットおよびツール#
- ONNX Runtime: ONNXファイルを実行する推論エンジンです。Microsoft主導の別プロジェクトであり、一般に「ONNX」と略されることがあります。
- TensorRT: NVIDIAのコンパイラです。ONNXファイルを、特定のGPUタイプとTensorRTバージョンに最適化されたエンジンに変換するため、チームは移植可能なソースとしてONNXファイルを保持し、ターゲットごとにエンジンを再構築します。
- PyTorchフォーマット:
.ptチェックポイントとsafetensorsファイルは、モデルを再構築するコード用の重みを保存します。TorchScriptとtorch.exportは、PyTorch独自のランタイム向けにグラフを記録します。 - その他のデプロイフォーマット: OpenVINO IR、LiteRTの
.tfliteファイル、Core MLパッケージ、量子化LLM向けのGGUFファイルは、それぞれ特定のランタイムを対象としています。AppleのcoremltoolsはPyTorchモデルを直接変換し、バージョン6でONNX入力を廃止しました。
実際のアプリケーション#
- クロスプラットフォームアプリ: 1つのONNXファイルで、Linuxサーバー、Windows MLを介したWindowsアプリ、ONNX Runtime Mobileを介したAndroidおよびiOSアプリに対応できます。
- ブラウザーでの推論: ONNX Runtime WebはWebGPUまたはWebAssemblyを使用してユーザーのデバイス上でモデルを実行するため、姿勢推定などの機能で使用するカメラフレームがブラウザーの外に出ることはありません。
- エッジアクセラレーター: Hailo、Qualcomm、Rockchipなどのベンダーが提供するNPUツールチェーンは、入力としてONNXモデルを受け取り、チップ向けにコンパイルします。多くの場合、量子化してINT8に変換します。
- 本番環境での古典的なモデル: ONNXに変換された勾配ブースティング木やscikit-learnパイプラインは、ONNX Runtimeを介してC#、Java、C++のサービスで実行でき、サービング経路にPythonインタープリターは不要です。










