jetson设备上自己手动编译适配版本的onnxruntime全过程,及报错的解决方法

原来我的jetpack版本较低,可以直接从jetson zoo中找到对应本版编译好的ort:


但是最高也只支持到jetpack6.0。而我今天的设备是jetpack 6.2.1(L4T 36.4.4),一开始我的思路是在官网中寻找这个版本对应的ort,发现根本没有类似jetson zoo这样的,已经编译好的whl文件,直接下载后pip install即可安装完成那么简单。

所以只能换个思路,自己手动编译ORT。首先找到onnxruntime官网,里面每个版本都发布在上面。根据nvidia官方文档查看jetpack版本对应的onnxruntime版本,JetPack 6.x 支持 ONNX Runtime 1.17.x,根据我JetPack 6.2.1(L4T 36.4.4)应该对应的是 ONNX Runtime 1.17.1。

在官网中找到1.17.1版本的release,下载Source code (zip) 或者 Source code (tar.gz)

推荐是下载tar.gz,然后开始编译:

🟩步骤 1:安装依赖

bash 复制代码
sudo apt update
sudo apt install -y build-essential python3-dev python3-pip git cmake ninja-build

🟩 步骤 2:安装 protobuf(JetPack 6.x 必须)

bash 复制代码
sudo apt install -y protobuf-compiler libprotobuf-dev

🟩 步骤 3:下载 ONNX Runtime 1.17.1 源码

bash 复制代码
wget https://github.com/microsoft/onnxruntime/archive/refs/tags/v1.17.1.tar.gz
tar -xvf v1.17.1.tar.gz
cd onnxruntime-1.17.1

🟩 步骤 4:开始编译(JetPack 6.x 专用命令)

首先构建 ONNX Runtime(含 CUDA + TensorRT):

bash 复制代码
./build.sh --config Release \
  --update --build \
  --parallel \
  --use_cuda \
  --cuda_home /usr/local/cuda \
  --cudnn_home /usr/lib/aarch64-linux-gnu \
  --use_tensorrt \
  --tensorrt_home /usr/lib/aarch64-linux-gnu \
  --skip_tests

解释:

复制代码
--use_cuda → 启用 CUDA EP
--use_tensorrt → 启用 TensorRT EP
--skip_tests → 避免 Jetson 上跑测试太慢
--parallel → 多核编译

时间比较久大约需要 30--60 分钟。

其次构建 Python wheel:

bash 复制代码
python3 tools/ci_build/build.py \
  --config Release \
  --build_dir build \
  --parallel \
  --skip_tests \
  --use_cuda \
  --cuda_home /usr/local/cuda \
  --cudnn_home /usr/lib/aarch64-linux-gnu \
  --use_tensorrt \
  --tensorrt_home /usr/lib/aarch64-linux-gnu \
  --build_wheel

🟩 步骤 5:找到生成的 whl 文件

编译完成后,whl 会在路径:

bash 复制代码
build/Linux/Release/dist/

文件名类似:

bash 复制代码
onnxruntime_gpu-1.17.1-cp310-cp310-linux_aarch64.whl

🟩 步骤 6:安装 whl

bash 复制代码
pip install build/Linux/Release/dist/onnxruntime_gpu-1.17.1-cp310-cp310-linux_aarch64.whl

🟦 五、验证 TensorRT + CUDA 是否启用成功

python 复制代码
import onnxruntime as ort
print(ort.get_available_providers())

你应该看到:

python 复制代码
['TensorrtExecutionProvider', 'CUDAExecutionProvider', 'CPUExecutionProvider']

但是上面只是理想的状态:其实大部分时间都会花在以下步骤------问题的出现、排查与解决:

问题1:fatal: 不是 git 仓库 (或者任何父目录) .git

在编译源码的时候出现如图报错:

是因为 GitHub 的 Source code 压缩包不包含 .git 和 submodules。

ONNX Runtime 的源码依赖大量 Git submodules(protobuf、flatbuffers、onnx、mimalloc、re2...),如果没有 submodules,编译一定失败。

解决:

删除当前的 onnxruntime-1.17.1 文件夹:

bash 复制代码
rm -rf onnxruntime-1.17.1

使用 git clone 下载完整仓库(包含 submodules):

bash 复制代码
git clone --recursive https://github.com/microsoft/onnxruntime.git -b v1.17.1

