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

华为Atlas 300V 24G推理卡跑通YOLOv8全流程实践

发布时间:2026/9/26 11:02:47

资讯中心
01
ARTICLE

华为Atlas 300V 24G推理卡跑通YOLOv8全流程实践

华为Atlas 300V 24G推理卡跑通YOLOv8全流程实践
先说结论华为 Atlas 300V 24G 就是一张专门做 AI 推理的运算加速卡它和 NVIDIA GPU 最大的区别在于核心是昇腾 AI 处理器而不是 CUDA 核心。很多人第一次听到“Atlas 300V 24G”这个名字第一反应就是“这玩意到底是不是显卡”第二反应则是“能不能跑 YOLO”。这两个问题我这次一起回答它是标准的推理加速卡而且跑 YOLO 非常合适。下面是我从硬件选型、环境搭建、模型转换到推理部署全流程的实操记录踩坑和心得都写在里面希望对准备用昇腾平台做目标检测的朋友有帮助。1. 项目背景Atlas 300V 24G 到底是一张什么卡1.1 先搞清硬件定位Atlas 300V 24G 属于昇腾推理卡不是训练卡。训练卡跑的是模型迭代推理卡跑的是已经训练好的模型预测。产品型号后面的“24G”指的是 24GB 的板载显存。这张卡采用的是昇腾 310P 系列芯片硬件形态是 PCIe 卡可以插在标准 x86 / ARM 服务器里供电走 PCIe 插槽本身或者辅助供电接口。实际使用中你可以把它理解为“一张针对神经网络推理场景深度优化的计算卡”。它和普通 GPU 不一样不追求通用计算而是把矩阵运算、卷积运算这些神经网络里的高频操作做成了专用硬件电路所以在跑 ResNet、YOLO、Transformer 这类模型时功耗和性价比都很有优势。我这次部署的目标很直接在 Atlas 300V 24G 上跑通 YOLOv8s拿它做实时视频流目标检测。项目要求不依赖闭源的云端推理服务所有计算必须在本地服务器上完成硬件功耗还有限制。当时对比了几张卡最后选它主要是看中三点24GB 显存对于目标检测这类模型来说非常宽裕不仅单卡能跑 batch size 很大的推理还能同时加载多个模型。单卡功耗控制得不错不需要额外改机房散热方案。在同等显存规格的推理卡里它的采购价格和渠道稳定性有优势适合批量落地。1.2 一张表看懂定位对比项NVIDIA T4Atlas 300I ProAtlas 300V 24G核心架构TuringAscend 310PAscend 310P显存16GB GDDR616GB24GB推理场景通用AI推理边缘推理较高性能推理主要优势生态成熟功耗极低显存大、内存带宽高适用模型多框架兼容轻量模型大模型、多路视频流对于跑 YOLO 目标检测来说24GB 的显存意味着你可以很轻松地加载 YOLOv5m、YOLOv8m 这类中等规模模型并且在同一个进程里做多路视频流推理不会出现显存不够用的尴尬。这也是我为什么宁可选 Atlas 300V 24G也不去选 16GB 版本的原因之一——后续扩展多路业务时显存就是硬指标。1.3 我踩过的第一个坑驱动版本和卡不匹配硬件拿到手之后的第一件事不是写代码而是看系统能不能识别。Atlas 300V 24G 需要安装昇腾驱动和对应的固件官方通常合称 HDKHardware Development Kit。驱动装好后用npu-smi info命令就能看到卡的型号、固件版本、算力状态和单卡功耗。这里有一个非常容易犯的错有人会直接把旧环境下 Atlas 300I Pro 的驱动装到 Atlas 300V 24G 上。虽然名义上都是昇腾 310P 系列但固件和驱动之间存在严格的配套关系版本不对会导致npu-smi info干脆识别不到设备或者板卡状态显示离线Offline。注意装驱动前一定要先查官网对应型号的驱动包Ubuntu 系统还要注意内核版本是否在支持列表里。内核版本太新或太旧驱动编译模块都会失败。这一步没有捷径只能对照官方文档的适配表来选。2. 环境准备与部署前置条件2.1 系统与驱动安装我当时的操作系统是 Ubuntu 22.04内核版本是 5.15 系列。安装顺序是先把驱动包和固件包上传到服务器然后按顺序安装先固件后驱动。# 解压驱动包进入目录后执行 ./Ascend-hdk-310P-npu-driver_24.1.0_linux-aarch64.run --full ./Ascend-hdk-310P-npu-firmware_24.1.0_linux.run --full安装完成后重启服务器然后运行npu-smi info正常情况下会显示类似下面这样的信息-------------------------------------------------------------------------------------- | NPU Name | Health | Power(W) | Temp(C) | HugePagesTotal | -------------------------------------------------------------------------------------- | 0 | OK | 28 | 42 | 0 | --------------------------------------------------------------------------------------看到 Health 状态是 OK 就说明硬件层面已经通了。这一步如果卡住大概率是内核模块没有加载可以执行dmesg | grep -i npu查看加载日志。2.2 CANN 工具链安装驱动只是让系统认识硬件真正要跑模型还需要安装 CANNCompute Architecture for Neural Networks工具链。CANN 是昇腾平台的计算架构软件包包含算子库、图编译引擎、运行时环境和各种开发接口。安装 CANN 的步骤官方文档写得很清楚我这边只说关键点下载Ascend-cann-toolkit_8.0.RC2_linux-aarch64.run。使用默认安装路径/usr/local/Ascend。安装完成后需要 source 环境变量source /usr/local/Ascend/ascend-toolkit/set_env.sh为了省事我直接把它写进了~/.bashrc这样每次登录终端都自动加载。echo source /usr/local/Ascend/ascend-toolkit/set_env.sh ~/.bashrc source ~/.bashrc2.3 开发方式选择直接用 Python 调 AscendCL昇腾平台支持多种推理开发方式AscendCL底层 C/Python 接口灵活度高适合定制化开发。MindX SDK / mxVision高层封装支持通过 pipeline 方式快速搭推理流程。MindSpore Lite适合 MindSpore 框架训练的模型。我这次为了完整掌控推理流程选的是 AscendCL 的 Python 接口。虽然多写点代码但遇到问题时方便定位而且后面做性能优化时也更自由。如果是只想快速验证模型能否在 Atlas 300V 24G 上跑通建议直接先跑一下 CANN 自带的 E2E 示例比如 yolov5 的 sample确认环境没问题后再切换到自己的模型。这个“先官方示例后自己模型”的顺序能帮你省下大量排查环境问题的时间。3. YOLO 模型转换全流程3.1 从 PyTorch 权重到 ONNX 文件YOLO 模型通常用 PyTorch 训练但 Atlas 300V 24G 不能直接加载.pt文件需要先把模型转成 ONNX再用昇腾的 ATC 工具把 ONNX 编译成.om离线模型。我用的是 YOLOv8s导出 ONNX 的命令很简单yolo export modelyolov8s.pt formatonnx opset11 simplifyTrue注意两点opset建议用 11太新的 opset 在 ATC 转换时可能会遇到算子不支持的问题。simplifyTrue会调用 onnx-simplifier 清理计算图里冗余节点对后续 ATC 转换的成功率有明显帮助。导出完成后可以用onnxruntime验证一下 ONNX 模型能不能正常推理确保模型结构和输入输出没问题再进入 ATC 转换。3.2 ATC 转换生成 .om 离线模型ATCAscend Tensor Compiler是昇腾平台的模型编译工具。核心任务是把 ONNX 模型“翻译”成能在昇腾芯片上高效执行的离线模型。我用的转换命令atc --modelyolov8s.onnx \ --framework5 \ --outputyolov8s_atlas \ --input_shapeimages:1,3,640,640 \ --soc_versionAscend310P3 \ --precision_modeallow_fp32_to_fp16 \ --input_fp16_nodesimages \ --output_typeFP32 \ --logerror参数解释--framework55 表示 ONNX 模型。--input_shape指定模型输入形状这里必须是 NCHW 格式比如 batch size 为 1、3 通道、640x640 分辨率。--soc_version目标芯片型号。Atlas 300V 24G 的 soc_version 不是固定的如果Ascend310P3报错说 SOC 版本不支持可以先用npu-smi info确认芯片型号再查官方支持的 soc_version 列表。--precision_modeallow_fp32_to_fp16允许把 FP32 计算转为 FP16利用昇腾芯片的 FP16 加速能力。--input_fp16_nodesimages指定输入的图像数据也用 FP16 传输减少内存占用。--output_typeFP32模型输出保留 FP32因为后续后处理里 NMS 通常需要较高精度。转换成功后目录里会生成yolov8s_atlas.om文件。看到这个文件生成就意味着模型已经成功编译成昇腾芯片可执行的指令集可以进入推理环节。提示如果 ATC 转换报算子不支持第一时间不要急着换模型先把 ONNX 模型用 onnx-simplifier 精简一遍再检查是否存在昇腾不支持的算子比如某些自定义 op。很多问题都是 ONNX 图里的一些冗余节点引起的精简完基本能解决。3.3 后处理最难的部分不是推理而是“解码”YOLOv8 模型原始输出的是一堆特征图并不是直接的检测框坐标。要从特征图里得到最终的类别、置信度、坐标必须做后处理解析三个检测头的输出得到预测框的 x、y、w、h 和分类分数。用 sigmoid 将分数归一化到 0~1。做 NMS非极大值抑制过滤重复框。Atlas 300V 24G 只负责把 YOLO 前向推理算完后处理的解码和 NMS 要么在主机 CPU 上用 NumPy / OpenCV 实现要么用昇腾的融合算子实现。我第一版直接在 Python 里用 NumPy 写的解码和 NMS代码大概长这样def postprocess(outputs, conf_thres0.25, iou_thres0.45): # outputs shape: (1, 84, 8400) 或类似 # 先转置为 (8400, 84) preds outputs[0].transpose((0, 2, 1)) boxes, scores [], [] for pred in preds[0]: class_scores pred[4:] max_score class_scores.max() if max_score conf_thres: cls_id int(class_scores.argmax()) cx, cy, w, h pred[0], pred[1], pred[2], pred[3] # 转成 x1, y1, x2, y2 x1 cx - w / 2 y1 cy - h / 2 x2 cx w / 2 y2 cy h / 2 boxes.append([x1, y1, x2, y2]) scores.append(max_score) # 调用 cv2.dnn.NMSBoxes 做 NMS indices cv2.dnn.NMSBoxes(boxes, scores, conf_thres, iou_thres) return [boxes[i] for i in indices]这个流程在 CPU 上跑单帧 640x640 的速度大约几毫秒到十几毫秒对于实时性要求不高的场景完全够用。但如果要做高吞吐的多路视频流建议把 NMS 这一步用多线程并行处理或者直接用 MindX SDK 里已经优化好的后处理插件。4. 基于 Atlas 300V 24G 的推理代码实现4.1 AscendCL 推理基础流程下面是一段最小可用的 AscendCL 推理 Python 代码骨架我把每一步的注释都写明白了import acl def run_inference(om_path, input_data): # 初始化 acl.init() ret acl.rt.set_device(0) # 加载模型 model_id acl.mdl.load_from_file(om_path) # 创建模型描述句柄获取输入输出尺寸 model_desc acl.mdl.create_desc() acl.mdl.get_desc(model_desc, model_id) input_size acl.mdl.get_input_size_by_index(model_desc, 0) output_size acl.mdl.get_output_size_by_index(model_desc, 0) # 申请设备侧内存 ret, dev_input acl.rt.malloc(input_size, 2) ret, dev_output acl.rt.malloc(output_size, 2) # 数据从主机复制到设备 # 注意 input_data 必须是连续内存且 shape 和 dtype 要和模型输入一致 ret acl.rt.memcpy(dev_input, input_size, input_data.ctypes.data, input_size, 2) # 2 表示 H2D # 执行推理 ret acl.mdl.execute(model_id, [dev_input], [input_size], [dev_output], [output_size]) # 把结果从设备复制回主机 output_data np.zeros(output_size, dtypenp.uint8) ret acl.rt.memcpy(output_data.ctypes.data, output_size, dev_output, output_size, 4) # 4 表示 D2H # 释放资源 acl.rt.free(dev_input) acl.rt.free(dev_output) acl.mdl.unload(model_id) acl.finalize() return output_data这段代码是“能跑版”真正工程化时还有几个必须优化的点acl.rt.set_device只调用一次不要放进循环里。模型加载一次后续多帧输入复用同一个 model_id。输入输出 buffer 也可以复用避免反复 malloc/free 带来的性能损耗。4.2 图像预处理与原理解读深度学习中图像预处理的一致性直接决定推理正确性。YOLOv8 在训练时输入图像会先做 letterbox 缩放也就是保持宽高比使用灰色填充空白区域把图片变成 640x640然后再除以 255 归一化并转成 RGB 排列的连续数组。我在写代码时吃过亏模型输出全是乱框检不到任何目标。排查半天发现是 Colab 测试环境里加载图片是 BGR 顺序的而模型训练用的是 RGB。这种“肉眼看起来差不多但结果差十万八千里”的问题在昇腾平台上非常常见。下面是我最终的预处理函数def preprocess(img, size640): # img: OpenCV BGR image h, w img.shape[:2] r min(size / h, size / w) nh, nw int(h * r), int(w * r) resized cv2.resize(img, (nw, nh)) canvas np.full((size, size, 3), 114, dtypenp.uint8) top, left (size - nh) // 2, (size - nw) // 2 canvas[top:top nh, left:left nw] resized # BGR - RGB, HWC - CHW, 归一化 rgb cv2.cvtColor(canvas, cv2.COLOR_BGR2RGB) rgb rgb.transpose(2, 0, 1) rgb rgb.astype(np.float32) / 255.0 return rgb, r, top, left注意最后返回了r、top、left三个值。后处理得到的检测框坐标是缩放在 640x640 画布上的必须将它们映射回原始图像坐标否则画框就会错位。映射公式是orig_x (x - left) / r orig_y (y - top) / r我用一个简单例子验证正确性。假设原图 1280x720letterbox 后实际缩放比例是 640/720 0.8889画布顶部填充约 266 像素那么原图上的某个点就必须按上面的公式反算回去才准。这个逻辑用代码两行就写完但调试的时候一旦漏掉就会以为模型有问题。4.3 异步推理与多路视频流优化单纯用上面的单线程推理跑单路视频流性能还算过得去但一旦要处理 4 路甚至 8 路视频流就必须引入异步推理机制。AscendCL 支持通过 stream流来实现异步执行stream acl.rt.create_stream() # 线程1不停地向 stream 提交推理任务 for frame in frames: copy_to_device(frame) acl.mdl.execute_async(model_id, input_list, output_list, stream) # 线程2同步等待并取结果 acl.rt.synchronize_stream(stream)更进一步的做法是“生产者-消费者”模型生产者线程负责从视频流读取帧、做预处理、拷贝到设备侧消费者线程负责从设备侧拿推理结果、做后处理、输出检测框。通过队列把两边解耦N 路视频流可以共用一个硬件推理队列别人看到的效果就是单张卡同时处理 N 路 1080p 视频流。我实测下来24GB 显存在多路并发时优势非常明显。之前 16GB 显存的卡最多开 4 路 YOLOv5s 的推理进程就快到顶了换成 Atlas 300V 24G 后开到 8 路显存占用率还不到一半。如果你有类似“单卡多模型”“多路视频流”的需求24G 绝对不亏。5. INT8 量化把显存和算力用到极致5.1 为什么做 INT8 量化Atlas 300V 24G 芯片内部针对 INT8 计算有专门的加速单元INT8 的计算吞吐通常是 FP16 的 2 倍以上。如果模型精度要求不是极其苛刻比如检测 IoU 在 0.5 和 0.75 之间INT8 量化是提升推理性能最直接的手段。昇腾平台量化工具是 AMCTAscend Model Compression Toolkit。基本流程准备一组校准图片通常几百张尽量覆盖目标场景。在模型转换阶段使用量化配置对每一层计算缩放因子。生成量化后的.om模型。5.2 量化实操要点AMCT 的使用方式一般是提供一个 Python 接口在原始 ONNX 模型上做 calibrationfrom amct_onnx import calibrate_onnx_model calibrate_onnx_model( modelyolov8s.onnx, calibration_datasetcalib_data, save_path./quantized_model )校准完成后会得到量化后的模型再通过 ATC 转成.om即可。校准集的数量不是越多越好太多反而增加校准时间一般几百张样本足够但校准集的数据分布一定要尽量贴真实业务场景如果检测的是行人结果拿一堆猫狗图去量化效果会差很多。提醒量化前先跑通 FP16 的模型确认结果没问题后再动 INT8。否则一旦量化后检测效果变差你会分不清是量化损失还是前面步骤本身就有 bug。5.3 精度下降排查方向如果发现 INT8 量化后检测精度明显下降优先检查两点预处理是否和校准时的预处理完全一致特别是归一化方式。模型的输出层是否也被量化了。通常建议保留最后几层为高精度浮点计算避免输出概率分布被压扁。可以通过设置“量化忽略层”的方式让输出层保持 FP16。我实际项目里 YOLOv8s 在 INT8 量化后 mAP0.5 的损失在 1% 左右肉眼几乎看不出差别但吞吐量翻了接近一倍。对于实时检测来说这个性价比相当高。6. 常见问题与排查技巧实录6.1 ATC 转换报错算子不支持最典型的错误日志里会出现类似E13002 op type: xxx not support或find kernel for op的报错。解决办法按优先级排序升级 CANN 版本昇腾算子的覆盖面每代都在扩充新版本往往能直接支持旧版本不支持的算子。简化 ONNX 图用 onnx-simplifier 走一遍。改模型结构如果模型里有比较冷门的自定义算子比如某个新提出的 attention 模块考虑把它替换成昇腾支持的等价实现。6.2 推理结果输出全为 0 或全是噪声这种问题十有八九出在输入数据上。先检查三样东西输入数据是否归一化到 0~1、通道顺序是 RGB 还是 BGR、数据形状是不是 NCHW。我建议在推理前把送入模型的输入数据用 NumPy 存成.npy文件然后用 onnxruntime 在 CPU 上跑一遍输出结果对比一下。两边都一致就能确认问题不是出在昇腾这边而是出在数据环节。6.3 检测框坐标偏差检测框能检出来但位置不对通常是因为后处理时没有处理 letterbox 的缩放比例和填充偏移。回到 3.3 里那个映射公式好好排查r、top、left三个变量有没有传对。6.4 npu-smi 看不到设备或设备离线重新安装正确版本的驱动和固件注意安装顺序。检查操作系统内核版本是否在支持列表。查看dmesg | grep -i npu是否有报错。确认 PCIe 插槽供电正常部分主板需要调整 BIOS 里 PCIe 插槽的供电模式。常见问题速查表现象可能原因解决思路npu-smi 无设备驱动/固件版本不匹配重装匹配版本ATC 算子报错ONNX 中存在不支持算子精简图、升级 CANN、替换算子推理结果全 0输入未归一化/通道错误检查预处理和 ONNX Runtime 对比检测框偏移letterbox 逆向映射缺失补上 r、top、left 映射多路并发显存不足batch 配置过大调小 batch 或减少并发路数7. 实操总结与个人心得这次在 Atlas 300V 24G 上部署 YOLO整体从摸清硬件到跑通单路推理花了大半天时间真正棘手的是模型转换和后处理而不是硬件本身。昇腾平台没有 NVIDIA 那么完备的社区资源很多问题要靠查官方文档、看日志、试参数慢慢磨但只要把第一套跑通了后续叠加新模型、做多路并发都是水到渠成的事。我觉得有几个经验很值得记住不要在硬件识别都还没搞定的时候就急着调模型ATC 转换前一定要先精简 ONNX 图任何推理结果异常都要先怀疑输入预处理而不是模型。还有可以先从官方示例入手哪怕你根本不用示例模型跑一遍也能确认整个链路是不是通的。等环境确认没问题了再换上自己的 YOLO 模型这样排错时思路会清楚很多。最后说一句掏心窝的话Atlas 300V 24G 是一张有能力、有性价比的推理卡但它的软件生态确实还需要更多人去踩坑、去填资料。如果你正在用它跑 YOLO遇到什么奇怪的报错可以顺着我这篇的思路排查一遍——大概率能帮你省下半天查文档的时间。
02
RELATED NEWS

相关资讯

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

03
WHY YAOTU

想打造同款高转化官网?

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

◈

场景化定制

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

◐

营销型架构

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

▲

全周期服务

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

免费获取你的建站方案

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