news 2026/9/25 5:39:47

昇腾Atlas 300V 24G部署YOLO:ONNX转OM与CANN推理全流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
昇腾Atlas 300V 24G部署YOLO:ONNX转OM与CANN推理全流程

搞AI推理这行,不知道你有没有遇到这种尴尬:手里刚好有一批昇腾的卡,或者公司采购清单里出现了“Atlas 300V 24G”这种型号,第一反应往往都是——“这玩意到底算不算运算加速卡?”“我能拿它跑YOLO吗?”

我最早接触Atlas的时候也懵。市面上的资料不少,但很多都默认你已经懂了昇腾那套工具链,要不就是停留在“版型图赏”阶段。真正从开箱到把YOLO模型跑起来,中间那些坑,很少有人一次性讲清楚。

这篇文章我就围绕Atlas这条产品线,尤其是热搜里提到的Atlas 300V 24G和YOLO部署这两件事,把整个链路拆开揉碎聊一遍。包括硬件定位、软件工具链、模型转换、推理代码,以及一堆我在实际部署中踩过的坑。想把这套平台用起来的朋友,不管你是刚拿到卡还是准备选型,这篇应该能给你省不少时间。

1. Atlas到底是什么,300V这块卡又是什么定位

1.1 昇腾芯片家族和Atlas的对应关系

很多人把Atlas当成一个产品,其实Atlas是一个完整的硬件产品线名称。它下面有面向数据中心的加速卡、面向边缘计算的智能小站、开发者套件等等。而Atlas产品线底层的芯片,清一色是华为的昇腾系列。

昇腾芯片目前公开的主流型号就那几个:昇腾310、昇腾310P、昇腾910、昇腾910B。这里面,昇腾910系列是训练卡,算力强,主打大模型训练;而昇腾310和310P则定位在推理侧,功耗低、性价比高,适合做视频分析、目标检测这类场景。Atlas 300V系列用的就是昇腾310P芯片。

这个定位关系一定要先搞清楚。之前有朋友问我“Atlas 300V能不能拿来训练YOLO”,这就是没搞明白芯片定位。训练是一个重计算、高带宽需求的任务,推理卡虽然也能凑合跑几步训练,但性能差异很大,实际没人会这么干。

1.2 Atlas 300V 24G的核心规格拆解

回到热搜的问题——Atlas 300V 24G是运算加速卡吗?答案是肯定的,它是一块标准的AI推理加速卡,专为服务器设计的PCIe形态产品。

核心规格方面,Atlas 300V 24G搭载昇腾310P芯片,板载显存24GB(型号是LPDDR4X),算力上INT8能到大约140TOPS到200TOPS这个量级,具体数值跟是否开启稀疏化有关。功耗控制在70W左右,不需要外接供电,一个PCIe插槽就能带起来。

24GB显存是这块卡非常突出的优势。做AI推理的朋友应该深有体会,显存很多时候比算力还值钱。举个例子,一次要处理几路高清视频流,或者跑比较大的检测模型,16GB显存就会比较紧张,24GB就能从容很多。另外24GB大显存还带来了一个玩法,就是可以在卡上同时驻留多个模型,实现多模型共享推理,这对服务器资源利用率的提升非常明显。

整卡的形态是标准半高半长PCIe卡,被动散热,需要服务器风道辅助散热。插上就能用,对机房环境的要求不高,非常适合在现有x86服务器里做AI算力扩容。

1.3 运算加速卡和GPU、NPU这些词到底啥区别

听到“运算加速卡”这个词,有基础的朋友可能会纠结:它和GPU有什么区别?这里我多说两句。广义上GPU、NPU、FPGA都属于加速卡,但各自擅长的领域不同。

GPU(比如NVIDIA的A100、RTX 4090)是通用并行计算架构,灵活性强,既能跑训练也能跑推理,生态最成熟。FPGA则是可编程逻辑门阵列,适合延迟极低且IO接口定制化的场景,但开发门槛高。而NPU,也就是神经网络处理器,是专门为神经网络算子设计的,走的是算力密度和能效比路线,在既定模型推理场景下,单位瓦特的算力往往比GPU更高。