然后再继续构建 C++ 与 构建 Python wheel 命令的执行。

问题2:git总是失败或者时间很长

①若是报错:

bash 复制代码
fatal: 无法访问 'https://github.com/microsoft/onnxruntime.git/':HTTP/2 stream 1 was not closed cleanly before end of the underlying stream'

... ...

如果第一种方案没能解决,你会跟我一样中间还有无数种各种各样不同的报错,根本原因还是国内网络不稳定git拉取也不稳定。直接看终极解决方案就行。

... ...

②根本原因国内网络不稳定

解决:

①强制 Git 使用 HTTP/1.1(避免 HTTP/2 问题)

bash 复制代码
git config --global http.version HTTP/1.1
git config --global http.postBuffer 524288000
git config --global http.maxRequests 100

然后继续git

②直接开VPN挂梯子

注意vpn内核要使用arm64架构的,而非常规的amd64架构。

开完之后拉取速度从之前的十几K到目前的几十M。

问题3:CMake 版本太低

报错:

bash 复制代码
CMake Error at CMakeLists.txt:5 (cmake_minimum_required):
CMake 3.26 or higher is required.  You are running version 3.22.1

-- Configuring incomplete, errors occurred!
... ...
... ...
File "/usr/lib/python3.10/subprocess.py", line 526, in run
    raise CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Command '['/usr/bin/cmake', '/home/baiyi/onnxruntime/cmake' ... ...

etPack 6.2.1 自带的 CMake 版本太低(3.22.1),而 ONNX Runtime 1.17.1 要求 CMake ≥ 3.26

解决:

CMake 官网下载二进制包cmake-3.27.x-linux-aarch64.tar.gz

然后:

bash 复制代码
tar -xvf cmake-3.27.*-linux-aarch64.tar.gz
sudo mv cmake-3.27.*-linux-aarch64 /opt/cmake
sudo ln -sf /opt/cmake/bin/* /usr/local/bin/

验证:

bash 复制代码
cmake --version

然后继续构建 ONNX Runtime 和 wheel。

问题4:构建onnxruntime时自动下载 Eigen出问题

报错:

bash 复制代码
CMake Error at eigen-subbuild/eigen-populate-prefix/src/eigen-populate-stamp/download-eigen-populate.cmake:170 (message):
  Each download failed!

ubuntu03-17 16:00:55
gmake[2]: *** [CMakeFiles/eigen-populate.dir/build.make:100:eigen-populate-prefix/src/eigen-populate-stamp/eigen-populate-download] 错误 1
gmake[1]: *** [CMakeFiles/Makefile2:83:CMakeFiles/eigen-populate.dir/all] 错误 2
gmake: *** [Makefile:91:all] 错误 2
CMake Error at /opt/cmake/share/cmake-3.27/Modules/FetchContent.cmake:1662 (message):
  Build step for eigen failed: 2
Call Stack (most recent call first):
  /opt/cmake/share/cmake-3.27/Modules/FetchContent.cmake:1802:EVAL:2 (__FetchContent_directPopulate)
  /opt/cmake/share/cmake-3.27/Modules/FetchContent.cmake:1802 (cmake_language)
  external/eigen.cmake:12 (FetchContent_Populate)
  external/onnxruntime_external_deps.cmake:462 (include)
  CMakeLists.txt:575 (include)

-- Configuring incomplete, errors occurred!
subprocess.CalledProcessError: Command '['/usr/local/bin/cmake', '/home/baiyi/onnxruntime/cmake' ... ...

核心在于:

bash 复制代码
Each download failed!
Build step for eigen failed

我的网络无法访问 Eigen 的官方源

解决:

手动下载 Eigen 并放到 ORT 的 external 目录

bash 复制代码
onnxruntime/cmake/external/eigen

ORT 会从这里查找 Eigen,可以手动下载 Eigen,然后放进去。

首先从官网的release中找到3.4.0版本,下载tar.gz源码压缩包。

进行解压:

bash 复制代码
tar -xvf eigen-3.4.0.tar.gz

得到的eigen-3.4.0/目录放到 ORT 的 external 目录底下:

bash 复制代码
mv eigen-3.4.0 onnxruntime/cmake/external/eigen

然后继续构建onnxruntime。

但是再次运行可能还是会报同样的错,因为放进去的 Eigen 目录没有被 ORT 识别到,ONNX Runtime 的 CMake 脚本不会自动检测手动放的 Eigen,它仍然会执行 FetchContent,从网络下载。所以必须让 ORT 强制使用本地 Eigen,而不是联网下载。

修改文件:

bash 复制代码
onnxruntime/cmake/external/eigen.cmake

将这段代码:

bash 复制代码
FetchContent_Declare(
  eigen
  URL https://gitlab.com/libeigen/eigen/-/archive/3.4.0/eigen-3.4.0.tar.gz
)

替换为:

bash 复制代码
FetchContent_Declare(
  eigen
  SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/eigen
)

这一步是要告诉CMake,不要下载 Eigen,直接用我本地的 eigen 目录。

然后删除 CMake 缓存,否则 CMake 会继续使用旧的下载配置:

bash 复制代码
rm -rf build
rm -rf eigen-subbuild
rm -rf eigen-src

重新进行./build.sh

问题5:ORT 1.17.1 的 CUDA RNN 模块与 cuDNN 9 不兼容

报错:

bash 复制代码
/home/baiyi/onnxruntime/onnxruntime/core/providers/cuda/rnn/cudnn_rnn_base.cc:31:36: error: 'cudnnGetRNNLinLayerMatrixParams' was not declared in this scope
   31 |     cudnnGetRNNLinLayerMatrixParams(handle, rnn_desc, pseudo_layer, x_desc, w_desc, reorganized_w_data, lin_layer_id, filter_desc, (void**)&mem_offset);
      |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/baiyi/onnxruntime/onnxruntime/core/providers/cuda/rnn/cudnn_rnn_base.cc:33:34: error: 'cudnnGetRNNLinLayerBiasParams' was not declared in this scope
   33 |     cudnnGetRNNLinLayerBiasParams(handle, rnn_desc, pseudo_layer, x_desc, w_desc, reorganized_w_data, lin_layer_id, filter_desc, (void**)&mem_offset);
      |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
gmake[2]: *** [CMakeFiles/onnxruntime_providers_cuda.dir/build.make:776:CMakeFiles/onnxruntime_providers_cuda.dir/home/baiyi/onnxruntime/onnxruntime/core/providers/cuda/rnn/cudnn_rnn_base.cc.o] 错误 1
gmake[1]: *** [CMakeFiles/Makefile2:2099:CMakeFiles/onnxruntime_providers_cuda.dir/all] 错误 2
gmake[1]: *** 正在等待未完成的任务....

cuDNN 9 已经完全移除了 RNN API(包括 cudnnGetRNNLinLayerMatrixParams / BiasParams),但 ONNX Runtime 1.17.1 仍然在尝试编译基于 cuDNN RNN 的 CUDA RNN Kernel。

报错正是 cuDNN 9 删除的 API:

bash 复制代码
cudnnGetRNNLinLayerMatrixParams
cudnnGetRNNLinLayerBiasParams

这些 API 在 cuDNN 8.x 存在,但在 cuDNN 9.x 被 NVIDIA 官方彻底移除。

这就意味着,ORT 1.17.1 无法在 JetPack 6.x(cuDNN 9)上直接编译 CUDA EP,必须要使用使用 ONNX Runtime 1.18。

解决:

删除旧目录:

bash 复制代码
rm -rf onnxruntime

重新 clone ORT 1.18(支持 cuDNN 9)

bash 复制代码
git clone --recursive https://github.com/microsoft/onnxruntime.git -b v1.18.0

然后进行解压、编译、构建wheel重复一开始的步骤顺序。

问题6:error: identifier "FLT_MAX" is undefined

报错:

bash 复制代码
/home/baiyi/onnxruntime/onnxruntime/contrib_ops/cuda/moe/ft_moe/moe_kernel.cu(68): error: identifier "FLT_MAX" is undefined
    float threadData(-FLT_MAX);
1 error detected in the compilation of "/home/baiyi/onnxruntime/onnxruntime/contrib_ops/cuda/moe/ft_moe/moe_kernel.cu".
gmake[2]: *** [CMakeFiles/onnxruntime_providers_cuda.dir/build.make:6984:CMakeFiles/onnxruntime_providers_cuda.dir/home/baiyi/onnxruntime/onnxruntime/contrib_ops/cuda/moe/ft_moe/moe_kernel.cu.o] 错误 2
gmake[2]: *** 正在等待未完成的任务....
gmake[1]: *** [CMakeFiles/Makefile2:2099:CMakeFiles/onnxruntime_providers_cuda.dir/all] 错误 2
gmake: *** [Makefile:146:all] 错误 2
Traceback (most recent call last):
... ...
... ...
  File "/usr/lib/python3.10/subprocess.py", line 526, in run
    raise CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Command '['/usr/local/bin/cmake', '--build', '/home/baiyi/onnxruntime/build/Linux/Release', '--config', 'Release', '--', '-j8']' returned non-zero exit status 2.

错误来自于:

bash 复制代码
onnxruntime/contrib_ops/cuda/moe/ft_moe/moe_kernel.cu

这是 ONNX Runtime 1.18.0 的已知 BUG,官方 issue 已确认并给出修复方法:

缺少 头文件导致 FLT_MAX 未定义。

FLT_MAX 定义在 中,而不是 <float.h> 或 CUDA 的头文件里。

ORT 1.18.0 的这个文件漏掉了 include,导致 NVCC 无法找到 FLT_MAX。

解决:

编辑文件:

bash 复制代码
onnxruntime/onnxruntime/contrib_ops/cuda/moe/ft_moe/moe_kernel.cu

在文件开头添加:

cpp 复制代码
#include <cfloat>

修改后必须清理缓存并重新构建:

bash 复制代码
rm -rf build
rm -rf CMakeCache.txt

然后重新编译和构建。

问题7:TypeError: canonicalize_version() got an unexpected keyword argument 'strip_trailing_zero'

在构建wheel时报错:

bash 复制代码
  File "/usr/local/lib/python3.10/dist-packages/setuptools/_core_metadata.py", line 293, in _distribution_fullname
    canonicalize_version(version, strip_trailing_zero=False),
TypeError: canonicalize_version() got an unexpected keyword argument 'strip_trailing_zero'

... ...

  File "/usr/lib/python3.10/subprocess.py", line 526, in run
    raise CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Command '['/usr/bin/python3', '/home/baiyi/onnxruntime/setup.py', 'bdist_wheel', '--wheel_name_suffix=gpu']' returned non-zero exit status 1.

setuptools 版本过新,而 ONNX Runtime 1.18.0 的 setup.py 使用的是 旧 API,两者不兼容,需要把 setuptools 降级到 ORT 兼容的版本。

解决:

降级 setuptools 到 65.x(官方兼容版本)

bash 复制代码
pip install "setuptools==65.5.1" --force-reinstall

然后重新运行 build.py

最后构建完成之后开始pip install,发现wheel文件不在/Linux/Release/dist/里面,使用find . -name "*.whl"找一下whl文件所在位置然后进行pip install,然后验证 CUDA / TensorRT 是否启用:

python 复制代码
import onnxruntime as ort
print(ort.get_available_providers())
相关推荐
伊织code4 小时前
AI 会议活动及2026活动计划一览
人工智能·ai·nvidia·活动·ces·waic·vivatech
码路飞10 小时前
GTC 2026 最后一天,老黄扔了个 NemoClaw 出来,我连夜装上试了一下
人工智能·llm·nvidia
蜡台15 小时前
整合一些 免费甚至无限量token平台,方便OpenClaw 使用,及一些相关使用配置代码
nvidia·token·ollama·openrouter·openclaw·龙虾
AI精钢2 天前
NVIDIA 可以挑战中国 AI 在开源社区的统治地位吗?
人工智能·ai·开源·llm·nvidia·open source·open weight
伟大的大威6 天前
NVIDIA DGX Spark (Blackwell GB10) 双机 196B Step 3.5 Flash 大模型部署完整实录
分布式·spark·nvidia
cnnews8 天前
在AWS Lambda上部署 tokenizers
python·云计算·numpy·aws·lambda·onnxruntime·tokenizers
麻瓜pro23 天前
【迭代】高性能c++实时对话系统e2e_voice
开发语言·c++·onnxruntime·端到端语音
Chasing Aurora1 个月前
深度学习 的GPU介绍
人工智能·深度学习·gpu算力·nvidia·智能电视·英伟达·vgpu
小溪彼岸1 个月前
NVIDIA免费API的申请与配置
nvidia