ONNX と Azure Machine Learning
この記事では、Open Neural Network Exchange (ONNX) が機械学習モデルの推論の最適化にどのように寄与するかについて説明します。 推論 (つまりモデル スコアリング) は、デプロイされたモデルを使用して実稼働データに対して予測を生成するプロセスです。
推論用に機械学習モデルを最適化するには、ハードウェア機能を最大限に活用するためにモデルと推論ライブラリを調整する必要があります。 クラウドやエッジ、CPU、GPU などのさまざまなプラットフォームで最適なパフォーマンスを引き出そうとすると、それぞれのプラットフォームで機能や特性が異なるため、このタスクは複雑になります。 さまざまなプラットフォーム上でさまざまなフレームワークのモデルを実行する必要がある場合、さらに複雑さが増します。 異なるフレームワークとハードウェアの組み合わせをすべて最適化するには、時間がかかる場合があります。
便利なソリューションとしては、好みのフレームワークでモデルを 1 回トレーニングし、その後 ONNX にエクスポートまたは変換して、クラウドまたはエッジ上の任意の場所で実行できるようにすることです。 ONNX は、機械学習モデルを表現するためのオープン スタンダードとして、Microsoft とパートナー コミュニティによって作成されました。 多くのフレームワークのモデルを標準の ONNX 形式にエクスポートまたは変換できます。 サポートされているフレームワークには、TensorFlow、PyTorch、scikit-learn、Keras、Chainer、MXNet、MATLAB などがあります。 ONNX 形式のモデルは、さまざまなプラットフォームやデバイスで実行できます。
この ONNX フロー図は、利用可能なフレームワークとデプロイ オプションを示しています。
ONNX Runtime
ONNX Runtime は、ONNX モデルを運用環境にデプロイするためのハイパフォーマンスの推論エンジンです。 ONNX Runtime はクラウドとエッジの両方に最適化されており、Linux、Windows、macOS で動作します。 ONNX は C++ で記述されていますが、これらの環境で使用するために、C、Python、C#、Java、JavaScript (Node.js) API も用意されています。
ONNX Runtime は、ディープ ニューラル ネットワーク (DNN) と従来の機械学習モデルの両方をサポートし、Nvidia GPU 上の TensorRT、Intel プロセッサ上の OpenVINO、Windows 上の DirectML などのさまざまなハードウェアのアクセラレータと統合されます。 ONNX Runtime を使用することにより、広範囲にわたる運用グレードの最適化、テスト、継続的改善の恩恵が得られます。
ONNX Runtime は、Bing、Office、Azure AI といった高スケールの Microsoft サービスで使用されています。 パフォーマンスの向上は多くの要因に依存しますが、これらの Microsoft サービスでは、ONNX を使用することで CPU のパフォーマンスが平均 2 倍向上すると報告されています。 ONNX Runtime は、Azure Machine Learning および次のような機械学習ワークロードをサポートするその他の Microsoft 製品で実行できます。
- Windows。 ONNX Runtime は Windows Machine Learning の一部として Windows に組み込まれており、数億台のデバイスで実行されています。
- Azure SQL: Azure SQL Edge と Azure SQL Managed Instance は、ONNX を使用してデータに対してネイティブなスコアリングを実行します。
- ML.NET: 例については、「チュートリアル: ML.NET で ONNX を使用してオブジェクトを検出する」を参照してください。
ONNX モデルを取得する方法
ONNX モデルは、さまざまな方法で取得できます。
- Azure Machine Learning で新しい ONNX モデルをトレーニングするか、自動機械学習機能を使用します。
- 別の形式の既存のモデルを ONNX に変換します。 詳細については、「ONNX チュートリアル」を参照してください。
- 事前トレーニング済みの ONNX モデルを ONNX モデル ズー から取得します。
- カスタマイズされた ONNX モデルを Azure AI Custom Vision サービス から生成します。
画像分類、物体検出、テキスト処理モデルなど、多くのモデルを ONNX として表現できます。 モデルを正常に変換できない場合は、使用したコンバーターのリポジトリで GitHub の問題を報告してください。
Azure での ONNX モデルのデプロイ
Azure Machine Learning で ONNX モデルのデプロイ、管理、および監視を実行できます。 標準的な MLOps デプロイ ワークフロー と ONNX Runtime を使用して、クラウドでホストされる REST エンドポイントを作成できます。
ONNX Runtime 用 Python パッケージ
CPU および GPU ONNX Runtime 用 Python パッケージは PyPi.org で入手できます。インストール前に、システム要件を必ず確認してください。
Python 用 ONNX Runtime をインストールするには、次のいずれかのコマンドを使用します。
pip install onnxruntime # CPU build
pip install onnxruntime-gpu # GPU build
Python スクリプトで ONNX Runtime を呼び出すには、次のコードを使用します。
import onnxruntime
session = onnxruntime.InferenceSession("path to model")
通常は、モデルに付属しているドキュメントに、モデルを使用するための入力と出力に関する情報が記載されています。 Netron などの視覚化ツールを使用してモデルを表示することもできます。
ONNX Runtime を使用すると、モデルのメタデータ、入力、および出力に対して次のようにクエリを実行できます。
session.get_modelmeta()
first_input_name = session.get_inputs()[0].name
first_output_name = session.get_outputs()[0].name
モデルで推論を実行するには、run
を使用し、返してほしい出力の一覧と入力値のマップを渡します。 すべての出力が必要な場合は、出力リストを空のままにしておきます。 結果として出力の一覧が返されます。
results = session.run(["output1", "output2"], {
"input1": indata1, "input2": indata2})
results = session.run([], {"input1": indata1, "input2": indata2})
詳細な ONNX Runtime API のリファレンスについては、「Python API ドキュメント」を参照してください。