コンテンツにスキップ

推論用のビルド

推論用にONNX Runtimeをビルドする

Section titled “推論用にONNX Runtimeをビルドする”

以下の手順に従って、推論を実行するためにONNX Runtimeをビルドします。

  • TOCプレースホルダー

基本的なCPUビルド

  • ソースツリーをチェックアウトします。

    Terminal window
    git clone --recursive https://github.com/Microsoft/onnxruntime.git
    cd onnxruntime
  • Python 3.10+をインストールします。

  • cmake-3.28以上をインストールします。

    Windowsでは、WinGetから最新バージョンを入手することをお勧めします。以下を実行してください。

    Terminal window
    winget install -e --id Kitware.CMake

    Linuxでは、pypiから入手できます。以下を実行してください。

    Terminal window
    python3 -m pip install cmake
    which cmake

    上記のコマンドが失敗した場合は、https://cmake.org/download/から手動でcmakeを入手してください。

    インストール後、以下を実行してインストールが成功したかどうかを確認できます。

    cmake --version

使用するVisual StudioバージョンのDeveloper Command Promptを開きます。これにより、コンパイラ、リンカ、ユーティリティ、ヘッダーファイルへのパスを含む環境が適切に設定されます。

.\build.bat --config RelWithDebInfo --build_shared_lib --parallel --compile_no_warning_as_error --skip_submodule_sync

デフォルトのWindows CMakeジェネレーターはVisual Studio 2022です。他のVisual Studioバージョンはサポートされていません。

Windows ARM64マシンでARM64バイナリをビルドしたい場合は、上記の同じコマンドを使用できます。Visual Studio、CMake、PythonがすべてARM64バージョンであることを確認してください。

Windows x86マシンでARM64またはARM64ECバイナリをクロスコンパイルしたい場合は、上記のビルドコマンドに「—arm64」または「—arm64ec」を追加する必要があります。

pythonインタープリターが64ビットWindowsアプリケーションであることを確認してください。32ビットビルドはサポートされなくなりました。

./build.sh --config RelWithDebInfo --build_shared_lib --parallel --compile_no_warning_as_error --skip_submodule_sync

デフォルトでは、ONNX Runtimeは最小ターゲットmacOSバージョン13.3用にビルドするように構成されています。 リリースNugetの共有ライブラリとPythonホイールは、macOSバージョン13.3以降にインストールできます。

x86_64 macOS用にonnxruntimeをビルドするためにXcodeを使用したい場合は、コマンドラインに--use_xcode引数を追加してください。

このフラグがない場合、cmakeビルドジェネレーターはデフォルトでUnix makefileになります。

現在、MacコンピュータはIntelベースまたはAppleシリコンベースのいずれかです。デフォルトでは、ONNX Runtimeのビルドスクリプトは、ビルドマシンが持つCPU ARCHのビットのみを生成します。クロスコンパイルを行いたい場合:IntelベースのMacコンピュータでarm64バイナリを生成するか、Appleシリコンを搭載したMacシステムでx86バイナリを生成するには、「CMAKE_OSX_ARCHITECTURES」cmake変数を設定できます。例:

Intel CPU用にビルド:

Terminal window
./build.sh --config RelWithDebInfo --build_shared_lib --parallel --compile_no_warning_as_error --skip_submodule_sync --cmake_extra_defines CMAKE_OSX_ARCHITECTURES=x86_64

AppleシリコンCPU用にビルド:

Terminal window
./build.sh --config RelWithDebInfo --build_shared_lib --parallel --compile_no_warning_as_error --skip_submodule_sync --cmake_extra_defines CMAKE_OSX_ARCHITECTURES=arm64

両方のためにビルド:

Terminal window
./build.sh --config RelWithDebInfo --build_shared_lib --parallel --compile_no_warning_as_error --skip_submodule_sync --cmake_extra_defines CMAKE_OSX_ARCHITECTURES="x86_64;arm64"

最後のコマンドは、両方のCPUアーキテクチャ用のfat-binaryを生成します。

注:クロスコンパイルを行う場合、互換性のないCPU命令セットのため、単体テストはスキップされます。

