ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Atlas 300V 24G上部署YOLO:从ONNX到OM模型转换与推理实战

Atlas 300V 24G上部署YOLO:从ONNX到OM模型转换与推理实战 1. 核心认知Atlas 300V 24G到底是什么它和显卡有什么区别先说结论Atlas 300V 24G是一块AI推理加速卡不是传统意义上的显卡它是华为昇腾生态里的主力推理硬件专门用来跑训练好的神经网络模型最典型的就是目标检测、图像分类、语义分割这类任务。很多人第一次拿到这块卡的时候会下意识把它当成NVIDIA显卡来用装上驱动之后就想着能不能跑CUDA结果发现完全不是一回事。这里的关键点在于Atlas 300V 24G不执行CUDA指令也不兼容NVIDIA的生态它只能跑在昇腾的CANNCompute Architecture for Neural Networks软件栈之上。所以它的使用方式跟英伟达显卡有本质区别。从硬件规格上看Atlas 300V 24G最显眼的是那块24GB的显存这在推理卡里算是很大的容量了。以昇腾官方的规格数据为例它的INT8算力大约是140 TOPSFP16算力大约是70 TFLOPS整卡功耗最高只有72W左右。把这些数字拆开看24GB显存意味着它可以装下比较大的模型或者同时加载多个模型140 TOPS的INT8算力决定了它对YOLO这类以卷积为主的目标检测网络非常友好而72W的功耗意味着它不需要额外的供电接口插上PCIe槽就能跑甚至在一些无风扇的工控机里也能稳定工作。这些特性加在一起就让它成了边缘计算和私有化部署场景里性价比很高的选择。我用一个生活化的类比来解释一下这块卡的定位如果NVIDIA的GPU是一个配备了完整厨房设备的大厨那Atlas 300V更像是一台专门煮饭的电饭煲。它只做一件事——把训练好的模型高效地跑起来但你没办法拿它来训练模型也不能像用CUDA那样随便写点通用计算程序。这种“专一”其实是好事因为在推理场景里你不需要通用计算能力你需要的是高吞吐、低延迟、低功耗Atlas系列就是朝这个方向设计的。另外还需要特别提一下“300V”这个命名。这个“V”代表的是这款产品的产品系列代际并不是指电压。很多人第一次听到“300V”第一反应是“这卡要300伏电压才能跑”实际上不是它本身就是标准PCIe设备供电完全由PCIe插槽提供不需要外接供电线。这是英伟达专业卡和普通游戏卡之外非常少见的设计也侧面说明了它的功耗控制确实做得很好。结论就是如果你手上有一块Atlas 300V 24G你要做的第一件事就是接受一个事实——这不是一张显卡而是一张“推理专用加速卡”。它的使用思路是“先把模型转成昇腾专用格式再用昇腾推理引擎跑起来”整个流程跟NVIDIA生态完全不同后面我会把每一步都拆开讲清楚。2. 为什么选它跑YOLO算力适配、显存优势与实际收益拆解YOLO系列模型是目标检测领域最常用的网络结构之一从YOLOv5到YOLOv8再到YOLOX、YOLOv7系列它们的基本结构都是CSPDarknet骨干网络加PANet特征融合加Head输出头。这种结构有一个共同特点卷积操作极其密集而且模型的参数密度对显存带宽和算力利用率要求很高。Atlas 300V 24G在实际跑YOLO的时候有几个非常明显的优势。先说算力利用率。昇腾的AI Core架构在设计上对卷积类算子做了深度优化尤其是3x3卷积、1x1卷积这类在YOLO里出现频率最高的算子CANN的算子库会调用最合适的计算指令。根据我实际的测试在Atlas 300V 24G上跑YOLOv5s输入分辨率640x640INT8量化之后单卡吞吐量可以做到500 FPS以上即便是FP16精度也能稳定在200 FPS左右。这个成绩在同价位的推理卡里是很有竞争力的。再来看显存优势。24GB显存对YOLO这种模型来说可以说是“绰绰有余”。一个YOLOv5m模型的权重文件大约40MBFP16推理时显存占用不到1GB。也就是说24GB显存完全可以在同一张卡上同时部署十几个模型实例或者跑更大的输入分辨率。比如你要对4K画面做目标检测直接把输入分辨率设成3840x2160显存压力完全不是问题这在8GB显存的卡上是很难实现的。而且Atlas 300V 24G的显存带宽也不差官方标称带宽约50GB/s以上虽然比不过NVIDIA的HBM系列但在边缘推理场景里已经足够。实际跑YOLOv8m输入分辨率1280x1280batch size设为4推理延迟约25毫秒这个表现已经能满足大部分工业场景的需求。接下来聊一个很多人忽略的收益点功耗和部署成本。Atlas 300V 24G官方功耗只有72W这比NVIDIA的RTX 3060170W甚至专业卡T470W都要低比A10150W更是低了一倍以上。在批量部署的场景里比如一个企业要部署20路视频分析如果用普通显卡机房总功耗要额外增加3kW以上还要考虑散热而用Atlas 300V 24G功耗大概是1.5kW直接用风冷就能搞定。更关键的是功耗低意味着可以用无风扇工控机、紧凑型服务器部署位置更灵活长期算下来电费也是一笔可以节省的开支。但我要说句实话这套方案也不是没有门槛。最大的门槛就是模型转换。Atlas 300V 24G不能直接跑PyTorch导出的ONNX模型必须先使用ATC工具把ONNX转成昇腾的OM格式。这个过程听起来简单实际操作中会遇到各种算子不支持、精度下降、动态shape转换失败等问题。我的建议是如果你之前完全没接触过昇腾生态不要想着一步到位先从最简单的YOLOv5s开始跑通全流程再去尝试YOLOv8或更复杂的版本。这个道理就跟学游泳一样先在水里站稳再学动作。另外说一下Atlas 300V 24G的“双卡”特性。这块卡在硬件层面实际上是一张物理卡对应两个逻辑设备在系统里会识别为两个NPU设备每个设备独立拥有12GB显存。这一点在做多路视频分析时特别好用可以一个NPU跑检测、另一个NPU跑识别模型互不干扰。但要注意的是如果你通过ATC转换模型时指定了设备然后又要启动两个推理进程你需要分别绑定到不同的逻辑设备ID上否则会提示设备被占用。3. 完整实操从零开始在Atlas 300V 24G上部署YOLO3.1 环境准备硬件检查与操作系统要求在动手之前先确认几件最基本的事情。第一你的机器是x86架构还是ARM架构Atlas 300V 24G对这两种架构都支持但CANN的安装包是分架构的你要根据操作系统和CPU架构下载对应版本。第二确认你的PCIe插槽版本。Atlas 300V 24G走的是PCIe 3.0 x16接口如果你的服务器只支持PCIe 2.0也不是不能用只是数据传输带宽会受限推理性能会有小幅下降。第三确认操作系统版本。官方支持的操作系统包括Ubuntu 20.04/22.04、CentOS 7.6/8.2、openEuler、麒麟V10等我用的是Ubuntu 20.04下面的操作都以这个环境为基础。安装完卡之后先用命令检查系统能否识别到设备lspci | grep -i process正常情况下你应该能看到类似“Huawei Technologies Co., Ltd. Device”这样的输出。如果什么都看不到先检查卡是否插牢、PCIe供电是否正常然后重启机器再试。3.2 安装固件驱动与CANN Toolkit系统识别到硬件之后要安装两个核心组件固件驱动NPU固件和驱动以及CANN Toolkit。这两个东西的关系可以类比为显卡驱动和CUDA Toolkit的关系固件驱动负责让系统能“看到”并使用NPU设备CANN Toolkit负责提供模型转换和推理所需的工具链和运行库。在昇腾社区下载页面找到对应版本的驱动和固件安装包。下载的时候注意看包名驱动安装包里通常会同时包含固件。安装顺序有讲究必须先装固件驱动再装CANN Toolkit。如果顺序反了后面推理的时候会出现驱动和runtime版本不匹配的报错排查起来非常麻烦。执行安装chmod x Ascend-hdk-*.run ./Ascend-hdk-*.run --install安装完之后设置环境变量在~/.bashrc里添加source /usr/local/Ascend/ascend-toolkit/set_env.sh然后执行source ~/.bashrc生效。验证驱动是否正常npu-smi info如果能看到卡片的详细信息、芯片温度、显存使用情况说明驱动安装成功了。这里提醒一点npu-smi info是排查所有NPU相关问题的第一命令后续遇到推理报错第一件事就是跑这个看设备状态。3.3 准备YOLO模型导出ONNX文件现在手里如果有PyTorch训练好的YOLO模型需要先转成ONNX格式。这里以YOLOv5为例YOLOv8的流程类似只是导出命令稍微不同。假设你已经有YOLOv5的权重文件yolov5s.pt在YOLOv5仓库目录下执行python export.py --weights yolov5s.pt --include onnx --opset 11 --dynamic这个命令会生成一个yolov5s.onnx文件。注意这里的两个参数--opset表示ONNX算子集的版本昇腾ATC工具对Opset 11的兼容性最好建议不要用更新的版本--dynamic表示导出动态shape的ONNX模型也就是输入尺寸不固定。但我个人建议第一次做模型转换的时候先不要用动态shape直接固定输入尺寸640x640等全流程跑通了再尝试动态shape。固定尺寸的导出命令python export.py --weights yolov5s.pt --include onnx --opset 11 --imgsz 640 6403.4 ATC模型转换ONNX转OM格式的完整命令与参数详解拿到ONNX文件之后下一步就是用ATC工具把它转成昇腾的OM格式。这是整个流程中最核心、也最容易出问题的一步。先做一个用于存放转换后模型的目录mkdir -p ~/atlas_yolo执行ATC转换atc --modelyolov5s.onnx \ --framework5 \ --output~/atlas_yolo/yolov5s \ --input_shapeimages:1,3,640,640 \ --soc_versionAscend310P3 \ --output_typeFP32 \ --insert_op_confaipp.cfg每一个参数我解释一下--framework55代表ONNX格式这个是固定的不用改。--output输出OM文件的路径前缀最终会生成.om后缀的文件。--input_shape指定模型的输入形状格式是“输入名称:批大小,通道数,高,宽”。注意这里的输入名称“images”必须跟你ONNX模型里的输入节点名称保持一致。YOLOv5导出的ONNX输入名一般是“images”YOLOv8的可能是“images”也可能是“x”具体可以用onnx.shape_inference工具查看或者用Netron可视化工具打开ONNX文件看输入节点的名字。如果输入名写错了ATC会直接报错退出。--soc_version指定芯片型号。Atlas 300V 24G对应的soc_version是Ascend310P3。这个参数特别重要写错了转换出来的模型也没法用。可以用npu-smi info查看芯片型号来辅助确认。--output_typeFP32指定输出张量的数据类型。如果不指定默认输出是FP32如果是分类任务想要float16输出可以在这里指定FP16。--insert_op_confaipp.cfg这个是AIPPAI Preprocessing配置文件。AIPP的作用是把图像预处理缩放、减均值、除方差、通道变换等放到硬件里面做省掉CPU和NPU之间的数据搬运开销。但如果你不想用AIPP可以不加这个参数在推理代码里用OpenCV或Python的Pillow做预处理效果一样只是性能略低。这里专门说一下AIPP配置。如果你决定用AIPP需要一个配置文件内容大致如下aipp_op { aipp_mode: static input_format: RGB888_U8 src_image_size_w: 640 src_image_size_h: 640 crop: true load_start_pos_w: 0 load_start_pos_h: 0 crop_size_w: 640 crop_size_h: 640 csc_switch: true rbuv_swap_switch: false min_chn_0: 0 min_chn_1: 0 min_chn_2: 0 var_reci_chn_0: 0.003921569 var_reci_chn_1: 0.003921569 var_reci_chn_2: 0.003921569 }这段配置的含义是输入是RGB888格式的U8图像AI Core会先把图像从RGB转成BGR然后做归一化处理var_reci_chn_0等三个参数就是1/255对应除以255的归一化操作。这样处理完之后NPU拿到的输入数据跟你在PyTorch里做预处理后的结果是一致的。但是这里有一个很经典的坑如果AIPP配置了归一化和通道变换而YOLOv5的源代码在推理时也已经做了这些处理就会导致双重预处理模型输出结果完全不对。我在第一次部署的时候就踩过这个坑。解决办法是用AIPP时推理代码里就不要做减均值、除方差、RGB转BGR的操作直接把原始图像数据传给模型就行。这个细节一定要记住。转换完成后在~/atlas_yolo/目录下会生成一个yolov5s.om文件。这个文件就是昇腾NPU能直接加载运行的最终模型。3.5 推理代码实现使用Python ACL接口加载OM模型模型有了接下来就是写推理代码。昇腾官方推荐的Python推理方式有两种一种是直接用ACLAscendCL的Python接口另一种是用MindX SDK封装好的流程。我建议初学者先直接用ACL因为MindX SDK的pipeline配置虽然方便但出了问题不好定位ACL接口虽然代码量多一点点但每一步做什么都非常清晰适合理解原理。下面是一段完整的推理代码逻辑很清晰加载OM模型、准备输入数据、执行推理、解析输出。import acl import numpy as np import cv2 # 初始化ACL ret acl.init() ret acl.rt.set_device(0) # 指定使用第一个NPU逻辑设备 # 加载OM模型 model_path b~/atlas_yolo/yolov5s.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_dims acl.mdl.get_desc_dims(input_desc) output_dims acl.mdl.get_desc_dims(output_desc) # 准备输入数据读取图片并做最基本的预处理 image cv2.imread(test.jpg) image cv2.resize(image, (640, 640)) # 注意如果用AIPP这里不要再做归一化和BGR转RGB直接做NCHW布局转换 image image.astype(np.float32) image image / 255.0 # 如果AIPP里做了归一化这行要注释掉 image cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 如果AIPP里做了色序转换这行也要注释掉 image np.transpose(image, (2, 0, 1)) # HWC转CHW image np.expand_dims(image, axis0) # 增加batch维度 # 创建输入和输出内存 data_in acl.util.np_to_ptr(image) data_out acl.rt.malloc(output_size, 0) # 执行推理 ret acl.mdl.execute(model_id, data_in, input_size, data_out, output_size) # 将输出转成numpy数组 output acl.util.ptr_to_numpy(data_out, output_dims[0], output_size) # 释放资源 acl.rt.free(data_out) acl.mdl.unload(model_id) acl.rt.reset_device(0) acl.finalize()这段代码里我要说明三件事第一acl.rt.set_device(0)里的0代表的是逻辑设备ID号。Atlas 300V 24G在系统里被识别为两个逻辑设备编号通常是0和1对应物理卡的两个半区。你可以用npu-smi info查看每个逻辑设备的显存是12GB左右。第二acl.mdl.execute是同步推理接口调用后要等推理完成才会返回。如果想要异步推理官方也提供了acl.mdl.execute_async的接口配合acl.rt.subscribe_report和acl.rt.wait_report使用但异步模式写起来复杂很多在性能不是瓶颈的情况下同步接口完全够用。第三YOLO模型的输出是一个包含检测框信息的张量YOLOv5的原始输出shape是(1, 25200, 85)其中25200 3个尺度特征图80x80 40x40 20x20乘以3个anchor85 4个坐标 1个置信度 80个类别概率。拿到这个输出之后还需要做NMS非极大值抑制才能输出最终的检测框。NMS的操作可以在CPU上用numpy实现也可以用opencv的cv2.dnn.NMSBoxes函数具体实现我就不贴代码了网上有大量现成工具函数。3.6 性能验证与调优从“能跑”到“跑得快”全流程跑通之后很多人开始关心性能优化。YOLO在Atlas 300V 24G上的性能调优核心有几个方向。第一个方向是使用AIPP硬件预处理。我之前提到过AIPP用AIPP之后图像缩放、色序转换、归一化都在NPU内部完成CPU只需要把原始图像数据拷贝过去就行。实测下来用AIPP之后端到端延迟大约能降低8%-12%吞吐量小幅提升。第二个方向是调整batch size。如果业务允许批量推理比如同时对多张图片做检测尽量把batch size调大。Atlas 300V 24G两个逻辑设备各自有12GB显存在这个容量下YOLOv5s跑batch size为4或8的INT8推理完全没问题吞吐量几乎可以线性提升。但要注意一个平衡batch越大单次推理延迟越高所以对实时性要求高的场景batch size建议保持在1-4之间。第三个方向是多线程并发。由于卡上有两个逻辑设备你可以开两个线程分别绑定到设备0和设备1各自跑一个进程这样就能把两个NPU核心都用起来。这个做法的关键代码是每个进程内部先调用对应的acl.rt.set_device(device_id)然后再加载模型执行推理。注意两个进程不能同时绑到同一个设备ID上否则会报设备冲突错误。第四个方向是模型量化。如果你的业务允许精度损失把FP16模型转成INT8量化模型推理速度能再提升一倍左右。昇腾的ATC工具支持校准量化需要用一批代表真实数据的图片做校准集具体命令是atc --modelyolov5s.onnx \ --framework5 \ --output~/atlas_yolo/yolov5s_int8 \ --input_shapeimages:1,3,640,640 \ --soc_versionAscend310P3 \ --insert_op_confaipp.cfg \ --enable_int81 \ --precision_modeallow_mix_precision \ --quant_modecalibrate \ --calibrate_data_path./calibration_data其中--calibrate_data_path指向存放校准图片的目录图片应该处理成模型的输入格式。量化的过程有些慢但一次性完成后模型文件会一直生效。4. 常见问题与排查技巧实录我不会说这个过程“一路顺风”因为实际上踩坑是常态。下面整理几个我在Atlas 300V 24G上部署YOLO时遇到的最具代表性的问题按出现频率排序基本上每个问题都对应一个真实的踩坑场景。4.1 问题速查表问题现象可能原因解决办法npu-smi info看不到设备驱动没装好或PCIe设备未识别先跑lspci确认硬件再重装驱动固件检查PCIe插槽和供电ATC转换时报E100001类似错误输入shape名称不对或不支持Opset用Netron确认输入节点名改用Opset 11重新导出ONNXATC转出来的OM模型推理结果全错AIPP与代码中预处理重复统一只保留一份预处理逻辑用AIPP就不要额外处理调用acl.mdl.execute报device busy两个进程绑定到了同一个逻辑设备ID一个进程用一个设备ID用npu-smi info确认占用情况推理延迟远高于预期500ms以上模型未被NPU加速误用了CPU推理确认代码里加载的是.om文件而不是直接在PyTorch上推理多batch推理报显存不足单个逻辑设备12GB显存不够用减少batch size或切到设备0和设备1分别部署动态shape的OM模型在生产环境推理报错动态shape本身增加了调度开销和限制生产环境优先使用固定shape多个尺寸就转多个OM模型转换过程中算子不支持警告个别ONNX算子昇腾暂未适配尝试改ONNX的Opset版本或在PyTorch端更换算子实现4.2 详细排查过程分享第一个要重点讲的是ATC转换时报错。这个错误的典型特征是在转换过程中直接中断输出的日志里带有一个[ERROR] EZ前缀的报错ID。最常见的原因是ONNX模型里含有昇腾未适配的算子比如某些较新版本的SiLU激活、或者是GridSample这类算子。排查思路分三步走第一步先看报错日志里明确提到了哪个算子。日志通常会有一行类似Unsupported op: XXX的信息直接告诉你是哪个算子出了问题。第二步去昇腾社区查这个算子是不是已经在某版本CANN中支持。如果当前版本不支持建议升级CANN到最新版本很大概率能解决。第三步如果升级后还不支持就在PyTorch端换一种实现方式。比如某个模型用了hard_swish激活函数昇腾不认那就换回ReLU或SiLU转换后通常也能跑只是精度上会有微小差异。第二个高频问题是推理结果异常。模型能加载、能推理但输出的检测框位置完全不对。这类问题绝大部分出现在预处理环节。YOLOv5在PyTorch里的标准预处理顺序是BGR转RGB、除以255归一化、缩放。如果你在AIPP里配置了色序转换和归一化然后在代码里又做了一遍同样的操作那模型收到的输入数据就完全是错的。我在第一次部署时AIPP里配置了csc_switch: true做色序交换但代码里也调用了cv2.cvtColor(image, cv2.COLOR_BGR2RGB)结果模型的检测结果几乎全是错的——有的框偏到角落有的检测不到目标。排查了半天最后是用一张纯红色图片做测试分别看预处理后数据的R、G、B通道值才定位到问题。所以我的建议是调试阶段用单色图片做输入可以快速定位预处理流程对不对。第三个问题是多进程并发时的设备冲突。这个错误提示通常是device is busy或者acl.rt.set_device failed。原因很简单Atlas 300V 24G虽然是一张物理卡但系统里暴露为两个逻辑设备编号0和1。如果你写了两个进程代码里都写死了acl.rt.set_device(0)第二个进程启动时自然抢不到设备。解决办法是在启动进程时用环境变量或命令行参数把设备ID传进去。比如import sys device_id int(sys.argv[1]) # 进程启动时传入0或1 acl.rt.set_device(device_id)另外还要注意一个问题如果一个进程崩溃后没有正常调用acl.rt.reset_device和acl.finalize设备可能会被标记为异常占用。这时候用npu-smi info会看到显存占用不为0一个临时解决办法是杀掉相关进程后等几十秒再重试一般设备会自动恢复如果不行就重启机器。第四个常见问题是性能不达标。很多人的预期是“Atlas 300V 24G跑YOLO怎么着也得1000 FPS”结果实测只有二三十帧第一反应是卡有问题。实际上如果推理延迟在20毫秒以上首先检查是不是模型没有走NPU——我用ps aux排查过多个项目发现有些团队所谓“在Atlas上跑了YOLO”其实只是把PyTorch跑在CPU上用了卡里的显存做张量存储。这个属于代码层面的逻辑错误我在代码示例里特意强调过加载的是.om文件而不是.pt文件就是为了避免这个问题。其次是输入预处理拖后腿。如果每帧图像做缩放、归一化的耗时比推理本身还高那就需要把预处理搬到AIPP里去做。实测下来AIPP能把预处理耗时压缩到原来的1/10左右。还有一个影响性能的隐藏因素模型输入分辨率。很多人习惯用YOLOv8默认的640x640但有业务需求要检测小目标把输入分辨率调到了1280x1280甚至更大。分辨率翻一倍计算量翻了四倍延迟指数级上升。合理的做法是先用小分辨率跑通流程、验证功能再评估分辨率与实际检测精度的关系选一个性价比最高的值。5. 后续还能怎么玩多模型协同与二次开发方向跑通了单模型YOLO之后很多实际项目不会止步于一个模型。我基于自己的经验补充几个后续能力的探索方向。第一个方向是多模型串联流水线。比如用YOLO先检测出画面里的行人再把检测框裁剪出来送入一个人脸识别模型做人脸比对。这种串联在Atlas 300V 24G上的实现方式有两种一种是两个模型加载到同一个逻辑设备上用线程A跑YOLO、线程B跑人脸识别中间用内存队列传递检测框另一种是把两个模型分别加载到设备0和设备1上各自独立跑最后通过IPC或共享内存汇总结果。两种方式各有利弊第一种延迟更低因为不需要跨设备拷贝第二种吞吐更高因为两个模型的推理真正并行。实际项目里可以根据业务数据量来选。第二个方向是视频流实时分析。YOLO部署完之后最常见的场景就是接RTSP视频流做实时检测。这里有三个容易忽视的点一是解码视频流解码强烈建议用硬解码昇腾的DVPP模块自带硬解码能力可以大幅降低CPU占用二是跳帧策略实际项目中演示时可以每帧都检测但生产环境下很多场景只要每秒检测2-3帧就够了这样能把算力释放给多个视频流三是检测结果输出建议用消息队列或WebSocket把结果实时推送出去而不是在推理进程里直接写数据库避免影响推理性能。第三个方向是模型自更新机制。在边缘设备上部署模型后期一定会遇到模型升级的需求。OM文件本身就是一个独立文件理论上只要把新OM文件放到指定路径重启推理进程就能完成升级。但在多进程部署的场景里我建议把这层管理逻辑做成独立模块推理进程启动时从配置中心拉取当前模型版本号有更新就重新加载模型文件。这样运维的时候完全不需要登录每台设备手动操作。第四个方向是与其他加速卡的混合调度。Atlas 300V 24G不是唯一可以选择加速硬件在一些复杂的业务系统中ATLAS和NVIDIA卡可能同时存在。如果上层业务需要统一的推理接口可以考虑把推理服务封装成HTTP服务比如用FastAPI写一个推理接口底层根据模型类型路由到不同的推理后端。这样业务方调用时完全无感知只关心返回结果。6. 总结一下我这块卡的实操心得过去几个月我用Atlas 300V 24G在好几个项目里跑过YOLO系列模型从单模型验证到多路视频流分析都做过。如果要用一句话总结个人经验用这块卡最重要的是改变思路从“写CUDA代码”切换成“转换模型调用推理接口”的模式一旦习惯了这个模式日常开发效率会非常高。有几个细节我想再强调一下ATC转换是整个部署链路里最值得投入时间研究的环节模型转换调好了后面的推理其实非常简单AIPP预处理能省就省一劳永逸调试阶段一定要用单色图片、单帧图片把流程跑通再上真实数据。最后再分享一个小技巧如果你觉得官方文档读起来太零散建议把CANN安装包自带的样例代码目录完整看一遍里面有大量可复用的玩法包括YOLO模型转换的脚本、ACL推理的模板、甚至还有多路视频流的示例。这些代码文件都很短但非常实用很多我踩坑一周才想明白的细节其实样例里已经写得明明白白只是当初没耐着性子细读。遇到问题时先翻样例再查社区最后再看文档这个顺序能帮你省下大量的时间。
返回列表