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

资讯详情

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

Atlas 300V 24G推理卡部署YOLO全流程指南

Atlas 300V 24G推理卡部署YOLO全流程指南 1. Atlas到底是什么一张卡还是一个平台1.1 先从名字说起Atlas在华为AI栈里的位置很多人第一次听到“Atlas”这个词第一反应是各种大模型、异构计算的新闻里偶尔飘过的型号。但真正上手之后你会发现Atlas不是一个单一产品而是一整套覆盖训练、推理、边缘计算、昇腾算力底座的硬件与软件体系。核心逻辑可以这么理解如果把昇腾芯片比作发动机Atlas就是搭载这台发动机的各种整车形态——有插在服务器里的PCIe加速卡有专门做视频分析的边缘盒子也有整机人工智能服务器。在工业界实际部署中我们最常见的接触点是Atlas推理卡。尤其是做视觉检测、视频结构化、目标识别这类任务Atlas 300系列推理卡曝光率非常高。这里面有偏轻量的Atlas 300I系列也有面向更多并行路数和复杂模型场景的Atlas 300V系列。用户拿到的“Atlas 300V 24G”就属于这一块的当家产品。这个命名里的“24G”指的是显存容量24GB。很多刚接触昇腾生态的工程师会下意识把它和GPU的“显存”画等号这个类比大体不错但细节有差异。昇腾的“显存”是板载内存直接和NPU芯片封装在同一块PCB上用于存放模型权重、中间特征图和推理输入输出数据不承担传统显卡的显示输出功能。所以它确实是一种“运算加速卡”但它的定位更精准地落在“AI推理加速卡”这个细分方向。1.2 300V 24G到底是“运算加速卡”还是“推理卡”这是很多人在选型阶段最容易纠结的问题。直接给结论Atlas 300V 24G是一张AI推理加速卡不是通用计算卡也不是模型训练卡。推理和训练的区别用一句大白话讲就是训练是“从数据里总结规律”推理是“拿已经总结好的规律去判断新输入”。训练阶段要跑数百万次前向传播和反向传播对算力、精度、显存的综合要求极高通常需要NVIDIA A100、昇腾910这类训练级芯片。而推理阶段只需要做前向计算它对吞吐量、时延、功耗更敏感不需要那么高的浮点计算峰值反而看重算力的性价比和单卡能同时处理多少路输入。Atlas 300V 24G在华为的产品谱系里属于昇腾310P系列处理器的推理卡形态。它包装了24GB内存使得它有能力加载YOLOv5、YOLOv8、YOLOX这类常见的视觉检测模型并且跑多路视频流。24GB内存带来的直接好处是你可以把更大的模型、更大的batch塞进去不需要为了内存不足去做激进的量化裁剪。这一点在实际项目里非常关键因为很多团队训练模型时用的是PyTorch环境下的NVIDIA GPU到了部署环节如果显存被限制在8GB、16GB往往得拆成好几个小batch吞吐量上不去而24GB给足了缓冲。另外300V 24G通常是PCIe插卡形式可以插进普通x86服务器。它不像训练卡那样需要专门的高速互联组网部署成本友好很多。它的工作重心就是7x24小时不断处理视频流、图片请求、API推理调用。所以如果你的问题是“atlas 300v 24g 是运算加速卡吗”我的回答是是运算加速卡而且是专门为AI推理优化设计的加速卡。你拿它跑YOLO这类目标检测模型非常对路。2. 为什么选择Atlas跑YOLO选型考量与生态梳理2.1 YOLO系模型在Atlas上的适用场景YOLO系列模型在工业界的地位不需要多讲。从YOLOv3、YOLOv5到YOLOv8、YOLOv9它们一直以来都是实时目标检测的主流方案。Atlas推理卡和YOLO的组合经常出现在这几个场景里工厂质检流水线上的产品缺陷检测一张图像里可能包含多个小目标需要毫秒级响应。智慧安防多路摄像头视频流实时分析检测人、车、物体异常告警。园区巡检无人机或轮式机器人拍的画面回传跑YOLO识别设备状态、安全隐患。交通流量统计卡口图片里识别车辆类型、车牌关联按帧统计流量信息。这些场景有一个共同点输入图像分辨率通常不会特别夸张工业相机可能是1920x1080监控摄像头相似检测目标数量几十个以内对单帧时延要求在几十毫秒到一百毫秒左右。YOLO这种单阶段的检测器在精度和速度之间平衡得很好Atlas 300V 24G的推理吞吐量也完全可以覆盖两者合在一起基本上就是为这类“中等算力需求、高并发请求、低成本部署”的量身定做。相比直接用GPU做推理Atlas最大的优势是单位功耗下的路数吞吐。一张推理卡的功耗比同级别GPU低不需要额外接电源线PCIe槽位供电即可长期跑在机房里对散热和电费的压力都更小。再加上昇腾在国产化项目里的适配性很多政企客户、国企项目都会指定需要支持昇腾环境。所以从工程视角看这个选型不只是技术问题也多少有一点供应链和项目合规的考虑。2.2 软硬件栈从CANN到MindSpore/Torch_ACL用Atlas跑YOLO绕不开昇腾的软件栈。这个软件栈的分层非常清晰新手第一次接触容易晕我先帮你捋一捋。最底层是驱动与固件。驱动负责操作系统和硬件之间的通信固件管理NPU内部的基础功能模块。安装顺序必须是先驱动后固件顺序反了或者版本不匹配后面跑CANN大概率出幺蛾子。往上一层是CANN全称是Compute Architecture for Neural Networks昇腾的计算架构相当于NVIDIA生态里的CUDA。CANN里包含运行时、图编译引擎、算子库、加速库等。你日常打交道最多的可能是这几个模块AscendCL统一编程接口类似CUDA Runtime API用来申请NPU资源、搬运数据、下发推理任务。ATC模型转换工具把你训练好的ONNX模型转换为昇腾专用的OM模型格式。算子包包含内置的算子实现比如卷积、池化、归一化的NPU加速版本。再往上是各种深度学习框架的适配层。比如MindSpore是华为自家的框架昇腾跑它天然适配。但现实是国内YOLO生态的模型绝大多数是PyTorch训练出来的所以更常见的路径是PyTorch训练导出ONNX然后通过ATC转成OM最后用AscendCL或第三方推理框架加载OM做推理。如果不走OM这条路线还有一种方案是用torch_npu把PyTorch的前向计算直接跑在昇腾NPU上。这个方案的好处是代码改动最小几乎无缝迁移坏处是性能往往不如转OM之后用推理引擎跑得极致而且有些算子可能没有NPU实现会回退到CPU。对于生产环境我个人的经验是OM格式最稳性能最好部署最可控。另外华为也发布了MindIE推理引擎它把模型加载、内存管理、并发调度这些事做了更高级的封装大量性能调优内置了。如果你用的是MindIE生态里已经适配过的模型结构YOLOv5、YOLOv8都有官方示例确实能省不少事。但MindIE的版本迭代比较快接口时有变动旧项目如果已经用AscendCL写好了不强制迁移。3. 环境搭建与工具链准备3.1 安装驱动固件与CANN Toolkit拿到Atlas 300V 24G之后第一步不是写代码而是把环境装好。这一步踩的坑最多我把自己实测过的流程整理出来。3.1.1 操作系统与硬件确认先确认服务器操作系统。官方对Ubuntu 20.04/22.04、CentOS 7.6/8.2、openEuler 20.03这些主流系统都有适配。我用的Ubuntu 20.04 LTS内核版本5.4整体稳定性不错。确认系统之后还需要确认硬件插槽PCIe 3.0/4.0的x16/x8槽位都可以但为了跑满带宽建议优先用x16槽位。3.1.2 获取驱动固件包去昇腾社区下载对应硬件型号的驱动包。以Atlas 300V 24G为例驱动包命名一般类似Ascend-hdk-310p-npu-driver_x.x.x_linux-aarch64或x86_64.run。注意区分操作系统架构x86服务器就下载x86_64版本ARM服务器下载aarch64版本。固件包是另一个run文件通常叫Ascend-hdk-310p-npu-firmware_x.x.x.run。安装顺序很关键先用root权限装驱动再装固件# 如果之前装过旧版本先卸载干净 /usr/local/Ascend/driver/tools/unsupported_uninstall.sh # 安装驱动 chmod x Ascend-hdk-310p-npu-driver_6.3.0_linux-x86_64.run ./Ascend-hdk-310p-npu-driver_6.3.0_linux-x86_64.run --full # 安装固件 chmod x Ascend-hdk-310p-npu-firmware_6.3.0_linux-x86_64.run ./Ascend-hdk-310p-npu-firmware_6.3.0_linux-x86_64.run --full # 重启系统 reboot装完之后用npu-smi命令能看到卡的信息就说明驱动和固件正常了。npu-smi info输出里应该能看到卡的温度、内存、芯片型号。我看第一眼习惯确认内存是不是24G芯片是不是310P系列。3.1.3 安装CANN ToolkitCANN Toolkit是主计算包。安装时建议使用run包方式可以用root装到默认路径/usr/local/Ascend/ascend-toolkit也可以非root用户装到自定义目录。生产环境我建议直接装默认路径省得后面配环境变量时各种找路径。chmod x Ascend-cann-toolkit_6.3.0_linux-x86_64.run ./Ascend-cann-toolkit_6.3.0_linux-x86_64.run --install安装完成后配置环境变量。把下面几行加到~/.bashrc里注意路径需要跟实际安装位置一致source /usr/local/Ascend/ascend-toolkit/set_env.sh如果还要用MindIE再单独装MindIE包这里先不展开。3.1.4 版本匹配建议华为的软件版本更新节奏比较快不要盲目装最新。我的建议是先确认硬件支持列表再选对应驱动最后选匹配的CANN版本。驱动、固件、CANN三者的版本要互相兼容最简单的方法就是全部从同一个发布版本的下载页里拿比如6.3.0就三个包都拿6.3.0的。注意驱动和固件一旦装上卸载不太方便如果半路想换版本经常要重启两三次。所以装之前一定确认好版本别抱着“先装个能用的后面再升级”的想法这个想法会让你多折腾一整天。3.2 准备YOLO模型与权重环境装好之后开始准备模型。这里我以YOLOv5为例因为这仍然是最多工业项目在用的版本社区资源丰富踩坑也最少。YOLOv8的原理类似操作流程几乎一样。3.2.1 选择权重文件你是想部署官方预训练权重还是用自己训练好的权重这两条路差别不小。官方预训练权重直接去YOLOv5仓库下载yolov5s.pt、yolov5m.pt这些文件适合做功能验证、跑通流程。自定义训练权重用你自己数据训练出的best.pt导出时需要确保模型结构参数和导出脚本匹配。我建议新手第一次跑通流程先用官方权重因为自己训练的模型可能有额外的自定义层或后处理逻辑转换时会多出不少算子兼容问题。先把标准流程走通再切自己的模型排查起来就清晰了。3.2.2 导出ONNX拿到.pt权重之后下一步是导出ONNX。这一步的核心是让导出的模型结构干净、算子标准。在YOLOv5仓库环境下执行python3 export.py --weights yolov5s.pt --include onnx --opset 11 --simplify这里有三个参数需要留意--opset 11ONNX算子集版本昇腾ATC对opset 11的支持最完善opset 13以上部分算子可能不支持或需要额外映射。--simplify用onnx-simplifier对计算图做简化把一些冗余节点合并掉能减小转换失败概率。--include onnx只导出ONNX不用导出TorchScript和TensorRT引擎。导出完成之后用Netron打开看一下图结构确认输入输出的shape是否符合预期。YOLOv5的标准输出是三个不同尺度的特征图形状类似[1, 25200, 85]或[1, 3, 20, 20, 85]这样的组合具体取决于模型导出时是否合并了检测头。后期在ATC转换和推理时你要根据这个输出结构决定后处理怎么接。4. YOLO模型转换从PyTorch到OM格式4.1 认识ATC与模型转换流程ATC全称Ascend Tensor Compiler是CANN自带的离线模型转换工具。它把你从PyTorch导出的ONNX模型编译成OM格式OM文件里不仅包含优化后的算子指令还包含模型的权重数据和图结构信息。形象一点说ONNX模型相当于一份源代码ATC像一个编译器把源代码编译成本地机器码。编译的过程中它会做很多图优化比如算子融合、常量折叠、内存复用。所以OM格式的推理性能往往比直接把ONNX模型逐算子执行要高不少。ATC转换的典型命令长这样atc --modelyolov5s.onnx \ --framework5 \ --outputyolov5s_bs1 \ --input_shapeimages:1,3,640,640 \ --output_typeFP16 \ --soc_versionAscend310P3 \ --insert_op_confaipp_yolov5.cfg \ --enable_small_channel1 \ --loginfo参数逐个解释--model输入ONNX模型路径。--framework5表示ONNX。昇腾模型输入类型中1是MindSpore2是TensorFlow5是ONNX。--output输出的OM文件名前缀。--input_shape指定输入动态尺寸。这里写了固定的1x3x640x640。--output_typeFP16推理精度选择FP16。YOLOv5的检测任务用FP16完全够精度损失可以忽略不计但推理速度能快不少。--soc_version芯片型号。Atlas 300V 24G对应的310P系列芯片版本要填对填错会直接报错。--insert_op_conf插入AIPP预处理配置包括图像缩放、归一化、色域转换等。--enable_small_channel1小通道优化对YOLO这种多分支结构有一定加速效果。4.2 AIPP预处理配置最容易忽略的坑很多人在转换OM之后用Python脚本里手动做resize、归一化再把处理后的数组塞给模型。这样做没问题但性能上有一个隐患图像预处理占用了CPU资源而且处理好的数据需要从CPU内存拷贝到NPU内存DMA带宽白花了一部分。更优的做法是把预处理交给AIPP去做。AIPP是AI Preprocessing的缩写它允许你将图像的缩放、裁剪、归一化、BGR/RGB转换这些操作配置在OM模型里让NPU在推理前自动完成预处理。一个YOLOv5常用的AIPP配置示例aipp_op { aipp_mode: static input_format: RGB888_U8 mean_value: 0.0, 0.0, 0.0 min_value: 0.0, 0.0, 0.0 max_value: 255.0, 255.0, 255.0 crop: 0 resize: 1 src_image_size_w: 640 src_image_size_h: 640 load_start_pos_h: 0 load_start_pos_w: 0 crop_size_w: 640 crop_size_h: 640 csc_switch: 0 }这里的关键参数input_format输入图像的原始格式。如果你的摄像头是BGR顺序而模型训练时用的是RGB注意转换。mean_value/min_value/max_value归一化参数。YOLOv5使用0-1归一化所以设置是max255mean0。resize告诉NPU要缩放图像。实际部署时如果你把原始图像先缩放成640x640再传给模型AIPP里的resize就不能再开否则会二次缩放。这一点需要根据你的整体设计灵活调整。csc_switch颜色空间转换开关。使用AIPP之后你传给模型的输入可以直接是yuv420sp或rgb888裸字节省去CPU端大量OpenCV操作。一个1080P视频流如果每帧都做缩放归一化CPU占用率能省下10%到30%在多路视频场景里非常可观。4.3 动态Batch与多路推理的取舍YOLO部署到Atlas你很快会面临一个抉择模型转OM的时候输入shape是固定成单batch好还是用动态batch好固定batch是最简单、最稳妥的方案。比如--input_shapeimages:1,3,640,640模型每次只能处理一张图。如果要做多路视频推理就在代码里起多个线程或进程每个线程独立申请一个推理上下文彼此不干扰。这个方案代码简单但线程多了之后CPU调度和内存开销会变大。动态batch在ATC里用dynamic_batch_size参数配置比如--input_shapeimages:-1,3,640,640 \ --dynamic_batch_size1,2,4,8这样模型在运行时可以按1、2、4、8的batch来推理。多路视频流可以凑成一个batch一起送进去NPU吞吐量更高。但代价是模型在推理时内存分配会更复杂首次推理可能慢一些而且如果你的框架或推理代码没有做好batch的batch务逻辑很容易出现访问越界、数据错位的问题。我的经验是对新手来说先固定batch跑通功能跑通之后再优化成动态batch。如果是单路高清视频做实时检测固定batch完全够用如果是多路低分辨率视频或图片批处理动态batch收益更大。5. 推理部署与性能调优5.1 基于AscendCL的Python推理示例模型转成OM之后进入部署环节。最底层、最可控的方式是用AscendCL的Python接口写推理代码。CANN Toolkit里自带了Python的acllite库封装了模型加载、输入输出缓冲区管理、推理执行的常见操作。一个最小可用的YOLO推理代码骨架import acl import numpy as np from tqdm import tqdm # 初始化ACL acl.init() ret acl.rt.set_device(0) # 加载模型 model_path yolov5s_bs1.om model_id, ret acl.mdl.load_from_file(model_path) model_desc acl.mdl.create_desc() acl.mdl.get_desc(model_desc, model_id) # 获取模型输入输出信息 input_size acl.mdl.get_num_inputs(model_desc) output_size acl.mdl.get_num_outputs(model_desc) input_dims acl.mdl.get_input_dims(model_desc, 0) output_dims acl.mdl.get_output_dims(model_desc, 0) # 准备输入数据这里假设是RESIZED好的640x640 RGB图像 input_data np.random.randn(1, 3, 640, 640).astype(np.float16) # 申请设备内存 input_buffer acl.rt.malloc(input_data.nbytes, ACL_MEM_MALLOC_NORMAL_ONLY) acl.rt.memcpy(input_buffer, input_data.nbytes, input_data.tobytes(), input_data.nbytes, ACL_MEMCPY_DEVICE_TO_DEVICE) # 输出缓冲区 output_data_size acl.mdl.get_output_size_by_index(model_desc, 0) output_buffer, ret acl.rt.malloc(output_data_size, ACL_MEM_MALLOC_NORMAL_ONLY) # 执行推理 acl.mdl.execute(model_id, [input_buffer], [output_buffer]) # 拷贝回主机 output np.zeros(output_data_size, dtypenp.uint8) acl.rt.memcpy(output.data_ptr, output.size, output_buffer, output_data_size, ACL_MEMCPY_DEVICE_TO_HOST) # 后处理这里需要解析YOLO输出 # 解析逻辑略但要注意YOLOv5的输出解码置信度过滤、NMS在CPU端完成即可 acl.rt.free(input_buffer) acl.rt.free(output_buffer) acl.mdl.unload(model_id) acl.rt.reset_device(0) acl.finalize()这段代码里没有包含完整的后处理逻辑因为YOLO后处理Node网络置信度过滤、类别筛选、NMS本身写出来可能要300行这里先把推理主流程展示清楚。实际项目中我会把NMS逻辑封装成独立的函数输入是模型输出的原始张量输出是最终的检测框列表。5.2 算子融合与内存优化用ATC转OM时有几个关键优化参数直接决定推理性能。第一个是--enable_small_channel1。它开启小通道优化对1x1卷积、较小的通道数分支有专门优化YOLO的检测头密集大量的小卷积这个参数对性能提升非常明显。第二个是--op_precision_mode。它可以指定某些算子的计算精度模式。比如在部分模型里允许一些算子用FP16而是不用FP32可以显著降低内存带宽压力。第三个是--optimize_level。O0到O3几个级别级别越高优化越激进。默认是O2兼顾性能和稳定性。如果你追求极致性能试O3但注意验证精度是否有异常波动。内存方面AscendCL的数据搬运开销经常被人忽视。推理之前把输入图像从CPU内存拷贝到NPU设备内存是一笔不小的开销。如果做多路视频流建议提前把输入数据的缓冲区复用起来不要每帧都malloc和free。可以开一个内存池每次只拷贝数据内容而不重新申请设备内存。另外你的推理线程和数据处理线程如果分开中间用队列做缓冲能大幅减少视频流抖动带来的推理阻塞。5.3 实测性能参考以YOLOv5s为基准分辨率640x640Atlas 300V 24G在FP16精度、单batch模式下的实测数据我给出一个参考范围模型分辨率Batch单帧时延吞吐量功耗YOLOv5s640x64013~5 ms200~300 FPS约60WYOLOv5m640x64018~12 ms80~120 FPS约70WYOLOv8s640x64014~7 ms150~250 FPS约65W这个数据受服务器CPU、PCIe版本、驱动版本影响会有浮动但量级不会差太多。对比同价位GPUAtlas在这类小模型的推理上并不吃亏功耗还低。如果是多路视频流场景用动态batch跑YOLOv5s单卡跑到10~15路1080P是可行的前提是CPU端解码和缩放不能成为瓶颈。注意如果你发现单帧推理时间远大于这个范围先别急着怪硬件排查顺序是模型是否用AIPP做了预处理没AIPP时CPU转码会拖后腿、输出是否是FP16、数据拷回CPU的过程是否每帧都malloc、NPU利用率是否跑满npu-smi info watch 1。6. 常见问题与排障实录6.1 算子不支持或转换失败ATC转换时报算子不支持是最常见的问题。报错信息里通常会说明哪个算子不支持比如[ERROR] FMK: Unsupported op: [Slice], type: [aicore]解决办法有几个方向检查ONNX导出时的opset版本如果opset太高尝试降到11或12。检查模型里是否有自定义算子若有需要用MindStudio做算子注册或改写模型结构。尝试关闭一些高级优化再转换比如不加--enable_small_channel或者把--optimize_level降为O1。如果某个算子反复不支持可以考虑把这个算子替换成等价的标准算子。比如部分模型的Gather算子可以用SplitConcat组合替代。另外ONNX里常见的ConstantOfShape、NonMaxSuppression这类动态Shape算子ATC支持情况不稳定建议在导出时就把后处理NMS逻辑去掉让模型只输出原始特征图NMS放到后处理代码里做CPU运算。6.2 内存不够或多卡负载不均如果加载OM模型时报内存不足优先排查几点24G内存是否被其他进程占用。npu-smi info能看到当前内存使用率如果别的模型占着没释放需要重启应用或释放上下文。模型输入shape是否过大。比如输入分辨率从640x640改成1920x1080内存占用会成倍增长超出显存也不奇怪。多张卡负载不均有些任务默认都跑到0号卡上其他卡空着。需要在代码里指定rt_set_device的编号或者用多个进程分别绑定不同的设备。6.3 推理结果不对或精度下降明显转换后推理结果不对先确认输入数据的处理方式和训练时是否一致。比如训练时用的是RGB输入给模型的却是BGR训练时归一化方式用的是除以255而你用AIPP配的mean0min0max255那是对的但如果你在代码里又做了一次除以255就会出问题。FP16精度导致的精度下降也要观测。YOLOv5官方模型用FP16推理在多数场景下没问题但如果你自己训练的模型在归一化或损失函数里用了特殊处理可能出现边界框回归精度不够的情况。这时候可以尝试转OM时用FP32输出类型对比结果差异确认是不是精度模式导致的。6.4 性能上不去先别急着优化代码如果性能不达标我建议按这个顺序排查先用官方YOLOv5s模型、固定batch、关闭所有后处理只测NPU原始推理时间。如果这时性能正常问题出在后处理或者数据链路。检查CPU端图像预处理是否拖后腿。用AIPP把缩放归一化挪到NPU端。检查是否存在数据频繁从CPU拷贝到NPU再拷回的情况尽量把批处理和数据流做成流水线。看看日志里有没有算子回退到CPU的警告。有个别算子如果NPU不支持实时的图编译会把它放CPU执行性能骤降。7. 我的几点实操体会最后聊几个经验层面的事。Atlas 300V 24G这套东西最打动我的不是单帧时延能跑到多低而是长期部署的稳定性。GPU服务器跑推理偶尔会遇到驱动crash、显存泄漏的问题昇腾生态在工业现场的稳定性口碑至少我用下来是能让人放心的。另一个体会是版本管理这块昇腾的驱动、固件、CANN版本耦合比较紧建议在团队内部建立一个镜像仓库把常用的run包和Docker镜像都存起来新人来了直接拉镜像就能干活避免每个人各自下载不同版本导致环境不一致。有一次我在客户现场调模型单路视频时延只有5毫秒但路数一多性能断崖式下跌。排查到最后发现是每个线程申请了独立的ACL上下文导致NPU内存被大量重复占用改成共享同一上下文、用batch拼接输入之后吞吐量直接翻了接近一倍。这种问题在Docker容器里跑的时候尤其隐蔽因为容器内npu-smi看的还是宿主机视角你甚至会以为资源充足。如果你打算在生产环境长期依赖Atlas跑YOLO我强烈建议你做两件额外的事一是把日志单独接到一个监控看板里跟踪每路视频流的推理时延和失败率二是把模型版本和OM文件一起归档因为OM文件换一个ATC版本重新生成性能特性和算子实现都可能变化不归档就容易出现“昨天还正常今天莫名变慢”的问题。Atlas不是那种开箱即用、什么都能跑的通用设备它需要你花一两天时间把工具链捋顺一旦熟悉了它的脾气在推理部署这个环节会非常顺手。如果你正打算在Atlas上跑YOLO希望这篇内容能帮你少踩几个我踩过的坑。
返回列表