ARTICLE DETAIL

资讯详情

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

Atlas 300V 24G推理加速卡部署YOLO实战:从环境配置到性能调优

Atlas 300V 24G推理加速卡部署YOLO实战:从环境配置到性能调优 最近项目要从GPU迁移到国产加速卡上做目标检测手头刚好拿到一张Atlas 300V 24G公司群里同时有人在问“Atlas 300V 24G到底是不是运算加速卡”以及“能不能用来部署YOLO”。这两个问题恰好也是我踩坑过程中反复确认过的干脆抽个时间把整个接入过程、模型转换流程和调优经验整理成文给后面要上手的人省点时间。先说结论Atlas 300V 24G是一张NPU架构的AI推理加速卡不是传统意义上的显卡但它的定位跟“运算加速卡”高度重合专门用来跑神经网络推理任务而且部署YOLO系列模型完全没问题。这篇文章就围绕这张卡把从环境准备到YOLOv5/v8部署、再到性能调优和问题排查的整套实操经验写清楚适合算法工程师、部署工程师以及想在国产推理卡上跑视觉模型的团队参考。1. Atlas 300V 24G到底是什么卡1.1 它不是“显卡”但确实是运算加速卡很多刚接触Atlas的人第一反应是“这玩意儿长得像显卡是不是就是显卡”其实差得很远。Atlas 300V 24G是一张半高半长的PCIe加速卡外形跟GPU类似有一个标准PCIe x16接口需要外接8pin供电整卡功耗在75W左右。但卡上核心不是CUDA架构处理器而是昇腾NPU编程模型也不是CUDA而是Ascend CL对应的软件栈是CANN。这里就有个很重要的认知作为技术人员你不能把它当GPU用不能直接跑PyTorch或者TensorFlow原生模型也不能直接把torch.cuda的代码拿过来。它的优势在于专门优化了神经网络算子特别是卷积、矩阵乘、归一化这一类在推理场景下单位功耗的算力表现很好特别适合大批量视频流、图片分类、目标检测这种固定模型、固定输入的负载。我拿到的是24G显存版本24GB HBM内存这是什么概念呢当前主流的YOLOv5s、YOLOv8s模型权重只有几十MB到一百多MB24G显存放这些模型绰绰有余甚至可以同时载入多个模型做多模型推理或者跑超大输入分辨率比如原图直接进网络不做压缩这是很多8G显卡做不到的。这也是Atlas 300V 24G在安防、工业质检、智慧交通等领域特别受欢迎的原因。1.2 算力指标与场景匹配Atlas 300V共有不同配置24G版本属于高配款。根据公开资料和实测参考值它的INT8算力在140TOPS左右FP16算力在70TFLOPS左右跟NVIDIA T4对比的话INT8算力明显高于T4的130TOPS而功耗只有T4的一多半。拿我们实际的YOLOv5s部署来说GPU上用T4跑单路1080p视频流FP16推理延迟大概是10~15ms一帧Atlas 300V 24G上用转好的OM模型在同样的输入分辨率下FP16延迟大概是12~18msINT8优化后能压到6~10ms。如果对精度损失容忍度高用INT8量化后延迟还能再降。对于大多数业务场景这个性能是够用的而且多卡并列部署非常方便一个机箱里塞几张卡就能水平扩展。1.3 适合谁来用如果你满足以下任何一个条件Atlas 300V 24G就很值得考虑项目有国产化选型需求需要用到国产AI推理硬件服务器机房功耗和机箱空间有限不想上大功耗GPU业务模型相对固定不需要频繁训练只需做高吞吐推理输入是图像/视频流模型是YOLO、ResNet、Transformer这类主流结构。反过来如果你需要跑大语言模型训练、需要CUDA生态里那些复杂自定义算子、或者需要折腾TensorRT的插件开发那Atlas 300V就不适合你不如老老实实用GPU。这个选型判断要先做好不然后面一切都是白费功夫。2. 部署环境准备与软件栈搭建2.1 操作系统与硬件环境要求Atlas 300V 24G支持x86和ARM平台的服务器常见的是Intel Xeon或者鲲鹏920。操作系统建议用Ubuntu 20.04或22.04 LTS官方也支持CentOS 7.6/8.2等但我在实际使用中觉得Ubuntu生态最顺手Python版本、第三方库的兼容性都更省心。硬件层面有几个硬性要求服务器主板要有至少一个PCIe x16插槽建议x16通道x8也行但带宽会打折电源供电要充足一张卡75W多张卡注意总功率服务器BIOS里要开启Above 4G Decoding和Resizable BAR否则驱动可能无法正确识别卡的内存空间。我第一次插卡后npu-smi info什么都看不到排查了半天发现是BIOS里Above 4G Decoding没开。这个问题非常隐蔽很多人卡在这里。2.2 安装驱动、固件与CANN工具包环境准备的核心是软件栈主要包括三样东西驱动、固件、CANN Toolkit。这三者的版本必须匹配官方文档里每个版本都对应一个版本配套表可以照着来。我自己习惯用CANN 7.0或8.0版本配套的驱动是Ascend HDK 24.1.rc1或类似版本。安装驱动的命令大致是chmod x Ascend-hdk-*.run ./Ascend-hdk-*.run --full --quiet装完驱动后安装固件./Ascend-hdk-*.run --firmware --quiet然后安装CANN Toolkit./Ascend-cann-toolkit_*.run --install --quiet安装完成后必须source环境变量source /usr/local/Ascend/ascend-toolkit/set_env.sh建议把这一行加到~/.bashrc里不然每次新终端都要手动source一次。很多人部署完开始跑demo报找不到te模块或者acl动态库99%都是环境变量没生效。验证驱动安装成功的命令npu-smi info如果能看到卡的型号、内存、算力状态说明驱动已经识别到卡了。再验证CANN是否正常python3 -c import acl; print(acl.__version__)能打印出版本号就说明环境基本OK。2.3 容器化部署注意事项如果团队希望用Docker容器隔离环境Atlas也提供了配套的容器镜像。在做容器部署时有个关键点容器启动时必须挂载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/Ascend/ascend-toolkit:/usr/local/Ascend/ascend-toolkit \ -v /etc/ascend_install.info:/etc/ascend_install.info \ -e ASCEND_VISIBLE_DEVICES0 \ 镜像名 /bin/bash这里的ASCEND_VISIBLE_DEVICES0类似CUDA的CUDA_VISIBLE_DEVICES用来指定容器能看到哪张卡。多卡环境下尤其重要不然可能会互相抢卡。容器内还要重新source/usr/local/Ascend/ascend-toolkit/set_env.sh。用容器我实际遇到的坑是宿主机驱动升级后容器里的driver挂载目录版本不匹配导致npu-smi看不到卡但容器里进程又能正常跑推理非常玄学。排查下来发现是容器内的libascend_hal.so等驱动库来自宿主机挂载目录版本不一致就会出现这种“能跑但检测不到”的怪现象。建议驱动升级后容器重建不要图省事。3. YOLO模型转换全流程3.1 为什么不能直接跑PyTorch模型Atlas的推理引擎只认两种格式OM格式Offline Model和MindIR格式MindSpore模型。PyTorch的pt/pth文件或者ONNX都不行必须经atc工具转换。转换过程会做算子的映射和融合最后生成一个静态或者动态shape的OM模型。这一步是整个部署链路里技术含量最高的环节也是坑最多的地方。前端模型的算子稍微特殊一点就可能转换失败或者推理结果不对。3.2 从PyTorch导出ONNX这里以YOLOv5s为例。首先把PyTorch模型导出为ONNXimport torch model torch.load(yolov5s.pt, map_locationcpu)[model].float() model.eval() dummy_input torch.randn(1, 3, 640, 640) torch.onnx.export( model, dummy_input, yolov5s.onnx, opset_version11, input_names[images], output_names[output] )有几个细节要注意opset_version建议11或者12太高或太低都可能触发CANN不支持的算子导出的模型不要把NMS逻辑加进去YOLOv5训练出的模型输出是raw predictions后处理置信度过滤、NMS放在Python/C侧做如果模型里带了NMSatc转换经常会失败导出时输入shape固定为1x3x640x640这个后面在atc转换时可以再调有些模型的export_script里默认开启了NMS选项需要关掉。YOLOv8的导出也类似torch.onnx.export或者用ultralytics自带的model.export(formatonnx)都可以同样的opset选择12左右。3.3 使用atc工具转换OM模型ONNX准备好后创建转换脚本convert_om.shsource /usr/local/Ascend/ascend-toolkit/set_env.sh atc \ --modelyolov5s.onnx \ --framework5 \ --outputyolov5s_ascend \ --input_shapeimages:1,3,640,640 \ --soc_versionAscend310P3 \ --insert_op_confaipp.cfg \ --output_typeFP16 \ --loginfo参数说明--framework5表示输入的是ONNX模型--output生成OM文件的路径前缀--input_shape固定shape格式是“输入名:维度”--soc_version这个要根据卡上NPU芯片型号来填Atlas 300V 24G通常是Ascend 910B系列或310P系列可以用npu-smi info查询具体型号填错会直接报错--insert_op_conf插入AIPP预处理配置文件--output_typeFP16指定网络计算精度为FP16比FP32快很多。3.4 AIPP配置文件与预处理下沉AIPPAI Preprocessing是一个非常实用的功能可以让NPU在推理前直接做图像的缩放、减均值、除方差等预处理操作这样应用侧只需要把原始JPEG图像数据传到NPU省掉了CPU侧的resize和normalize开销。配置如下aipp_op { aipp_mode: static input_format: RGB888_U8 src_image_size_w: 640 src_image_size_h: 640 csc_switch: false rbuv_swap_switch: false mean_chn_0: 0 mean_chn_1: 0 mean_chn_2: 0 min_chn_0: 0.003921569 min_chn_1: 0.003921569 min_chn_2: 0.003921569 }这里有一个容易踩坑的点YOLOv5训练时对图像做的归一化是除以255所以AIPP里min_chn填0.003921569即1/255。如果YOLOv8默认也是除以255同样的设置。但如果你的模型用了ImageNet的mean/std如R-CNN系列就要填训练时的mean和std参数。input_format: RGB888_U8表示输入数据是RGB格式、每个通道8bit无符号整数如果应用侧传的是BGR需要把rbuv_swap_switch置为true但要注意改了之后槽位通道顺序对不上会导致检测结果全乱。AIPP最大的价值在于省掉CPU预处理。实测下来在1080p视频流场景中如果不在AIPP做缩放而是用OpenCV先resize到640x640再做推理CPU占用率会增加30%左右在PCIe带宽有限的情况下整体吞吐反而会下降。所以能用AIPP就用AIPP让NPU多干活CPU少干活。3.5 转换失败与精度异常的排查转换阶段最常见的报错就是算子不支持比如某个自定义算子或者很新的Transformer算子。解决办法有几个方向降低onnx opset版本重新导出用--logdebug查看atc日志定位到具体哪个算子不支持将模型拆成两个子网络前端运行在NPU特殊算子跑CPU但性能会打折扣一般不推荐如果用了YOLOv5的Focus层新版CANN对Focus有融合优化不需要手工拆分SPPF、C2f这些结构和CANN的适配已经很成熟不用做额外处理。转换成功后用一个简单的Python脚本或者MindX SDK测试推理把结果对比PyTorch输出。如果置信度分布差异很大先检查AIPP的mean/std是否和训练时一致再检查输入图像通道顺序。我遇到过两次“检测框全乱了”的问题一次是AIPP里忘了配mean另一次是模型导出时导入了带NMS的版本。4. 推理部署实操与代码实现4.1 快速上手用MindX SDK搭推理流CANN虽然有ACL底层API但直接用ACL写推理代码非常啰嗦要管理device初始化、上下文、内存拷贝、stream同步等一大堆事对快速验证不友好。更快的方案是使用MindX SDK比如mxVision它把推理过程抽象成pipline你可以像搭积木一样把“读图、缩放、推理、后处理”串起来。一个典型的YOLOv5 pipline配置如下{ pipeline: [ { unit_type: appsrc, unit_name: appsrc0 }, { unit_type: mxpi_imagedecode, unit_name: mxpi_imagedecode0 }, { unit_type: mxpi_imagecrop, unit_name: mxpi_imagecrop0 }, { unit_type: mxpi_tensorinfer, unit_name: mxpi_tensorinfer0, props: { modelPath: ./model/yolov5s_ascend.om } }, { unit_type: mxpi_objectpostprocess, unit_name: mxpi_objectpostprocess0, props: { postProcessConfigPath: ./config/yolov5_postprocess.cfg } } ] }这个方式适合快速跑通demo但如果业务逻辑复杂、需要自己控制前后处理细节我反而更推荐直接用ACL Python接口灵活性更高也方便和业务代码集成。4.2 用Python ACL接口写推理代码这里给一个精简但完整的Python推理框架。由于代码篇幅较长我贴核心部分并加注释。首先初始化import acl import numpy as np ACL_MEMCPY_DEVICE_TO_DEVICE 2 # 实际值以头文件为准 ACL_MEMCPY_DEVICE_TO_HOST 3 ACL_MEMCPY_HOST_TO_DEVICE 4 acl.init() ret acl.rt.set_device(0) # 使用0号卡 context, ret acl.rt.create_context(0) # 加载模型 model_path b./yolov5s_ascend.om model_id, ret acl.mdl.load_from_file(model_path) # 通过模型描述符获取输入输出的shape model_desc acl.mdl.create_desc() ret acl.mdl.get_desc(model_desc, model_id)然后准备输入数据。这里以AIPP方式输入原始图像为例直接把JPEG解码后的RGB数据不需要resize和normalize拷贝到device侧交给NPU处理# 假设src_data是HWC的RGB数组dtypeuint8 input_data src_data.astype(np.uint8).flatten() # 申请device内存并拷贝 n_input acl.mdl.get_num_inputs(model_desc) input_size acl.mdl.get_input_size_by_index(model_desc, 0) input_ptr, ret acl.rt.malloc(input_size, 2) # 2表示内存对齐 ret acl.rt.memcpy(input_ptr, input_size, input_data.ctypes.data, input_data.nbytes, ACL_MEMCPY_HOST_TO_DEVICE) # 建dataset input_dataset acl.mdl.create_dataset() acl.mdl.add_dataset_buffer(input_dataset, input_ptr, input_size)接着同步推理取输出n_output acl.mdl.get_num_outputs(model_desc) output_size acl.mdl.get_output_size_by_index(model_desc, 0) output_ptr, ret acl.rt.malloc(output_size, 2) output_dataset acl.mdl.create_dataset() acl.mdl.add_dataset_buffer(output_dataset, output_ptr, output_size) ret acl.mdl.execute(model_id, input_dataset, output_dataset) # 拷贝回host output_np np.zeros(output_size, dtypenp.uint8) ret acl.rt.memcpy(output_np.ctypes.data, output_size, output_ptr, output_size, ACL_MEMCPY_DEVICE_TO_HOST) output_data np.frombuffer(output_np.tobytes(), dtypenp.float16).reshape([1, 25200, 85])注意上面reshape里的25200是YOLOv5s在640x640输入下三个stride8/16/32输出的先验框总数80x8040x4020x20 64001600400 8400。等一下这个数字要算对——640输入下YOLOv5每个尺度的anchor数80x80640040x40160020x20400合计8400每个位置3个锚框所以是三份总候选框是8400x325200。对25200没错。85 4 1 804个框坐标1个置信度80个类别。这里的output_datadtype要根据转换时的--output_type决定用了FP16就改成np.float16。4.3 YOLO后处理置信度过滤与NMS模型输出的25200x85矩阵里绝大多数框的置信度都很低先把它们过滤掉conf output_data[0, :, 4] # 目标置信度 class_conf output_data[0, :, 5:].max(axis1) final_conf conf * class_conf mask final_conf 0.25 if mask.sum() 0: return [] boxes output_data[0, mask, :4] scores final_conf[mask] classes output_data[0, mask, 5:].argmax(axis1) # xywh转xyxy boxes_xyxy np.zeros_like(boxes) boxes_xyxy[:, 0] boxes[:, 0] - boxes[:, 2] / 2 boxes_xyxy[:, 1] boxes[:, 1] - boxes[:, 3] / 2 boxes_xyxy[:, 2] boxes[:, 0] boxes[:, 2] / 2 boxes_xyxy[:, 3] boxes[:, 1] boxes[:, 3] / 2然后做NMS。如果不想引入OpenCV的dnn模块可以自己写一个简单的NMSdef nms(boxes, scores, iou_threshold0.45): indices np.argsort(scores)[::-1] keep [] while indices.size 0: i indices[0] keep.append(i) iou compute_iou(boxes[i], boxes[indices[1:]]) indices indices[1:][iou iou_threshold] return keep如果用OpenCV可以直接import cv2 keep cv2.dnn.NMSBoxes(boxes.tolist(), scores.tolist(), 0.25, 0.45)实测效率不错单帧几千个候选框的情况下NMS耗时也就一两毫秒。4.4 推理代码工程化的几个建议在正式业务中使用时有几个工程化要点需要提前规划不然后续扩量会很难受。内存复用acl.rt.malloc和acl.rt.free不能每帧都做合理做法是初始化阶段把所有device内存款分配好推理阶段反复使用最后释放。如果每帧都malloc/free你会看到内存碎片化严重甚至频繁OOM。多路流处理如果要对8路摄像头同时做推理建议创建多个线程每个线程绑定独立的context和stream不要让多路流共享同一个context。Atlas NPU上的stream并发能力比较强独立context可以避免线程间的同步竞争。模型输出处理OM模型输出的是连续的tensor数据在解析时尽量用numpy.view或者frombuffer不要用深拷贝尤其在大批量帧场景拷贝开销很可观。5. 性能调优与实测对比5.1 输入分辨率与batch size的选择YOLO模型对输入分辨率非常敏感分辨率越高推理延迟和内存占用越大。Atlas 300V 24G上我在不同分辨率下测过YOLOv5sFP16的推理延迟输入分辨率单帧延迟内存占用适用场景416x4166~8ms约4GB追求吞吐、对小目标要求不高640x64012~18ms约6GB通用场景推荐1280x128040~55ms约14GB小目标检测如航拍图Batch size方面固定分辨率下batch1的延迟最低但整体的吞吐不一定最高。如果在服务端做离线批量推理比如一批图片统一检测batch4或8时计算效率更高每帧平均延迟反而下降。业务里如果想追求吞吐建议在服务端设置动态batch把积压的请求聚合后再推理。5.2 AIPP利用率与数据传输优化很多人在Atlas上做性能优化时只关注模型本身的算子融合实际上图像传输开销往往被忽略。Atlas 300V通过PCIe与CPU通信如果每帧图像都要从CPU拷到NPU再从NPU把原始输出拷回CPUPCIe带宽很可能会饱和。优化方向尽量使用AIPP做预处理让NPU拿到的是原始JPEG/RGB数据直接“原样”进卡应用侧避免频繁的numpy转拷贝能用缓冲区复用就用缓冲区复用视频流场景可以把解码后的图像先放到一个内存池里推理线程从池中取数据数据量大的时候开启DMA拷贝的异步模式即拷贝和上一次推理计算重叠降低PCIe传输对流水线的阻塞。5.3 多卡并发与负载均衡Atlas 300V支持在一台服务器上插多张卡多卡场景下推荐结合Docker的ASCEND_VISIBLE_DEVICES做隔离并且用一个简单的任务队列分发请求。比如你开了4张卡可以做一个小型负载均衡器把任务轮询分发到4张卡上的4个独立服务进程。每张卡的Infer进程建议独占卡不要在单进程里创建太多contextcontext多了但NPU资源总量不变反而会引入调度开销。实测单卡单进程绑定一个context性能是最稳定的。5.4 数据流整体优化性能瓶颈不一定在NPU上。我用top和npu-smi info同时观察发现很多时候CPU占用率反而高于NPU利用率原因通常是解码、resize、后处理跑在CPU上。这时候应该做的不是压榨NPU而是优化CPU侧使用硬件解码比如ffmpeg的h264_cuvid或Atlas的DVPP硬件解码模块替代CPU软解后处理逻辑用多线程并行避免单线程逐帧顺序处理NMS中的大量list/dict操作尽量改用numpy向量化计算。DVPP是Atlas自带的硬件图像处理单元支持JPEG解码、缩放、格式转换性能远超CPU软解。在视频流场景中建议把解码和缩放都交给DVPP做。配置方式是在pipline里插入mxpi_videodecoder和mxpi_imageresize插件。6. 常见问题与排查技巧实录6.1 npu-smi看不到卡这个遇到的人最多原因通常是BIOS设置或者驱动未正确安装。排查顺序lspci | grep -i ascend确认PCIe设备已被系统识别查看BIOS中Above 4G Decoding是否开启确认驱动和固件版本配套重新安装如果是虚拟机还要确认是否做了PCIe直通。6.2 acl.mdl.load_from_file报错模型加载失败最可能是OM模型转换时用的soc_version和当前卡不匹配。先用npu-smi info查看NPU型号再重新用正确的--soc_version转换模型。还有一种情况是模型用了不支持的算子或者自定义算子此时看CANN日志最有效export ASCEND_GLOBAL_LOG_LEVEL1 export ASCEND_SLOG_PRINT_TO_STDOUT1日志级别是1时能输出详细报错信息能定位到具体算子。6.3 推理结果全乱或没有检测框这个问题排第二常见多数出在AIPP配置上。逐一检查mean/min参数是否与训练一致输入图像通道顺序是RGB还是BGR输入数据是否是uint8如果用了float数组AIPP的input_format要对应改模型输出的dtype是否和--output_type一致后处理里解析时要用对。6.4 内存持续增长长期驻留服务经常出现内存缓慢上涨多是因为device侧内存没有释放。排查方法检查每次推理后是否调用了acl.rt.free或acl.rt.destroy_stream;检查dataset buffer是否反复追加而没有清理检查是否在循环里调用了acl.mdl.get_desc等API但没对应acl.mdl.destroy_desc。内存问题不像CPU飙升那么明显但一旦跑上几天OOM就来了排查起来更头疼。6.5 视频流场景解码跟不上如果8路视频流跑起来CPU马上拉满推理倒是快的那就是解码瓶颈。优先把解码切到DVPP或者ffmpeg硬件解码不要用OpenCV的VideoCapture去软解。Atlas上比较推荐的流程是ffmpeg拉流 - 硬件解码到NV12 - DVPP转RGB并缩放 - AIPP推理整条链路都在硬件上完成CPU只做调度。6.6 精度相比GPU有差异如果同一模型在GPU和Atlas上推理结果不完全一致不要慌这是正常的。原因有几个Atlas默认使用FP16推理精度比FP32低一点个别极端输入可能有差异算子融合后的计算顺序不同浮点累加误差不一样AIPP的归一化实现可能和PyTorch有细微差别。应对方法如果能用FP32就在转换时指定--output_typeFP32但延迟会翻倍或者使用INT8量化并仔细校准一般检测框的IoU偏差在1%以内就不必担心。7. 部署监控与日志技巧7.1 用npu-smi监控卡状态维护阶段监控比部署更关键。除了肉眼查看npu-smi info建议写一个简单的定时脚本把NPU的利用率、温度、内存占用、HBM温度记录下来方便回溯问题。npu-smi info -t usages -i 0 -c 0 npu-smi info -t mem -i 0 -c 0 npu-smi info -t temperature -i 0 -c 0把这些输出灌入Prometheus或者其他时序数据库就能画出卡的使用曲线。在正式上线前先跑一段压测确认温度稳定在可接受范围内如果温度一直往上顶检查散热风扇和风道不然长期高温会缩短卡寿命。7.2 CANN日志等级控制CANN默认日志级别是INFO生产环境会产生大量日志占用磁盘。建议把日志级别调整为ERRORexport ASCEND_GLOBAL_LOG_LEVEL3级别1是DEBUG2是INFO3是WARNING4是ERROR。调试时候用1稳定运行用4即可。我见过有人带着默认日志跑了一个月日志目录塞满了十几个G最后还是停机清日志这种教训一次就够了。7.3 服务健康检查推理服务建议加一个健康检查接口定时给服务发送一张测试图判断返回的检测框数量是否正常。如果连续几次返回空或者置信度异常就认为NPU或模型出了问题触发重启或者报警。这个方法成本很低但能救你于无数个半夜排查事故中。最后再分享一个小技巧整个Atlas 300V 24G从环境搭建到YOLO模型完成部署我最大的感受就是Atlas生态和CUDA相比确实小众文档也不如NVIDIA那么全但只要把环境版本对应关系搞清楚把模型转换这个环节磨顺日常推理部署的体验其实不差尤其是INT8量化后性能很能打。如果后面做视频流分析建议提前规划好解码链路不要把压力全放在CPU上。Atlas自带的DVPP和AIPP都是好东西合理地用起来整条推理流水线能轻松压到很低延迟。我周围不少团队还在观望其实拿开发板先跑一个YOLOv5s做基准测试成本很低收益却很直观。等你们真的把第一个生产模型跑顺了会回来感谢这篇文章的。
返回列表