新闻详情

新闻详情

首页 / 资讯中心 / 详情

昇腾Atlas 300V Pro 24G部署YOLOv5完整指南:环境配置、模型转换与推理调优

发布时间:2026/9/26 15:08:55来源:尧图网络
昇腾Atlas 300V Pro 24G部署YOLOv5完整指南:环境配置、模型转换与推理调优
最近项目上要把一套YOLOv5的检测服务从GPU环境迁移到昇腾Atlas平台手里的卡正好是Atlas 300V Pro 24G。很多同事第一次看到这个型号都会问同样一句话atlas 300v 24g是运算加速卡吗答案是肯定的它不但是加速卡还是专门为AI推理设计的加速卡。这篇博文就围绕atlas部署yolo这件事把从环境准备、模型转换到最终跑起来的完整过程捋一遍包括中间踩过的坑和换来的经验希望能给准备在昇腾平台上做目标检测部署的工程师一点参考。1. Atlas 300V Pro 24G到底是一张什么卡1.1 先弄清楚它是“推理卡”不是“训练卡”Atlas 300V Pro 24G本质上是一张AI推理加速卡核心是昇腾310P系列NPU。它和常见的NVIDIA训练卡比如A100、V100定位完全不同训练卡要兼顾前向和反向的计算能力算力足够高但功耗和价格也非常感人推理卡的目标是用更低的功耗、更小的体积把训练好的模型跑得足够快尤其是在多路视频流、并发检测这类场景下。这张卡是PCIe形态的标准加速卡插到普通服务器就能用不需要整台昇腾服务器。卡上有24GB显存这个容量对YOLO这类目标检测模型来说非常宽裕哪怕跑YOLOv5s、YOLOv8s这种主流规模的模型单卡加载多个模型实例或者多batch推理都绰绰有余。官方标称INT8推理算力在百级TOPS区间不同软件版本、不同规格的300V Pro会有差异我实际跑下来最直观的感受是单张300V Pro 24G做YOLOv5s的640x640推理这种并发压力下表现很稳。1.2 24G显存和PCIe接口意味着什么很多人会拿Atlas 300V Pro 24G和GPU显卡去对比显存带宽、显存频率但这么做意义不大。NPU的推理性能和显存大小有一定关系但更关键的瓶颈经常在数据搬运CPU把图像数据拷到NPU显存、NPU算完再拷回来这一来一回如果没优化好再高的TOPS也发挥不出来。24G显存的具体价值在于“装得下”和“多路跑”装得下YOLO模型本身不大yolov5s的权重文件才14MB左右转换成OM离线模型也就几十MB24G显存可以同时驻留多个模型或者一个模型开多batch。多路跑做视频流检测时通常要同时处理多路摄像头每路一个推理线程显存充足就不容易出现设备内存不足的报错。PCIe接口意味着它可以插在任何通用x86/ARM服务器上不像部分专用设备那样绑定特定硬件平台。对已经有存量服务器的团队来说加一张PCIe加速卡比换整机划算得多。2. 部署YOLO之前的环境准备2.1 驱动、固件、CANN三件套缺一不可在Atlas上部署YOLO第一步不是写代码而是把环境装好。这里有个容易犯迷糊的地方昇腾平台不像NVIDIA那样装一个显卡驱动就能用它需要驱动、固件、CANN工具包三个东西配合起来。驱动NPU驱动负责操作系统和NPU硬件之间的通信类似GPU驱动。固件NPU固件跑在NPU上的底层固件控制芯片内部的计算单元和资源调度。CANN昇腾异构计算架构类似CUDA提供开发套件、运行时库和ATC模型转换工具。安装顺序最好是先装驱动和固件再装CANN。装CANN的时候推荐直接装上toolkit里面包含了ATC转换工具、pyACL运行库、编译依赖等后面都跑得通。社区里有些人只装了runtime包结果后面想转模型发现没有atc命令还得补装白白浪费时间。装完以后用下面这组命令验证环境npu-smi info能看到板卡型号、芯片名称、驱动版本和固件版本就说明驱动固件没问题。然后再检查CANN环境source /usr/local/Ascend/ascend-toolkit/set_env.sh atc --versionatc能正常打印版本号工具链就通了。实际项目里我习惯把这行source写进~/.bashrc否则每次开新终端都要手动执行很容易漏掉。2.2 从PyTorch权重到NPU离线模型链路是怎样的很多第一次接触昇腾的人会问为什么不能像GPU那样直接把PyTorch模型加载上去跑原因很简单PyTorch框架底层的算子大部分是为GPU/CPU设计的NPU上要高效运行必须先把模型里的算子映射成昇腾支持的算子再编译成NPU能直接执行的离线模型。整个链路可以概括为在GPU机器上用PyTorch训练出权重文件.pt。导出成ONNX中间格式。ONNX不偏向任何硬件平台是所有推理引擎都能理解的一种“通用语言”。用ATC工具Ascend Tensor Compiler把ONNX模型编译成昇腾的离线模型文件.om。推理程序加载.om文件把输入数据准备好NPU执行推理结果返回CPU后处理解析检测框。这个流程和NVIDIA的TensorRT很像TensorRT把训练好的模型编译成engine昇腾ATC把ONNX编译成OM。理解这一点后后续遇到ATC转换报错就不会慌本质上就是“算子没被NPU支持”或“模型结构太复杂”而已。3. 用Atlas 300V Pro 24G部署YOLOv5的完整流程3.1 第一步导出ONNX模型避开超算图优化我这次用的是YOLOv5官方仓库自带export脚本可以直接导出ONNXpython export.py --weights yolov5s.pt --include onnx --opset 12 --batch-size 1 --simplify这里几个参数值得多说一句--opset 12ONNX算子集版本。昇腾对opset 11-13支持得都不错我建议固定到12或13太老的算子集有的结构表达不了太新的又容易遇到算子不支持。--batch-size 1先固定batch为1把整个转换链路跑通后面要优化性能再换动态batch或者多batch模型。--simplify用onnxsim简化计算图去掉一些冗余算子ATC转换时会更顺利。导出之后用以下命令检查ONNX结构import onnx model onnx.load(yolov5s.onnx) onnx.checker.check_model(model) print(model.graph.input[0]) print(model.graph.output[0])输出节点的形状很关键。YOLOv5如果不加NMS模块输出一般是一个三维tensor比如(1, 25200, 85)包含了所有anchor的预测如果你导出时加了--nms输出可能变成了多组tensor结构不一样ATC转换时的输出设置也要跟着改。刚开始部署建议先导出不带NMS的版本后续后处理在自己代码里做排查问题更容易。3.2 第二步用ATC工具把ONNX转换成OM离线模型得到ONNX模型后下一步就是ATC转换。这是整个部署过程中最容易卡壳的环节因为每个模型的结构不同ATC的配置也稍有差异。我这次用的转换命令是这样的atc --modelyolov5s.onnx \ --framework5 \ --outputyolov5s_bs1 \ --soc_versionAscend310P3 \ --input_shapeimages:1,3,640,640 \ --input_formatNCHW \ --insert_op_confaipp.cfg \ --output_typeFP16各个参数的含义--model输入的ONNX模型路径。--framework55表示ONNX。ATC支持多种框架TensorFlow是1Caffe是0ONNX是5。--output输出OM文件名。--soc_version芯片版本必须和实际硬件匹配。Atlas 300V Pro 24G对应的昇腾芯片是310P系列常见值是Ascend310P3。不确定的话先用npu-smi info查看芯片名称或者运行atc --help看当前版本支持的SoC列表。--input_shape固定输入尺寸。这里images要和ONNX模型输入节点名一致大小1x3x640x640。--insert_op_conf插入AIPP预处理配置文件。AIPP是昇腾的硬件预处理模块可以把图像缩放、色域转换、归一化这些操作融合到模型里减少CPU负担。--output_typeFP16输出数据用FP16格式。YOLO后处理时注意转回float32不然后面解析坐标会出问题。AIPP配置文件aipp.cfg内容如下aipp_op { aipp_mode: static input_format: RGB888_U8 csc_switch: true rbuv_swap_switch: false min_chn_0: 0.0 min_chn_1: 0.0 min_chn_2: 0.0 var_reci_chn_0: 0.003921569 var_reci_chn_1: 0.003921569 var_reci_chn_2: 0.003921569 }这里rgbuv_swap_switch: false表示输入是RGB顺序。如果你直接送OpenCV读出来的BGR图像需要把通道顺序调对或者在AIPP里做BGR到RGB的通道交换。var_reci_chn是每个通道的归一化系数0.003921569就是1/255把像素从0-255缩放到0-1。转换成功后可以看到类似INFO: ATC run success的日志此时当前目录下会多出yolov5s_bs1.om文件。这个文件就是Atlas能直接加载推理的离线模型。3.3 第三步用pyACL写最小推理程序Atlas上写推理程序有几种方式官方推荐用MindX SDK也可以直接用底层pyACLPython AscendCL。我习惯先用pyACL跑通最简流程因为保留的底层控制更多出了问题好定位。核心流程分成五步初始化、加载模型、准备输入输出、执行推理、取结果。import acl import numpy as np # 1. 初始化 acl.init() ret acl.rt.set_device(0) if ret ! 0: raise RuntimeError(set device failed) context, ret acl.rt.create_context(0) # 2. 加载OM模型 model_id, ret acl.mdl.load_model_from_file(yolov5s_bs1.om) if ret ! 0: raise RuntimeError(load model failed) # 3. 获取模型输入输出信息 input_desc acl.mdl.create_model_desc() acl.mdl.get_desc(input_desc, model_id) input_size acl.mdl.get_input_size_by_index(input_desc, 0) output_size acl.mdl.get_output_size_by_index(input_desc, 0) # 4. 准备输入数据假设img是已经resize到640x640的RGB图像 img img.astype(np.float16) if img.dtype ! np.float16 else img input_data np.expand_dims(img, axis0) # 5. 分配设备内存并拷贝输入 input_tensor acl.rt.malloc(input_size, 2) output_tensor acl.rt.malloc(output_size, 2) acl.rt.memcpy(input_tensor, input_size, input_data.ctypes.data, input_size, 1) # 6. 执行推理 stream acl.rt.create_stream() acl.mdl.execute_async(model_id, [input_tensor], [output_tensor], stream) acl.rt.synchronize_stream(stream) # 7. 把输出拷贝回家解析结果 output_data acl.rt.malloc_host(output_size) acl.rt.memcpy(output_data, output_size, output_tensor, output_size, 1) output np.array(output_data, copyFalse).reshape((1, 25200, 85))代码里有几个容易漏的点acl.rt.malloc的第二个参数是内存类型2表示指定设备内存具体值以你所用CANN版本的pyACL接口为准。输入数据只做了一次astype(np.float16)但YOLO模型输入是FP32或FP16要看ATC转换时的--input_dtype设置。如果你在ATC命令里指定了FP16输入这里必须转FP16如果没指定默认可能是FP32转换错了推理结果会异常。acl.rt.memcpy最后的type参数1表示设备到设备需根据实际情况调整。如果输入要在主机和设备之间拷贝类型要选对。3.4 第四步YOLO后处理与结果解析YOLOv5的输出格式一般是(1, 25200, 85)25200等于三个尺度的anchor总数50x50 25x25 13x13 2500 625 169 3294实际是8400不同版本差异较大85表示x, y, w, h, 置信度, 80个类别得分。后处理的第一步是过滤低置信度的框然后做NMS非极大值抑制。这段逻辑和GPU部署时完全一样可以复用原来的numpy实现boxes output[0][:, :4] conf output[0][:, 4] class_ids np.argmax(output[0][:, 5:], axis1) scores output[0][:, 5:].max(axis1) # 过滤置信度 mask scores 0.25 boxes boxes[mask] scores scores[mask] class_ids class_ids[mask]接着对每个类别分别做NMS。注意输出坐标是在640x640输入尺寸下的要拿到原图上画框需要在预处理时记录resize和letterbox的比例推理结果解析时反算回去。这一步非常容易出错经常出现“框位置偏移”“框和物体对不上”原因往往不是模型或NPU的问题而是resize方式不一致。4. 常见问题与排查技巧实录4.1 部署过程中最常踩的五个坑我在部署这个项目的过程中前后卡了大概三天回头看去全是小问题。下面这几条是实际遇到的典型坑拿出来分享给你避免重复交学费。第一个坑是npu-smi info能识别到卡但pyACL调用时acl.rt.set_device返回错误码。出现这种情况八成是当前用户的权限不够导致无法访问NPU设备文件。我用root用户跑没问题换普通用户就失败。解决办法把用户加进HwHiAiUser组或者直接用root跑测试脚本。第二个坑是ATC转换时报E19999: Inner Error。这类错误提示通常非常抽象日志里却能看到某个ONNX算子不支持。我遇到的处理办法是先把ONNX模型做一遍simplify再不行就换一个更常规的结构描述。例如YOLO检测头里用到了Split、Sigmoid、Concat这些算子时有时导出参数不同会导致结构复杂降低opset版本往往能绕过去。第三个坑是推理结果全为0。这种现象在GPU上很少见在Ascend上却很容易出现。最大嫌疑是AIPP归一化写错了比如模型内部已经有归一化操作AIPP又做了一次var_reci_chn等于把输入缩放了两次数值直接溢出或变成0。我调整AIPP配置时把归一化系数改成1.0问题立刻消失。第四个坑是图像颜色不对检测框看起来“正常”但识别出的类别和实际物体对不上。我的情况是OpenCV读图默认BGRAIPP里设置的是RGB模型实际上接收的是RGB最终颜色通道反了分类结果乱七八糟。统一在AIPP里做一次BGR到RGB的rbuv_swap_switch处理或者在代码里先转换通道两者选一个千万别重叠。第五个坑是执行推理时acl.mdl.execute_async一直不返回。多半是忘了调用acl.rt.synchronize_stream。异步接口提交任务后不会等待NPU执行完成必须显式同步。用pyACL时在execute_async之后立刻调acl.rt.synchronize_stream(stream)是最稳妥的。4.2 一张速查表解决大多数报错对于初次接触Atlas的人报错信息是最劝退的东西。我整理了一张速查表覆盖最常遇到的问题现象可能原因处理办法npu-smi info找不到设备驱动未安装或者权限不足重装驱动固件切到root用户执行acl.rt.set_device返回100018驱动固件与CANN版本不匹配查官方版本配套表重新安装匹配版本ATC转换报E19999ONNX算子不支持用onnxsim简化模型降低opset替换自定义算子推理结果全为0AIPP归一化系数设置错或模型内部重复归一化调整aipp.cfg中var_reci_chn检测框偏移或错位预处理resize和letterbox不一致统一原始图像到模型输入的resize方式保存缩放比例输出类别混乱RGB/BGR通道顺序错误保证代码、AIPP、模型三者通道顺序一致acl.mdl.execute_async卡住缺少stream同步调用acl.rt.synchronize_stream以上问题排查时最好记下完整的错误码和堆栈日志。昇腾的报错机制很有特点真正的底层错误往往在一大串日志的末尾使用grep -i error过滤出关键信息再结合npu-smi info查看设备状态定位速度会快很多。5. 性能调优思路与个人的一些扩展经验5.1 把Atlas 300V Pro 24G的算力吃满的一些手段模型跑通只是第一步实际场景里要考虑性能。我这次的需求是同时处理8路视频流每路做实时目标检测所以调优时主要围绕“并发”和“减少无效等待”这两点。第一固定推理shape。ATC转换时固定输入尺寸为1x3x640x640虽然灵活性下降但NPU内部的算子计算图和内存布局会被充分优化推理延时明显降低。如果确实需要动态分辨率可以转成动态shape模型但ATLAS上的动态shape性能通常不如静态尤其对于实时场景能固定就固定。第二开启AIPP并且尽量把图像缩放交给DVPP硬件模块。DVPP是昇腾专有的视频/图像预处理硬件支持缩放、裁剪、格式转换。我在CPU上做一次预处理耗时在2-3毫秒改用DVPP后直接降了一半左右。对于8路视频流CPU压力瞬间减小。第三使用多batch推理。把8路视频帧攒成batch8的输入一次推理完成比8次单帧推理减少了很多调度和内存拷贝开销。Atlas 300V Pro 24G的显存足够支撑yolov5s的batch8推理单帧平均耗时能从12ms降到7ms左右具体数值受分辨率和模型版本影响。第四注意CPU和NPU的并行。execute_async非常适合做流水线CPU一边准备下一帧输入NPU一边算当前帧。代码里维护一个输入队列预处理线程不断放入数据推理线程不断取数据并执行整体吞吐量能提高不少。5.2 除了YOLOv5这个部署流程还能怎么扩展这次做的是YOLOv5但同样的流程可以直接迁移到YOLOv8、YOLOX、RT-DETR等模型上核心步骤就三步导出ONNX、ATC转OM、pyACL推理。实际差异可能出现在模型输出结构上比如YOLOv8的输出格式不一样后处理逻辑要跟着调整。如果产品化要求再高一层可以换成MindX SDK的mxVision流程编排它有点像NVIDIA DeepStream把解码、缩放、推理、后处理串成pipeline适合长周期维护的项目。不过底层原理和我上面写的一致先跑通pyACL在理解上会有很大优势。后续我还打算尝试把这些检测结果直接送到下游业务系统再做一层跟踪和计数这时候就会发现Atlas 300V Pro 24G在功耗、稳定性上的优势很突出。我个人的体会是部署昇腾平台最大的门槛不是硬件本身而是“第一次转换模型”时的不适应。一旦ONNX转OM跑通后续的迭代节奏就能快起来。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