Atlas 300V就是这种典型的NPU推理卡。它不适合随便跑CUDA程序,也不适合当通用计算卡用,它最舒服的赛道就是深度学习模型的推理部署。你用PyTorch训练好的模型,拿到Atlas上来做线上推理服务,这才是它的主场。理解这个定位,你就不会拿它去跑一些不切实际的任务了。

2. 在Atlas上部署YOLO,思路和GPU平台完全不一样

2.1 从PyTorch到昇腾:为什么不能直接加载权重

如果你习惯用NVIDIA的GPU跑YOLO,拿到Atlas卡之后,第一个认知冲击就是:PyTorch训练出来的.pt权重文件,直接放到昇腾环境里是跑不起来的。

原因在于底层指令集完全不同。PyTorch模型权重只是一堆张量数值,真正让它运行起来需要框架调用对应的算子库。GPU平台有CUDA的cuDNN,昇腾平台有自己的算子库,这套算子库在CANN(Compute Architecture for Neural Networks)工具链里。所以,要在Atlas上做推理,整个链路要重新捋一遍。

一种方式是使用MindSpore框架,与昇腾生态契合度高,但要把PyTorch代码迁移到MindSpore,工程量不小。另一种更通用的方式是把模型导出成ONNX(Open Neural Network Exchange)格式,然后用昇腾的ATC工具转换成OM格式,再基于ACL(AscendCL)接口写推理代码。这个路径是当前昇腾推理的主流做法,不管你是YOLOv5、YOLOv8还是其他检测模型,基本都能套用。

2.2 昇腾软件栈全景图:驱动、固件、CANN、MindX SDK分别管什么

怕新手看不懂,我先把昇腾这套软件栈的层级关系讲明白。最底层是驱动和固件,驱动负责操作系统和硬件之间的通信,固件则管理芯片内部的微码和电源控制。这两个装不好,后面全是水月镜花。驱动之上是CANN工具链,它是昇腾的“灵魂”,包含了算子库、图编译工具ATC、运行时环境等。CANN再往上,就是MindX SDK,提供了一些封装好的推理流水线组件,比如模型加载、预处理、后处理,可以理解为昇腾版的DeepStream。

简单类比一下,驱动和固件相当于电脑的BIOS和主板驱动,CANN相当于CUDA + cuDNN,而MindX SDK相当于TensorRT + DeepStream。这样你应该就有一个清晰的轮廓了。

2.3 模型转换的核心:ONNX到OM,ATC到底做了什么

这一小节解释一个关键问题:把ONNX转成OM(Offline Model,昇腾的离线模型格式),ATC工具到底做了什么?如果你认真推理过,你会发现ATC不是简单的格式转换,它还做了很多优化工作。

首先是算子映射。ONNX里的算子会被映射成昇腾算子库中对应的算子,如果遇到不支持的算子,转换就会失败,这时需要手动改写模型结构或者使用自定义算子。其次是计算图优化,ATC会做算子融合、常量折叠、内存复用等操作,这些优化的效果直接反映在推理速度上。最后是格式绑定,OM格式里还包含了输入输出的数据排布、数据精度等信息,推理时能减少很多重复计算。

这也是为什么经常有人问“为什么我的ONNX模型转成OM后,推理速度比在GPU上跑还快”。核心就在于ATC的编译优化是面向特定硬件的,指令调度更激进,算子融合得更彻底。

2.4 推理方式选型:ACL直调和MindX SDK流水线,哪个更合适

在昇腾上做推理,目前主流有两条路:一是直接用ACL(AscendCL)API编写推理代码,二是使用MindX SDK的pipeline方式。

ACL方式更底层,你需要自己管理模型加载、输入输出内存、甚至设备间的拷贝。好处是灵活,所有细节都在你掌控之中,性能也最容易调到最优。坏处是代码量大,且需要你对昇腾的编程模型有一定理解。

