環境情報
- アーキテクチャ: 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未対応でもビルドが継続可能になるが、関連最適化が無効になる可能性がある点に注意。