【Linux】在Arm服务器源码编译onnxruntime-gpu的whl

服务器信息:

aarch64架构
ubuntu20.04
nvidia T4卡

编译onnxruntime-gpu前置条件:

  1. 已经安装合适的cuda
  2. 已经安装合适的cudnn
  3. 已经安装合适的cmake

源码编译onnxruntime-gpu的步骤

1. 下载源码

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

2. 选择版本

然后根据需要安装的onnxruntime-gpu版本号,切换版本

git checkout v1.16.3

3. 执行bulid指令

在onnxruntime根目录下执行:

./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

4. 报错解决方式

4.1 算力设置不匹配
[ 53%] Built target onnxruntime_optimizer
make: *** [Makefile:166: all] Error 2
Traceback (most recent call last):File "/home/tc/onnxruntime/tools/ci_build/build.py", line 2684, in <module>sys.exit(main())File "/home/tc/onnxruntime/tools/ci_build/build.py", line 2577, in mainbuild_targets(args, cmake_path, build_dir, configs, num_parallel_jobs, args.target)File "/home/tc/onnxruntime/tools/ci_build/build.py", line 1487, in build_targetsrun_subprocess(cmd_args, env=env)File "/home/tc/onnxruntime/tools/ci_build/build.py", line 798, in run_subprocessreturn run(*args, cwd=cwd, capture_stdout=capture_stdout, shell=shell, env=my_env)File "/home/tc/onnxruntime/tools/python/util/run.py", line 49, in runcompleted_process = subprocess.run(File "/usr/lib/python3.8/subprocess.py", line 516, in runraise CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Command '['/home/tc/cmake-3.26.0-linux-aarch64/bin/cmake', '--build', '/home/tc/onnxruntime/build/Linux/Release', '--config', 'Release', '--', '-j40']' returned non-zero exit status 2.

问题原因:
./bulid.sh的参数CMAKE_CUDA_ARCHITECTURES=87 表示目标 GPU 的计算能力为 8.7,请确认您的硬件是否匹配:
可以直接用AI来查询,T4需要填写75,解决此问题

4.2 下载库文件超时
-- Using src='https://github.com/pytorch/cpuinfo/archive/ca678952a9a8eaa6de112d154e8e104b22f9ab3f.zip'
CMake Error at pytorch_cpuinfo-subbuild/pytorch_cpuinfo-populate-prefix/src/pytorch_cpuinfo-populate-stamp/download-pytorch_cpuinfo-populate.cmake:170 (message):Each download failed!error: downloading 'https://github.com/pytorch/cpuinfo/archive/ca678952a9a8eaa6de112d154e8e104b22f9ab3f.zip' failedstatus_code: 28status_string: "Timeout was reached"log:--- LOG BEGIN ---Trying 20.205.243.166:443...connect to 20.205.243.166 port 443 failed: Connection timed outFailed to connect to github.com port 443 after 131336 ms: Couldn't connectto serverClosing connection 0--- LOG END ---

问题原因:
下载库文件速度过慢超时
解决方案
手动下载,并放到指定位置,再重新执行编译指令。
以上述报错为例:
网页下载资源,浏览器输入地址自动下载压缩包:

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

将下载的 cpuinfo-ca678952a9a8eaa6de112d154e8e104b22f9ab3f.zip,解压到相对路径onnxruntime/build/Linux/Release/_deps/pytorch_cpuinfo-subbuild/pytorch_cpuinfo-populate-prefix/src/ 目录下。(报错里会写明需要放置的位置,根据实际情况修改路径)

然后重新执行bulid.sh的指令就可以继续编译。

4.3 不支持BFLOAT16
NVCC_ERROR = nvcc fatal   : Unknown option '-Wstrict-aliasing'NVCC_OUT = 1
CMake Error at CMakeLists.txt:695 (message):The compiler doesn't support BFLOAT16!!!-- Configuring incomplete, errors occurred!
Traceback (most recent call last):File "/home/tc/onnxruntime/tools/ci_build/build.py", line 2998, in <module>sys.exit(main())File "/home/tc/onnxruntime/tools/ci_build/build.py", line 2853, in maingenerate_build_tree(File "/home/tc/onnxruntime/tools/ci_build/build.py", line 1674, in generate_build_treerun_subprocess(File "/home/tc/onnxruntime/tools/ci_build/build.py", line 867, in run_subprocessreturn run(*args, cwd=cwd, capture_stdout=capture_stdout, shell=shell, env=my_env)File "/home/tc/onnxruntime/tools/python/util/run.py", line 49, in runcompleted_process = subprocess.run(File "/usr/lib/python3.8/subprocess.py", line 516, in runraise CalledProcessError(retcode, process.args,

问题原因:
ONNX Runtime 从 v1.17.0 起要求 ARM 架构支持 BFLOAT16 指令集,当前编译器版本不支持。
解决方式一:升级编译器 / 系统环境
官方文档和讨论指出:在 JetPack 5.x (Ubuntu 18.04/20.04) 上编译时,GCC 必须 ≥10 (JetPack 6 对应 Ubuntu 22.04,自带 GCC11+)。也就是说,最简单的解决方案是升级到 JetPack 6 (Ubuntu 22.04/GCC11) 或手动安装较新版本的 GCC(如通过 sudo apt install gcc-11 g+±11 并更新 alternatives)。升级要求:Ubuntu 22.04,不然可能无法直接安装gcc-12 和 g+±12 。
升级后,-march=armv8.2-a+bf16 检查就会通过。表明需要更高版本的编译器以支持 BF16。

  1. 首先,添加包含较新 GCC 版本的 PPA:
sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt update

此 PPA 提供了多个版本的 GCC 和 G++,包括 gcc-12 和 g+±12 。

  1. 安装所需版本的 GCC 和 G++
sudo apt install gcc-12 g++-12
  1. 使用 update-alternatives 设置默认版本
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
  1. 如果系统中安装了多个版本的 GCC 和 G++,可以使用以下命令手动选择默认版本:
sudo update-alternatives --config gcc
sudo update-alternatives --config g++
  1. 验证当前版本
gcc --version
g++ --version
  1. 重新编译

解决方式二:修改源码绕过 BFLOAT16 检查
若必须在现有环境下编译,可以手动修改源码跳过 BFLOAT16 检查。在 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()

修改为:

if(NOT HAS_ARM64_BFLOAT16)#message(WARNING "BFLOAT16 not supported, disabling BF16 optimizations")set(HAS_ARM64_BFLOAT16 TRUE)
endif()

这样跳过了编译器不支持 BF16 的致命错误。不过需要注意:跳过检查后仍可能缺少 BF16 优化代码,性能或功能可能受影响。修改后保存并重新运行 CMake 即可继续编译。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/80756.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端上传el-upload、原生input本地文件pdf格式(纯前端预览本地文件不走后端接口)

前端实现本地文件上传与预览&#xff08;PDF格式展示&#xff09;不走后端接口 实现步骤 第一步&#xff1a;文件选择 使用前端原生input上传本地文件&#xff0c;或者是el-upload组件实现文件选择功能&#xff0c;核心在于文件渲染处理。&#xff08;input只不过可以自定义样…

Python 数据分析与可视化:开启数据洞察之旅(5/10)

一、Python 数据分析与可视化简介 在当今数字化时代&#xff0c;数据就像一座蕴藏无限价值的宝藏&#xff0c;等待着我们去挖掘和探索。而 Python&#xff0c;作为数据科学领域的明星语言&#xff0c;凭借其丰富的库和强大的功能&#xff0c;成为了开启这座宝藏的关键钥匙&…

C语言学习记录——深入理解指针(4)

OK&#xff0c;这一篇主要是讲我学习的3种指针类型。 正文开始&#xff1a; 一.字符指针 所谓字符指针&#xff0c;顾名思义就是指向字符的指针。一般写作 " char* " 直接来说说它的使用方法吧&#xff1a; &#xff08;1&#xff09;一般使用情况&#xff1a; i…

springboot3+vue3融合项目实战-大事件文章管理系统获取用户详细信息-ThreadLocal优化

一句话本质 为每个线程创建独立的变量副本&#xff0c;实现多线程环境下数据的安全隔离&#xff08;线程操作自己的副本&#xff0c;互不影响&#xff09;。 关键解读&#xff1a; 核心机制 • 同一个 ThreadLocal 对象&#xff08;如示意图中的红色区域 tl&#xff09;被多个线…

Nacos源码—8.Nacos升级gRPC分析六

大纲 7.服务端对服务实例进行健康检查 8.服务下线如何注销注册表和客户端等信息 9.事件驱动架构源码分析 一.处理ClientChangedEvent事件 也就是同步数据到集群节点&#xff1a; public class DistroClientDataProcessor extends SmartSubscriber implements DistroDataSt…

设计杂谈-工厂模式

“工厂”模式在各种框架中非常常见&#xff0c;包括 MyBatis&#xff0c;它是一种创建对象的设计模式。使用工厂模式有很多好处&#xff0c;尤其是在复杂的框架中&#xff0c;它可以带来更好的灵活性、可维护性和可配置性。 让我们以 MyBatis 为例&#xff0c;来理解工厂模式及…

AI与IoT携手,精准农业未来已来

AIoT&#xff1a;农业领域的变革先锋 在科技飞速发展的当下&#xff0c;人工智能&#xff08;AI&#xff09;与物联网&#xff08;IoT&#xff09;的融合 ——AIoT&#xff0c;正逐渐成为推动各行业变革的关键力量&#xff0c;农业领域也不例外。AIoT 技术通过将 AI 的智能分析…

排错-harbor-db容器异常重启

排错-harbor-db容器异常重启 环境&#xff1a; docker 19.03 , harbor-db(postgresql) goharbor/harbor-db:v2.5.6 现象&#xff1a; harbor-db 容器一直restart&#xff0c;查看日志发现 报错 initdb: error: directory "/var/lib/postgresql/data/pg13" exists…

Docker容器启动失败?无法启动?

Docker容器无法启动的疑难杂症解析与解决方案 一、问题现象 Docker容器无法启动是开发者在容器化部署中最常见的故障之一。尽管Docker提供了丰富的调试工具&#xff0c;但问题的根源往往隐藏在复杂的配置、环境依赖或资源限制中。本文将从环境变量配置错误这一细节问题入手&am…

查看购物车

一.查看购物车 查看购物车使用get请求。我们要查看当前用户的购物车&#xff0c;就要获取当前用户的userId字段进行条件查询。因为在用户登录时就已经将userId封装在token中了&#xff0c;因此我们只需要解析token获取userId即可&#xff0c;不需要前端再传入参数了。 Control…

C/C++ 内存管理深度解析:从内存分布到实践应用(malloc和new,free和delete的对比与使用,定位 new )

一、引言&#xff1a;理解内存管理的核心价值 在系统级编程领域&#xff0c;内存管理是决定程序性能、稳定性和安全性的关键因素。C/C 作为底层开发的主流语言&#xff0c;赋予开发者直接操作内存的能力&#xff0c;却也要求开发者深入理解内存布局与生命周期管理。本文将从内…

使用Stable Diffusion(SD)中CFG参数指的是什么?该怎么用!

1.定义&#xff1a; CFG参数控制模型在生成图像时&#xff0c;对提示词&#xff08;Prompt&#xff09;的“服从程度”。 它衡量模型在“完全根据提示词生成图像”和“自由生成图像”&#xff08;不参考提示词&#xff09;之间的权衡程度。 数值范围&#xff1a;常见范围是 1 …

【GESP】C++三级练习 luogu-B2156 最长单词 2

GESP三级练习&#xff0c;字符串练习&#xff08;C三级大纲中6号知识点&#xff0c;字符串&#xff09;&#xff0c;难度★★☆☆☆。 题目题解详见&#xff1a;https://www.coderli.com/gesp-3-luogu-b2156/ 【GESP】C三级练习 luogu-B2156 最长单词 2 | OneCoderGESP三级练…

Linux网络基础 -- 局域网,广域网,网络协议,网络传输的基本流程,端口号,网络字节序

目录 1. 计算机网络背景 1.1 局域网 1.1.2 局域网的组成 1.2 广域网 1.1.2 广域网的组成 2. 初始网络协议 2.1 网络协议的定义和作用 2.2 网络协议的分层结构 2.2.1 OSI七层模型 2.2.2 TCP/IP 五层&#xff08;四层&#xff09;模型 3. 再识网络协议 3.1 为什么要有…

【PostgreSQL】超简单的主从节点部署

1. 启动数据库 启动主节点 docker run --name postgres-master -e POSTGRES_PASSWORDmysecretpassword -p 5432:5432 -d postgres启动从节点 docker run --name postgres-slave -e POSTGRES_PASSWORDmysecretpassword -p 5432:5432 -d postgres需要配置挂载的存储卷 2. 数据…

c#修改ComboBox当前选中项的文本

对于一个C#的Combobox列表&#xff0c;类型设置为下拉样式&#xff0c;不允许输入&#xff0c;只能选择&#xff0c;样子如下&#xff1a; 该控件的名字为 cbb1&#xff0c;如果要修改当前这个“A1区”的文件&#xff0c;则用如下方式&#xff1a; cbb1.Items[cbb1.SelectedInd…

Java设计模式之适配器模式:从入门到精通

适配器模式(Adapter Pattern)是Java中最常用的结构型设计模式之一,它像一座桥梁连接两个不兼容的接口,使得原本由于接口不兼容而不能一起工作的类可以协同工作。本文将全面深入地解析适配器模式,从基础概念到高级应用,包含丰富的代码示例、详细注释、使用场景分析以及多维对…

中国黄土高原中部XF剖面磁化率和粒度数据

时间分辨率&#xff1a;1000年 < x空间分辨率为&#xff1a;空共享方式&#xff1a;申请获取数据大小&#xff1b;35.75 KB数据时间范围&#xff1a;743-0 ka元数据更新时间&#xff1a;2023-08-15 数据集摘要 该数据集包括中国黄土高原中部XF剖面磁化率和粒度数据。将所有…

【Python训练营打卡】day23 @浙大疏锦行

test pipeline管道 知识回顾: 1. 转化器和估计器的概念 2. 管道工程 3. ColumnTransformer和Pipeline类 作业&#xff1a; 整理下全部逻辑的先后顺序&#xff0c;看看能不能制作出适合所有机器学习的通用pipeline 伪代码 # 适合所有机器学习的通用pipeline #伪代码 import p…

【android bluetooth 框架分析 02】【Module详解 13】【CounterMetrics 模块介绍】

1. CounterMetrics 介绍 CounterMetrics 模块代码很少&#xff0c; 我简单介绍一下。 // system/gd/metrics/counter_metrics.cc #define LOG_TAG "BluetoothCounterMetrics"#include "metrics/counter_metrics.h"#include "common/bind.h" #i…