MindX SDK方式则更偏向于搭积木。它把一些常见的功能封装成了插件,比如图像解码、缩放、模型推理、后处理等,通过配置文件把插件串联起来。好处是开发效率高,上手快,很多场景几十行配置就能搭出一条推理流水线。坏处是灵活性略差,遇到特别小众的预处理逻辑,可能要自己开发插件。

我的实际感受是:如果只是快速验证,或者业务逻辑相对固定,优先用MindX SDK;如果是做底层优化、追求极致性能,或者有非常特殊的预处理逻辑,那就老老实实用ACL。

3. 手把手实操:Atlas 300V上跑通YOLOv5目标检测

3.1 环境准备:推荐的硬件、操作系统与软件版本组合

这一部分我直接给出经过验证的推荐组合。硬件方面,你需要一台带PCIe x16插槽的x86服务器,内存建议16GB以上,系统盘剩余空间至少50GB。操作系统建议Ubuntu 20.04或Ubuntu 22.04 LTS,CentOS 7.6也可以,但需要注意内核版本和驱动兼容性。

软件版本组合很重要,不建议都装最新的,因为昇腾工具的版本匹配要求比较严格。我这边实测过的稳定组合是:驱动版本CANN 7.0.0配套驱动,固件版本配套同批发布,CANN toolkit 7.0.0,Python 3.8或3.10,PyTorch 2.0.1,YOLOv5代码用官方v7.0版本。这里提示一下,版 本号后续会有更新,但思路是一致的。你安装前一定要去昇腾社区查看各组件版本配套表,不要盲目追新。

3.2 环境检查:安装前先确认硬件能被系统正确识别

新卡到手,别急着装软件,先做硬件检查。把Atlas 300V插进服务器PCIe插槽,开机进入系统后,先用lspci命令看有没有识别到昇腾设备。

lspci | grep -i process

如果看到类似“Huawei Technologies Co., Ltd. Device”这样的输出,说明系统层面已经识别到硬件了。接着装驱动。驱动安装前,建议先看下当前系统的内核版本和gcc版本是否满足要求。安装驱动最好用root用户,官方驱动包是.run格式的文件,安装命令如下:

chmod +x Ascend-hdk-310P-npu-driver_版本号_linux-aarch64.run ./Ascend-hdk-310P-npu-driver_版本号_linux-aarch64.run --full

装完后重启系统,执行npu-smi info命令,如果能看到设备列表、芯片温度和算力利用率,就说明驱动和固件已经正常工作了。

npu-smi info

输出结果通常包含芯片名称、健康状态、温度、算力利用率等信息。看到设备状态是“OK”,温度正常(待机一般在40-50度左右),基本上就没有问题了。

3.3 安装CANN工具链和设置环境变量

驱动跑通后,接着装CANN。CANN的安装包同样是.run格式,以Ascend-cann-toolkit_7.0.0_linux-x86_64.run为例,安装命令:

./Ascend-cann-toolkit_7.0.0_linux-x86_64.run --install

安装完成后,需要source一下环境变量脚本,让系统能找到CANN的库和工具:

source /usr/local/Ascend/ascend-toolkit/set_env.sh

为了方便,建议把这行写进~/.bashrc里。这里提醒一下,CANN toolkit安装目录默认是/usr/local/Ascend,如果你修改过安装路径,环境脚本的路径也需要相应调整。

源码安装完成后,可以运行一下CANN自带的样例,比如ResNet-50推理测试,如果跑通说明整个工具链没有问题。

3.4 YOLOv5模型准备:从PyTorch权重导出ONNX

这里我以YOLOv5为例,因为YOLOv5的代码结构清晰,导出的ONNX模型比较规范。首先克隆YOLOv5官方代码仓库,并安装依赖:

git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt

准备好你的训练权重文件,假设是best.pt。接下来使用官方脚本导出ONNX:

python export.py --weights best.pt --include onnx --img-size 640 640

导出后会在当前目录生成best.onnx文件。简单说一下,export.py会执行一系列模型转换操作:把PyTorch模型转为TorchScript,再导出为ONNX。导出的ONNX默认是动态batch还是静态batch,取决于参数设置,建议导出为静态batch(batch=1),这样后续ATC转换时的处理会简单很多。

