尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Atlas 300V 24G部署YOLOv5实战:从环境搭建到推理调优

发布时间:2026/9/25 5:58:13

资讯中心
01
ARTICLE

Atlas 300V 24G部署YOLOv5实战:从环境搭建到推理调优

Atlas 300V 24G部署YOLOv5实战:从环境搭建到推理调优
这段时间后台一直有人私信问我“Atlas 300V 24G 是运算加速卡吗”“跑 YOLO 用 Atlas 到底行不行” 正好我手里有一块 Atlas 300V 24G最近也在它上面完成了 YOLOv5 的完整部署从环境搭建到模型转换再到推理调优都踩了一遍。这篇文章就把我这次的实操过程完整梳理一遍先从这块卡本身的定位说起再带你把 YOLO 部署的全流程跑通。这篇内容适合谁看手里已经有或者准备入手 Atlas 推理卡、想在边缘设备上跑 YOLO 系列检测模型、以及被官方文档里 C 示例劝退了想用 Python 快速验证的同学。我会把关键命令、配置文件、推理代码都贴出来也会把那些官方文档里不会写、只有自己踩过坑才会知道的细节一并交代清楚尽量让你少走弯路。1. 先搞明白Atlas 300V 24G 到底是个什么卡1.1 它的真实身份推理卡不是训练卡直接回答大家最关心的问题Atlas 300V 24G 确实是运算加速卡但它不是像 NVIDIA A100 或者 RTX 4090 那样既能训练又能推理的通用 GPU。它是一张专用推理卡芯片用的是昇腾 310P 系列定位就是做 AI 推理加速尤其是视频图像类的推理任务。24G 指的是板载内存LPDDR4X不是传统意义上显卡的“显存”所以它不适合做模型训练也没法拿来玩游戏但做推理尤其是多路视频流分析这块卡的性价比和功耗表现都很突出。为什么要特别强调“推理卡”这个定位因为很多刚接触昇腾的朋友会拿着训练的思路来用 Atlas结果发现这不对、那不行。你要清楚它的设计目标模型在 GPU 或者服务器上训练好之后导出成推理格式再放到 Atlas 上做高效的推理计算。这个流程决定了你的部署方案一定是“训练端 推理端”分离的。Atlas 300V 还有几个兄弟型号我放在一起对比一下型号芯片内存定位常用场景Atlas 300I Pro昇腾 310P24GB通用推理卡边缘服务器推理、多路视频分析Atlas 300V Pro昇腾 310P24GB视频图像推理卡视频编解码 AI 推理一体Atlas 300V 24G昇腾 310P24GB视频推理加速卡类似 300V Pro侧重视频前后处理我这块是 Atlas 300V 24G整卡功耗说是在 70W 左右级别比同算力的 GPU 卡低不少对于边缘机房或者工控机来说非常友好。INT8 算力在几十 TOPS 量级跑 YOLOv5s 这种量级的模型能跑到理想帧率后面我会细说实际表现。1.2 为什么要用 Atlas 跑 YOLO边缘推理场景的选择逻辑有人可能会问我直接用 GPU 推理不香吗如果环境允许GPU 生态确实成熟得多CUDA 全家桶上手快。但实际项目里有两个问题绕不开第一很多客户现场是现有的服务器插槽和电源预算有限加一块大功率 GPU 不现实第二AI 加速卡在做视频分析时有专门的编解码硬件单元多路 RTSP 视频流接入时GPU 的通用计算资源要同时应付解码和推理压力很大而 Atlas 300V 这种卡把视频解码、预处理、推理整合到了一起多路视频场景下优势明显。另外在国产化需求较高的项目中Atlas 系列是绕不开的一个选项。所以我的建议是如果你要做的是单张图片或者低并发推理用 GPU 很舒服但如果要跑视频流、做批量检测、部署在边缘侧Atlas 这类卡值得认真考虑。2. 部署 YOLO 前的环境准备驱动、固件与 CANN2.1 硬件安装与系统要求Atlas 300V 24G 是标准 PCIe 全高卡插进服务器 PCIe x16 槽位就行。安装时注意三点电源供电要够、散热要留空间、系统时间要校准。第一个坑就是供电。这卡虽然是 70W 左右的卡但有些服务器主板 PCIe 槽位供电不足导致系统起来后 npu-smi 看不到设备。建议优先插在距离 CPU 最近的 PCIe 槽那个槽供电通常最稳。系统方面官方支持 Ubuntu、CentOS、openEuler 等主流 Linux 发行版。我是用 Ubuntu 20.04 做的x86 架构比较简单。小提示系统盘建议留出至少 50GB 空间因为 CANN 工具链和模型文件占的空间比想象中大。2.2 驱动、固件与 CANN 的安装顺序这个顺序千万不能乱先装驱动再升级固件最后安装 CANN 工具包。如果先装 CANN 再装驱动大概率会遇到 ASCEND 环境变量和运行库对不上的问题。驱动和固件我用的都是华为官网 Ascend HDK 里对应的安装包版本要和你的卡匹配。装好之后先别急着配环境用一条命令验证硬件状态npu-smi info能看到类似下面这样的输出就说明驱动和硬件基本没问题了-------------------------------------------------------------------------------------------- | npu-smi 24.1.0 Version: 24.1.0 | ------------------------------------------------------------------------------------------ | NPU Name | Health | Power(W) | Temp(C) | Hugepages-Usage(page)| |------------------------------------------------------------------------------------------ | 0 | OK | 28.0 | 52 | 0 |如果 npu-smi 都看不到设备不要继续往后折腾 CANN 了先排查驱动和固件。CANN 版本我用的是 8.0 系列在昇腾社区可以直接下载。装完 CANN 后还要 source 一下环境变量source /usr/local/Ascend/ascend-toolkit/set_env.sh建议直接把这行写进~/.bashrc避免每次开新终端都要手动执行。这里有个小坑如果你用的是 zsh环境变量文件也要对应 source 到 zsh 的配置里不然会“找不到 acl 模块”。2.3 CANN 工具链里的关键组件装完 CANN 后你会看到很多目录和库文件新手很容易懵。其实我们做推理部署主要用到这几个ATCAscend Tensor Compiler负责把 ONNX、Caffe 等模型转成昇腾的 OM 格式这是最关键的一步。ACLAscend Computing Language算力平台 APIC 和 Python 都能调用推理代码底层全靠它。pyACLACL 的 Python 接口包对 Python 用户特别友好。AIPPAI Preprocessing用于在硬件上完成图像缩放、减均值、归一化等预处理把数据搬运开销降到最低。我的整体路线很明确PyTorch 训练好 YOLOv5 权重 → 导出 ONNX → 用 ATC 转成 OM → 用 pyACL 写推理脚本。下面每一步我都拆开讲。3. 模型转换全流程从 PyTorch 权重到 OM3.1 为什么不能直接跑 PyTorch 权重很多人拿到 YOLOv5 的.pt权重第一反应是“能不能直接放到 Atlas 上跑”。答案是不行。昇腾推理芯片执行的是 OM 格式它经过了算子融合、内存布局优化、指令级调整专门为昇腾硬件优化过。直接跑 PyTorch 权重相当于让一个擅长读地图的人在没有路的地方开车完全没有发挥硬件性能。正确的转换链路是PyTorch 权重 → ONNX 中间格式 → ATC 生成 OM。ONNX 就像一个“通用语言”把 PyTorch 的算子描述成一套标准接口ATC 再把标准接口翻译成昇腾的执行指令。为什么不用别的中间格式因为 ONNX 生态最成熟、算子覆盖面最广YOLOv5 官方提供了现成的导出脚本出问题的概率最小。3.2 导出 ONNXYOLOv5 的实操细节我用的是 YOLOv5 官方仓库版本 7.0。导出命令用官方自带的 export.py 就行python export.py --weights yolov5s.pt --include onnx --opset 11 --dynamic这里有几个参数值得特别注意--opset 11建议固定。ONNX 算子集版本太高ATC 可能还没支持新算子太低则可能缺少某些算子对应的映射。实测 opset 11 在 YOLOv5 和 CANN 8.0 组合下最稳妥。--dynamic是导出动态 batch 和动态输入尺寸如果你确定只跑 640x640 输入可以不加转 OM 时会更简单。导出之后先用 ONNX Runtime 验证一下 ONNX 模型能否正常推理这一步能提前暴露 80% 的算子兼容性问题python detect.py --weights yolov5s.onnx --source data/images/bus.jpg能看到检测框说明 ONNX 本身没问题再继续走下一步。3.3 ATC 转 OM核心参数逐一说明转 OM 的命令是整个流程中最容易出错的环节。先贴一个我实际使用的命令atc --modelyolov5s.onnx \ --framework5 \ --outputyolov5s_640 \ --input_shapeimages:1,3,640,640 \ --insert_op_confaipp.cfg \ --output_typeFP32 \ --soc_versionAscend310P3一个个解释--framework5表示输入模型是 ONNX 格式。这个数值不能写错写错了 ATC 直接报错。--input_shape必须和你导出的 ONNX 输入一致。YOLOv5 的输入节点名默认是imagesshape 是NCHWN 是 batch 数3 是通道数后面是高度和宽度。--insert_op_confAIPP 配置文件路径这个后面专门说。--output_typeFP32输出数据的精度。我这里为了后处理方便直接输出 FP32如果追求更高吞吐也可以输出 FP16。--soc_version芯片型号。怎么查跑一下npu-smi info看芯片名或者用npu-smi info -t board然后对照文档填。Ascend 310P 系列常见的是 Ascend310P3。AIPP 配置是我觉得很多人容易忽略但非常重要的一环。它的作用是在推理前用硬件完成 resize、减均值、归一化这些操作。我用的配置文件如下aipp_op { aipp_mode: static input_format: RGB888_U8 src_image_size_w: 640 src_image_size_h: 640 csc_switch: true rbuv_swap_switch: false crop: false normalize { crop_size_w: 640 crop_size_h: 640 channel_num: 3 mean: [0, 0, 0] min: [0, 0, 0] var: [0.003921569, 0.003921569, 0.003921569] } }有几个地方要特别注意。input_format表示输入图像格式我用的是 RGB888如果你的图像是 BGR需要设置通道转换否则颜色通道会乱。var不是除以平均值而是乘的归一化系数所以这里填 1/255 也就是 0.003921569对应 YOLOv5 训练时对像素值除以 255 的归一化操作。最关键的一点如果 AIPP 里做了归一化那么训练侧 ONNX 模型本身的归一化层要么删掉要么在导出时就把它去掉。怎么判断导出的 ONNX 如果输入层后面跟着 Mul/Div 这类归一化算子而 AIPP 里又做了 normalize就会造成双重归一化结果必然是检测框乱飞或者全无输出。我确认过 YOLOv5 官方 ONNX 导出不会自动移除归一化层所以要么在 AIPP 里去掉 normalize 相关配置要么在 ONNX 模型里屏蔽掉前面几个算子。最省事的方案直接把 AIPP 的 normalize 关掉让数据原样进去模型内部自己处理归一化。新手先按这个来后面熟悉了再按需优化。转完 OM 后目录下会生成一个yolov5s_640.om文件。可以先跑一个工具验证模型文件是否正常omg -o # 看帮助信息这一步不是必须的。更直接的验证方式是用 model 的 dump 工具但那个流程比较复杂一般等推理脚本跑通了自然就验证了。4. 写推理代码pyACL 从初始化到出框4.1 推理的整体思路OM 模型有了接下来就是用 pyACL 跑推理。整体流程可以拆成五个阶段初始化、加载模型、准备输入输出、执行推理、后处理。这五个阶段我逐一贴代码但有一点先说明pyACL 的接口分层比较细为了让你看清主流程我把错误处理、内存释放这些做了简化。实际项目中建议封装成类尽量把所有ret都检查一遍。4.2 初始化与模型加载先看初始化和加载模型的代码import acl import numpy as np import cv2 # 初始化 ret acl.init() assert ret 0, facl.init failed: {ret} # 指定设备0是设备ID ret acl.rt.set_device(0) assert ret 0, fset_device failed: {ret} # 创建上下文 context, ret acl.rt.create_context(0) assert ret 0, fcreate_context failed: {ret} # 加载模型 model_path yolov5s_640.om model_id, ret acl.mdl.load_from_file(model_path) assert ret 0, fload model failed: {ret}这里容易踩的坑acl.init()必须在所有其他acl.rt调用之前执行而且在一个进程里只能调用一次。如果你在 Notbook 或者交互环境里重复执行这段代码第二次就会跑挂原因就是重复初始化了。解决方案是在脚本开头加一个全局标志判断是否已经初始化。加载模型时如果报错九成是 OM 和 CANN 版本不匹配。比如用 CANN 8.0 转出来的 OM拿到 CANN 7.0 的环境里去加载会直接报版本错误。换环境时一定要重新转换模型。4.3 数据准备与推理执行加载模型之后需要为输入输出分配设备侧内存。这里要先了解模型描述信息model_desc acl.mdl.create_desc() ret acl.mdl.get_desc(model_desc, model_id) assert ret 0, get_desc failed # 获取输入输出尺寸 input_size acl.mdl.get_input_size_by_index(model_desc, 0) output_size acl.mdl.get_output_size_by_index(model_desc, 0) # 分配设备内存 input_ptr, ret acl.rt.malloc(input_size, 2) output_ptr, ret acl.rt.malloc(output_size, 2)acl.rt.malloc的第二个参数 2 是ACL_MEM_MALLOC_HUGE_FIRST标志优先申请大页内存性能更好。在需要频繁推理的场景这个标志能减少内存碎片。真正执行推理前要把预处理好的图像数据拷贝到设备侧。我这里用 AIPP 做了预处理所以只需要把原始图像的字节数据传进去前提是图像的尺寸、格式要和 AIPP 配置一致# 读图和resize img cv2.imread(bus.jpg) img cv2.resize(img, (640, 640)) # 将BGR转成RGB img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 转成连续内存的numpy数组 img np.ascontiguousarray(img, dtypenp.uint8) # 拷入设备内存 acl.rt.memcpy(input_ptr, input_size, img.tobytes(), input_size, ACL_MEMCPY_HOST_TO_DEVICE) # 执行推理 ret acl.mdl.execute(model_id, input_ptr, input_size, output_ptr, output_size) assert ret 0, fmodel execute failed: {ret}注意这里的ACL_MEMCPY_HOST_TO_DEVICE常量在 pyACL 里的定义需要单独 import。从数据拷贝到推理完成全程同步在 10ms 级别这个性能对单张图推理来说完全够用。如果要做多路视频流就需要用异步接口和多线程并发这个后面可以单独讲。4.4 后处理解析输出、NMS 与画框推理完成后输出数据在output_ptr里需要把它读回主机侧output_data np.zeros(output_size, dtypenp.uint8) acl.rt.memcpy(output_data, output_size, output_ptr, output_size, ACL_MEMCPY_DEVICE_TO_HOST)YOLOv5 的输出形状一般是[1, 25200, 85]或者执行了--end2end导出后是[1, 100, 7]这样的固定输出格式。我用的 YOLOv5 7.0 默认导出输出是1x25200x85其中 85 4 个坐标 1 个置信度 80 个类别概率。解析方式就是把 640x640 的坐标中心点换算回原图坐标过滤低置信度框再做 NMS。这段后处理代码不复杂但容易搞错的是坐标换算。YOLOv5 输出的 cx、cy 是在 640x640 输入尺寸下的坐标所以要按原图和输入尺寸的比例缩放回原图坐标。我简单写了关键片段def postprocess(output, conf_thresh0.4, iou_thresh0.5, img_shape(640, 640)): # output shape: (1, 25200, 85) preds output[0] boxes [] confidences [] class_ids [] for pred in preds: confidence pred[4] if confidence conf_thresh: continue class_scores pred[5:] class_id np.argmax(class_scores) class_score class_scores[class_id] total_conf confidence * class_score if total_conf conf_thresh: continue cx, cy, w, h pred[:4] x1 cx - w / 2 y1 cy - h / 2 x2 cx w / 2 y2 cy h / 2 boxes.append([x1, y1, x2, y2]) confidences.append(total_conf) class_ids.append(class_id) # NMS 用 cv2.dnn.NMSBoxes 即可 indices cv2.dnn.NMSBoxes(boxes, confidences, conf_thresh, iou_thresh) return indices, boxes, confidences, class_ids这里特别提醒一点YOLOv5 输出的坐标可不是 0~1 的归一化坐标而是相对于输入图像尺寸的像素坐标。如果你拿到坐标后没乘 640 或者没做缩放映射画框位置会完全对不上。接着把 box 的坐标除以 640 再乘回原图宽高即可。5. 常见问题与排查技巧实录5.1 问题速查表安装与运行阶段我把自己部署过程中遇到的和身边朋友踩过的问题整理成了一张表按频率从高到低排列现象可能原因解决方法npu-smi info看不到设备驱动未装好或 PCIe 供电不足换 PCIe 槽位重装驱动确认固件版本ATC 转换报错E10023ONNX 模型算子不支持降低 opset 版本或升级 CANN 版本ATC 转换报错E19999模型路径错误或配置参数冲突检查--input_shape是否与 ONNX 一致推理输出全为 0AIPP 与输入图像格式不匹配检查 AIPP 的input_format和resize配置推理输出乱码、框位置错乱双重归一化或坐标未换算去掉 AIPP 的 normalize或确认后处理坐标缩放模型加载报版本不匹配OM 与 CANN 版本不一致用当前环境重新执行 ATC 转换5.2 独家避坑细节从模型到性能调优第一个坑是 AIPP 和模型内置归一化的冲突。这个问题太隐蔽了表面上看输出有数据但置信度全部很低或者框完全不在目标上。我建议新手第一次跑通先不要用 AIPP 的 normalize直接把原始图像喂进去让 ONNX 里的归一化层处理。物理上慢一点点但排查问题容易得多。等全流程通了再想性能优化。第二个坑是输入数据的字节对齐。pyACL 对输入内存有对齐要求有时候传 numpy 数组忘了用np.ascontiguousarray会导致acl.rt.memcpy报内存错误。所有传给 ACL 的 host 数据统一先转成连续内存再拷贝。第三个坑是信了 24G 内存很深就觉得可以随便造。Atlas 300V 24G 的 24G 是板载内存但推理耗时并不只看内存大小而是看算子执行效率。你可以把 batch size 加大到 4 或者 8让一次推理处理多张图提升设备利用率。我实测 YOLOv5s 在 batch1 时单帧推理约 12ms 到 15msbatch4 时平均每帧降到 8ms 左右吞吐量能提升将近一倍。多路视频场景下把多路帧合到一个 batch 里这是最直接的优化手段。第四个坑是驱动固件升级。如果跑了一段时间后 npu-smi 显示健康状态异常或者推理偶发报错可以试着重刷固件# 进入固件包目录 ./Ascend-hdk-*.run --upgrade升级完最好重启一次系统。固件升级中断是大忌千万保证电源稳定。我遇到过刷固件过程中意外断电最后整个卡识别不到只能送修这个教训分享出来希望大家别踩。最后分享一点个人体会在 Atlas 300V 24G 上部署 YOLOv5 整体链路是通的而且比我预期顺利。如果你第一次接触昇腾我建议从 YOLOv5 这种成熟模型的推理部署入手先跑通 ONNX→OM→pyACL 这条链路先别看那些训练和量化相关的进阶内容。整个过程中最花时间的往往不是写推理代码而是环境版本匹配和 AIPP 参数调整。只要把这两块按我上面的顺序逐步检查基本半天就能出第一张带框的推理图。另外Atlas 这个平台还在快速迭代CANN 版本一升级很多旧坑就消失了但也会带来一些新行为。我现在搭好环境后会把 CANN 版本、驱动版本、固件版本都记在项目的 README 里换机器时直接按版本清单装能省掉大量排查时间。后续我打算把多路视频流的异步推理也跑一版到时候再写一篇详细分享。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。