资讯动态

Atlas 300V 24G上部署YOLOv8s:从环境配置到推理优化全指南

发布时间:2026/9/25 9:27:42 来源:尧图企业网站定制
1. Atlas 300V 24G的定位确认它到底算不算一块运算加速卡先直接把热搜词里那个问题回答清楚Atlas 300V 24G是一块AI推理加速卡不是训练卡也不全是大家日常理解的GPU。它基于昇腾310P芯片官方定位是面向AI推理场景的加速模块所以你问它是运算加速卡吗答案是是但它的运算有明确边界——它擅长跑已经训练好的模型的前向推理不擅长做反向传播和梯度更新这类训练负载。我第一次拿到这块卡的时候也困惑过。看参数24GB显存比很多桌面级显卡都大接口是PCIe插上服务器就能用怎么看都像一块显卡。但它跟GPU有几处本质区别搞清楚这些再动手部署能省掉后面一大半的弯路第一架构取向不同。GPU走的是通用并行计算路线OpenCL、CUDA什么都能跑弹性大昇腾310P走的是专用电路加速路线对卷积、矩阵乘这类算子做了硬核固化同样的算力规模下推理功耗和时延都比GPU更有优势但灵活性差一些。第二软件栈完全不同。它不认CUDA生态里没有cuDNN、TensorRT这些工具取而代之的是华为的CANNCompute Architecture for Neural Networks。这意味着你在GPU上写好的YOLO推理代码不能直接搬过来跑至少要走一遍模型转换接口适配的流程。这正是本文要解决的核心问题。第三24G显存的意义。这块卡上的24GB不是给训练大Batch用的而是为了让你能一次性载入较大的模型、或者同时驻留多路模型实例。实测在YOLOv8s模型下塞进8个实例同时跑显存也才用了不到10GB。如果你只部署单个YOLO模型其实用不上这么大但它给了你很大的并发余量。下表是这块卡跟常见硬件的简要对位方便你判断自己到底需不需要它项目Atlas 300V 24G消费级GPU如RTX 4060数据中心GPU如A10核心定位AI推理加速图形通用计算训练/推理通用推理时延YOLOv8s640x640约5-8ms约8-12ms约4-6ms峰值功耗整卡72W115W150W软件生态CANNCUDACUDA常见部署方式服务器插卡无显示输出工作站/PC服务器购买成本中等较低高结论很明确如果你只有一个把模型跑起来的需求并且对时延、功耗有要求Atlas 300V 24G是合适的如果你需要频繁改模型结构、做训练调参它会让你很难受。这篇文章全篇以YOLOv8s为例介绍从零开始在这块卡上完成部署的完整流程。2. 部署YOLO前的环境搭建驱动、固件与CANN的版本匹配我踩过的第一个坑就是版本。Atlas的软件栈不像NVIDIA那样装个驱动再装个CUDA就完事它有驱动Driver、固件Firmware、CANN Toolkit三层三者之间严格的版本配套关系。官方文档里有一张配套矩阵表很多人直接忽略结果后面跑模型的时候报一堆莫名其妙的错。2.1 三层软件栈的作用驱动Driver操作系统与硬件之间的通道。它负责把PCIe上的设备枚举出来、管理显存、处理中断。驱动装不好npu-smi info命令大概率什么都看不到。固件Firmware芯片内部的控制程序相当于芯片的BIOS。它决定芯片怎么执行上层下发的指令任务、怎么管理内部缓存。CANN Toolkit你写代码时真正要调用的框架类似于CUDA Toolkit的角色。里面包含了ACLAscend Computing Language运行时库、ATC模型转换工具、算子库等。这三者必须严格按配套表安装。我第一次装的时候在服务器上随手拿了一个最新版CANN 8.0结果驱动还停留在7.0时代的版本运行任何推理任务都报runtime init failed。2.2 版本选择建议安装前先到华为昇腾社区的版本配套表里查清楚。以我当前使用的组合为例组件版本操作系统Ubuntu 22.04 LTS驱动23.0.3固件23.0.3CANN Toolkit7.0.RC1Python3.9这里有一个经验供参考不要追最新版CANN选择发布了六个月以上的版本最稳。因为新版本常有一些算子实现的微调遇到问题的概率更高社区解决方案也不够多。2.3 驱动和固件安装步骤安装包一般是从昇腾社区下载的.run文件。以驱动为例chmod x Ascend-hdk-910b-npu-driver_23.0.3_linux-aarch64.run ./Ascend-hdk-910b-npu-driver_23.0.3_linux-aarch64.run --full注意三个操作细节安装时要用--full参数它会同时安装默认配套的固件。如果你分别下两个包顺序必须是先驱动后固件反过来会失败。安装完成后一定要重启服务器别省这一步。不重启的话设备节点不会自动创建。用npu-smi info验证正常输出类似下面这样------------------------------------------------------------------------------------------- | npu-smi 23.0.3 Version: 23.0.3 | ------------------------------------------------------------------------------------------ | NPU Name | Health | Power(W) | Temp(C) | Hugepages-Free | | 300V | OK | 35.8 | 48 | 0 | ------------------------------------------------------------------------------------------看到Health: OK才算通过。2.4 CANN Toolkit安装CANN安装需要设置好环境变量否则后面命令总是找不到atc或者aclnn相关的工具链。# 下载并安装CANN这里以x86_64架构为例 ./Ascend-cann-toolkit_7.0.RC1_linux-x86_64.run --install # 安装完成以后手动设置环境变量建议写入~/.bashrc source /usr/local/Ascend/ascend-toolkit/set_env.sh然后检查是否安装成功which atc # 正常会输出类似路径 # /usr/local/Ascend/ascend-toolkit/latest/bin/atc如果你在容器里部署需要注意容器必须用--device/dev/davinci0挂载NPU设备同时还要挂载驱动相关的so目录一般位于/usr/local/Ascend/driver/lib64。我见过不少人在容器里漏挂驱动目录结果CANN运行时找不到NPU设备报Device not found。一个可用的Docker启动参数参考docker run -it --name yolo-atlas \ --device/dev/davinci0 \ --device/dev/davinci_manager \ -v /usr/local/Ascend/driver/lib64:/usr/local/Ascend/driver/lib64 \ -v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \ -v /usr/local/Ascend/ascend-toolkit:/usr/local/Ascend/ascend-toolkit \ --nethost \ your_image:tag现在环境准备好了下一步进入关键环节——模型转换。3. 从PyTorch到OMYOLO模型转换的完整链路与ATC参数细节Atlas 300V不接受PyTorch的.pt文件也不接受ONNX格式直接在芯片上跑。它只认自家的OM格式Offline Model离线模型所以整个部署链路是.pt权重文件 - ONNX - OM离线模型这一步是整个部署流程里最需要耐心的地方。很多人在GPU上用PyTorch推理非常熟练到这一步就卡住了报错信息又长又看不懂。3.1 第一步PyTorch导出ONNX我以YOLOv8s为例先加载权重再导出为ONNXimport torch from ultralytics import YOLO model YOLO(yolov8s.pt) model.model.eval() # 导出为ONNX固定batch1opset设为11CANN兼容性较好 dummy_input torch.randn(1, 3, 640, 640) torch.onnx.export( model.model, dummy_input, yolov8s.onnx, opset_version11, input_names[images], output_names[output0], dynamic_axesNone )这里有两个非常重要的细节影响后续能否直接成功必须设置dynamic_axesNone也就是固定输入尺寸。ATC转换时如果允许动态维度生成的OM模型在推理时会多一层动态shape分发的开销性能打折。对于YOLO这类目标检测模型固定为1x3x640x640就够了。即使有多个分辨率需求更好的做法是转换多个OM模型而不是用一个动态模型。ONNX Opset版本建议11。更高版本的opset比如13、17里面有一些算子如ScatterND的新变体在CANN 7.0上的兼容性还不太理想。3.2 第二步ATC工具把ONNX转成OMATC工具像是一个编译器把ONNX的算子图翻译成昇腾310P上能高效执行的指令。基本命令如下atc --modelyolov8s.onnx \ --framework5 \ --outputyolov8s_om \ --input_shapeimages:1,3,640,640 \ --soc_versionAscend310P3 \ --insert_op_confaipp_yolo.cfg \ --output_typeFP32几个参数必须解释清楚因为它们直接决定后面推理时数据怎么喂--framework55代表ONNX格式。常见枚举值里1是Caffe2是MindSpore3是TensorFlow5是ONNX。写错会直接报parse failed。--soc_versionAscend310P3这块卡对应的是Ascend310P3。你可以用npu-smi info查看芯片具体型号也可以使用atc --help查看支持的--soc_version列表。填错的话编译出来的OM模型虽然能生成加载到NPU时会报invalid model。--insert_op_confaipp_yolo.cfgAIPPAI Preprocessing是CANN提供的一个硬件级预处理功能可以把图像缩放、减均值、除方差这些操作从CPU搬到芯片的AI Core上执行非常实用。配置文件内容如下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: true 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 }这个配置的含义是输入图片先被缩放到640x640然后做色彩空间转换rbuv_swap_switch: true表示把RGB换成YOLO训练时用的RGB模式再把像素值除以255归一化到0~1。如果你不太确定怎么配最简单的方式是先不配置AIPP把预处理放到主机侧代码里做等整个链路跑通了再加AIPP优化性能。转换成功后你会得到一个yolov8s_om.om文件。可以通过atc --modelyolov8s.om --om_info之类的方式检查模型结构信息也可以用后续的aclmdlQuerySize接口在代码里查看所需内存大小。3.3 转出来的模型输出是什么YOLOv8s的ONNX输出是一个1x84x8400的张量其中84 4框坐标 80COCO类别8400 640/8的平方 640/16的平方 640/32的平方也就是三个检测尺度上的候选框总数。这个张量进入OM模型后输出格式不变你需要在后处理里解析它。这里有一个很反直觉的点OM模型并不包含非极大值抑制NMS。因为NMS属于动态逻辑循环、条件判断在AI芯片的静态图执行模型里实现很不划算所以标准做法是把NMS放到主机侧CPU上去做。这让很多人一开始以为模型没转对因为输出里有大量重叠框。其实这是正常现象。4. 推理代码的核心逻辑ACL接口下的预处理、推理与后处理环境搭好、模型转换好之后剩下的就是写推理代码。CANN的底层接口叫ACLAscend Computing Language用C语言风格暴露给上层同时提供Python绑定mindspore或者更底层的aclnnPython API。实际项目里我推荐直接用C写推理服务Python做原型验证。但为了演示清晰下面用Python API逐步说明。4.1 ACL初始化和设备管理代码的第一步是初始化ACL运行时就像CUDA里cudaSetDevice一样import acl ACL_DEVICE_ID 0 # 这张卡在系统里的设备编号可通过npu-smi查看 ret acl.init() assert ret 0, ACL初始化失败 ret acl.rt.set_device(ACL_DEVICE_ID) assert ret 0, 设备设置失败 context, ret acl.rt.create_context(ACL_DEVICE_ID)注意ACL运行时上下文绑定线程PyTorch的多线程推理在那里可能踩坑。如果后续你要用多线程并发推理建议每个线程独立创建context不要跨线程传递context对象。4.2 加载OM模型并从文件读取模型数据import os MODEL_PATH yolov8s_om.om # 加载模型文件到内存 with open(MODEL_PATH, rb) as f: model_data f.read() # 查询模型所需内存大小 model_id 0 ret acl.mdl.load_from_mem(model_data, model_id) assert ret 0, f模型加载失败, ret{ret}从这一刻起模型就常驻在NPU的显存里了。你可以把它理解成把程序装进显卡的显存之后每次推理都是直接调用这块驻留的模型。4.3 准备输入输出内存这是最容易出错的地方。ACL要求输入输出数据放在特定内存区域一般用acl.rt.malloc来分配。如果是从CPU侧把numpy数组拷贝过去步骤是import numpy as np # 输入shape: [1, 3, 640, 640]fp32 input_np np.random.randn(1, 3, 640, 640).astype(np.float32) input_size input_np.nbytes # 在NPU侧分配内存 input_ptr, ret acl.rt.malloc(input_size, ACL_MEM_MALLOC_NORMAL_ONLY) assert ret 0 # 把CPU数据拷到NPU侧 ret acl.rt.memcpy(input_ptr, input_size, input_np.ctypes.data, input_size, ACL_MEMCPY_DEVICE_TO_DEVICE)这里ACL_MEMCPY_DEVICE_TO_DEVICE其实是指从CPU内存拷贝到设备内存的异步直接内存访问模式直白说就是驱动会直接搬运不用你手动同步。接着同样分配输出内存。YOLOv8s的输出shape是[1, 84, 8400]每个元素是浮点数output_shape (1, 84, 8400) output_size int(np.prod(output_shape)) * 4 # float32占4字节 output_ptr, ret acl.rt.malloc(output_size, ACL_MEM_MALLOC_NORMAL_ONLY)然后构造ACL的数据集描述对象这是ACL里最容易晕的部分# 创建输入数据集 input_dataset acl.mdl.create_dataset() input_desc acl.mdl.create_data_desc() acl.mdl.set_data_desc(input_desc, 0, input_ptr, input_size) acl.mdl.add_dataset_buffer(input_dataset, input_desc) # 创建输出数据集 output_dataset acl.mdl.create_dataset() output_desc acl.mdl.create_data_desc() acl.mdl.set_data_desc(output_desc, 0, output_ptr, output_size) acl.mdl.add_dataset_buffer(output_dataset, output_desc)每次推理时都用这个dataset结构。它本质上是一个数据容器告诉芯片输入在哪、输出放在哪。4.4 执行推理并取回结果ret acl.mdl.execute(model_id, input_dataset, output_dataset) assert ret 0, f推理执行失败, ret{ret} # 把NPU上的结果拷回CPU output_np np.zeros(output_shape, dtypenp.float32) ret acl.rt.memcpy(output_np.ctypes.data, output_size, output_ptr, output_size, ACL_MEMCPY_DEVICE_TO_HOST)从output_np里每8400个元素为一组候选框信息。具体解析方式如下import numpy as np output output_np.reshape(1, 84, 8400)[0] # shape变为(84, 8400) transposed output.T # (8400, 84) boxes_xywh transposed[:, :4] # 中心点坐标宽高 class_scores transposed[:, 4:] # 每个类别的得分 # 取最大类别得分 max_scores np.max(class_scores, axis1) max_classes np.argmax(class_scores, axis1) # 过滤低分框 conf_threshold 0.25 valid_mask max_scores conf_threshold if valid_mask.any(): valid_boxes boxes_xywh[valid_mask] valid_scores max_scores[valid_mask] valid_classes max_classes[valid_mask] else: valid_boxes, valid_scores, valid_classes [], [], []拿到过滤后的框之后再用标准NMS去除重叠框。这里注意一个细节YOLOv8的坐标输出是中心点格式需要转成x1y1x2y2才能用OpenCV的rectangle画出来。def xywh_to_xyxy(boxes): x_center, y_center, w, h boxes[:, 0], boxes[:, 1], boxes[:, 2], boxes[:, 3] x1 x_center - w / 2 y1 y_center - h / 2 x2 x_center w / 2 y2 y_center h / 2 return np.stack([x1, y1, x2, y2], axis1)整个推理流程到这儿就通了。初次跑通这段代码我大概花了一个下午其中一半时间都耗在搞清楚ACL的dataset结构上。5. 踩坑实录四个典型问题与完整排查链路这一节我想把实际部署中遇到的四个问题完整写出来因为它们非常典型几乎所有Atlas新手都会遇到。每个问题我都给出现象 - 排查 - 结论的完整链路你可以按图索骥。5.1 问题一ATC转换失败报Unsupported Op现象执行ATC转换命令后日志末尾出现类似[ERROR] Unsupported op: [ScatterND]的报错后面跟着一堆算子名。排查过程我最初以为ONNX导出有问题重新导出了三次换不同opset依然报错。我去查了CANN的算子支持列表发现CANN 7.0对ONNX算子的支持是按需覆盖的。具体来说如果模型里某个运算在芯片上没有专门电路它会尝试用基础算子拆解拼凑。如果拆不了就直接报Unsupported。关键一步打开ATC日志的调试模式看看是哪一层网络触发了这个算子。命令加--debug_dir./atc_debug然后检查plog目录下的详细日志。最终定位YOLOv8导出ONNX时torch.onnx.export默认会尝试把一些reshape操作转换成ScatterND而CANN又没法高效拆分它。解决办法导出ONNX时给torch.onnx.export加上dynamic_axesNone、opset_version11同时把模型的model.model.eval()放在导出前。如果还不行可以尝试用onnx-simplifier简化模型pip install onnx-simplifier python -m onnxsim yolov8s.onnx yolov8s_sim.onnx简化后的模型通常会去掉大量冗余reshape、transpose算子ATC转换的兼容性会好很多。5.2 问题二推理结果全为0或者框的位置完全乱掉现象模型能加载、能执行、不报错但打印出来的框坐标全部是0或者坐标明显超出图像范围。排查过程我一开始怀疑是模型转换问题重新转了几次问题依旧。打印OM模型的输出shape确认是[1, 84, 8400]正常。仔细检查了输入数据我在主机侧用OpenCV读图、转成RGB、resize到640x640、再归一化然后拷贝给NPU。看起来没问题但结果还是乱的。后来突然反应过来AIPP配置了但我的输入数据也做了归一化等于归一化了两次。第一次也是踩这个坑把AIPP打开的情况下主机侧又除以255模型输入分布完全错误输出全乱。解决办法二选一不要同时做。方案A去掉AIPP配置所有预处理放在主机侧。这样最直观也最容易调试只是性能稍微损失一点。方案B保留AIPP主机侧只做resize和RGB转换不做归一化。AIPP会自动帮你除以255。从性能角度看方案B更有优势因为归一化挪到了芯片上执行CPU和内存带宽的压力都小。但如果你刚开始上手我强烈建议先用方案A跑通再切到方案B优化性能。5.3 问题三推理时延30ms完全达不到预期现象第一次跑通了但算下来一帧图像推理要28-35ms和网上说的5-8ms差距巨大心里发慌。排查过程用npu-smi info看NPU利用率发现利用率和功耗都很低说明芯片根本没跑满。查代码发现每次推理前都在用acl.mdl.load_from_mem重新加载模型然后再执行推理。这等于每一次推理都重新加载一次模型文件耗时当然高。修复后推理时延降到9ms左右但离5ms还有距离。进一步排查发现输入数据在主机侧是numpy数组每次推理都需要从CPU拷贝到NPU。这个拷贝本身消耗3-4ms。再加上预处理还没有用AIPP整体时间还是偏高。解决办法模型权重在初始化时加载一次之后常驻显存不要反复加载。使用acl.mdl.execute_async异步接口上一帧的后处理可以和下一帧的推理并行执行。把预处理切到AIPP省掉主机侧resizenormalize的耗时时延直接降到5.5ms左右。下面是我在开启异步和AIPP后的实测对比部署方式预处理位置推理时延吞吐主机侧全预处理 同步推理CPU28-35ms约30 FPS模型常驻 同步推理CPU9-12ms约85 FPSAIPP 异步推理NPU5.5-7.5ms约140 FPS从这张表可以清楚看到性能瓶颈往往不在芯片本身而在数据搬运和排队方式上。5.4 问题四多路视频流推理时内存泄漏现象用这个模型去推理多路视频流一开始很正常跑了几个小时后内存稳步上涨最终OOM。排查过程在本地循环推理1000次观察内存发现每次推理内存上涨几MB但不会回落。怀疑是ACL的dataset对象没有释放。检查代码发现我在每一帧推理时都新建输入输出的dataset但只用acl.mdl.destroy_dataset()释放了其中的一部分另一个数据集一直没释放。进一步用acl.rt.mem_free释放输入输出显存的时候发现有个指针是NULL说明之前某次异常路径导致内存没有正确释放。解决办法推理循环外创建dataset循环内只更新数据内容而不是反复创建销毁。增加异常分支的释放流程用try/finally或C的RAII机制保证所有ACL资源在出错时也能被正确释放。定期用npu-smi info查显存占用如果发现显存持续增长优先排查acl.rt.malloc和acl.mdl.create_dataset是否成对出现。这块卡的内存管理比CUDA更原始没有自动垃圾回收所有分配的内存都需要手动释放。在写业务代码之前先把ACL资源管理封装好是避免这类问题的最有效手段。6. 后处理性能优化与异步流水线的进一步实践跑通之后如果想要更大的吞吐就要开始优化流水线了。这里把我在项目中实际使用的优化方法分享出来。6.1 主机侧后处理怎么提速YOLO的输出有8400个候选框后处理本身在CPU上做也能跑得很快但如果你用Python的纯循环操作8400个框的NMS反而会吃掉大量时间。实测下来同一个视频流Python纯循环NMS需要8ms用numpy向量化后只要1.2ms。向量化核心代码如下def vectorized_nms(boxes, scores, iou_threshold0.45): x1 boxes[:, 0] y1 boxes[:, 1] x2 boxes[:, 2] y2 boxes[:, 3] areas (x2 - x1) * (y2 - y1) order scores.argsort()[::-1] keep [] while order.size 0: i order[0] keep.append(i) xx1 np.maximum(x1[i], x1[order[1:]]) yy1 np.maximum(y1[i], y1[order[1:]]) xx2 np.minimum(x2[i], x2[order[1:]]) yy2 np.minimum(y2[i], y2[order[1:]]) w np.maximum(0.0, xx2 - xx1) h np.maximum(0.0, yy2 - yy1) inter w * h iou inter / (areas[i] areas[order[1:]] - inter) inds np.where(iou iou_threshold)[0] order order[inds 1] return keep这基本就是复刻了OpenCV里NMS的逻辑但用numpy批量运算。如果你的项目允许引入OpenCV直接cv2.dnn.NMSBoxes更省事性能也不错。6.2 异步推理的流水线设计Atlas支持acl.mdl.execute_async这一代接口允许你把数据拷贝和推理执行重叠起来。具体来说就是利用多个输入输出buffer轮流使用CPU在NPU算上一帧的同时把下一帧的数据拷贝到另一个buffer里。架构大概是这样主循环 1. 从视频流读一帧 2. CPU侧预处理resize, RGB转换 3. 拷贝到NPU输入buffer A此时NPU可能正在用buffer B执行上一帧的推理 4. 调用acl.mdl.execute_asyncNPU开始计算当前帧 5. 不等待它结束先去读取下一帧 6. 在合适时机调用acl.rt.synchronize等待异步推理完成取回结果这样流水线跑起来后单路视频流的整体吞吐往往可以从推理时延提升到接近帧间间隔的水平。多路视频流的场景下甚至可以开多个线程每路一个ACL context效果更好。这里是关键点不要共用一个输入buffer做多路推理。各路的数据拷贝时间不一致会导致某一路的数据覆盖了另一路还没推理完的数据。正确做法是为每一路视频流独立分配输入输出buffer。7. 总结性经验什么时候选Atlas 300V什么时候该绕开文章最后想分享一些不太会被写在官方文档里的实际感受。Atlas 300V 24G在推理场景里的性价比是实打实的尤其是你已经有昇腾服务器、对功耗和时延有要求、并且模型比较固定不经常改结构的时候。它就像一台专用洗衣机——洗衣服很快很省电但你非要拿它来烘干被子那就会感到处处受限。如果你是下面这几类情况我会建议你先别买这块卡你还在频繁调模型每隔几天就要换一次backbone或者改检测头。每改一次都要走一遍ONNX导出-ATC转换-踩算子兼容问题的流程这个迭代效率确实不高。你的业务模型里有大量动态shape比如NLP里变长序列、检测里不定尺度的输入。虽然ATC支持动态shape但那部分性能损耗和配置复杂度都是实打实的。你的团队只有CUDA背景没有昇腾经验。学习成本不是不能承受但如果你时间很紧直接用GPU肯定更顺手。反过来如果你现在维护的是一套已经训练好的YOLO模型想以低成本高并发的形式把它部署到服务器上Atlas 300V 24G是非常合适的选择。24G显存带来的并发能力加上72W的低功耗长时间跑推理任务是真的稳。我手上的业务已经在这块卡上稳定运行了几个月高负载下核心温度始终控制在70度以内没有出现过因过热降频的问题。最后再留一个扩展思路Atlas 300V支持在同一张卡上加载多个OM模型。如果你的项目里既要YOLO检测又要OCR识别完全可以把两个模型同时load进显存共用一个ACL context。这样做的好处是省掉了模型切换时的卸载和重载开销对多模型服务的性能提升非常明显。实测下来YOLOv8s和CRNN两个模型同时驻留显存占用也才8GB左右剩余的显存还能再塞下一个轻量分类模型。想深挖的同学可以沿着这个方向试试。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