7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【第1回】ONNXってなんだ? - AIモデルの「共通言語」が誕生した理由

7
Posted at

ねらい

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によって発表された。)

出典: Wikipedia - Open Neural Network Exchange

面白いことに、元々の名前は「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の最初のバージョンがプロダクション対応になったことを発表できることを嬉しく思います。)

出典: Meta Engineering Blog - ONNX V1 released

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 Learn - ONNX Runtime

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など、ハードウェアアクセラレータのための抽象化レイヤーも提供している。)

出典: Microsoft Open Source Blog

モデルを変更せずに、ハードウェアだけ差し替えて高速化できる。これは本番運用において非常にありがたい。


対応フレームワーク

現在、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変換で失敗するのか」「どうすれば解決できるか」がわかるようになる。

お楽しみに。


参考文献

7
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?