コンテンツにスキップ

カスタムビルド

カスタムONNX Runtimeパッケージのビルド

Section titled “カスタムONNX Runtimeパッケージのビルド”

ONNX Runtimeパッケージは、ターゲット環境の要求に応じてカスタマイズできます。

ONNX Runtimeビルドをカスタマイズする最も一般的なシナリオは、モバイルやWebなどのフットプリントの小さいデプロイメントです。

そして、ビルドをカスタマイズする最も一般的なメカニズムは、ランタイムでサポートされるオペレーターのセットを、ターゲット環境で実行されるモデル(複数可)で必要なものだけに減らすことです。

カスタムONNX Runtimeパッケージをビルドするには、ソースからのビルドの手順が適用されますが、以下に指定するいくつかの追加オプションがあります。

  • TOCプレースホルダー

オペレーターカーネルを削減する

Section titled “オペレーターカーネルを削減する”

ONNX Runtimeのコンパイル済みバイナリサイズを削減するために、ビルドに含まれるオペレーターカーネルを、モデルで必要なものだけに減らすことができます。

含まれるオペレーターは、モデルまたはモデルのセットから生成できる構成ファイルで、ビルド時に指定されます。

ビルドを必要なオペレーターカーネルに削減するためのビルドオプション

Section titled “ビルドを必要なオペレーターカーネルに削減するためのビルドオプション”

--include_ops_by_config

  • ビルドパラメータに--include_ops_by_config <モデル変換中に生成された構成ファイル> --skip_testsを追加します。

  • 注:ビルド中に、未使用のカーネルを除外するために、一部のONNX Runtimeソースファイルが編集されます。

    特に、このソース変更は、デフォルトで有効になっているか、--updateビルドパラメータで明示的に有効になっている「更新」ビルドフェーズ中に実行されます。

    ONNX Runtimeバージョン1.10以前: ソースファイルは直接変更されます。完全なビルドの作成に戻りたい場合、または含まれるオペレーターカーネルを変更したい場合は、ローカルONNX Runtimeリポジトリのルートディレクトリからgit reset --hardまたはgit checkout HEAD -- ./onnxruntime/core/providersを実行して、これらの変更を元に戻す必要があります。

    ONNX Runtimeバージョン1.11以降: 更新されたバージョンのソースファイルがビルドディレクトリに生成されるため、ソースファイルの変更を元に戻す必要はありません。

必要なオペレーターでサポートされる型を削減するオプション

Section titled “必要なオペレーターでサポートされる型を削減するオプション”

--enable_reduced_operator_type_support

  • オペレーター型の削減を有効にします。ONNX Runtimeバージョン1.7以降が必要で、モデル変換中に型の削減が有効になっている必要があります。

構成ファイルがORT形式のモデルを使用して作成されている場合、--enable_type_reductionが指定されていれば、個々のオペレーターが必要とする入力/出力型を追跡できます。これは、ORTのビルド時に--enable_reduced_operator_type_supportが指定されていれば、ビルドサイズをさらに削減するために使用できます。

ONNX形式のモデルは、必要なノードごとの型情報が含まれていることが保証されていないため、このオプションでは使用できません。

ONNX Runtimeは、バイナリサイズをさらに最小化するようにビルドできます。 これらの縮小サイズのビルドは最小ビルドと呼ばれ、以下で説明するさまざまな最小ビルドレベルがあります。

--minimal_build

Pythonバインディング(--build_wheel)が有効になっていない限り、このビルドではRTTIはデフォルトで無効になっています。

基本的な最小ビルドには、次の制限があります。

  • ONNX形式のモデルはサポートされていません。モデルはORT形式に変換する必要があります。
  • ランタイム最適化はサポートされていません。最適化は、ORT形式への変換中に実行されます。
  • 静的にカーネルを登録する実行プロバイダー(例:ONNX Runtime CPU実行プロバイダー)のみをサポートします。

--minimal_build extended

拡張最小ビルドは、基本的な最小ビルドよりも多くの機能をサポートします。

  • ランタイムパーティショニング(モデル内のノードを特定の実行プロバイダーに割り当てる)の限定的なサポート。
  • NNAPICoreMLなどのカーネルをコンパイルする実行プロバイダーの追加サポート。
  • ONNX Runtimeバージョン1.11以降:保存されたランタイム最適化と、ランタイムで有効になっているいくつかのグラフオプティマイザによる、ランタイム最適化の限定的なサポート。

