この記事では、 Open Neural Network Exchange (ONNX) を使用して機械学習モデルの推論を最適化する方法について説明します。 推論 (モデル スコアリング) は、デプロイされたモデルを使用して運用データに対する予測を生成するプロセスです。
推論用に機械学習モデルを最適化するには、ハードウェア機能を最大限に活用するためにモデルと推論ライブラリを調整する必要があります。 このタスクは、クラウド、エッジ、CPU、GPU など、さまざまなプラットフォームで最適なパフォーマンスを得たい場合に複雑になります。各プラットフォームの機能と特性が異なるためです。 さまざまなプラットフォーム上でさまざまなフレームワークのモデルを実行する必要がある場合、さらに複雑さが増します。 異なるフレームワークとハードウェアの組み合わせをすべて最適化するには、時間がかかる場合があります。
便利なソリューションとしては、好みのフレームワークでモデルを 1 回トレーニングし、その後 ONNX にエクスポートまたは変換して、クラウドまたはエッジ上の任意の場所で実行できるようにすることです。 ONNX は、機械学習モデルを表現するためのオープン スタンダードとして、Microsoft とパートナー コミュニティによって作成されました。 多くのフレームワークのモデルを標準の ONNX 形式にエクスポートまたは変換できます。 サポートされているフレームワークには、TensorFlow、PyTorch、scikit-learn、Keras、Chainer、MXNet、MATLAB などがあります。 ONNX 形式のモデルは、さまざまなプラットフォームやデバイスで実行できます。
この ONNX フロー図は、利用可能なフレームワークとデプロイ オプションを示しています。
ONNX ランタイム
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 ランタイムは、 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 モデル ズー から取得します。
- Azure AI Custom Vision サービスからカスタマイズされた ONNX モデルを生成します。
画像分類、物体検出、テキスト処理モデルなど、多くのモデルを ONNX として表現できます。 モデルを正常に変換できない場合は、使用したコンバーターのリポジトリで GitHub の問題を報告してください。
Azure での ONNX モデルのデプロイ
Azure Machine Learning で ONNX モデルのデプロイ、管理、および監視を実行できます。 ONNX Runtime で標準 の MLOps デプロイ ワークフロー を使用すると、クラウドでホストされる REST エンドポイントを作成できます。
ONNX Runtime 用 Python パッケージ
CPU および GPU ONNX ランタイム用の 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 ドキュメント」を参照してください。