|
| |
| 開発元 | Linux Foundation(Facebook, Microsoftが開始) |
|---|---|
| 初版 | 2017年9月7日 |
| 最新版 |
v1.19.0
/ 2025年8月27日 |
| リポジトリ | onnx - GitHub |
| 種別 | 人工知能 機械学習 |
| ライセンス | Apache License 2.0 |
| 公式サイト |
onnx |
| 開発元 | マイクロソフト |
|---|---|
| 初版 | 2018年11月30日 |
| 最新版 |
v1.23.0
/ 2025年9月26日 |
| リポジトリ | onnxruntime - GitHub |
| プログラミング 言語 | Python, C++, C#, C言語, Java, JavaScript, Objective-C, WinRT |
| 対応OS | Windows, Linux, macOS, Android, iOS, ウェブブラウザ |
| プラットフォーム | 多数(本記事参照) |
| ライセンス | MITライセンス |
| 公式サイト |
onnxruntime |
Open Neural Network Exchange(略称:ONNX、読み:オニキス、オニックス)とは、オープンソースで開発されている機械学習や人工知能のモデルを表現する為の代表的なフォーマットである。実行エンジンとしてONNX Runtimeも開発されている。
機械学習、特にニューラルネットワークモデルは様々なフレームワーク上で学習され、また様々なハードウェア上で実行(推論)される。各環境に特化したモデルは他のフレームワーク・ハードウェアで利用できず相互運用性を欠いてしまう。また実装者は環境ごとにサポートをおこなう必要があり大きな労力を必要とする。
ONNXはモデルを記述する統一インターフェース(フォーマット)を提供し、これらの問題を解決する。各フレームワークは学習したモデルをONNX形式で出力する。各ハードウェアはONNX実行環境を提供することで、どのフレームワークで学習されたかを問わずモデル推論を実行する。このように相互運用可能なモデルフォーマットとしてONNXは開発されている。
以下の特性を補完する意図にて開発が進められた。
開発工程や機械学習の高速処理、ネットワークの基本設計における柔軟性やモバイルデバイスでの推論などの特定の段階において、開発者が複数のフレームワークでのデータのやり取りを簡単に行えるようにする。
ハードウェアベンダーなどは、ONNXを対象に調整を行うことで、複数のフレームワークにおけるニューラルネットワークのパフォーマンスを一度に改善することができる。
2017年9月に、FacebookとMicrosoftは、PyTorchやCaffe2などの機械学習フレームワーク間において相互運用を可能にする為の取り組みとして、このプロジェクトを始動した。その後、IBM、Huawei、Intel、AMD、ARM、Qualcommがこの取り組みに対して積極的な支援を表明した。
2017年10月に、MicrosoftはCognitive ToolkitおよびProject Brainwaveプラットフォームにおいて、ONNXのサポートを発表した。
2019年11月14日、ONNXはLinux Foundation AIの卒業プロジェクト(graduate project)に移行したことを発表した。
ONNXは、推論(評価)に焦点を当て、拡張可能な計算グラフモデル、組み込み演算子、および標準データ型の定義を提供する。
それぞれのデータフローグラフは、有向非巡回グラフを形成するノードのリストになっている。ノードには入力と出力があり、各ノードが処理を呼び出すようになっている。メタデータはグラフを文書化する。組み込み演算子は、ONNXをサポートする各フレームワークで利用可能である。
グラフは Protocol Buffers を使用して拡張子 .onnx のバイナリファイルとして保存可能である。このファイルは様々な機械学習のライブラリから読み書き可能である。
ONNX仕様は2つのサブ仕様、IRとOperatorからなる。この2つの仕様はそれぞれバージョニングされており、ONNX仕様のバージョンはこの2つのサブ仕様の特定版を指定したものとなっている。2021-12-22現在の最新バージョンは version 1.10.2 であり、これはIR v8とOperator v15-v2-v1 から成る。
Open Neural Network Exchange Intermediate Representation (ONNX IR) はONNXの基本データ型と計算グラフを定義するサブ仕様である。ONNX IRは計算グラフを構成する Model, Graph, Node 等の要素、入出力 Tensor, Sequence, Map およびデータ FLOAT, INT8, BFLOAT16 等の基本データ型を定義する。2021-12-22現在の最新バージョンは version 8 である。
ONNX IRが定義する要素として以下が挙げられる。
Graph: 計算グラフを表現する要素。Graph入出力を指定するinput/initializer/output、計算ノード群を指定するnode、メタデータを収納するname/doc_string/value_info、の属性をもつ。Node: 計算ノードを表現する要素。Node入出力を指定するinput/output、演算子とそのパラメータを指定するdomain/op_type/attribute、メタデータを収納するname/doc_string/value_info、の属性をもつ。すなわちGraphに収納された各Nodeが入出力をもった演算 (例: Conv) になっており、Node/Graph入出力名に基づいてNode群がグラフ構造を取っている。
ONNX IRはONNX Operatorで定義される標準演算子に追加して、独自の拡張演算子を受け入れられるように設計されている。これによりONNXの "Extensible/拡張可能" 特性を実現している。拡張演算子セットを Model の opset_import 属性に指定することで実行エンジン側へ拡張演算子の利用を通知する仕組みである。ONNXを受け取った実行エンジンは opset_import を確認し、指定された演算子セット全てをサポートしていれば受け入れ、そうでなければ Model 全体を拒絶する。
ONNXのビルトイン演算子はサブ仕様 Operator specifications により定義される。3種類の演算子セット(Opset)ai.onnx, ai.onnx.ml, ai.onnx.training が定義されており、ai.onnx がデフォルトである。2022年12月12日現在、ai.onnx の最新バージョンは version 18 である。
例えばOpset ai.onnx v15ではRNN系演算子として RNN 、LSTM 、GRU が定義されている。
ONNXは入出力の量子化やそれに対する操作を演算子として持つ。QuantizeLinearはスケール・シフトパラメータに基づく線形量子化をおこなう。DynamicQuantizeLinearは入力ベクトルのmin/maxに基づく動的uint8量子化をおこなう。int8入力に対する演算にはMatMulInteger、QLinearMatMul、ConvInteger、QLinearConvなどがある。
ONNX Runtime (略称: ORT) は様々な環境におけるONNXモデルの推論・学習高速化を目的としたオープンソースプロジェクトである。フレームワーク・OS・ハードウェアを問わず単一のRuntime APIを介してONNXモデルを利用できる。またデプロイ環境に合わせた最適化を自動でおこなう。ONNX Runtimeは設計方針としてアクセラレータ・ランタイム抽象化とパフォーマンス最適化の両立を掲げており、ONNXモデルの自動分割と最適アクセラレータによるサブモデル実行によりこれを実現している。
ONNX Runtimeがサポートする最適化には以下が挙げられる。
ONNX Runtime は共有ライブラリの実行プロバイダ(Execution Provider, EP)によって多数のバックエンドをサポートしている。これにはIntel の OpenVINO バックエンド (onnxruntime-openvino) 及び oneDNN バックエンド、NVIDIAの CUDA バックエンド (onnxruntime-gpu) 及び TensorRT バックエンド (onnxruntime-gpu)、AMDの ROCm バックエンド及び MIGraphX バックエンド、Windows の DirectML バックエンド (onnxruntime-directmlなど)、macOS / iOS の CoreML バックエンド、Android の NNAPI バックエンド、Microsoft Azure向けの Azure バックエンドなどが存在する。
以下のデバイスがONNX Runtimeに対応している。
主要なデバイスとしては Google の TPU, Edge TPU、AWS の Trainium, Inferentia が対応していない。Edge TPU は LiteRT のみだが、それ以外のデバイスは、JAX、TensorFlow、PyTorch に対応しているので、これらに変換することで動作し、AWS は Trainium, Inferentia は PyTorch 経由の動作を薦めている。
ONNX Runtime Webはウェブブラウザを含めたJavaScript上で動作するONNX Rutime。Execution Providerとして、Web Neural Network (WebNN)、WebGPU、WebGL、WebAssemblyが利用可能である。WebNNはONNXのようにニューラルネットワークのモデルを表現できるので、GPUやNPUなどのアクセラレーションが有効であれば、これが最速である。WindowsではWebNNからDirectML経由でGPUやNPUで実行される。
Windows ML は、マイクロソフトが開発している、Windows 上で ONNX Runtime の実行プロバイダ(EP)を自動的に選択するライブラリ。Windows 11 24H2 以降に標準搭載されていて、Windows ML には ONNX Runtime も同梱されている。2025年5月に発表され、2025年9月に正式リリースされた。同時期に2025年7月に DirectML の開発終了が発表され、ニューラルネットワークの Windows 上での実行は、ONNX Runtime → Windows ML の実行プロバイダの自動選択 → CPU・GPU・NPU各社の実行プロバイダ という呼び出しの流れとなった。Google Chrome の Windows 版には ONNX Runtime backend for WebNN が搭載されているが、WebNN の実行もこの流れになる。
ONNXのモデルはPythonスクリプトから生成したり(#例を参照)、他のフレームワークから変換したりすることで作ることができる。他のフレームワークからの変換には以下のような方法が存在する:
ONNXのモデル集としては以下が存在する。
線形回帰モデルの学習結果として が得られたとして、それを ONNX ファイルに保存する Python での実装例。
import numpy as np
import onnx
from onnx import TensorProto, numpy_helper
from onnx.helper import make_model, make_node, make_graph, make_tensor_value_info
A = numpy_helper.from_array(np.array(2.0), "A")
B = numpy_helper.from_array(np.array(3.0), "B")
X = make_tensor_value_info("X", TensorProto.DOUBLE, [])
Y = make_tensor_value_info("Y", TensorProto.DOUBLE, [])
graph = make_graph([
make_node("Mul", ["A", "X"], ["AX"]),
make_node("Add", ["AX", "B"], ["Y"]),
], "Linear Regression", [X], [Y], [A, B])
onnx.save(make_model(graph), "2x_3.onnx")
それを ONNX Runtime を使い実行する Python での実装例。
import numpy as np
import onnxruntime as ort
ort_sess = ort.InferenceSession("2x_3.onnx")
y = ort_sess.run(None, {"X": np.array(4.0)})[0]
opset_import property in a model that depends on the extension operators." Open Neural Network Exchange Intermediate Representation (ONNX IR) Specification. onnx/onnx