--disable_exceptions

  • 例外をスローする場所はすべて、代わりにエラーメッセージをログに記録してabort()を呼び出します。
  • --minimal_buildが必要です。
  • 注:Pythonバインディング(--build_wheel)が必要な場合、これは有効なオプションではありません。Python Wheelには例外が有効になっている必要があります。
  • 例外は、ONNX Runtimeでは例外的なことに対してのみ使用されます。使用する入力を検証し、モデルをロードできることを検証していれば、システムレベルの問題(例:メモリ不足)がない限り、ORTが例外をスローする可能性は低いです。

MLオペレーターのサポートを無効にする

Section titled “MLオペレーターのサポートを無効にする”

--disable_ml_ops

  • オペレーターカーネル削減スクリプトは、未使用のMLオペレーターカーネルをすべて無効にしますが、ML固有の型のサポートを削除することで、さらなる節約が可能です。モデルにML演算がないこと、またはMap型を使用するML演算がないことがわかっている場合は、このフラグを指定できます。
  • 不明な場合は、ONNX MLオペレーターの仕様を参照してください。

--android_cpp_shared

  • デフォルトの静的libc++ライブラリの代わりに共有libc++ライブラリを使用してビルドすると、libonnxruntime.soライブラリが小さくなります。
  • 詳細については、Android NDKドキュメントを参照してください。

--config

MinSizeRel構成は、最小のバイナリサイズを生成します。

バイナリサイズよりもパフォーマンスを優先したい場合は、Release構成も使用できます。

ビルド元のONNX Runtimeのバージョン

Section titled “ビルド元のONNX Runtimeのバージョン”

必要な特定の機能がない限り、未リリースのmainブランチは使用しないでください。

ONNX Runtimeリポジトリをクローンしたら、リリースタグの1つをチェックアウトしてビルドします。

Terminal window
git clone --recursive https://github.com/microsoft/onnxruntime
cd onnxruntime
git checkout <リリースタグ>

リリースタグ名はv<リリースバージョン>のパターンに従います。例えば、v1.13.1です。 こちらで探してください。

Windowsで、オペレーターサポートを削減し、ORT形式のモデルのみをサポートしてビルドする

Section titled “Windowsで、オペレーターサポートを削減し、ORT形式のモデルのみをサポートしてビルドする”
<ONNX Runtimeリポジトリルート>\build.bat ^
--config=Release ^
--cmake_generator="Visual Studio 16 2019" ^
--build_shared_lib ^
--minimal_build ^
--disable_ml_ops --disable_exceptions --disable_rtti ^
--include_ops_by_config <モデル変換からの構成ファイル> --enable_reduced_operator_type_support ^
--skip_tests
<ONNX Runtimeリポジトリルート>/build.sh \
--config=Release \
--build_shared_lib \
--minimal_build \
--disable_ml_ops --disable_exceptions --disable_rtti \
--include_ops_by_config <モデル変換からの構成ファイル> --enable_reduced_operator_type_support \
--skip_tests

このセクションでは、ops.configは、含めるopset、opカーネル、および型を指定する構成ファイルです。

[このセクションは近日公開予定]

iOSビルド用のポッドを生成するには、ONNX Runtimeリポジトリのbuild_and_assemble_apple_pods.pyスクリプトを使用します。

  1. 使用したいONNX Runtimeのバージョンをチェックアウトします。

  2. ビルドスクリプトを実行します。

    例:

    Terminal window
    python3 tools/ci_build/github/apple/build_and_assemble_apple_pods.py \
    --staging-dir /path/to/staging/dir \
    --include-ops-by-config /path/to/ops.config \
    --build-settings-file /path/to/build_settings.json

    これにより、カスタムビルドが実行され、そのためのポッドパッケージファイルが/path/to/staging/dirに作成されます。

    ビルドオプションは、--build-settings-fileオプションに指定されたファイルで指定されます。ビルド済みパッケージで使用されている現在のビルドオプションについては、tools/ci_build/github/apple/default_full_apple_framework_build_settings.jsonを参照してください。このファイルを直接使用できます。

    カスタムビルドの削減されたopセットは、--include_ops_by_configオプションに指定された構成ファイルで指定されます。これはオプションです。

    デフォルトのパッケージにはトレーニングAPIは含まれていません。トレーニングパッケージを作成するには、--build-settings-fileに指定するビルドオプションファイルに--enable_training_apisを追加し、build_and_assemble_apple_pods.pyを呼び出すときに--variant Trainingオプションを追加します。

    例:

    Terminal window
    # /path/to/build_settings.jsonは、`--enable_training_apis`オプションを含むファイルです
    python3 tools/ci_build/github/apple/build_and_assemble_apple_pods.py \
    --staging-dir /path/to/staging/dir \
    --include-ops-by-config /path/to/ops.config \
    --build-settings-file /path/to/build_settings.json \
    --variant Training
  3. ローカルポッドを使用します。

    たとえば、リリース済みのonnxruntime-objcポッドの代わりにローカルのonnxruntime-objcポッドを使用するようにPodfileを更新します。

    pod 'onnxruntime-objc'
    pod 'onnxruntime-objc', :path => "/path/to/staging/dir/onnxruntime-objc"
    pod 'onnxruntime-c', :path => "/path/to/staging/dir/onnxruntime-c"

    注:onnxruntime-objcポッドはonnxruntime-cポッドに依存します。リリース済みのonnxruntime-objcポッドを使用する場合、この依存関係は自動的に処理されます。ただし、ローカルのonnxruntime-objcポッドを使用する場合は、それが依存するローカルのonnxruntime-cポッドもPodfileで指定する必要があります。

