推論用のビルド
推論用にONNX Runtimeをビルドする
Section titled “推論用にONNX Runtimeをビルドする”以下の手順に従って、推論を実行するためにONNX Runtimeをビルドします。
- TOCプレースホルダー
基本的なCPUビルド
-
ソースツリーをチェックアウトします。
Terminal window git clone --recursive https://github.com/Microsoft/onnxruntime.gitcd onnxruntime -
Python 3.10+をインストールします。
-
cmake-3.28以上をインストールします。
Windowsでは、WinGetから最新バージョンを入手することをお勧めします。以下を実行してください。
Terminal window winget install -e --id Kitware.CMakeLinuxでは、pypiから入手できます。以下を実行してください。
Terminal window python3 -m pip install cmakewhich cmake上記のコマンドが失敗した場合は、https://cmake.org/download/から手動でcmakeを入手してください。
インストール後、以下を実行してインストールが成功したかどうかを確認できます。
cmake --version
Windows
Section titled “Windows”使用する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用にビルド:
./build.sh --config RelWithDebInfo --build_shared_lib --parallel --compile_no_warning_as_error --skip_submodule_sync --cmake_extra_defines CMAKE_OSX_ARCHITECTURES=x86_64AppleシリコンCPU用にビルド:
./build.sh --config RelWithDebInfo --build_shared_lib --parallel --compile_no_warning_as_error --skip_submodule_sync --cmake_extra_defines CMAKE_OSX_ARCHITECTURES=arm64両方のためにビルド:
./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の場合、以下の環境設定をエクスポートします。
ulimit -m unlimitedulimit -d unlimitedulimit -n 2000ulimit -f unlimitedexport OBJECT_MODE=64export 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の場合、以下の環境設定をエクスポートします。
ulimit -m unlimitedulimit -d unlimitedulimit -n 2000ulimit -f unlimitedexport OBJECT_MODE=64export 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"ビルドを開始するには、以下のコマンドを実行します。
./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をインストールしてから、次のようにします。
その後、ONNX Runtimeのビルドを開始する前にprotobufをアンインストールすることをお勧めします。特に、ONNX Runtimeが持つものとは異なるバージョンのprotobufをインストールした場合はなおさらです。export ONNX_ML=1python3 setup.py bdist_wheelpip3 install --upgrade dist/*.whl
サポートされているアーキテクチャとビルド環境
Section titled “サポートされているアーキテクチャとビルド環境”アーキテクチャ
Section titled “アーキテクチャ”| x86_32 | x86_64 | ARM32v7 | ARM64 | PPC64LE | RISCV64 | PPC64BE | S390X | |
|---|---|---|---|---|---|---|---|---|
| Windows | はい | はい | はい | はい | いいえ | いいえ | いいえ | いいえ |
| Linux | はい | はい | はい | はい | はい | はい | いいえ | はい |
| macOS | いいえ | はい | いいえ | いいえ | いいえ | いいえ | いいえ | いいえ |
| Android | いいえ | いいえ | はい | はい | いいえ | いいえ | いいえ | いいえ |
| iOS | いいえ | いいえ | いいえ | はい | いいえ | いいえ | いいえ | いいえ |
| AIX | いいえ | いいえ | いいえ | いいえ | いいえ | いいえ | はい | いいえ |
ビルド環境(ホスト)
Section titled “ビルド環境(ホスト)”| OS | CPUをサポート | 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 | いいえ | テストされていません | はい(必要な最小バージョンは確認されていません) |
ターゲット環境
Section titled “ターゲット環境”コードは以下用にビルドできます。
- Windows
- Linux
- MacOS
- Android
- iOS
- WebAssembly
ランタイム時:
- サポートされている最小WindowsバージョンはWindows 10です。
- サポートされている最小CentOSバージョンは7です。
- サポートされている最小Ubuntuバージョンは16.04です。
一般的なビルド手順
Section titled “一般的なビルド手順”| 説明 | コマンド | 追加の詳細 |
|---|---|---|
| 基本ビルド | build.bat (Windows)./build.sh (Linux) | |
| リリースビルド | --config Release | リリースビルド。その他の有効な構成値はRelWithDebInfoとDebugです。 |
| 並列処理を使用したビルド | --parallel | ビルドを高速化するために強くお勧めします。 |
| 共有ライブラリのビルド | --build_shared_lib | |
| トレーニングサポートの有効化 | --enable_training |
APIと言語バインディング
Section titled “APIと言語バインディング”| API | コマンド | 追加の詳細 |
|---|---|---|
| Python | --build_wheel | |
| C#およびC Nugetパッケージ | --build_nuget | C#バインディングをビルドし、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_nodejs | Node.jsバインディングをビルドします。--build_shared_libを意味します |
Nugetパッケージのビルド
Section titled “Nugetパッケージのビルド”現在、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を実行する必要があります。
Windows
Section titled “Windows”.\build.bat --build_nuget./build.sh --build_nugetNugetパッケージは<native_build_dir>\nuget-artifactsの下に作成されます。
その他のビルドオプション
Section titled “その他のビルドオプション”- VCPKGを使用してonnxruntimeをビルドできます。詳細については、ドキュメント/docs/build/dependencies.mdを参照してください。
縮小オペレーターカーネルビルド
Section titled “縮小オペレーターカーネルビルド”縮小オペレーターカーネルビルドでは、ビルド内のカーネルをカスタマイズして、バイナリサイズを小さくすることができます。
DebugNodeInputsOutputs
Section titled “DebugNodeInputsOutputs”OnnxRuntimeは、中間テンソルの形状とデータのデバッグを有効にするためのビルドオプションをサポートしています。
これを有効にしてビルドするには、onnxruntime_DEBUG_NODE_INPUTS_OUTPUTを設定します。
./build.sh --cmake_extra_defines onnxruntime_DEBUG_NODE_INPUTS_OUTPUTS=1Windows
Section titled “Windows”.\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=1ORT_DEBUG_NODE_IO_NAME_FILTER="Foo;Bar"ORT_DEBUG_NODE_IO_DUMP_DATA_TO_FILES=1RISC-V
Section titled “RISC-V”RISC-Vなどのプラットフォームで実行するには、ホストプラットフォーム(Linuxなど)からターゲットプラットフォーム(特定のRISC-V CPUアーキテクチャとオペレーティングシステム)へのクロスコンパイルが必要です。以下の手順に従って、RISC-V 64ビット用にONNX Runtimeをビルドします。
Linuxでのクロスコンパイル
Section titled “Linuxでのクロスコンパイル”-
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-gccCOLLECT_LTO_WRAPPER=/path/to/libexec/gcc/riscv64-unknown-linux-gnu/13.2.0/lto-wrapperTarget: riscv64-unknown-linux-gnuConfigured 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: posixSupported LTO compression algorithms: zlib zstdgcc version 13.2.0 () -
RISC-V 64ビットCMakeツールチェーンファイルを構成します。
CMakeツールチェーンファイルは
${ORT_ROOT}/cmake/riscv64.toolchain.cmakeにあります。構成する必要のある変数の代替値がある場合は、そのファイルに対応する設定を含めてください。 -
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) - 推奨; 簡単、低速、ARM64のみ(ARM32のサポートなし)
- Linuxでのクロスコンパイル - 困難、高速
- Windowsでのクロスコンパイル
シミュレーションを使用したArmベースのデバイスのクロスコンパイル(Linux/Windows)
Section titled “シミュレーションを使用したArmベースのデバイスのクロスコンパイル(Linux/Windows)”簡単、低速、推奨
この方法は、qemuユーザーモードエミュレーションに依存しています。これにより、命令レベルのシミュレーションを介してデスクトップまたはクラウドVMを使用してコンパイルできます。ビルドをx86 CPUで実行し、すべてのArmアーキテクチャ命令をx86に変換します。これは、ローエンドデバイスでネイティブにコンパイルするよりも大幅に高速になる可能性があります。結果のONNX Runtime Pythonホイール(.whl)ファイルは、Python 3スクリプトで呼び出すことができるArmベースのデバイスにデプロイされます。ビルドプロセスには数時間かかる場合があり、ターゲットCPUが32ビットの場合はメモリ不足になる可能性があります。
Linuxでのクロスコンパイル
Section titled “Linuxでのクロスコンパイル”困難、高速
このオプションは非常に高速で、パッケージを数分でビルドできますが、セットアップが困難です。大規模なコードベースがある場合(たとえば、onnxruntimeに新しい実行プロバイダーを追加する場合)、これが唯一の実行可能な方法である可能性があります。
-
対応するツールチェーンを入手します。
要するに、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-gccCOLLECT_LTO_WRAPPER=/usr/libexec/gcc/aarch64-linux-gnu/9/lto-wrapperTarget: aarch64-linux-gnuConfigured 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=gnuThread model: singlegcc 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があります。
以前の出力からこれらのすべての情報を取得できます。すべてが正しいことを確認してください。
-
(オプション)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.img1 8192 532479 524288 256M c W95 FAT32 (LBA) 2020-02-13-raspbian-buster.img2 532480 7397375 6864896 3.3G 83 Linux ルートパーティションが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.6numpyにはまだビルド済みパッケージがないため、これらのコマンドには数時間かかります。完了したら、2番目のウィンドウを開いて次を実行します。
Terminal window docker ps出力から:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES5a796e98db05 quay.io/pypa/manylinux2014_aarch64 "/bin/bash" 3 minutes ago Up 3 minutes affectionate_cannondockerインスタンスIDが5a796e98db05であることがわかります。次のコマンドを使用して、ルートファイルシステムを将来使用するためのsysrootとしてエクスポートします。
Terminal window docker export 5a796e98db05 -o manylinux2014_aarch64.tar -
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の依存関係は使用する場合があります。
-
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/headerscmakeを実行した後、次を実行します。
Terminal window $ make -
(オプション)Pythonパッケージをビルドします。
ソースフォルダからsetup.pyファイルをビルドフォルダにコピーし、次を実行します。
Terminal window python3 setup.py bdist_wheel -p linux_aarch64manylinuxをターゲットにしている場合、残念ながら、彼らのツールはクロスコンパイルシナリオでは機能しません。次のような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など)のみをターゲットにしたい場合は、これは不要です。
Windowsでのクロスコンパイル
Section titled “Windowsでのクロスコンパイル”Visual C++コンパイラの使用
-
Arm(64)用のVisual C++コンパイラとライブラリをダウンロードしてインストールします。 Visual Studioがインストールされている場合は、Visual Studioインストーラーを使用して(Visual Studioを
変更することを選択した後、個々のコンポーネントセクションの下を見てください)、対応するArm(64)コンパイラとライブラリをダウンロードしてインストールしてください。 -
.\build.batを使用し、ビルドオプションとして--armまたは--arm64を指定してビルドを開始します。できればDeveloper Command Prompt for VSを使用するか、ビルドに使用するコマンドプロンプトからすべてのインストール済みクロスコンパイラがPATH環境変数を使用して見つけられるようにしてください。 -
ビルドコマンドに
--use_vcpkgを追加すると、protoc.exeを手動で処理するのを回避できます。
Android用ビルドとiOS用ビルドを参照してください。
ウェブ用ビルドを参照してください。