DeepSearcher 接入 Docling:本地文件加载与 Web 爬取一体化实战指南 2026/9/26 15:47:58

DeepSearcher 接入 Docling:本地文件加载与 Web 爬取一体化实战指南

人工智能大模型RAGAI Agent深度研究知识库 【免费下载链接】deep-searcher Open Source Deep Research Alternative to Reason and Search on Private Data. Written in Python. 项目地址: https://gitcode.com/gh_mirrors/de/deep-searcher 点击查看 免费下载 本指…

阅读更多 →
Apex Amp 混合精度训练实战:从 opt_level 到统一 API 的完整指南 2026/9/26 15:47:58

Apex Amp 混合精度训练实战:从 opt_level 到统一 API 的完整指南

人工智能大模型音乐生成音频预训练 【免费下载链接】jukebox Code for the paper "Jukebox: A Generative Model for Music" 项目地址: https://gitcode.com/gh_mirrors/ju/jukebox 点击查看 免费下载 本文以 NVIDIA Apex 仓库中 amp.rst 文档为主线&…

阅读更多 →
给爸妈配吸附性义齿,做子女的要先弄清哪几件事?/钟祥小灰兔科普 2026/9/26 15:47:52

给爸妈配吸附性义齿,做子女的要先弄清哪几件事?/钟祥小灰兔科普