Android AARパッケージを生成するには、ONNX Runtimeリポジトリのbuild_custom_android_package.pyスクリプトを使用します。

このスクリプトは、リポジトリ内またはリポジトリ外から使用できます。リポジトリ外で使用する場合は、その親ディレクトリをコピーしてください。

注:以下の手順では、<ORTバージョン>を使用したいONNX Runtimeバージョンに置き換えてください(例:1.13.1)。

  1. ビルドスクリプトを実行します。

    例:

    Terminal window
    python3 tools/android_custom_build/build_custom_android_package.py \
    --onnxruntime_branch_or_tag v<ORTバージョン> \
    --include_ops_by_config /path/to/ops.config \
    --build_settings /path/to/build_settings.json \
    /path/to/working/dir

    これにより、カスタムビルドが実行され、そのためのAndroid AARパッケージが/path/to/working/dirに作成されます。

    --onnxruntime_branch_or_tagオプションで使用したいONNX Runtimeバージョンを指定します。このスクリプトはDockerコンテナ内でONNX Runtimeリポジトリの別のコピーを使用するため、これはコンテナを含むONNX Runtimeリポジトリのバージョンとは無関係です。

    ビルドオプションは、--build_settingsオプションに指定されたファイルで指定されます。ビルド済みパッケージで使用されている現在のビルドオプションについては、tools/ci_build/github/android/default_full_aar_build_settings.jsonを参照してください。

    カスタムビルドの削減されたopセットは、--include_ops_by_configオプションに指定された構成ファイルで指定されます。

    --build_settings--include_ops_by_configの両方のオプションはオプションであり、ビルド済みパッケージのビルドに使用されるものにデフォルト設定されます。どちらも指定しない場合、ビルド済みパッケージのようなパッケージが作成されます。

  2. ローカルのカスタムAndroid AARパッケージを使用します。

    たとえば、Android Studioプロジェクトで:

    a. /path/to/working/dir/output/aar_out/<ビルド構成、例:Release>/com/microsoft/onnxruntime/onnxruntime-android/<ORTバージョン>/onnxruntime-android-<ORTバージョン>.aarからAARファイルをプロジェクトの<モジュール名、例:app>/libsディレクトリにコピーします。

    b. プロジェクトの<モジュール名>/build.gradleファイルのdependenciesセクションを更新します。

    implementation 'com.microsoft.onnxruntime:onnxruntime-android:latest.release'
    implementation files('libs/onnxruntime-android-<ORTバージョン>.aar')

ONNX Runtime Pythonバインディングを最小ビルドで使用したい場合は、Pythonで例外が必要なため、例外を有効にする必要があります。

ONNX Runtimeバインディングを含むPython Wheelをビルドするには、ビルドコマンドから--disable_exceptionsを削除し、--build_wheelを追加します。

.whlファイルは、ビルド出力ディレクトリの<config>/distフォルダに生成されます。

  • build.batを使用したWindowsリリースビルドのPython Wheelは、<ONNX Runtimeリポジトリルート>\build\Windows\Release\Release\dist\にあります。
  • build.shを使用したLinuxリリースビルドのPython Wheelは、<ONNX Runtimeリポジトリルート>/build/Linux/Release/dist/にあります。

wheelはpipを使用してインストールできます。プラットフォームとwhlファイル名に合わせて次のコマンドを調整してください。

pip install -U .\build\Windows\Release\Release\dist\onnxruntime-1.7.0-cp37-cp37m-win_amd64.whl