ARMアーキテクチャ向けONNX Runtime GPU版のソースビルド手順

環境情報

  • アーキテクチャ: aarch64
  • OS: Ubuntu 20.04
  • GPU: NVIDIA T4

前提条件

  • CUDAが適切にインストール済み
  • cuDNNが適切にインストール済み
  • CMakeが適切にインストール済み

ビルド手順

1. ソースコードの取得

git clone --recursive https://github.com/microsoft/onnxruntime.git
cd onnxruntime

2. バージョンの切り替え

git checkout v1.16.3

3. ビルドスクリプトの実行

./build.sh \
  --config Release \
  --update \
  --build \
  --parallel \
  --build_wheel \
  --use_cuda \
  --allow_running_as_root \
  --cuda_home /usr/local/cuda \
  --cudnn_home /usr/lib/aarch64-linux-gnu \
  --skip_tests \
  --cmake_extra_defines \
     CMAKE_CUDA_ARCHITECTURES=75 \
     onnxruntime_ENABLE_NVTX_PROFILE=ON \
     onnxruntime_USE_MEMORY_EFFICIENT_ATTENTION=OFF \
     onnxruntime_USE_FLASH_ATTENTION=OFF \
     onnxruntime_BUILD_UNIT_TESTS=OFF \
     CMAKE_POLICY_VERSION_MINIMUM=3.5

よくあるエラーと対処法

1. CUDAアーキテクチャの不一致

エラーメッセージに「CMAKE_CUDA_ARCHITECTURES=87」と表示される場合、T4 GPUの計算能力は7.5(75)であるため、引数をCMAKE_CUDA_ARCHITECTURES=75に修正する必要がある。

2. 外部ライブラリのダウンロードタイムアウト

例として、pytorch/cpuinfo のZIPファイルがダウンロードできない場合、手動でブラウザから以下のURLをダウンロードする:

https://github.com/pytorch/cpuinfo/archive/ca678952a9a8eaa6de112d154e8e104b22f9ab3f.zip

ダウンロード後、ファイルを以下ディレクトリに配置する(パスはエラーメッセージに従って調整):

onnxruntime/build/Linux/Release/_deps/pytorch_cpuinfo-subbuild/pytorch_cpuinfo-populate-prefix/src/

その後、ビルドコマンドを再実行する。

3. BFLOAT16サポートの欠如

v1.17.0以降ではARM環境でBFLOAT16命令のサポートが必須となる。Ubuntu 20.04のデフォルトGCCでは対応していないため、以下のいずれかの方法で対処する。

方法1: GCCのアップグレード
sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt update
sudo apt install gcc-12 g++-12

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 120
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 120

# 必要に応じて選択
sudo update-alternatives --config gcc
sudo update-alternatives --config g++

gcc --version
g++ --version
方法2: ソースコードの修正

onnxruntime/cmake/CMakeLists.txt内の以下のチェック部分を変更する:

# 変更前
check_cxx_compiler_flag(-march=armv8.2-a+bf16 HAS_ARM64_BFLOAT16)
if(NOT HAS_ARM64_BFLOAT16)
  message(FATAL_ERROR "The compiler doesn't support BFLOAT16!!!")
endif()

# 変更後
check_cxx_compiler_flag(-march=armv8.2-a+bf16 HAS_ARM64_BFLOAT16)
if(NOT HAS_ARM64_BFLOAT16)
  set(HAS_ARM64_BFLOAT16 TRUE)
endif()

この変更により、BFLOAT16未対応でもビルドが継続可能になるが、関連最適化が無効になる可能性がある点に注意。

タグ: onnxruntime CUDA arm64 GCC bfloat16

5月29日 15:10 投稿