咱们钟祥人讲孝心,都是实打实的。上回在阳春大街碰见老同学,他说给老爷子买了副新假牙,结果老爷子吃饭还是嫌松,打喷嚏的时候赶紧用手捂着嘴,生怕假牙“跑”出来。这场景,好多街坊家里是不是都见过&#xf…

阅读更多 →
Mosquitto CVE-2017-9868 安全公告解读:持久化文件权限漏洞的成因、修复与防护实践 2026/9/26 15:47:45

Mosquitto CVE-2017-9868 安全公告解读:持久化文件权限漏洞的成因、修复与防护实践

物联网消息队列后端网络/通信 【免费下载链接】mosquitto Eclipse Mosquitto - An open source MQTT broker 项目地址: https://gitcode.com/gh_mirrors/mo/mosquitto 点击查看 免费下载 导读:本文以 Eclipse Mosquitto 官方安全公告(securi…

阅读更多 →
InternVL1.5 配 TaoToken:多模态模型 settings.json 配置与 GPT-4V 差距验证 2026/9/26 15:47:45

InternVL1.5 配 TaoToken:多模态模型 settings.json 配置与 GPT-4V 差距验证

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

阅读更多 →
【清晰教程】Claude Code 安装教程:从 Node.js 到 settings.json 配 TaoToken 2026/9/26 15:47:45

【清晰教程】Claude Code 安装教程:从 Node.js 到 settings.json 配 TaoToken

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

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