ARTICLE DETAIL

资讯详情

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

Atlas 300V 24G推理加速卡部署YOLO模型完整实战指南

Atlas 300V 24G推理加速卡部署YOLO模型完整实战指南 1. 硬件定位Atlas 300V 24G到底是不是运算加速卡先直接回答这个热搜问题是的Atlas 300V 24G就是一款运算加速卡而且是为AI推理场景专门设计的加速卡。我手里这块卡已经在产线上跑了半年多当时拿到手第一反应也是疑惑——这卡没有显示输出接口跟常见的GPU卡长得不太一样但它确实是实打实的算力硬件只不过人家走的是专用加速路线不干图形渲染的活儿。Atlas 300V 24G属于华为昇腾计算产品线里的推理加速卡核心芯片是昇腾310P系列板上配了24GB显存准确说是DDR4显存颗粒和GPU厂商常说的GDDR6显存有一定差异。24GB这个容量在推理卡里属于很能打的水平意味着你在单卡上可以载入较大的模型、跑更高的batch或者同时常驻多路视频流的推理任务。我用它主要跑YOLO系列目标检测模型下面会详细讲部署过程。很多人容易把运算加速卡和GPU画等号这个理解不全面。从计算机体系结构的角度看只要是专门分担CPU算力、针对特定计算类型做加速的硬件都可以叫运算加速卡。Atlas 300V就是典型的ASIC架构推理卡它和GPU的区别在于GPU是为图形渲染设计的通用并行处理器后来扩展到通用计算而昇腾这类NPU生来就是为神经网络算子设计的从指令集到内存调度都是为了把矩阵乘法和卷积跑得更快、更省电。从实际应用场景看Atlas 300V 24G适合的人群很明确做AI推理部署的工程师、做边缘计算或服务器侧视频分析的方案商、以及需要规模化商业落地目标检测模型的团队。它的性价比优势要在生产环境里才能完全体现出来——单卡功耗才72W左右一张RTX 3090的功耗够它跑四五张卡如果做大规模集群省下来的电费和散热成本是相当可观的。说白了如果你要做的事是模型训练那这台卡不太适合你训练还是用GPU为主但如果你要做的是模型上线跑推理比如给YOLO模型做服务化部署那Atlas 300V 24G就是很值得考虑的选项——专用芯片在推理场景下的能效比高得离谱。1.1 一张表看清Atlas 300V在硬件家族里的位置很多刚接触昇腾生态的朋友面对这块卡时会懵因为产品线层级比较多。我按自己的理解给你理一下分类代表产品定位适用场景训练卡Atlas 800T、Atlas 900模型训练训练集群、科研推理卡Atlas 300I Pro、Atlas 300V、Atlas 300T模型推理线上服务、边缘盒子、视频分析加速模组Atlas 200、Atlas 500嵌入式/边缘智能摄像头、小盒子设备注意看300V和300I的区别。300I是单芯推理卡比较轻量300V是双芯推理卡板载两颗昇腾310P芯片所以算力翻倍、显存更大适合需要挂多路视频流或大模型的服务器场景。24G显存也是300V最吸引人的点我在部署YOLOv8x时batch设为8能稳定跑这在很多同价位推理卡上是做不到的。1.2 为什么推理场景我更推荐ASIC而不是GPU这个话题一提容易吵架但我把实际使用感受摆出来你自己判断。GPU跑推理当然没问题CUDA生态成熟、资料多但它在推理场景有两个绕不开的痛点功耗太高。一块主流GPU推理卡动辄两三百瓦如果做32路视频分析的服务器光GPU就是几千瓦的功耗机房散热成本直接翻倍。利用率浪费。你做推理时加载的是已经训练好的模型需要的是大量低精度矩阵运算GPU里很多通用计算单元其实在空转。ASIC芯片把电路都固化成了卷积、激活、池化这些算子精度砍到INT8后每瓦算力比GPU高出一大截。举个例子我用同一台服务器之前插两张GPU卡跑8路YOLOv5s视频流GPU功耗200W电费看得肉疼。换成两张Atlas 300V之后同样跑8路视频流整卡功耗72W显存还没用满风扇转速都上不去。对做商业项目的团队来说这个差距就是实打实的利润。2. 部署前的环境准备搞懂昇腾推理全链路手里有了卡别急着写代码。昇腾生态和CUDA生态有个很大的不同它有一套完整的自有工具链从模型到能跑起来中间隔着好几道工序。我第一次上手时在环境上就浪费了两天现在把这些环节捋清楚你能少走一半弯路。昇腾推理的完整链路是这样的PyTorch/TensorFlow 模型 - ONNX - OM离线模型 - 推理引擎ACL/MindX SDK - 业务代码也就是说你没法直接拿PyTorch训练出来的.pt文件在Atlas上跑必须先转成ONNX再用昇腾的ATC工具把ONNX转成OM离线模型最后通过昇腾的推理接口加载OM文件执行推理。这个流程是昇腾生态最大的特点也是一个常用的性能优化手段——OM模型相当于昇腾芯片的机器码在转换时就已经把算子编排、内存分配、指令调度全部优化好了运行效率远高于实时解释执行。2.1 驱动、固件与CANN的版本对应关系安装昇腾环境时最容易踩的坑就是版本不匹配。昇腾的软件栈分成几层驱动Driver、固件Firmware、CANN工具包以及如果你用MindSpore训练的话还有MindSpore框架层。这几个组件之间是严格互相匹配的版本对不上轻则算子报错重则直接加载不了设备。我的建议是去昇腾社区下载配套的CANN软件包驱动固件组合包上面有明确标注配套版本的表格。别为了图新各个组件都去装最新版最后全项目代码跑不了。检查驱动和固件版本的命令npu-smi info这条命令会显示所有昇腾设备的状态、驱动版本、固件版本以及当前的显存使用情况、温度、功耗。养成习惯所有环境问题排查第一步都是先看npu-smi。我见过太多人环境配了半天最后发现是驱动没加载成功npu-smi一查就露馅。2.2 CANN到底装哪一层CANN是昇腾计算架构的总称里面包含了很多子模块比如ATC模型转换工具、ACL推理运行时库类似CUDA的Runtime、算子库、图编译引擎等。安装CANN时你可能会看到多个安装包选项我建议如果你只做推理安装Ascend-cann-toolkit就够了不需要装训练相关的MindSpore包。如果你后面想用MindX SDK昇腾的极简推理开发框架再单独装MindX Toolkit。安装完CANN之后一定要执行环境变量脚本否则命令行根本找不到atc和ascend相关命令source /usr/local/Ascend/ascend-toolkit/set_env.sh建议把这行加到.bashrc里省得每次开终端都source一遍。另外注意CANN对操作系统有严格的兼容性要求官方支持的是Ubuntu 20.04/22.04、openEuler等特定版本CentOS 7的高版本内核可能有问题建议先查兼容性列表再装系统。2.3 Docker部署给环境上一份保险如果要在多台机器上部署或者想避免环境冲突直接用昇腾官方提供的Docker镜像是最稳的做法。昇腾社区维护了一个叫Ascend Docker Runtime的插件装好之后可以让容器直接访问宿主机的NPU设备命令类似这样docker run -it --device/dev/davinci0 \ --device/dev/davinci_manager \ --device/dev/hisi_hdc \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ -v /usr/local/dcmi:/usr/local/dcmi \ -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ ascendhub.huawei.com/public/ascend-ubuntu:latest /bin/bash这样容器里就能直接使用昇腾的推理接口而且宿主机上的驱动是共享的升级时只需要升宿主机的驱动即可业务环境和系统环境解耦了。生产环境强烈推荐这个方案我在开发机上踩过的很多环境坑部署到Docker里之后都没再犯过。3. YOLO模型从PyTorch到OM的完整移植过程接下来到重头戏了。我们用YOLOv8来做演示因为它现在是目标检测的主力模型而且导出ONNX的过程很干净。整体流程可以拆成四个阶段导出ONNX、ATC转换成OM、编写推理代码、后处理解码。下面一步步来。3.1 导出ONNX这一步决定了后面是否顺利在PyTorch环境中用ultralytics库导出ONNX非常简单from ultralytics import YOLO model YOLO(yolov8s.pt) model.export(formatonnx, opset11, dynamicTrue, simplifyTrue)这里有两个参数要特别说明。opset要设为11或12不要用太高版本昇腾的ATC工具对高版本opset的支持存在滞后如果opset设成18、19转换时会碰到不支持的算子。dynamicTrue表示导出动态shape的ONNX模型这样转换OM时可以自由的设置batch大小后面推理时也灵活很多。导出完成后用onnxsim再做一次图优化把常量折叠、冗余算子清理掉可以减少后面ATC转换的失败率python -m onnxsim yolov8s.onnx yolov8s_sim.onnx这一步不能省。我用一个二次训练的YOLOv5模型试过不简化直接转OM报了一个莫名其妙的算子错误简化之后同样的ATC命令就过去了。原因通常是PyTorch导出时在计算图里留了一些C端的冗余子图onnxsim能把它们全部消除。3.2 ATC转换把ONNX编译成昇腾指令ATC工具是昇腾生态的核心工具作用是把ONNX模型编译成OM离线模型并做算子调度优化和内存复用优化。转换命令长这样atc --modelyolov8s_sim.onnx \ --framework5 \ --outputyolov8s_bs1 \ --soc_versionAscend310P3 \ --input_shapeimages:1,3,640,640 \ --input_formatNCHW \ --output_typeFP16 \ --insert_op_confaipp.cfg参数说明--framework5表示输入模型是ONNX。Framework的编号规则不太直观5对应ONNX1对应MindSpore2对应TensorFlow3对应Caffe装完CANN后可以用atc --help查一下。--soc_version指定芯片型号。Atlas 300V用的是昇腾310P芯片所以填Ascend310P3。不确定具体型号时用npu-smi info看芯片名或者跑一下atc --help里的支持列表。--output_typeFP16把模型权重和中间计算精度转成FP16。对于推理场景FP16精度几乎无损尤其是目标检测这种任务速度和内存占用却能减半。--insert_op_confaipp.cfg插入AIPP预处理配置后面会讲。如果你的模型有多个输出YOLO系列通常输出三个不同尺度的特征图转换后OM的输出名会变成类似output0、output1、output2的命名后面写推理代码时要按这个索引来取。3.3 关于AIPP用硬件做图像预处理这是昇腾最让我喜欢的一个特性。AIPPArtificial Intelligence Pre-Processing可以在芯片硬件层面完成图像的缩放、归一化、颜色空间转换不需要CPU参与也不用在模型里做letterbox预处理。我常用的aipp.cfg配置aipp_op { aipp_mode: static input_format: RGB888_U8 src_image_size_w: 1280 src_image_size_h: 1280 csc_switch: true rbuv_swap_switch: false crop_params { crop_w: 640 crop_h: 640 load_start_pos_h: 0 load_start_pos_w: 0 } 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 }这段配置的意思是把1280x1280的输入图像在硬件上完成裁剪到640x640、RGB通道归一化乘上1/255。模型输入直接就是处理好的浮点数据省掉了Python或者C里的预处理耗时。注意如果你的输入图像尺寸不固定要设aipp_mode: dynamic但这会牺牲一部分性能建议固定输入尺寸的场景优先用static模式。我做视频流分析时摄像头分辨率通常是1280x720直接resize到1280x1280再让AIPP裁剪到640x640实测省了大概3-5毫秒的预处理耗时整路时延从23毫秒降到了18毫秒。3.4 转换失败的常见排查思路ATC转换本身是一个比较容易出问题的地方我总结一下最容易踩的几个坑算子不支持。提示Unsupported operator xxx或者xxx is not supported通常是因为ONNX里存在昇腾不支持的算子或者opset版本太高。排查方法是先去昇腾社区查算子支持列表如果确认算子被支持还报错试试升级CANN版本。模型太大导致内存不足。转换过程会占用不少内存如果机器内存只有16G转大模型时可能被杀掉。加--memory_init_size2048限制一下或者直接换一台内存大点的机器。输出shape错误。转出来后推理时发现输出维度和你预期不一致经常是dynamic shape在ATC里没处理好。如果不需要可变batch就直接把--input_shape写死动态维度尽量不用。4. 推理代码实现从加载OM到输出检测框模型转换好之后就进入编码阶段。下面给出一个完整的Python推理流程用昇腾的ACLAscend Computing Language接口。Python不是最高效的语言但胜在调试方便、代码短、逻辑最清楚先把流程跑通了再用C做性能优化也不迟。4.1 推理核心代码import acl import numpy as np # 初始化ACL acl.init() ret acl.rt.set_device(0) # 加载OM模型 model_path yolov8s_bs1.om model_id, ret acl.mdl.load_from_file(model_path) # 获取模型输入输出信息 input_desc acl.mdl.get_input_desc(model_id) output_desc acl.mdl.get_output_desc(model_id) input_size acl.mdl.get_input_size_by_index(model_id, 0) output_size acl.mdl.get_output_size_by_index(model_id, 0) # 分配device内存 input_data np.zeros((1, 3, 640, 640), dtypenp.float32) input_ptr acl.util.np_to_ptr(input_data) output_ptr, ret acl.rt.malloc(output_size, 2) # 推理 ret acl.mdl.execute(model_id, [input_ptr], [output_ptr]) # 把结果拷回host内存 output_np acl.util.ptr_to_np(output_ptr, (output_size,), np.uint8) # 根据输出dtype和shape还原 output_np output_np.view(np.float32).reshape(...) # 释放资源 acl.rt.free(output_ptr) acl.mdl.unload(model_id) acl.rt.reset_device(0) acl.finalize()这个流程看起来简单但有几个非常容易踩的坑输出的内存格式不是连续数组。ACM输出的每个tensor是有独立地址和size的用acl.mdl.get_output_size_by_index获取每个输出的大小然后分别acl.rt.memcpy拷到host端我见过的多数模型输出不对的问题其实都是只拷了第一个tensor或者把整个输出区当成了一个连续buffer。输入数据dtype必须与OM模型输入一致。如果用AIPP静态配置模型输入就是uint8如果没用AIPP而是外置归一化输入就是float32。dtype对不上推理结果全是乱的。不要忘记调用acl.finalize()。在长驻服务里不释放资源跑个几千次之后就会出现内存暴涨我之前排查过一个推理服务跑3小时就崩溃的问题最后发现是ACL资源泄漏。4.2 YOLO输出的后处理Decode NMSYOLOv8和YOLOv5有一个较大区别v8的检测头不再有objectness置信度分支输出直接是4cls_num个值4个边界框坐标加类别概率。解码逻辑相对简化了核心代码如下def decode_output(pred, conf_thres0.25, iou_thres0.45): pred shape: [num_boxes, 4 num_classes] 输出坐标是cx, cy, w, h需要转成xyxy格式 boxes [] scores [] class_ids [] for i in range(pred.shape[0]): class_scores pred[i, 4:] max_score class_scores.max() if max_score conf_thres: continue class_id class_scores.argmax() cx, cy, w, h pred[i, :4] x1 cx - w / 2 y1 cy - h / 2 x2 cx w / 2 y2 cy h / 2 boxes.append([x1, y1, x2, y2]) scores.append(float(max_score)) class_ids.append(int(class_id)) # NMS按类别分别执行 keep nms(boxes, scores, iou_thres) return boxes, scores, class_ids关键点在于坐标和原图的对齐。如果你的模型输入是640x640原图是1280x720在AIPP时做了resize和crop那模型输出的坐标映射回原图坐标时必须精确记录AIPP的裁剪偏移量。AIPP的裁剪参数在static模式下是固定的所以你可以提前算出偏移从代码里拿到模型输出的坐标后先加偏移量再乘缩放比例。我在实际项目里写过好几版坐标映射最终的万金油方案是不要在AIPP里做裁剪只用它做resize和归一化这样映射逻辑最简单——只要用原图宽高除以模型输入宽高就得到x和y方向的缩放系数。4.3 用MindX SDK代替手写ACL能省不少事如果你觉得ACL接口太底层可以试试MindX SDK。我对它的评价是更像一个为昇腾封装好的推理工具链代码量能减少60%左右。以YOLO为例MindX SDK做的基本上就是把上面那些底层操作封装成了可配置的插件流from mindx import mxpi import cv2 # 定义推理流 stream { name: yolo_pipeline, elements: [ {name: mxpi_imagedecoder, type: mxpi_imagedecoder}, {name: mxpi_imageresize, type: mxpi_imageresize, props: {resizeWidth: 640, resizeHeight: 640}}, {name: mxpi_tensorinfer, type: mxpi_tensorinfer, props: {modelPath: yolov8s.om}}, {name: mxpi_objectpostprocess, type: mxpi_objectpostprocess, props: {postProcessType: YOLOV8, confThreshold: 0.25, nmsThreshold: 0.45}} ] }MindX SDK的好处是内置了很多现成的插件比如图像解码、缩放、模型推理、后处理、可视化你可以把这些插件像积木一样拼成一条流水线。对业务形态比较固定的项目来说效率确实高。不过如果要做一些非标准的处理逻辑比如自定义NMS规则、多模型串联推理那还是ACL更灵活。5. 性能调优与多路并发榨干Atlas 300V的最后一点算力模型能在Atlas上跑起来只是第一步生产环境里真正考验人的是性能和稳定性。这一章节完全来自我在实际项目里做的各种压测和调优经验不一定是最优解但都是经过验证的有效方法。5.1 32路视频流实战batch和stream怎么选在做视频分析项目时最典型的场景就是多路RTSP视频流同时跑YOLO检测。Atlas 300V 24G显存够大双芯片的设计让她天生适合多路并发。但多路具体怎么实现有两条路单路单模型多进程并行。每个进程绑定一路视频流进程之间互不干扰但显存占用大进程切换也有开销。这种方式在Atlas上能跑到16路就差不多了。多路共用模型batch推理。把多路的帧拼成一个batch一次推理同时出多路结果显存利用率最高性能也最优。这也是我最终采纳的方案。以YOLOv5s为例输入640x640batch设为8Atlas 300V实测能做到大约180 FPS包含AIPP预处理不含后处理NMS。换算下来每路视频按25FPS算一张卡处理20路左右的1080P视频流没什么问题。batch再往上加到16FPS反而会下降因为显存带宽成了瓶颈。最佳batch大小要针对具体模型实测不是越大越好。另外提供了一个小技巧Atlas 300V是双芯片的通常用里面的两个Die来理解或者说是两颗NPU你可以在代码里用acl.rt.set_device(0)和acl.rt.set_device(1)分别初始化两个ACL上下文把视频流平均分配给两个device分别跑一个batch推理。这样算力可以真正并行相当于把卡用满了。别把两个device的任务混在一个ACL上下文里那样会让两颗芯片互相等性能反而降低。5.2 AIPP和DVPP是两回事在昇腾生态里有两个容易混淆的概念AIPP和DVPP。简单说AIPP是模型转换时定义的预处理算子在NPU上执行处理的是模型输入格式的统一转换和归一化属于数学预处理。DVPP是昇腾的媒体处理硬件单元负责图像解码JPEG/视频流硬件解码、缩放、格式转换YUV与RGB互转属于像素预处理。在视频流场景里RTSP流先到DVPP做硬件解码成YUV帧再经过AIPP归一化后送进模型全程不经过CPU延迟和CPU占用都很低。强烈建议做视频流处理时用DVPP的解码能力我之前用FFmpeg软解拉RTSP流CPU直接飙到70%换成DVPP硬解之后CPU占用掉到5%以下差距不是一点半点。DVPP的使用门槛稍微高一点它有自己的内存管理方式DVPP内存在专用内存池里需要单独申请和释放好在MindX SDK已经把DVPP封装成了插件如果你用ACL裸写就要多留意DVPP硬件的对齐要求。有个最典型的坑DVPP缩放时宽高必须是2的倍数输入输出buffer有对齐要求默认16字节对齐写代码时如果不管这些会出现花屏或者图像变形。5.3 推理服务的稳定性与异常恢复部署在服务器上的推理服务稳定性比性能还要重要。我在生产环境里总结了几条必须做的防护措施显存泄漏监控。用npu-smi info定期记录显存占用只要发现占用随请求数持续增长基本可以断定是ACL资源没有释放。异常进程自动拉起。用systemd或supervisor守护推理进程如果NPU驱动偶发异常导致进程崩溃可以自动重启服务不至于让整个业务挂掉。请求排队机制。多路视频流的推理请求是突发的用队列缓冲请求模型按batch大小批量取帧推理比来一个请求就推理一次要高效得多也能平滑掉峰值压力。6. 部署中遇到的高频报错与排查实录最后这部分整理一些我在Atlas 300V部署过程中真实遇到过的问题以及对应的排查思路。如果你也碰到类似报错希望能少走一点弯路。6.1 昇腾部署常见错误速查表报错现象根本原因解决方案E10001: Runtime internal errorACL环境初始化失败通常是驱动没加载或者版本不匹配先跑npu-smi info确认设备状态再确认CANN版本与驱动版本匹配E40000: Device memory not enough显存不足调低batch大小检查是否有进程占用显存没释放ATC转换报算子不支持ONNX版本太高或模型里有昇腾不支持的算子降低opset到11对模型做onnxsim简化查算子支持列表OM模型推理结果全是0输入数据dtype错误或者输入shape和模型定义不一致打印一下模型输入信息和代码里的输入数组对比检查AIPP是否生效推理速度比预期慢很多模型没走AI Core算子落到CPU上执行了用profiler工具看算子调度情况找出CPU算子升级CANN版本视频流花屏或黑边DVPP缩放对齐问题输入分辨率不是2的倍数保证输入宽高为2的倍数检查内存对齐参数6.2 一个印象深刻的排查案例有一次在客户的服务器上部署YOLOv5模型推理偶尔会突然卡顿过几秒才恢复。一开始以为是网络问题排查了一圈一无所获。最后用npu-smi info -t log看NPU日志发现是ECC错误导致芯片自动降频保护。再往深挖发现服务器电源功率不够推理任务一拉高负载电源供不上来NPU进入降频状态。换了一台电源功率足够的服务器之后问题彻底消失。这个案例想说明两件事第一昇腾卡对供电稳定性有要求部署时别忽略电源功率这个基础项第二遇到莫名其妙的性能波动一定要看NPU的系统日志不要只盯着应用层代码。日志命令通常用npu-smi info -t log或者去/var/log/npu下找对应日志。6.3 一套适合新手的自检流程如果你刚把Atlas 300V装上别急着跑大模型先按这个顺序做一轮基础自检驱动检查。npu-smi info能看到芯片温度、功耗、显存说明驱动正常。ACL检查。跑一下CANN自带的sample程序确认ACL环境没问题。小模型试水。先用一个小模型比如ResNet-50走一遍ONNX到OM到推理的完整流程确认工具链通畅。YOLO模型再上。小模型跑通后再上YOLO如果报算子错误问题定位起来清晰很多。压测稳定性。连续跑12小时以上的压测观察显存、温度、功耗曲线确认没有资源泄漏再上线。这套流程帮我躲过了很多部署初期的坑。说句实在话昇腾卡本身的硬件稳定性相当不错我用了一年多基本没碰到过硬件故障绝大多数问题都出在软件栈配置和代码细节上。7. 聊聊我对Atlas 300V的使用体会从决定在推理场景全面转向昇腾到现在把YOLO系列模型在Atlas 300V上跑成稳定的线上服务这个过程中的收获远不止学会了一套新工具链这么简单。至少有三点感受是比较深的。第一ASIC芯片在推理场景的能效优势是真的。还是那句老话训练用GPU推理用NPU各司其职。Atlas 300V 24G这张卡72W的功耗能提供不输甚至超过中高端GPU推理卡的性能大批量部署时省下的成本和空间对做商业项目的团队来说是实实在在的竞争力。第二生态成熟度在快速追赶。两年前我刚接触昇腾时遇到问题几乎全靠翻社区帖子很多边缘case找不到答案。现在的CANN版本已经解决了当年很多痛点MindX SDK也把大量常用场景封装好了。虽然距离CUDA的生态还有差距但昇腾的推进速度是肉眼可见的。第三合适才是最重要的。回到最初那个热搜问题Atlas 300V 24G是一块运算加速卡吗是而且是一块在AI推理场景表现相当出色的加速卡。但选型的时候务必要想清楚自己的场景——如果主要做训练GPU依然是绕不开的选择如果做推理、做视频分析、做边缘计算规模化部署Atlas 300V这张卡值得放进你的候选清单里认真比一比。如果你正准备上手这块卡我的建议很直接先从环境搭建和YOLOv8的完整流程走一遍跑通一个端到端的demo再去想性能调优的事。等你在npu-smi里看到自己的YOLO模型稳定跑起来的那一刻昇腾这套东西的轮廓自然就清晰了。
返回列表