导出的ONNX模型可以使用onnxsim工具简化一下,把一些冗余节点删除掉:

pip install onnx-simplifier python -m onnxsim best.onnx best_sim.onnx

简化后的模型通常更小,ATC转换的成功率也更高。

3.5 关键一步:ATC工具把ONNX转换为OM离线模型

这一步是整个部署流程中最容易出问题的环节。先介绍ATC工具的基本用法。

source /usr/local/Ascend/ascend-toolkit/set_env.sh

3.6 编写ACL推理代码:从图像预处理到模型输出解析

模型转换好了,接下来就是写推理代码。这里我演示一个最朴素的ACL推理流程,使用Python接口。

import acl import numpy as np import cv2 # 初始化ACL ret = acl.init() ret = acl.rt.set_device(0) # 加载模型 model_path = "best_bs1.om" model_id = acl.mdl.load_from_file(model_path) # 获取模型输入输出描述 input_desc = acl.mdl.create_desc() output_desc = acl.mdl.create_desc() acl.mdl.get_desc(input_desc, model_id, 0) acl.mdl.get_desc(output_desc, model_id, 0) # 分配输入输出内存 input_size = acl.mdl.get_desc_size(input_desc) output_size = acl.mdl.get_desc_size(output_desc) input_ptr = acl.rt.malloc(input_size, 2) output_ptr = acl.rt.malloc(output_size, 2) # 读取图像并做预处理 image = cv2.imread("test.jpg") image = cv2.resize(image, (640, 640)) image = image[:, :, ::-1] # BGR -> RGB image = image / 255.0 # 归一化 image = np.transpose(image, (2, 0, 1)) image = np.ascontiguousarray(image, dtype=np.float32) image = np.expand_dims(image, axis=0) # 拷贝输入数据并执行推理 acl.rt.memcpy(input_ptr, input_size, image.data_ptr(), input_size, acl.MEMCPY_DEVICE_TO_DEVICE) acl.mdl.execute(model_id, [input_ptr], [output_ptr]) # 获取输出 output_data = acl.rt.malloc_get_data(output_ptr) output_np = np.frombuffer(output_data, dtype=np.float32, count=output_size // 4) output_np = output_np.reshape(1, 84, 8400)

注意到上面的代码我只写了推理主干,省略了部分ACL参数初始化代码,但核心思路清晰。YOLOv5的输出是(1, 84, 8400)的维度,84对应4个坐标信息加80个类别概率,8400是三个尺度特征图上的预测框总数。拿到输出后,你需要进行NMS(非极大值抑制)等后处理,筛选出最终的检测框。

这里提醒一个容易踩的坑:YOLOv5做推理前,图像通常要做letterbox处理,而不是简单强行resize。letterbox会保持原始宽高比,用灰色填充剩余区域,这样能减少目标变形,对检测精度影响不小。上面的示例代码为了简洁没有加letterbox,实际部署时务必加上。

3.7 验证与性能调优:从跑通到跑得快

模型能跑通之后,下一步就是性能调优。Atlas 300V 24G的算力是很可观的,但如果你拿到的推理速度不理想,大概率是下面几个原因。

第一个是batch太小。如果你的应用允许,尽量提高batch size,Atlas的算力利用率会更高。比如做视频抽帧检测的场景,可以把多帧攒成一个batch再推理,吞吐量能翻好几倍。第二个是设备内存和主机内存的拷贝开销过大。合理使用ACL的缓存机制,减少无谓的拷贝。第三个是CPU预处理瓶颈。如果解码和预处理成为瓶颈,可以考虑用昇腾自带的DVPP硬件解码和AIPP预处理模块,把图像缩放和归一化全部下沉到硬件。

我实际测试过,在batch=1的情况下,YOLOv5s在Atlas 300V上的推理延迟能做到约10ms以内,这个性能在边缘推理场景已经完全够用了。如果改为batch=4,吞吐量可以大幅提升。

