ねらい
ONNXとは何か、なぜ生まれたのか、何ができるようになるのかを理解する。
対象
- 「ONNX」という単語を聞いたことがあるけど、よくわからない人
- PyTorchやTensorFlowでモデルを作ったことがある人
- モデルのデプロイに興味がある人
ゴール
- ONNXの基本概念を説明できるようになる
- ONNXが解決する問題を理解する
- 自分のプロジェクトでONNXが役立つかどうか判断できるようになる
TL;DR
- ONNXは機械学習モデルの「共通フォーマット」
- 2017年にFacebook(現Meta)とMicrosoftが共同で発表
- PyTorchで訓練 → ONNXに変換 → TensorFlowやC++で推論、ができる
- 推論の高速化・デプロイの柔軟性向上に効果的
ONNXとは何か
まず、公式の定義を見てみよう。
ONNX is an open format built to represent machine learning models. ONNX defines a common set of operators - the building blocks of machine learning and deep learning models - and a common file format to enable AI developers to use models with a variety of frameworks, tools, runtimes, and compilers.
(ONNXは機械学習モデルを表現するために構築されたオープンフォーマットである。ONNXは、機械学習およびディープラーニングモデルの構成要素である共通のオペレータセットと、AI開発者がさまざまなフレームワーク、ツール、ランタイム、コンパイラでモデルを使用できるようにする共通のファイルフォーマットを定義している。)
出典: ONNX公式サイト
要するに、ONNXは機械学習モデルの「共通言語」 だ。
人間の世界に例えるなら、英語のような存在。日本語話者とフランス語話者が直接会話するのは難しいが、お互いが英語を話せれば意思疎通ができる。ONNXはまさに、機械学習フレームワーク間の「英語」として機能する。
なぜONNXが生まれたのか
フレームワーク乱立時代の悩み
2017年頃、機械学習の世界はまさに戦国時代だった。
- TensorFlow(Google)
- PyTorch(Facebook)
- Caffe/Caffe2(Berkeley/Facebook)
- CNTK(Microsoft)
- MXNet(Apache/AWS)
それぞれに強みがあり、研究者や開発者は用途に応じて使い分けていた。しかし、ここで深刻な問題が生じる。
「PyTorchで訓練したモデルを、TensorFlow Servingでデプロイしたい」
こんな要望に応えるのが、とてつもなく面倒だったのだ。モデルのアーキテクチャを一から再実装し、重みを変換し、動作確認して...考えるだけで気が滅入る。
FacebookとMicrosoftの決断
この状況を打破すべく、2017年9月、FacebookとMicrosoftが手を組んだ。
ONNX was originally named Toffee and was developed by the PyTorch team at Facebook. In September 2017 it was renamed to ONNX and announced by Facebook and Microsoft.
(ONNXはもともとToffeeという名前で、FacebookのPyTorchチームによって開発された。2017年9月にONNXと改名され、FacebookとMicrosoftによって発表された。)
面白いことに、元々の名前は「Toffee」(タフィー/キャラメルの一種)だったらしい。甘い名前だったのに、なぜか堅い「Exchange」になってしまった。命名センスの問題は置いておこう。
一気に広がる支持
発表後、業界の反応は素早かった。
同年12月には、AWSも加わりバージョン1.0がリリース。その後、IBM、Huawei、Intel、AMD、Arm、Qualcomm、NVIDIAといった錚々たる企業が次々とサポートを表明した。
Today Facebook, AWS, and Microsoft are excited to announce that with the support of the community and new partners the first version of ONNX is now production-ready.
(本日、Facebook、AWS、Microsoftは、コミュニティと新しいパートナーのサポートにより、ONNXの最初のバージョンがプロダクション対応になったことを発表できることを嬉しく思います。)
2019年11月には、Linux Foundation AI & Dataのgraduate projectとして正式に受け入れられ、中立的なガバナンス体制の下で開発が続けられている。
ONNXで何ができるようになるか
1. フレームワーク間の相互運用
これがONNXの最大の価値だ。
PyTorchで訓練 → ONNX形式でエクスポート → TensorFlowで読み込み
こんなワークフローが可能になる。研究開発はPyTorchの柔軟性を活かし、本番環境ではTensorFlow Servingの安定性を使う、といった使い分けができる。
2. 推論の高速化
ONNX Runtimeという高性能な推論エンジンを使うことで、元のフレームワークよりも高速な推論が可能になることがある。
High-scale Microsoft services such as Bing, Office, and Azure AI use ONNX Runtime. Although performance gains depend on many factors, these Microsoft services average a 2x performance gain on CPU because they use ONNX.
(Bing、Office、Azure AIなどのMicrosoftの大規模サービスはONNX Runtimeを使用している。パフォーマンスの向上は多くの要因に依存するが、これらのMicrosoftサービスはONNXを使用することでCPUで平均2倍のパフォーマンス向上を達成している。)
Microsoftの主要サービスで平均2倍の高速化。これは無視できない数字だ。
3. デプロイ先の多様化
ONNXモデルは、様々な環境で実行できる。
- クラウド: AWS、Azure、GCP
- エッジ: NVIDIA Jetson、Raspberry Pi
- モバイル: iOS、Android
- ブラウザ: WebAssembly経由
一度ONNXに変換してしまえば、デプロイ先の選択肢が一気に広がる。
4. ハードウェアアクセラレーション
ONNX Runtimeは、様々なハードウェアアクセラレータをサポートしている。
ONNX Runtime also provides an abstraction layer for hardware accelerators, such as Nvidia CUDA and TensorRT, Intel OpenVINO, Windows DirectML, and others.
(ONNX Runtimeは、NVIDIA CUDAやTensorRT、Intel OpenVINO、Windows DirectMLなど、ハードウェアアクセラレータのための抽象化レイヤーも提供している。)
モデルを変更せずに、ハードウェアだけ差し替えて高速化できる。これは本番運用において非常にありがたい。
対応フレームワーク
現在、ONNXは主要なほぼすべてのフレームワークをサポートしている。
ONNXへエクスポート可能
| フレームワーク | 変換方法 |
|---|---|
| PyTorch |
torch.onnx.export() (公式サポート) |
| TensorFlow | tf2onnx |
| Keras |
tf2onnx または keras2onnx
|
| scikit-learn | sklearn-onnx |
| XGBoost | onnxmltools |
| LightGBM | onnxmltools |
| Caffe2 | 公式サポート |
ONNXから読み込み可能
| ランタイム/フレームワーク | 備考 |
|---|---|
| ONNX Runtime | 公式推奨、最も高速 |
| TensorFlow |
onnx-tf で変換 |
| Caffe2 | 公式サポート |
| CoreML (Apple) |
coremltools で変換 |
| TensorRT (NVIDIA) | 公式サポート |
| OpenVINO (Intel) | 公式サポート |
ONNXの発音
地味だけど気になる人も多いはず。
公式によると、「オニックス」 と発音する。宝石のオニキス(onyx)と同じ発音だ。「オンエヌエヌエックス」と読んでいた人(私含む)は、今日から堂々と「オニックス」と言おう。
まとめ
- ONNX = Open Neural Network Exchange
- 機械学習モデルのオープンな共通フォーマット
- 2017年にFacebook + Microsoftが共同発表
- フレームワーク間の壁を取り払うことが主目的
- ONNX Runtimeによる推論高速化も大きなメリット
- 現在はLinux Foundation AI & Data傘下で開発継続中
次回予告
第2回では、ONNXモデルの内部構造に踏み込む。計算グラフ、オペレータ、opset versionといった概念を理解することで、「なぜONNX変換で失敗するのか」「どうすれば解決できるか」がわかるようになる。
お楽しみに。
参考文献
- ONNX公式サイト: https://onnx.ai/
- Wikipedia - Open Neural Network Exchange: https://en.wikipedia.org/wiki/Open_Neural_Network_Exchange
- Meta Engineering Blog: https://engineering.fb.com/2017/12/08/ml-applications/onnx-v1-released/
- Microsoft Learn - ONNX: https://learn.microsoft.com/en-us/azure/machine-learning/concept-onnx