Jetson Orin 安裝 onnxruntime
onnxruntime在Jetson上安裝只需注意三件事: 版本! 版本! 還是TMD版本!
本機環境
- Jectpack : 5.1.2
- CUDA : 11.4
- cuDNN :8.6.0
版本說明
關于onnxruntime的版本適配不同的官方有不同的推薦
- 英偉達jetson zoo提供了onnxruntime的預編譯版本,版本號是根據Jetpack的版本號來選擇onnxruntime,這里推薦的是1.17.0和1.18.0
- onnxruntime官方是根據CUDA版本推薦的,這里推薦的是1.11和1.12
這里二者推薦的版本很矛盾,因此綜上所述,我們選擇的版本是1.16.0 😃 因為前面幾個版本測試安裝都有問題
1、安裝準備
Jetson zoo雖然有onnxruntime的預編譯版本,但是是python版本的,沒有c++部署需要的頭文件和動態庫,所以推薦源碼安裝編譯。
首先需要臨時聲明一些環境變量
sudo apt-get install protobuf-compiler libprotoc-devexport PATH=/usr/local/cuda/bin:${PATH}
export CUDA_PATH=/usr/local/cuda
export cuDNN_PATH=/usr/lib/aarch64-linux-gnu
export CMAKE_ARGS="-DONNX_CUSTOM_PROTOC_EXECUTABLE=/usr/bin/protoc"
2、源碼下載
源碼下載,最好直接用git clone,而不是去github下載對應版本的程序,因為build.sh好像需要git的倉庫,為了不必要的麻煩直接gitclone
git clone --recursive https://github.com/Microsoft/onnxruntime.git
--recursive
遞歸子庫
切換版本號
git checkout v1.16.0
更新子倉庫
git submodule update --init --recursive --progress
NOTICE1:
這一步可能會遇到如下錯誤
does not match expected value
expected: ‘ee201b07085203ea7bd8eb97cbcb31b07cfa3efb’
actual: ‘5b3adeb17e87b1a6f6a716b2c462f44b5aa01713’
– Hash mismatch, removing…
導致程序卡在eigen這個庫反復下載
出現此問題的原因是git下來的eigen庫哈希值與期望的哈希值不一致,即使手動下載此庫也會這樣。目前不清楚expected的哈希值為什么與給出鏈接的不同,可能是版本問題。
找到 ./onnxruntime/cmake/external
路徑下的eigen.cmake文件,在文件開始強制修改期望的哈希值為下載的版本,這里舉例我的是
set(DEP_SHA1_eigen "5b3adeb17e87b1a6f6a716b2c462f44b5aa01713")
NOTICE2:
可能會遇到這個錯誤,由于丟失記不清哪個錯誤了,總之就會卡住一會,網絡錯誤,多試幾遍就好
ontent.cmake:2145:EVAL:2 (__FetchContent_doPopulation) /usr/local/cmake/share/cmake-3.31/Modules/FetchContent.cmake:2145 (cmake_language) /usr/local/cmake/share/cmake-3.31/Modules/FetchContent.cmake:1978:EVAL:1 (__FetchContent_Populate) /usr/local/cmake/share/cmake-3.31/Modules/FetchContent.cmake:1978 (cmake_language) external/eigen.cmake:12 (FetchContent_Populate) external/onnxruntime_external_deps.cmake:483 (include) CMakeLists.txt:586 (include) -
3、編譯
cd ./onnnxruntime
./build.sh --config Release --update --build --parallel --build_shared_lib --build_wheel --use_cuda --cuda_home /usr/local/cuda --cudnn_home /usr/lib/aarch64-linux-gnu
--build_shared_lib
生成動態庫 --use_cuda
使用cuda --parallel
多線程編譯
編譯完成標志
...
build [INFO] - Build complete
4、安裝
cd ./build/Linux/Release
sudo make install
安裝完成后 動態庫 libonnxruntime.so 在/usr/local/lib
里
頭文件在/usr/local/include/onnxruntime
里
5、異常分析
- ImportError: cannot import name ‘FileError’ from ‘setuptools.errors’
遇到這個問題可能是setuptools版本問題,檢查更新并安裝依賴庫
然后重新編譯python3 -m venv onnxruntime-env source onnxruntime-env/bin/activate pip install --upgrade pip setuptools pip install -r /mnt/cf/wk_test/onnxruntime/requirements.txt
5、其他版本
隨手記錄下其他版本安裝中遇到的問題,以供參考和復盤
- v1.17.0 / v1.18.0
首先報錯
CMake Error at CMakeLists.txt:647 (message): The compiler doesn't support BFLOAT16!!!
此報錯為gcc-9版本不支持BFLOAT16類型,需要升級到gcc-10版本
然后遇到報錯
error: This file was generated by an older version of protoc which is incompatible with your Protocol Buffer headers.
這個錯誤是在編譯時源碼報的錯,錯誤表明 ?Protocol Buffer(protoc)版本不兼容?,導致生成的 onnx-ml.pb.h 文件與當前系統安裝的 protobuf 頭文件沖突,直接放棄
- v1.16.3
1.16.3在編譯時可以通過,但是在編譯后的test測試會報錯
----------] Global test environment tear-down [==========] 4119 tests from 289 test suites ran. (344132 ms total)[ PASSED ] 4110 tests.
[ SKIPPED ] 6 tests, listed below:
[ SKIPPED ] AttentionTest.AttentionPastState_dynamic [ SKIPPED ] AttentionTest.Attention_Mask2D_Fp32_B2_S32
[ SKIPPED ] AttentionTest.Attention_Mask1D_Fp32_B2_S64 [ SKIPPED ] AttentionTest.Attention_NoMask_Fp16[ SKIPPED ] MatMulFpQ4.MatMul2DSym [ SKIPPED ] MatMulFpQ4.MatMul2DBlkZp[ FAILED ] 3 tests, listed below:
[ FAILED ] MultiHeadAttentionTest.CrossAttention_Batch2_HeadSize32_NoBias_NoMask_PackedKV
[ FAILED ] MultiHeadAttentionTest.SelfAttention_Batch2_HeadSize32_NoBias_NoMask_PackedQKV
[ FAILED ] QuantizeLinearOpMLFloat16Test.Float8 3FAILED TESTS YOU HAVE 9 DISABLED TESTS <end of output> Test time = 344.85 sec ---------------------------------------------------------- Test Failed. "onnxruntime_test_all"
搜索后可能是注意力機制和量化模塊有問題,解決了之后又報
packed KV format is not implemented for current GPU. Please disable packed kv in fusion options?
此問題屬于 ONNX Runtime 對特定 GPU 架構的算子支持不完整,因此放棄了此版本。
- v1.12.0
編譯時總是遇到 undefined reference to `libiconv_close’ 這個錯誤,但是已經安裝了libiconv庫,并且export臨時聲明了庫的地址,試過了很多方法還是報錯,放棄。