尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Atlas 300V 24G推理卡部署YOLOv8全流程详解

Atlas 300V 24G推理卡部署YOLOv8全流程详解 这年头做AI落地最烦的不是模型精度上不去而是模型训完了、精度也达标了最后卡在“部署”这道坎上。如果你跟我一样需要在一个没有GPU、或者GPU资源极其紧张的环境里上YOLO推理服务那你大概率听说过Atlas系列。但很多人跟我最初一样心里有个问号Atlas 300V 24G到底是块什么卡真能跑YOLO吗它跟GPU比到底行不行我前阵子正好把一个YOLOv8检测项目从GPU迁移到Atlas 300V 24G上从半信半疑到全量上线中间踩了不少坑也把关键流程捋顺了。这篇主要就是聊聊这块卡的定位以及完整的部署实操过程给准备入坑或者正在纠结拿Atlas干什么用的朋友一个参考。我会把平时文档里写不明白的、论坛里搜不到的东西尽量说透。1. Atlas 300V 24G到底是什么卡先说结论Atlas 300V 24G就是一块运算加速卡而且是专门干推理活的加速卡。但这里有个很容易混淆的点它跟训练卡的玩法完全不一样用错思路体验就是天上地下。1.1 推理卡和训练卡的区别很多第一次接触Atlas的人会用惯性思维去理解这卡能跑模型那我不如直接拿它训练答案是不太合适。训练卡更看重算力的通用性和大量矩阵运算的吞吐而推理卡更看重单次前向计算的低延迟、高并发和低能耗。Atlas 300V 24G定位是AI推理加速卡不是训练卡。它内部集成的算力核心为AI Core通过专用的硬件加速单元完成算子执行。它的优势在特定网络结构下能比GPU用更低的功耗跑出同样的推理吞吐。但你在上面跑训练流程各种反向传播算子支持度不行能把你气死。我打个比方训练用的GPU是五金店什么工具都有你想造什么模型都行而推理卡更像是流水线机床你只要把零件规格定好它就给你快速批量加工但你要在机床上手工雕花那是使不上劲的。1.2 Atlas 300V 24G核心参数怎么理解关于Atlas 300V 24G名字里的300V是系列型号24G指的是板载24GB内存这个内存不是普通显存而是给神经网络计算专用的存储空间。很多人在论坛问“24G是不是运算加速卡”参数如下看完就清晰了参数项数值个人解读形态PCIe 4.0半高半长卡普通服务器插上就能用不需要专用机箱AI算力INT8约140 TOPS这是推理场景最常用的精度指标内存24GB LPDDR4X容量不小能塞下较大的模型内存带宽204.8GB/s中规中矩但配合特定优化够用功耗典型75W左右风冷无压力不需要液冷接口PCIe 4.0 x16带宽足够大减少数据传输瓶颈这张卡最大的特点是半高半长普通2U服务器里能塞多张。我在一个4U的推理服务器里塞了4张跑多路视频流检测性价比很能打。1.3 一张卡在真实场景里能干多少活有人拿它和RTX 4090比性能我觉得没多大意义。用Atlas 300V 24G核心场景就是高并发推理典型应用是视频流分析、工业质检、园区安防、OCR识别这种需要7x24小时跑的稳活。我这边的实际场景是16路1080P视频流并发每路每秒做一次全画面YOLOv8检测模型输入640x640。之前用单张RTX 2080 TiGPU占用率长期90%以上加个新任务就告警。换成一张Atlas 300V 24G之后算力利用率大概在60%左右延迟没明显增加整个过程功耗还降了接近一半。这就是它典型的价值取向专事专办。还有一点很多人关心Atlas 300V 24G是昇腾系列里的推理卡配套的软件栈是CANN而现在主流的模型训练框架是PyTorch所以部署路径是“训练框架 - 通用模型格式 - 昇腾专属格式”。这个转换过程也是本文的重点。2. 部署YOLO前的环境准备Atlas卡部署YOLO不像GPU那样pip install一下就能跑。它需要专门的驱动、固件和CANN工具包。这块搞不定后面寸步难行。我建议你耐心看完再动手否则容易在第一步就卡个一两天。2.1 CANN工具链的作用和版本选择CANNCompute Architecture for Neural Networks是整个昇腾AI计算的软件底座相当于GPU那套环境里的CUDA加cuDNN的合体。没有它模型根本没法在NPU上跑。版本选择上CANN现在多个版本并存8.0之后叫CANN 8.0.RC1之类的。关键点在于必须是驱动、固件、CANN包三位一体版本能对应上。这个最坑驱动是驱动、固件是固件、工具包是工具包三者版本不匹配就各种奇奇怪怪的报错。我的建议是直接去Ascend社区或者华为昇腾官网找对应型号的驱动和固件配套包下载Center的SDK包尽量用一整套配套。比如我用的就是CANN 8.0.RC1加配套驱动版本运行一段时间稳定没有升级的冲动。2.2 宿主机环境要求Atlas 300V 24G对宿主机要求不算苛刻但几个基本条件不能省操作系统Ubuntu 20.04/22.04 x86_64 服务器版最好桌面版也行内核版本建议对应昇腾文档里方的支持列表太新的内核有兼容性问题内存建议不低于32GB因为推理过程中除了模型本身数据预处理也要占资源PCIe形态需要PCIe 4.0 x16的插槽x8也能用但传输带宽打八折如果用的是国产CPU加国产OS如麒麟、欧拉也没问题CANN适配过。我这里开发机是OpenEuler 22.03生产机是Ubuntu 20.04都跑通了。2.3 驱动固件安装的正确姿势安装驱动和固件网上文档写得又长又啰嗦我这里直接给操作顺序# 查看系统架构 uname -m # x86_64则安装x86_64版本的包aarch64则用对应的 # 安装依赖 sudo apt-get install -y gcc g make cmake zlib1g zlib1g-dev openssl libsqlite3-dev libssl-dev libffi-dev unzip pciutils net-tools libblas-dev gfortran libblas3 # 进入驱动包目录执行安装命令Ascend-hdk-xxx.run文件就是驱动加固件合集 sudo ./Ascend-hdk-310p-npu-driver_24.0.0_linux-x86_64.run --full --install-for-all # 安装完成查看是否识别 npu-smi info这里有个观察点驱动装完以后npu-smi info能列出卡的信息名字应该显示类似Atlas 300V Pro之类的型号配合显存显示24576MiB到这里硬件层面就通了。之后安装CANN工具包# 这个是纯软件工具包解压后执行安装脚本 ./Ascend-cann-toolkit_8.0.RC1_linux-x86_64.run --install # 安装完记得source环境变量 source /usr/local/Ascend/ascend-toolkit/set_env.sh这个环境变量每次新终端都要source不然找不到atc命令。要在生产环境长期用建议写进~/.bashrc或/etc/profile里。3. 把YOLO模型搬上Atlas完整流程环境就绪之后就是整个部署流程里的核心环节模型转换和推理代码编写。这部分我踩过的坑最多也最值得展开说。3.1 模型转换之前的认知准备模型要从PyTorch转到昇腾NPU上跑中间文件格式需要先明白。昇腾芯片不直接执行PyTorch模型它执行的是一种叫OMOffline Model的离线模型格式。OM文件在开发环境通过ATC工具生成运行时直接加载不需要再依赖原始模型框架。所以流程就是PyTorch权重 - ONNX模型 - OM模型这里很多新手会卡在第一步到第二步之间的各种算子上因为ONNX是静态图PyTorch是动态图两者之间的表达不完全等价。3.2 从PyTorch到ONNX的导出如果是YOLOv5或YOLOv8官方教程都提供了导出ONNX的办法。我直接说几个关键操作要点import torch from ultralytics import YOLO # 加载模型 model YOLO(yolov8n.pt) # 导出为ONNX这里的参数极其关键 model.export(formatonnx, opset11, imgsz640)这里容易踩哪些坑第一opset版本。昇腾ATC对高版本opset算子支持度未必完整。我实测opset 11兼容性最好opset 13以上容易遇上某些算子不被支持。第二动态分辨率。如果你在export时不指定dynamicTrue导出的模型只有640x640这一个输入尺寸。Atlas推理卡从性能角度更倾向于固定尺寸固定形状的模型能提前做好图优化推理效率高。第三模型后处理不要放进去。我见过有人把NMS非极大值抑制直接写进模型里导出的ONNX又大又难转。正确做法是ONNX模型只保留卷积层和基础算子检测结果的后处理、NMS放在外部代码里用CPU做。这样做的好处是模型简单易转后处理灵活可调还能利用多核CPU并行。导出后可以先验证一下ONNX模型是否正常。import onnx model onnx.load(yolov8n.onnx) onnx.checker.check_model(model) print(ONNX模型检查通过)3.3 ATC转换实操拿到ONNX模型下一步就是用ATC工具转成OM模型。ATC是Atlas Training Conversion的缩写属于CANN的工具链里最常用也最需要经验的组件。先看一眼基本命令atc --modelyolov8n.onnx \ --framework5 \ --outputyolov8n \ --soc_versionAscend310P3 \ --input_shapeimages:1,3,640,640 \ --insert_op_confaipp.cfg \ --output_typeFP16 \ --input_formatNCHW这里面每个参数都值得单独解释--framework5表示输入格式是ONNX。框架编号对应关系是1为Caffe2为MindSpore3为TensorFlow5为ONNX这个别搞混。--soc_versionAscend310P3这个是关键中的关键。Atlas 300V 24G内部芯片版本是Ascend 310P但310P下面还有细分型号310P1、310P2、310P3。选错版本转出来的OM格式不对要么加载失败要么跑起来后性能很差。怎么确认用哪个版本可以在安装了驱动之后执行npu-smi info来看详细型号也可以通过CANN工具自带的查询命令npu-smi info -t board看到芯片名称是310P3就填Ascend310P3。注意P和3之间没有空格别道听途说填成Ascend310。--input_shapeimages:1,3,640,640这里定义模型的输入张量形状。重点在于这个1是batch size。固定batch size能最大程度做静态图优化但部署灵活性会低一些。如果你需要动态batch可以在ATC命令中用--dynamic_batch_size1,2,4,8来支持多档位batch不过性能会打折。--insert_op_confaipp.cfg这个文件用来配置AI PreProcessing模式意思就是图片缩放、减均值、归一化这些操作可以直接下沉到NPU里做省掉CPU预处理和H2D传输的时间。我的配置一般是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 min_quant: 0.0 max_quant: 255.0 }这个配置是说把输入图片转成RGB 8位无符号格式并且缩放归一化到0-255的范围。做完这个配置推理代码里就不需要再额外做resize和归一化了。这个细节能省不少事推荐新手直接用。--output_typeFP16这个非常关键。NPU对FP16的加速效率远高于FP32所以默认情况下把模型转成FP16精度运行。这时候需要了解你的模型对精度损失的容忍度。YOLO检测框输出用FP16完全没问题但有的时候某些OCR模型对精度非常敏感就需要额外做精度对比。3.4 推理代码怎么写模型转换完成拿到yolov8n.om文件后到了编写推理代码环节。这里有个选择用Python还是C如果你追求极致的推理延迟和更少的内存拷贝建议用C如果只是快速验证或者业务逻辑以Python为主就用Python。Python接口其实还挺好用的用acllite或pyACL都可以。这里演示一下pyACL的完整推理流程import acl import numpy as np import cv2 # 初始化 acl.init() ret acl.rt.set_device(0) context, ret acl.rt.create_context(0) # 加载模型 model_id, ret acl.mdl.load_from_file(yolov8n.om) # 获取模型输入输出信息 desc acl.mdl.create_desc() ret acl.mdl.get_desc(desc, model_id) input_size acl.mdl.get_input_size_by_index(desc, 0) output_size acl.mdl.get_output_size_by_index(desc, 0) # 申请输入输出内存这个内存是设备侧内存必须用acl.rt.malloc input_data, ret acl.rt.malloc(input_size, 2) output_data, ret acl.rt.malloc(output_size, 2) # 创建数据缓存对象 dataset_input acl.mdl.create_dataset() dataset_output acl.mdl.create_dataset() buffer_input acl.create_data_buffer(input_data, input_size) buffer_output acl.create_data_buffer(output_data, output_size) acl.mdl.add_dataset_buffer(dataset_input, buffer_input) acl.mdl.add_dataset_buffer(dataset_output, buffer_output) # 读取图片并做预处理如果用了AIPP这里只需要做resize img cv2.imread(test.jpg) img cv2.resize(img, (640, 640)) img_rgb cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img_np img_rgb.astype(np.uint8) img_np np.expand_dims(img_np, axis0).copy() # 将输入数据拷贝到设备内存 acl.rt.memcpy(input_data, input_size, img_np.tobytes(), input_size, acl.memcpy_kind.acl_rt_memcpy_host_to_device) # 执行推理 ret acl.mdl.execute(model_id, dataset_input, dataset_output) # 获取输出数据拷回主机侧 output_np np.zeros(output_size, dtypenp.uint8) acl.rt.memcpy(output_np.tobytes(), output_size, output_data, output_size, acl.memcpy_kind.acl_rt_memcpy_device_to_host) # 后处理解析检测框 # 这里需要根据YOLO的输出格式写对应的解析逻辑这段代码的思路很清晰初始化ACL环境、加载模型、申请内存、预处理、执行推理、取回结果。但要注意的点来了ACL的接口是C语言的Python包装可能封装得不好用起来比PyTorch麻烦很多。以我经验如果业务系统已经用FastAPI之类的Python框架那就用Python接口如果是嵌入式C开发直接用C接口跑通后集成。4. 踩坑实录与性能调优环境搭好、模型转好、代码能跑这只能算“跑通”。真正到了生产环境各种问题才浮出水面。这一节我把自己实际遇到的和身边朋友踩过的关键坑做个整理省得你重复走老路。4.1 常见报错速查表以下表格是我和几个用过Atlas 300V的同行交流出的经验汇总按出现频率排序报错信息原因解决方案60013或70001驱动未装好或权限不对检查npu-smi info是否正常确认用户加入了HwHiAiUser用户组EZ9999: Inner Error模型转换或加载时算子不支持检查ONNX模型结构定位不支持算子替换或拆算子ACL_ERROR_RT_PARAM_INVALID代码里入参类型错误检查acl.mdl.get_desc传参确认desc句柄有效内存不足输出缓存大小定义不对在代码里打印实际output_size重设缓存推理速度极慢只有几FPSsoc_version选错或batch_size1确认soc版本尽可能升高batch大小模型加载失败文件格式错误OM文件和芯片架构不匹配重新用正确的soc_version做ATC转换这里我想强调一个最容易被忽略的ACL接口的返回值。很多时候代码没报错但推理结果是错的就是因为返回值没检查。我写ACL代码的习惯是一个函数一个返回值检查宁可多几行代码也比线上跑出错误结果要强。4.2 Batch Size和动态形状的取舍Atlas 300V 24G这类推理卡最擅长的就是批量推理。同一张图片尺寸下batch size越高单张处理的平均耗时越低。举个例子我用YOLOv8n做测试batch size为1时单帧耗时约8msbatch size为8时单帧平均耗时降到4.5ms左右吞吐翻倍。但是这里别高兴太早batch size越大延迟越高因为要等凑够一整个batch才处理。如果你的业务是单路实时视频流用batch1保证低延迟就行如果你的业务是多路视频流优先用batch4到8把多路请求合起来推理整体吞吐更高。动态形状方面Atlas 300V支持--dynamic_image_size但性能上会有明显下降。原因很直接固定尺寸时NPU可以把内存规划做到极致动态形状必须留buffer余量还做不了太多静态优化。所以能固定就固定实在要变就设两三个档位。4.3 实测性能数据与优化建议用一张Atlas 300V 24G跑YOLOv8s输入分辨率640x640FP16推理NMS在CPU侧做我实测一组数据模型batch size单帧延迟吞吐量YOLOv8n17.8ms128 FPSYOLOv8n410.2ms392 FPSYOLOv8s114.6ms68 FPSYOLOv8s419.5ms205 FPSYOLOv8m128.3ms35 FPSYOLOv8m437.2ms107 FPS这个数据有一次让我意识到通过合理调度batch整体吞吐比单batch翻了3倍。这也指出了一个设计方向如果业务侧并发压力大一定要在上层做动态batch的调度队列把多条请求攒到一起凑够了4个或8个再丢给NPU推理。另一个性能优化点是图像预处理。我之前有个版本用Python的Pillow做resize和归一化CPU占用率高不说还增加了数据传输时间。后来我把预处理写成C扩展再配合AIPP把归一化下沉到NPU整体端到端延迟从18ms降到了10ms以内。优化幅度几乎接近一倍而这些改进完全不动模型结构。CANN还提供了一个叫AIMeta的组件专门做数据预处理和模型推理的流水线编排。如果处理比较复杂、有多个模型串联用AIMeta编排比手动管理ACL舒服很多但学习成本也随之上升。4.4 多卡调度与高并发场景的部署策略Atlas 300V 24G单卡在多数场景够用但总有一些项目需要更大吞吐。这种情况下能在同一台服务器里插多张Atlas卡通过环境变量指定使用哪张卡export ASCEND_RT_VISIBLE_DEVICES0类似CUDA的CUDA_VISIBLE_DEVICES把不同业务进程绑定到不同卡上互相不干扰。这里有个细节渲染之道是两张卡直通不同的PCIe控制器避免共享PCIe带宽。插卡时优先选择服务器上不同PCIe Root Complex的槽位否则多卡同时跑满PCIe带宽可能成为瓶颈。多卡并行推理时我建议每张卡单独起一个推理进程而不是单进程绑多卡。原因是ACL的context管理在多设备下比较复杂数据流可能需要跨卡拷贝性能损耗反而上去了。每张卡一个进程负载均衡用Redis或MQ做任务分发简单有效还方便横向扩容。5. 关于“Atlas 300V 24G是不是运算加速卡”的终极结论回到标题热搜词那个问题Atlas 300V 24G当然是运算加速卡但它的“运算”更聚焦在推理这个环节定位是AI推理卡。说它是加速卡因为它确实能对模型前向计算做硬加速让YOLO这类检测任务在低功耗下跑出高吞吐。但它不是万能的通用计算卡别指望它像GPU跑CUDA一样做各种通用并行计算。从我的经验来说这个卡适合以下场景的判断标准一是模型已经训练好需要稳定的推理服务。二是推理并发量有几十路到几百路但不需要单路极致低延迟低于2ms。三是机房用电和散热有限塞不了太多GPU。四是现有服务里CPU推理已经卡脖子GPU又预算超标。这几个条件只要中两个Atlas 300V 24G就比较划算。一块卡几千块到一万出头看渠道比几万块的GPU卡便宜不少又是标准PCIe插槽运维成本低。反过来如果你的业务是超大Batch的训练、或者需要极低延迟的A/B实验比如几毫秒内响应那这张卡不太合适老老实实用GPU更省心。我这次把YOLOv8从GPU迁移到Atlas 300V 24G整体时间是三天左右。第一天搭环境和转换模型第二天调通推理代码第三天做性能和并发优化。如果照着这篇走你大概率一天就能跑起来剩下时间用来调性能。最后分享一个我个人的操作体会Atlas这套东西最坑的地方不是卡本身而是软件栈的碎片化和版本匹配问题。所以不管看什么教程第一步永远是确认驱动、固件、CANN三者的版本配套关系人家文档写“推荐配套”就别自作主张乱升级。另外模型转换的时候宁可多花几分钟看看ATC日志里的警告信息很多坑就是被警告提前暴露出来的等它变成报错再排查耗时翻倍。
返回列表