AIXでは、以下を使用して64ビット用にONNX Runtimeをビルドできます。

  • IBM Open XLコンパイラツールチェーン。 最小限必要なAIX OSバージョンは7.2です。17.1.2コンパイラPTF5(17.1.2.5)バージョンが必要です。
  • GNU GCCコンパイラツールチェーン。 最小限必要なAIX OSバージョンは7.3です。GCCバージョン10.3以降が必要です。

IBM Open XLの場合、以下の環境設定をエクスポートします。

Terminal window
ulimit -m unlimited
ulimit -d unlimited
ulimit -n 2000
ulimit -f unlimited
export OBJECT_MODE=64
export BUILD_TYPE="Release"
export CC="/opt/IBM/openxlC/17.1.2/bin/ibm-clang"
export CXX="/opt/IBM/openxlC/17.1.2/bin/ibm-clang++_r"
export CFLAGS="-pthread -m64 -D_ALL_SOURCE -mcmodel=large -Wno-deprecate-lax-vec-conv-all -Wno-unused-but-set-variable -Wno-unused-command-line-argument -maltivec -mvsx -Wno-unused-variable -Wno-unused-parameter -Wno-sign-compare"
export CXXFLAGS="-pthread -m64 -D_ALL_SOURCE -mcmodel=large -Wno-deprecate-lax-vec-conv-all -Wno-unused-but-set-variable -Wno-unused-command-line-argument -maltivec -mvsx -Wno-unused-variable -Wno-unused-parameter -Wno-sign-compare"
export LDFLAGS="-L$PWD/build/Linux/$BUILD_TYPE/ -lpthread"
export LIBPATH="$PWD/build/Linux/$BUILD_TYPE/"

GCCの場合、以下の環境設定をエクスポートします。

Terminal window
ulimit -m unlimited
ulimit -d unlimited
ulimit -n 2000
ulimit -f unlimited
export OBJECT_MODE=64
export BUILD_TYPE="Release"
export CC="gcc"
export CXX="g++"
export CFLAGS="-maix64 -pthread -DFLATBUFFERS_LOCALE_INDEPENDENT=0 -maltivec -mvsx -Wno-unused-function -Wno-unused-variable -Wno-unused-parameter -Wno-sign-compare -fno-extern-tls-init -Wl,-berok "
export CXXFLAGS="-maix64 -pthread -DFLATBUFFERS_LOCALE_INDEPENDENT=0 -maltivec -mvsx -Wno-unused-function -Wno-unused-variable -Wno-unused-parameter -Wno-sign-compare -fno-extern-tls-init -Wl,-berok "
export LDFLAGS="-L$PWD/build/Linux/$BUILD_TYPE/ -Wl,-bbigtoc -lpython3.9"
export LIBPATH="$PWD/build/Linux/$BUILD_TYPE"

ビルドを開始するには、以下のコマンドを実行します。