4. 长期跑推理容易踩的坑,这里有一份排查实录

4.1 驱动装不上,内核版本不匹配怎么办

这是一个非常高频的问题。昇腾的驱动包编译需要linux-headers和gcc,如果你的服务器内核版本太新,或者缺少头文件,驱动编译就会失败。

解决办法是:先安装对应内核版本的linux-headers包。

apt-get install linux-headers-$(uname -r)

如果系统内核太新,昇腾驱动还没来得及适配,那就需要降级内核。我建议选择Ubuntu 20.04搭配5.4内核,或者Ubuntu 22.04搭配5.15内核,这些版本相对保守稳定。

如果是CentOS系统,还需要确保gcc版本不是特别旧,否则编译也会出问题。

4.2 ATC转换报错,算子不支持怎么处理

YOLO系列模型在导出ONNX时,可能会包含一些昇腾算子库暂时不支持的算子,比如某些动态shape操作或者特殊激活函数。面对这类问题,通常有三种解法。

解法一:回退PyTorch模型结构。有些算子是可以绕开的,比如把SiLU激活函数替换成ReLU+自定义组合。解法二:使用ONNX简化工具,把图中的冗余节点删掉,有时候就能绕过不支持的部分。解法三:自定义算子。如果实在绕不开,需要写TBE(Tensor Boost Engine)自定义算子,这个门槛比较高,一般用不到。

大部分情况下,前面两种解法都能解决问题。我遇到的ATC转换失败案例中,超过80%都是因为ONNX里带了多余的节点或动态维度导致的。

4.3 推理速度慢,卡在性能瓶颈怎么办

当你发现模型能跑,但速度不达标时,可以用profiling工具看看瓶颈在哪里。

CANN自带的profiling工具可以输出算子耗时统计,用这个工具可以清楚地看到每个算子的执行时间。如果发现某个算子异常慢,可以考虑修改模型结构,或者调整ATC转换时的优化选项。

另一个常见性能瓶颈是设备利用率低。用npu-smi info watch命令可以实时查看算力利用率,如果利用率长期低于50%,说明推理流程中存在等待,需要检查是不是拷贝数据耗时太长,或者是batch太小导致计算单元闲置。

4.4 常见问题排查速查表

问题表现可能原因处理方式
驱动安装失败缺少内核头文件、gcc版本低安装对应linux-headers,升级gcc
npu-smi信息里没有设备驱动未加载或PCIe识别失败检查lspci输出,重新安装驱动
ATC转换报Unknown opONNX算子不支持或版本过新使用onnxsim简化,降级PyTorch版本
推理结果全是0输入数据归一化方式错误检查预处理逻辑,确认输入格式
推理速度慢batch太小、CPU预处理瓶颈调整batch,使用DVPP/AIPP硬件预处理
显存不足多进程同时申请显存调整多进程模型加载策略,按时释放内存

结尾

Atlas这套平台,说实话刚上手的时候会有一种“过去的知识全白费了”的感觉,因为工具链、生态、思维方式跟CUDA体系完全不一样。但只要沉下心来把驱动、CANN、ATC这条链路走通一遍,你就会发现它的设计逻辑其实非常清晰,而且性能真的不差。

我个人最深的体会是,在昇腾平台上做推理,宁可多花点时间在模型转换和预处理优化上,也别急着写推理代码。因为很多坑其实在转换阶段就已经埋下了,前面处理好了,后面写代码反而是一马平川。另外建议新手朋友多利用官方社区和文档,遇到问题时先查版本配套表,这能帮你省掉大量排查时间。

最后再分享一个小技巧:如果你是拿Atlas 300V长期跑线上服务,建议在代码里加上设备状态监控和异常重启逻辑,毕竟推理卡在数据中心环境里长时间运行,保持监控总没有坏处。祝大家都能顺利把自己手里的YOLO模型在Atlas上跑起来,性能调到自己满意为止。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/25 5:39:39

指纹芯片选型:模组公差、环境鲁棒性与TrustZone协同深度

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华