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())
相关推荐
晨欣17 小时前
单卡 48GB 实测:Gemma 4 26B A4B、Gemma 4 31B、gpt-oss-20b 三模型部署与并发对比
google·openai·nvidia·vllm·llama.cpp·gpt-oss-20b·gemma4
明月醉窗台6 天前
[Jetson] NVIDIA Jetson 全系列边缘计算芯片进阶指南
人工智能·边缘计算·cuda·jetson
d1z8889 天前
NCCL 测试完全指南:从概念到性能调优
gpu·nvidia·nccl
明月醉窗台10 天前
[Jetson] 在Jetson Xavier AGX编译opencv+cuda
人工智能·opencv·计算机视觉·cuda·jetson
路弥行至12 天前
将你的 Jetson 变为全功能公网服务器——使用Cloudflare_Tunnel方式实现
运维·服务器·经验分享·笔记·其他·jetson·入门教程
cnbestec14 天前
GTC 2026重磅:NVIDIA开源Isaac Teleop,Manus数据手套成官方标配,机器人数据采集迎来标准化时代
nvidia·英伟达·manus·manus数据手套·gtc2026
AI小译14 天前
Triton - 官方文档介绍
nvidia·triton·language
诶尔法Alpha16 天前
jetson设备上自己手动编译适配版本的pytorch全过程,及报错的解决方法
pytorch·nvidia·jetson·torchvision
HelloTonyGo16 天前
个人游戏笔记本免费“养龙虾”(二)用显卡GPU运行OpenClaw,CUDA的安装与配置
gpu·nvidia·cuda·openclaw