Terminal window
./build.sh \
--config $BUILD_TYPE\
--build_shared_lib \
--skip_submodule_sync \
--cmake_extra_defines CMAKE_INSTALL_PREFIX=$PWD/install \
--parallel
  • パッケージをカスタムディレクトリにインストールしたい場合は、CMAKE_INSTALL_PREFIXの値としてディレクトリの場所を指定します。
  • IBM Open XLコンパイラツールチェーンの場合、AIX 7.2ではonnxruntimeに必要なlibunwind.aなどのランタイムライブラリの一部が欠落している可能性があります。これを修正するには、関連するファイルセットをインストールできます。
  • ビルドオプションの—parallelオプション。 名前が示すように、このオプションは並列ビルド用であり、リソースを大量に消費するオプションです。したがって、システムに各CPUコアに対して十分なメモリがない場合は、このオプションをスキップできます。
  • rootユーザーがビルドをトリガーする場合は、—allow_running_as_rootが必要です。
  • これらの手順はデバッグビルドをビルドするため、パフォーマンストレードオフがある場合があることに注意してください。「—config」パラメータには、Debug、Release、RelWithDebInfo、MinSizeRelの4つの有効な値があります。「Release」と比較して、「RelWithDebInfo」にはデバッグ情報があるだけでなく、バイナリをデバッグしやすくするために一部のインラインが無効になっています。したがって、RelWithDebInfoはReleaseよりも低速です。
  • 各リリースからのバージョン(Windows、Linux、Macのバリアントを含む)をビルドするには、参考としてこれらの.ymlファイルを参照してください。
  • ビルドスクリプトは、ネイティブビルドの場合はデフォルトですべての単体テストを実行し、クロスコンパイルビルドの場合はデフォルトでテストをスキップします。 テストをスキップするには、--buildまたは--update --buildで実行します。
  • ソースコードからprotobufをインストールする必要がある場合は、次の点に注意してください。
    • まず、cmake/deps.txtを開いて、ONNX Runtimeの公式パッケージが使用しているprotobufのバージョンを確認してください。
    • protobufに静的にリンクするため、WindowsではprotobufのCMakeフラグprotobuf_BUILD_SHARED_LIBSをOFFにする必要があります。Linuxでは、オプションがOFFの場合、PICが有効になっていることを確認する必要もあります。インストール後、PATHに「protoc」実行可能ファイルが必要です。ldconfigを実行して、protobufライブラリが見つかることを確認することをお勧めします。
    • 標準以外の場所にprotobufをインストールした場合は、次の環境変数を設定すると便利です:export CMAKE_ARGS="-DONNX_CUSTOM_PROTOC_EXECUTABLE=protocへのフルパス"これにより、ONNXビルドでそれを見つけることができます。また、リンカがprotobufライブラリを見つけられるようにldconfig <protobufライブラリフォルダパス>を実行します。
  • ソースコードからonnxをインストールしたい場合は、最初にprotobufをインストールしてから、次のようにします。
    export ONNX_ML=1
    python3 setup.py bdist_wheel
    pip3 install --upgrade dist/*.whl
    その後、ONNX Runtimeのビルドを開始する前にprotobufをアンインストールすることをお勧めします。特に、ONNX Runtimeが持つものとは異なるバージョンのprotobufをインストールした場合はなおさらです。

サポートされているアーキテクチャとビルド環境

Section titled “サポートされているアーキテクチャとビルド環境”
x86_32x86_64ARM32v7ARM64PPC64LERISCV64PPC64BES390X
Windowsはいはいはいはいいいえいいえいいえいいえ
Linuxはいはいはいはいはいはいいいえはい
macOSいいえはいいいえいいえいいえいいえいいえいいえ
Androidいいえいいえはいはいいいえいいえいいえいいえ
iOSいいえいいえいいえはいいいえいいえいいえいいえ
AIXいいえいいえいいえいいえいいえいいえはいいいえ
OSCPUをサポートGPUをサポート
Windows 10はいはいVS2019から最新のVS2022までがサポートされています
Windows 10
Subsystem for Linux
はいいいえ
Ubuntu 20.x/22.xはいはいARM32v7でもサポートされています(実験的)
CentOS 7/8/9はいはいARM32v7でもサポートされています(実験的)
macOSはいいいえ

GCC 8.x以前はサポートされていません。 32ビットアーキテクチャ用のバイナリをビルドしたい場合は、32ビットコンパイラではビルドを実行するのに十分なメモリがない可能性があるため、クロスコンパイルを行う必要がある場合があります。 Android/iOSでのコードのビルドはサポートされていません。そのためには、Windows、Linux、またはmacOSデバイスを使用する必要があります。

OS/コンパイラVCをサポートGCCをサポートClangをサポート
Windows 10はいテストされていませんテストされていません
Linuxいいえはい(gcc>=8)テストされていません
macOSいいえテストされていませんはい(必要な最小バージョンは確認されていません)

コードは以下用にビルドできます。

  • Windows
  • Linux
  • MacOS
  • Android
  • iOS
  • WebAssembly

ランタイム時:

  • サポートされている最小WindowsバージョンはWindows 10です。
  • サポートされている最小CentOSバージョンは7です。
  • サポートされている最小Ubuntuバージョンは16.04です。

説明コマンド追加の詳細
基本ビルドbuild.bat (Windows)
./build.sh (Linux)
リリースビルド--config Releaseリリースビルド。その他の有効な構成値はRelWithDebInfoとDebugです。
並列処理を使用したビルド--parallelビルドを高速化するために強くお勧めします。
共有ライブラリのビルド--build_shared_lib
トレーニングサポートの有効化--enable_training
APIコマンド追加の詳細
Python--build_wheel
C#およびC Nugetパッケージ--build_nugetC#バインディングをビルドし、nugetパッケージを作成します。--build_shared_libを意味します
詳細な手順は以下にあります。
WindowsML--use_winml
--use_dml
--build_shared_lib
WindowsMLはDirectMLとOnnxRuntime共有ライブラリに依存します
Java--build_javaビルドディレクトリにonnxruntime4j.jarを作成し、--build_shared_libを意味します
Java APIをコンパイルするには、通常の要件に加えてgradle v6.1以降がインストールされている必要があります。
Node.js--build_nodejsNode.jsバインディングをビルドします。--build_shared_libを意味します

現在、WindowsとLinuxでのみサポートされています。

  • csharpバインディングをビルドし、マネージドnugetパッケージを作成するにはdotnetが必要です。こちらの手順に従ってdotnetをダウンロードしてください。バージョン2.1と3.1でテスト済みです。
  • nuget.exe。こちらの手順に従ってnugetをダウンロードしてください。
    • Windowsでは、nugetのダウンロードは簡単で、上記の手順に従うだけでうまくいくはずです。
    • Linuxでは、nugetはMonoランタイムに依存しているため、これも設定する必要があります。上記リンクには、Monoとnugetを設定するためのすべての情報が含まれています。手順はこちらに直接あります。場合によっては、monoをインストールした後にsudo apt-get install mono-completeを実行する必要があります。
.\build.bat --build_nuget
./build.sh --build_nuget

Nugetパッケージは<native_build_dir>\nuget-artifactsの下に作成されます。


  • VCPKGを使用してonnxruntimeをビルドできます。詳細については、ドキュメント/docs/build/dependencies.mdを参照してください。

縮小オペレーターカーネルビルド

Section titled “縮小オペレーターカーネルビルド”

縮小オペレーターカーネルビルドでは、ビルド内のカーネルをカスタマイズして、バイナリサイズを小さくすることができます。

OnnxRuntimeは、中間テンソルの形状とデータのデバッグを有効にするためのビルドオプションをサポートしています。

これを有効にしてビルドするには、onnxruntime_DEBUG_NODE_INPUTS_OUTPUTを設定します。

Terminal window
./build.sh --cmake_extra_defines onnxruntime_DEBUG_NODE_INPUTS_OUTPUTS=1
.\build.bat --cmake_extra_defines onnxruntime_DEBUG_NODE_INPUTS_OUTPUTS=1

デバッグダンプの動作は、いくつかの環境変数で制御できます。 詳細については、onnxruntime/core/framework/debug_node_inputs_outputs_utils.hを参照してください。

ノードの出力データを(デフォルトではstdoutに)ダンプするように指定するには、次の環境変数を設定します。

ORT_DEBUG_NODE_IO_DUMP_OUTPUT_DATA=1

「Foo」または「Bar」という名前のノードのノード出力データをファイルにダンプするように指定するには、次の環境変数を設定します。

ORT_DEBUG_NODE_IO_DUMP_OUTPUT_DATA=1
ORT_DEBUG_NODE_IO_NAME_FILTER="Foo;Bar"
ORT_DEBUG_NODE_IO_DUMP_DATA_TO_FILES=1

RISC-Vなどのプラットフォームで実行するには、ホストプラットフォーム(Linuxなど)からターゲットプラットフォーム(特定のRISC-V CPUアーキテクチャとオペレーティングシステム)へのクロスコンパイルが必要です。以下の手順に従って、RISC-V 64ビット用にONNX Runtimeをビルドします。

  1. GNU RISC-Vクロスコンパイルツールチェーンとエミュレータをダウンロードしてインストールします。

    Ubuntuを使用している場合は、https://github.com/riscv-collab/riscv-gnu-toolchain/releasesにアクセスして、ビルド済みのRISC-V GNUツールチェーンを入手できます。riscv64-glibc-ubuntu-22.04-llvm-nightly-XXXX-nightly.tar.gzなどの適切なバージョンを探してください。ダウンロード後、アーカイブをビルドマシンに展開し、「bin」フォルダを$PATH環境変数に追加します。QEMUエミュレータもツールチェーンフォルダにあります。これらの手順に従った場合は、この手順をスキップしてください。

    他のLinuxディストリビューションのユーザーは、ソースコードからGCCをコンパイルするオプションを利用できます。ターゲットオペレーティングシステムに対応するコンパイラバージョンを選択し、最新の安定版リリースを選択することをお勧めします。

    コンパイラを入手したら、riscv64-unknown-linux-gnu-gcc -vを実行します。これにより、次のような出力が生成されます。

    Terminal window
    Using built-in specs.
    COLLECT_GCC=/path/to/riscv64-unknown-linux-gnu-gcc
    COLLECT_LTO_WRAPPER=/path/to/libexec/gcc/riscv64-unknown-linux-gnu/13.2.0/lto-wrapper
    Target: riscv64-unknown-linux-gnu
    Configured with: /path/to/riscv-gnu-toolchain/gcc/configure --target=riscv64-unknown-linux-gnu --prefix=/opt/riscv --with-sysroot=/opt/riscv/sysroot --with-pkgversion= --with-system-zlib --enable-shared --enable-tls --enable-languages=c,c++,fortran --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libsanitizer --disable-nls --disable-bootstrap --src=.././gcc --disable-multilib --with-abi=lp64d --with-arch=rv64gc --with-tune=rocket --with-isa-spec=20191213 'CFLAGS_FOR_TARGET=-O2 -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-O2 -mcmodel=medlow'
    Thread model: posix
    Supported LTO compression algorithms: zlib zstd
    gcc version 13.2.0 ()
  2. RISC-V 64ビットCMakeツールチェーンファイルを構成します。

    CMakeツールチェーンファイルは${ORT_ROOT}/cmake/riscv64.toolchain.cmakeにあります。構成する必要のある変数の代替値がある場合は、そのファイルに対応する設定を含めてください。

  3. Linuxでのクロスコンパイル

    --rv64フラグを指定して./build.shを実行し、--riscv_toolchain_rootを使用してRISC-Vツールチェーンルートを指定し、--riscv_qemu_pathを使用してQEMUパスをビルドオプションとして指定して、ビルドプロセスを開始します。PATH環境変数を構成して、ビルドに使用するコマンドプロンプトからすべてのインストール済みクロスコンパイラにアクセスできるようにしてください。

    (オプション)xnnpackを実行プロバイダーとして利用する場合は、ビルド構成に--use_xnnpackオプションを必ず含めてください。

    ビルドコマンドの例:

    Terminal window
    ./build.sh --parallel --config Debug --rv64 --riscv_toolchain_root=/path/to/toolchain/root --riscv_qemu_path=/path/to/qemu-riscv64 --skip_tests

Arm®ベースのデバイス用にONNX Runtimeをビルドするには、いくつかのオプションがあります。

まず、実際のArmベースのデバイス、またはエミュレータ(qemuなど)を備えたx86_64デバイス、またはエミュレータを備えたdockerコンテナを備えたx86_64デバイス(x86_64 PCでArmベースのコンテナを実行できます)で実行できます。その場合、ビルド手順は基本的にLinux x86_64の手順と同じです。ただし、ターゲットとするCPUが64ビットでない場合、ビルドプロセスに2GB以上のメモリが必要なため、機能しません。

シミュレーションを使用したArmベースのデバイスのクロスコンパイル(Linux/Windows)

Section titled “シミュレーションを使用したArmベースのデバイスのクロスコンパイル(Linux/Windows)”

簡単、低速、推奨

この方法は、qemuユーザーモードエミュレーションに依存しています。これにより、命令レベルのシミュレーションを介してデスクトップまたはクラウドVMを使用してコンパイルできます。ビルドをx86 CPUで実行し、すべてのArmアーキテクチャ命令をx86に変換します。これは、ローエンドデバイスでネイティブにコンパイルするよりも大幅に高速になる可能性があります。結果のONNX Runtime Pythonホイール(.whl)ファイルは、Python 3スクリプトで呼び出すことができるArmベースのデバイスにデプロイされます。ビルドプロセスには数時間かかる場合があり、ターゲットCPUが32ビットの場合はメモリ不足になる可能性があります。

困難、高速

このオプションは非常に高速で、パッケージを数分でビルドできますが、セットアップが困難です。大規模なコードベースがある場合(たとえば、onnxruntimeに新しい実行プロバイダーを追加する場合)、これが唯一の実行可能な方法である可能性があります。

  1. 対応するツールチェーンを入手します。

    要するに、https://www.linaro.org/downloads/にアクセスし、「64-bit Armv8 Cortex-A, little-endian」と「Linux Targeted」を入手し、「Bare-Metal Targeted」は入手しないでください。ビルドマシンに展開し、binフォルダを$PATH環境に追加します。その後、この部分をスキップします。

    GCCまたはClangを使用できます。どちらも機能しますが、ここでの手順はGCCに基づいています。

    GCCの用語では:

    • 「ビルド」は、GCCが構成およびコンパイルされているシステムの種類を表します。
    • 「ホスト」は、GCCが実行されるシステムの種類を表します。
    • 「ターゲット」は、GCCがコードを生成するシステムの種類を表します。

    クロスコンパイルしない場合、通常は「ビルド」=「ホスト」=「ターゲット」です。クロスコンパイルする場合、通常は「ビルド」=「ホスト」!=「ターゲット」です。たとえば、x86_64でGCCをビルドし、x86_64でGCCを実行し、aarch64をターゲットとするバイナリを生成できます。この場合、「ビルド」=「ホスト」= x86_64 Linux、ターゲットはaarch64 Linuxです。

    ソースコードからGCCを自分でビルドするか、Ubuntu、linaroなどのベンダーからビルド済みのものを入手できます。ターゲットオペレーティングシステムと同じコンパイラバージョンを選択するのが最善です。これが不可能な場合は、最新の安定版を選択し、GCCライブラリに静的にリンクします。

    コンパイラを入手したら、aarch64-linux-gnu-gcc -vを実行します。これにより、次のような出力が生成されます。

    Terminal window
    Using built-in specs.
    COLLECT_GCC=/usr/bin/aarch64-linux-gnu-gcc
    COLLECT_LTO_WRAPPER=/usr/libexec/gcc/aarch64-linux-gnu/9/lto-wrapper
    Target: aarch64-linux-gnu
    Configured with: ../gcc-9.2.1-20190827/configure --bindir=/usr/bin --build=x86_64-redhat-linux-gnu --datadir=/usr/share --disable-decimal-float --disable-dependency-tracking --disable-gold --disable-libgcj --disable-libgomp --disable-libmpx --disable-libquadmath --disable-libssp --disable-libunwind-exceptions --disable-shared --disable-silent-rules --disable-sjlj-exceptions --disable-threads --with-ld=/usr/bin/aarch64-linux-gnu-ld --enable-__cxa_atexit --enable-checking=release --enable-gnu-unique-object --enable-initfini-array --enable-languages=c,c++ --enable-linker-build-id --enable-lto --enable-nls --enable-obsolete --enable-plugin --enable-targets=all --exec-prefix=/usr --host=x86_64-redhat-linux-gnu --includedir=/usr/include --infodir=/usr/share/info --libexecdir=/usr/libexec --localstatedir=/var --mandir=/usr/share/man --prefix=/usr --program-prefix=aarch64-linux-gnu- --sbindir=/usr/sbin --sharedstatedir=/var/lib --sysconfdir=/etc --target=aarch64-linux-gnu --with-bugurl=https://bugzilla.redhat.com/bugzilla/ --with-gcc-major-version-only --with-isl --with-newlib --with-plugin-ld=/usr/bin/aarch64-linux-gnu-ld --with-sysroot=/usr/aarch64-linux-gnu/sys-root --with-system-libunwind --with-system-zlib --without-headers --enable-gnu-indirect-function --with-linker-hash-style=gnu
    Thread model: single
    gcc version 9.2.1 20190827 (Red Hat Cross 9.2.1-3) (GCC)

    --build--host--targetの値と、--with-arch=armv8-a--with-arch=armv6--with-tune=arm1176jz-s--with-fpu=vfp--with-float=hardなどの特別な引数があるかどうかを確認します。

    また、ターゲットハードウェアに必要なフラグの種類も知っておく必要があります。これは大きく異なる可能性があります。たとえば、通常のARMv7コンパイラを入手してRaspberry Pi V1で直接使用すると、Raspberry PiにはARMv6しかないため機能しません。通常、すべてのハードウェアベンダーはツールチェーンを提供します。そのビルド方法を確認してください。

    ターゲット環境は、以下によって識別されます。

    • Arch:x86_32、x86_64、armv6、armv7、arvm7l、aarch64など
    • OS:ベアメタルまたはLinux
    • Libc:gnu libc/ulibc/muslなど
    • ABI:Armにはeabi、eabihfなどの複数のABIがあります。

    以前の出力からこれらのすべての情報を取得できます。すべてが正しいことを確認してください。

  2. (オプション)Python拡張を有効にするためにsysrootを設定します。Pythonを使用しない場合はスキップします。

    ターゲットオペレーティングシステムのルートファイルシステムをビルドマシンにダンプします。そのフォルダーを「sysroot」と呼び、onnxruntime Python拡張のビルドに使用します。その前に、ターゲットマシンにpython3 devパッケージ(Cヘッダーファイルを含む)とnumpy pythonパッケージをインストールする必要があります。

    以下にいくつかの例を示します。

    ターゲットOSがraspbian-busterの場合は、ウェブサイトからRAWイメージをダウンロードしてから、次のように実行します。

    Terminal window
    $ fdisk -l 2020-02-13-raspbian-buster.img

    ディスク2020-02-13-raspbian-buster.img:3.54 GiB、3787456512バイト、7397376セクター 単位:1 * 512 = 512バイトのセクター セクターサイズ(論理/物理):512バイト/ 512バイト I/Oサイズ(最小/最適):512バイト/ 512バイト ディスクラベルタイプ:dos ディスク識別子:0xea7d04d6

    デバイスブート開始終了セクターサイズIDタイプ
    2020-02-13-raspbian-buster.img18192532479524288256McW95 FAT32 (LBA)
    2020-02-13-raspbian-buster.img2532480739737568648963.3G83Linux

    ルートパーティションが532480セクターから始まることがわかります。これは、先頭から532480 * 512 = 272629760バイトです。

    次に、次のように実行します。

    Terminal window
    $ mkdir /mnt/pi
    $ mount -r -o loop,offset=272629760 2020-02-13-raspbian-buster.img /mnt/pi

    /mnt/piにすべてのraspbianファイルが表示されます。ただし、まだ使用できません。一部のシンボリックリンクが壊れているため、最初に修正する必要があります。

    /mnt/piで、次を実行します。

    Terminal window
    $ find . -type l -exec realpath {} \; |grep 'No such file'

    これにより、どれが壊れているかがわかります。 次に、次を実行して修正できます。

    Terminal window
    $ mkdir /mnt/pi2
    $ cd /mnt/pi2
    $ sudo tar -C /mnt/pi -cf - . | sudo tar --transform 'flags=s;s,^/,/mnt/pi2/,' -xf -

    次に、/mnt/pi2が次のステップで使用するsysrootフォルダーになります。

    ターゲットOSがUbuntuの場合は、https://cloud-images.ubuntu.com/からイメージを入手できます。ただし、そのイメージはqcow2形式です。fdiskとmountを実行する前に変換してください。

    Terminal window
    qemu-img convert -p -O raw ubuntu-18.04-server-cloudimg-arm64.img ubuntu.raw

    残りの部分はraspbianと同様です。

    ターゲットOSがmanylinux2014の場合は、次のようにして入手できます。 aptまたはdnfからqemu-user-staticをインストールします。 次に、dockerを実行します。

    Ubuntu:

    Terminal window
    docker run -v /usr/bin/qemu-aarch64-static:/usr/bin/qemu-aarch64-static -it --rm quay.io/pypa/manylinux2014_aarch64 /bin/bash

    「-v /usr/bin/qemu-aarch64-static:/usr/bin/qemu-aarch64-static」引数はFedoraでは不要です。

    次に、docker内で次を実行します。

    Terminal window
    cd /opt/python
    ./cp35-cp35m/bin/python -m pip install numpy==1.16.6
    ./cp36-cp36m/bin/python -m pip install numpy==1.16.6
    ./cp37-cp37m/bin/python -m pip install numpy==1.16.6
    ./cp38-cp38/bin/python -m pip install numpy==1.16.6

    numpyにはまだビルド済みパッケージがないため、これらのコマンドには数時間かかります。完了したら、2番目のウィンドウを開いて次を実行します。

    Terminal window
    docker ps

    出力から:

    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    5a796e98db05 quay.io/pypa/manylinux2014_aarch64 "/bin/bash" 3 minutes ago Up 3 minutes affectionate_cannon

    dockerインスタンスIDが5a796e98db05であることがわかります。次のコマンドを使用して、ルートファイルシステムを将来使用するためのsysrootとしてエクスポートします。

    Terminal window
    docker export 5a796e98db05 -o manylinux2014_aarch64.tar
  3. CMakeツールチェーンファイルを生成します。 次の内容をtool.cmakeとして保存します。

    SET(CMAKE_SYSTEM_NAME Linux)
    SET(CMAKE_SYSTEM_VERSION 1)
    SET(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
    SET(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)
    SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
    SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
    SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
    SET(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
    SET(CMAKE_FIND_ROOT_PATH /mnt/pi)

    sysrootがない場合は、最後の行を削除できます。

    さらに、CMAKE_SYSTEM_PROCESSORを設定することもできます。CMakeの公式ドキュメントでは、クロスコンパイルを行う場合、CMAKE_TOOLCHAIN_FILEが指定するターゲットアーキテクチャに一致するようにCMAKE_SYSTEM_PROCESSOR変数を設定する必要があると示唆されています。ただし、ドキュメントには有効な値のリストが提供されておらず、この設定は必須ではないことがわかりました。とにかく、変数を設定する必要のある値がわかっている場合は、そこに設定を追加してください。ONNX Runtimeのビルドスクリプトはこの変数を使用しませんが、ONNX Runtimeの依存関係は使用する場合があります。

  4. CMakeとmakeを実行します。

    cmake引数に-Donnxruntime_ENABLE_CPUINFO=OFF -DCMAKE_TOOLCHAIN_FILE=path/to/tool.cmakeを追加し、cmakeとmakeを実行してビルドします。Pythonパッケージもビルドしたい場合は、次のようなcmake引数を使用できます。

    Terminal window
    -Donnxruntime_GCC_STATIC_CPP_RUNTIME=ON -DCMAKE_BUILD_TYPE=Release -Dprotobuf_WITH_ZLIB=OFF -DCMAKE_TOOLCHAIN_FILE=path/to/tool.cmake -Donnxruntime_ENABLE_PYTHON=ON -DPYTHON_EXECUTABLE=/mnt/pi/usr/bin/python3 -Donnxruntime_BUILD_SHARED_LIB=OFF -Donnxruntime_DEV_MODE=OFF "-DPYTHON_INCLUDE_DIR=/mnt/pi/usr/include;/mnt/pi/usr/include/python3.7m" -DNUMPY_INCLUDE_DIR=/mnt/pi/folder/to/numpy/headers

    cmakeを実行した後、次を実行します。

    Terminal window
    $ make
  5. (オプション)Pythonパッケージをビルドします。

    ソースフォルダからsetup.pyファイルをビルドフォルダにコピーし、次を実行します。

    Terminal window
    python3 setup.py bdist_wheel -p linux_aarch64

    manylinuxをターゲットにしている場合、残念ながら、彼らのツールはクロスコンパイルシナリオでは機能しません。次のようなdockerで実行します。

    Terminal window
    docker run -v /usr/bin/qemu-aarch64-static:/usr/bin/qemu-aarch64-static -v `pwd`:/tmp/a -w /tmp/a --rm quay.io/pypa/manylinux2014_aarch64 /opt/python/cp37-cp37m/bin/python3 setup.py bdist_wheel

    特定のLinuxディストリビューション(Ubuntuなど)のみをターゲットにしたい場合は、これは不要です。

Visual C++コンパイラの使用

  1. Arm(64)用のVisual C++コンパイラとライブラリをダウンロードしてインストールします。 Visual Studioがインストールされている場合は、Visual Studioインストーラーを使用して(Visual Studioを変更することを選択した後、個々のコンポーネントセクションの下を見てください)、対応するArm(64)コンパイラとライブラリをダウンロードしてインストールしてください。

  2. .\build.batを使用し、ビルドオプションとして--armまたは--arm64を指定してビルドを開始します。できればDeveloper Command Prompt for VSを使用するか、ビルドに使用するコマンドプロンプトからすべてのインストール済みクロスコンパイラがPATH環境変数を使用して見つけられるようにしてください。

  3. ビルドコマンドに--use_vcpkgを追加すると、protoc.exeを手動で処理するのを回避できます。


Android用ビルドiOS用ビルドを参照してください。

ウェブ用ビルドを参照してください。