為推理構建 ONNX Runtime

請按照以下說明構建 ONNX Runtime 以執行推理。

目錄

CPU

基本 CPU 構建

先決條件

  • 檢出原始碼樹

     git clone --recursive https://github.com/Microsoft/onnxruntime.git
     cd onnxruntime
    
  • 安裝 Python 3.10+

  • 安裝 cmake-3.28 或更高版本。

    在 Windows 上,我們建議從 WinGet 獲取最新版本。請執行

      winget install -e --id Kitware.CMake
    

    在 Linux 上,您可以從 PyPI 獲取。請執行

      python3 -m pip install cmake
      which cmake
    

    如果上述命令失敗,請手動從 https://cmake.org/download/ 獲取 cmake。

    安裝後,您可以執行

      cmake --version
    

    以驗證安裝是否成功。

構建說明

Windows

開啟您將使用的 Visual Studio 版本的開發人員命令提示符。這將正確設定環境,包括編譯器、連結器、實用程式和標頭檔案的路徑。

.\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 位構建。

Linux

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

macOS

預設情況下,ONNX Runtime 配置為針對最低目標 macOS 版本 13.3 進行構建。釋出 Nuget 包中的共享庫和 Python wheel 檔案可以在 macOS 13.3+ 版本上安裝。

如果您想使用 Xcode 為 x86_64 macOS 構建 onnxruntime,請在命令列中新增 --use_xcode 引數。

如果沒有此標誌,cmake 構建生成器將預設為 Unix makefile。

如今,Mac 電腦要麼是基於 Intel 的,要麼是基於 Apple 晶片的。預設情況下,ONNX Runtime 的構建指令碼只為構建機器所具有的 CPU 架構生成二進位制檔案。如果您想進行交叉編譯:在基於 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_64

為 Apple 晶片 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

在 AIX 中,您可以使用以下方式構建 64 位 ONNX Runtime:

  • IBM Open XL 編譯器工具鏈。最低要求的 AIX 作業系統版本為 7.2。您需要安裝 17.1.2 編譯器 PTF5 (17.1.2.5) 版本。
  • GNU GCC 編譯器工具鏈。最低要求的 AIX 作業系統版本為 7.3。需要 GCC 10.3+ 版本。

對於 IBM Open XL,請匯出以下環境變數設定。

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,請匯出以下環境變數設定。

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"

要啟動構建,請執行以下命令:

./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。與“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 構建能夠找到它。同時執行 ldconfig <protobuf 庫資料夾路徑>,以便連結器能夠找到 protobuf 庫。
  • 如果您想從原始碼安裝 onnx,請先安裝 protobuf,然後
      export ONNX_ML=1
      python3 setup.py bdist_wheel
      pip3 install --upgrade dist/*.whl
    

    然後,在開始構建 ONNX Runtime 之前,最好解除安裝 protobuf,特別是如果您安裝了與 ONNX Runtime 不同的 protobuf 版本。—

支援的架構和構建環境

架構

  x86_32 x86_64 ARM32v7 ARM64 PPC64LE RISCV64 PPC64BE S390X
Windows
Linux
macOS
Android
iOS
AIX

構建環境(宿主機)

作業系統 支援 CPU 支援 GPU 備註
Windows 10 支援 VS2019 至最新的 VS2022
Windows 10
適用於 Linux 的子系統
 
Ubuntu 20.x/22.x 也支援 ARM32v7 (實驗性)
CentOS 7/8/9 也支援 ARM32v7 (實驗性)
macOS  

不支援 GCC 8.x 及以下版本。
如果您想為 32 位架構構建二進位制檔案,您可能需要進行交叉編譯,因為 32 位編譯器可能沒有足夠的記憶體來執行構建。
不支援在 Android/iOS 上構建程式碼。您需要使用 Windows、Linux 或 macOS 裝置來完成。

作業系統/編譯器 支援 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 和語言繫結

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 包

目前僅支援 Windows 和 Linux。

先決條件
  • 構建 C# 繫結和建立託管 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
.\build.bat --build_nuget
Linux
./build.sh --build_nuget

Nuget 包建立在\nuget-artifacts


其他構建選項

精簡運算子核心構建

精簡運算子核心構建允許您自定義構建中的核心,以提供更小的二進位制檔案大小。

除錯節點輸入輸出

OnnxRuntime 支援用於啟用中間張量形狀和資料除錯的構建選項。

構建說明

設定 onnxruntime_DEBUG_NODE_INPUTS_OUTPUT 以啟用此功能進行構建。

Linux
./build.sh --cmake_extra_defines onnxruntime_DEBUG_NODE_INPUTS_OUTPUTS=1
Windows
.\build.bat --cmake_extra_defines onnxruntime_DEBUG_NODE_INPUTS_OUTPUTS=1

配置

除錯轉儲行為可以透過多個環境變數控制。詳情請參閱 onnxruntime/core/framework/debug_node_inputs_outputs_utils.h

示例

要指定節點輸出資料應被轉儲(預設為標準輸出),請設定此環境變數

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

在 RISC-V 等平臺上執行涉及從主機平臺(例如 Linux)交叉編譯到目標平臺(特定的 RISC-V CPU 架構和作業系統)。請按照以下說明構建用於 RISC-V 64 位的 ONNX Runtime。

在 Linux 上交叉編譯

  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,這將產生如下輸出:

        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 上交叉編譯

    執行 ./build.sh 並帶上 --rv64 標誌,使用 --riscv_toolchain_root 指定 RISC-V 工具鏈根目錄,並使用 --riscv_qemu_path 提供 QEMU 路徑作為構建選項來啟動構建過程。確保所有已安裝的交叉編譯器都可以從用於構建的命令提示符訪問,方法是配置 PATH 環境變數。

    (可選)如果您打算使用 xnnpack 作為執行提供程式,請務必在構建配置中包含 --use_xnnpack 選項。

    示例構建命令

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

Arm

有幾種為基於 Arm® 的裝置構建 ONNX Runtime 的選項。

首先,您可以在真實的 Arm 裝置上進行,或者在帶有模擬器(如 qemu)的 x86_64 裝置上進行,或者在帶有模擬器(您可以在 x86_64 PC 上執行基於 Arm 的容器)的 docker 容器中的 x86_64 裝置上進行。那麼構建說明本質上與 Linux x86_64 的說明相同。但是,如果您的目標 CPU 不是 64 位,則無法工作,因為構建過程需要超過 2GB 記憶體。

透過模擬進行基於 Arm 裝置的交叉編譯 (Linux/Windows)

簡單、慢、推薦

此方法依賴於 qemu 使用者模式模擬。它允許您透過指令級模擬使用桌面或雲虛擬機器進行編譯。您將在 x86 CPU 上執行構建,並將每個 Arm 架構指令轉換為 x86。這可能比在低端裝置上本地編譯快得多。生成的 ONNX Runtime Python wheel (.whl) 檔案隨後部署到基於 Arm 的裝置上,在那裡可以在 Python 3 指令碼中呼叫。構建過程可能需要數小時,如果目標 CPU 是 32 位,可能會記憶體不足。

在 Linux 上交叉編譯

困難,快

此選項非常快,可以在幾分鐘內構建軟體包,但設定起來很困難。如果您有大型程式碼庫(例如,您正在向 onnxruntime 新增新的執行提供程式),這可能是唯一可行的方法。

  1. 獲取相應的工具鏈。

    簡而言之;前往 https://www.linaro.org/downloads/,獲取“64-bit Armv8 Cortex-A, little-endian”和“Linux Targeted”,而不是“Bare-Metal Targeted”。將其解壓到您的構建機器並將 bin 資料夾新增到您的 $PATH 環境變數中。然後跳過此部分。

    您可以使用 GCCClang。兩者都可行,但這裡的說明基於 GCC。

    在 GCC 術語中

    • “build”描述了配置和編譯 GCC 的系統型別。
    • “host”描述了 GCC 執行的系統型別。
    • “target”描述了 GCC 生成程式碼的系統型別。

    當不進行交叉編譯時,通常“build”=“host”=“target”。當您進行交叉編譯時,通常“build”=“host”≠“target”。例如,您可以在 x86_64 上構建 GCC,然後執行在 x86_64 上,再生成目標為 aarch64 的二進位制檔案。在這種情況下,“build”=“host”= x86_64 Linux,目標是 aarch64 Linux。

    您可以自行從原始碼構建 GCC,或者從 Ubuntu、linaro 等供應商獲取預構建的 GCC。選擇與目標作業系統相同的編譯器版本是最好的。如果不可能,請選擇最新的穩定版本並靜態連結到 GCC 庫。

    獲取編譯器後,執行 aarch64-linux-gnu-gcc -v,這將產生如下輸出:

     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。通常,每個硬體供應商都會提供一個工具鏈;檢查它是如何構建的。

    目標環境透過以下方式識別:

    • 架構:x86_32, x86_64, armv6, armv7, armv7l, aarch64,...
    • 作業系統:裸機或 Linux。
    • Libc:gnu libc/ulibc/musl/...
    • ABI:Arm 有多種 ABI,如 eabi, eabihf...

    您可以從之前的輸出中獲取所有這些資訊,請確保它們都正確無誤。

  2. (可選)設定 sysroot 以啟用 Python 擴充套件。如果不使用 Python,請跳過。

    將目標作業系統的根檔案系統轉儲到您的構建機器上。我們將該資料夾稱為“sysroot”,並將其用於構建 onnxruntime Python 擴充套件。在此之前,您應該首先在目標機器上安裝 python3 開發包(包含 C 標頭檔案)和 numpy Python 包。

    以下是一些示例。

    如果目標作業系統是 raspbian-buster,請從其網站下載 RAW 映象,然後執行

     $ 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 位元組。

    然後執行

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

    您將在 /mnt/pi 看到所有 raspbian 檔案。但是您還不能使用它。因為一些符號連結已損壞,您必須先修復它們。

    在 /mnt/pi 中,執行

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

    它會顯示哪些已損壞。然後您可以透過執行以下命令修復它們:

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

    然後 /mnt/pi2 就是您下一步將使用的 sysroot 資料夾。

    如果目標作業系統是 Ubuntu,您可以從 https://cloud-images.ubuntu.com/ 獲取映象。但該映象為 qcow2 格式。請在執行 fdisk 和掛載之前進行轉換。

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

    剩餘部分與 raspbian 類似。

    如果目標作業系統是 manylinux2014,您可以透過以下方式獲取:從 apt 或 dnf 安裝 qemu-user-static。然後執行 docker

    Ubuntu

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

    在 Fedora 上不需要 “-v /usr/bin/qemu-aarch64-static:/usr/bin/qemu-aarch64-static” 引數。

    然後,在 docker 內部,執行

     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 還沒有預構建的包。完成後,開啟第二個視窗並執行

     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 以備將來使用。

     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 引數:

    -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 後,執行

    $ make
    
  5. (可選)構建 Python 包

    setup.py 檔案從原始檔夾複製到構建資料夾並執行

    python3 setup.py bdist_wheel -p linux_aarch64
    

    如果目標是 manylinux,不幸的是其工具在交叉編譯場景下不起作用。請在 docker 中執行,例如

    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 上交叉編譯

使用 Visual C++ 編譯器

  1. 下載並安裝適用於 Arm(64) 的 Visual C++ 編譯器和庫。如果您已安裝 Visual Studio,請使用 Visual Studio 安裝程式(在選擇修改 Visual Studio 後,檢視“各個元件”部分)下載並安裝相應的 Arm(64) 編譯器和庫。

  2. 使用 .\build.bat 並指定 --arm--arm64 作為構建選項來開始構建。最好使用 Visual Studio 的開發人員命令提示符,或者確保所有已安裝的交叉編譯器都可以從用於構建的命令提示符透過 PATH 環境變數找到。

  3. 在構建命令中新增 --use_vcpkg,這可以避免手動處理 protoc.exe


移動裝置

請參閱 為 Android 構建為 iOS 構建

Web

請參閱 為 Web 構建