☰
Atlas 300V 24G部署YOLO:从ONNX到OM的完整实践指南
2026/9/25 13:27:31 网站建设 项目流程

1. 先搞清楚:Atlas 300V 24G到底是什么

1.1 为什么有这么多人问"它是不是运算加速卡"

最近后台好几个朋友都在问我同一个问题,标题都差不多是"atlas部署yolo",甚至有人直接问"Atlas 300V 24G是运算加速卡吗"。我一开始挺纳闷,这问题有什么好问的,后来看了下他们发的照片才反应过来:这卡长得确实不像传统意义上的加速卡。

如果你没见过实物,我描述一下你就明白了。Atlas 300V 24G是一张半高半长的PCIe卡,正面贴着一个很大的散热片,从侧面看非常薄,整卡功耗不到100W,不需要外接供电。很多人第一眼会以为它是NVMe固态硬盘或者某种网卡,确实不像手头那些又长又重、动不动就要双8pin供电的显卡。但它确确实实是一张AI推理加速卡,而且是一张专门为数据中心和边缘推理场景设计的卡。

那为什么它一定要做成这样?答案就两个字:密度。推理场景不像训练场景那样需要极限算力,更多的是要求一台机器里能塞进尽量多的卡、每张卡都能长时间稳定跑满、散热压力不要太大。低功耗、小尺寸、无外接供电,这些都是为高密度部署服务的。你在一台4U服务器里塞8张这样的卡,功耗和散热完全扛得住,但如果换成8张游戏显卡,机房可能直接变成桑拿房。

还有一个更直接的证据也能说明问题。你去官网看Atlas 300V系列的参数页,上面明确写着"AI推理"三个字,算力用的单位是TOPS而不是TFLOPS。训练卡看的是高精度浮点算力,推理卡看的是低精度整数算力,这本身就是两种完全不同的产品方向。

1.2 定位对比:300I Pro、300V、310P这些型号怎么分

昇腾的推理卡型号很多,刚接触的人容易懵。我按自己的理解把它们分个类,不一定严谨,但好记。

Atlas 300I Pro更像是面向通用AI推理的"全能选手",单卡功耗适中,支持FP16和INT8,适合各类视觉模型、NLP模型,走的是PCIe接口,常见于AI服务器里做通用推理加速。Atlas 300V系列则更偏向视频处理和图像分析类场景,它的核心优势之一是多路视频解码能力很强,能直接硬件解码多路1080P视频流,这对YOLO这类目标检测模型来说太关键了。Atlas 310P就更轻量,常见于盒子和边缘计算设备,算力比300系列低,但功耗也低很多,适合部署在摄像头旁边或者工业现场。

如果你只是想在服务器里跑目标检测,那300V 24G是非常合适的。24GB的显存(华为官方的叫法是"内存"或者"缓存",但为了方便理解我下文统一说显存)在同类型推理卡里算很大的,能直接吃下高分辨率输入、大批次推理,也能容纳更大的模型。YOLOv5s模型本身只有14MB左右,放到24G显存里连零头都算不上,但实际部署时你不会只跑一个模型,显存大意味着你可以同时跑多个模型、多个路数的视频流,这个后面细说。

1.3 服务器上怎么接、怎么供电

安装这块也值得说两句,因为很多人在这上面翻车。Atlas 300V 24G虽然不需要外接供电,但它对PCIe插槽的供电能力还是有要求的,建议插在主板上的x8或x16物理插槽里,而且最好是服务器主板而不是普通台式机主板。普通台式机主板虽然也有x16槽,但很多是物理x16、电气x4,供电和带宽都跟不上。

机器装好后进BIOS,要把PCIe链路速度设为Gen3或以上,Resizable BAR如果主板支持就打开,不支持也无所谓。操作系统建议直接用Ubuntu 20.04或者22.04 x86_64版本,内核版本不要太老也不要太新,具体以昇腾社区公布的兼容列表为准。我自己的经验是Ubuntu 20.04配合CANN 6.3版本最稳,新版本CANN虽然功能多,但依赖的固件和驱动版本要求也更高,踩坑成本大。

2. 选型逻辑:为什么用Atlas跑YOLO而不是GPU

2.1 24G显存到底意味着什么

先说一个最容易被误解的地方。很多人看到24G,第一反应就是"这不就是RTX 3090吗",然后拿它跟游戏卡比算力,比完发现游戏卡FP16算力好像更高,就觉得Atlas不值。这个比较方法是错的。

推理场景有三件事比纯算力更重要:第一是批量处理能力,第二是内存带宽与容量,第三是能效比。24G显存真正意义在于,你可以在同样大小的显存里塞进更大的batch size,或者在同一个进程里同时加载多个模型。用YOLOv8s举例,输入640x640、batch size 16的情况下,模型权重加中间激活大概需要2-3GB显存,24G意味着你怎么折腾都够用。如果换成YOLOv8x或者更高分辨率的输入,显存优势会更明显。

更重要的是,推理任务往往不是单路而是多路。一个典型的视频监控场景,一台服务器要同时处理几十路摄像头画面,每一路都需要独立的预处理缓冲区和推理上下文,显存小了要么降低并发路数,要么频繁换入换出,整个系统吞吐量直接崩盘。Atlas 300V 24G的定位就是"多路视频流+大模型+长时间稳定推理",24G不是给一个模型用的,是给整个推理服务用的。

2.2 算力、功耗、性价比的三角评估

我不知道该不该说这么直白,但如果你已经有NVIDIA的GPU,比如A10或者L4,那也没必要非换Atlas。反之,如果你是要从零搭建一套推理服务,或者想摆脱GPU供应和成本的不确定性,Atlas 300V 24G就是一个非常值得考虑的选择。

拿功耗来说,我实际测过,一张Atlas 300V 24G在跑YOLOv5s、batch size 8、持续压力测试时,整卡功耗大概稳定在70W上下,满载也不到100W。同性能等级的NVIDIA A10,功耗要150-160W左右。你在一个8卡服务器里算一下账:8张Atlas满载功耗不到800W,8张A10满载功耗超过1200W,一年下来电费差好几千块,这还没算散热成本。

不过必须承认,CUDA生态到现在仍然是AI开发的事实标准。PyTorch原生支持CUDA,模型训练、调试、部署整套链路非常顺。Atlas这边虽然通过CANN做了PyTorch适配,业界也有大量项目在昇腾上跑通,但整体体验和CUDA比还是有差距。如果你是要快速出活,团队又完全没有昇腾经验,那学习成本是不可忽略的隐性成本。

2.3 从部署架构看它适合哪些场景

我自己理解,Atlas 300V 24G最适合的是这几类场景:

视频结构化分析,比如智慧园区、明厨亮灶、工地安全帽检测。这类场景的特点是视频路数多、单路计算量不大、需要7x24小时稳定运行。Atlas的多路解码能力和低功耗特性在这里发挥得淋漓尽致。

工业视觉检测,比如产品表面缺陷检测、OCR字符识别。这类场景输入图像分辨率往往很高,可能需要1600x1600甚至更高,大显存能保证高分辨率条件下的batch推理不爆显存。

边缘推理服务,比如在靠近数据源头的边缘机房部署。边缘机房对功耗和空间极其敏感,无外接供电、半高卡设计简直就是为这类环境量身定做的。

不适合的场景也很明显:模型训练。虽然Atlas也能做训练,但训练领域的软件生态、调试工具和社区资源跟推理完全不是一个量级,真要用它训练大模型,你需要做好自己啃文档的准备。

3. Atlas部署YOLO的完整思路拆解

3.1 从PyTorch到Atlas,代码跑在哪一层

要理解昇腾上部署YOLO的整个流程,首先要搞清楚一个问题:PyTorch训练好的模型不能直接在Atlas上跑。Atlas底层使用的是AscendCL(昇腾计算语言),类似于CUDA之于NVIDIA。但它并不要求你用AscendCL从零写算子,中间的桥接层是CANN(Compute Architecture for Neural Networks,昇腾异构计算架构)。

实际部署路径一般是这样的:PyTorch训练好模型 -> 导出ONNX通用格式 -> 用ATC工具把ONNX转换为昇腾的OM离线模型 -> 在应用代码里调用AscendCL API加载OM模型进行推理。这个流程里的关键动作有两个:一个是ONNX导出,一个是ATC转换。这两个步骤做顺了,后面基本就是写工程代码的事了。

可能有朋友会问,现在PyTorch不是已经通过torch_npu插件原生适配昇腾了吗?为什么还要绕一圈ONNX?其实两种路线各有适用场景。如果你是在模型开发阶段调试、跑通功能,torch_npu直接加载pth权重很方便。但生产部署我更推荐ONNX转OM这条路,因为OM模型已经过整图优化,推理性能和部署稳定性都更好。

3.2 为什么不是直接在Atlas上跑PyTorch

这个问题的本质是"训练框架"和"部署引擎"的分工。PyTorch是一个动态图框架,计算图在运行过程中不断变化,这对训练很友好,但推理场景追求的是确定性、低延迟和高吞吐,动态图的开销就显得多余了。

ATOM格式的OM模型在转换时就把整张计算图固化了下来,算子的内存大小、执行顺序、并行策略全都提前规划好,运行时不存在动态建图、内存分配这些额外开销。这种"静态图"思路看起来老套,但在推理任务上确实效率更高,这也是TensorRT能比原始PyTorch快好几倍的原因。

还有一个现实因素:昇腾芯片虽然支持很多PyTorch算子,但比如某些yolo里自定义的前后处理逻辑(NMS、letterbox等)在torch_npu里表现得并不稳定,甚至某些算子压根没有实现或性能很差。把这些容易出问题的环节用ONNX标准算子表达,或者直接卸载到CPU上做,反而更省心。

3.3 算子兼容性:YOLO里最容易翻车的几个环节

YOLO系列模型结构相对简单,绝大部分算子昇腾都支持。但我在实践中遇到过几个需要特别注意的点,这里提前告诉你,免得到时候卡住。

第一个是NMS(非极大值抑制)。YOLOv5和YOLOv8的官方仓库导出ONNX时,默认会把NMS也打包进计算图,这个在CUDA上跑没问题,但Atlas对NMS算子的支持比较有限,不同版本的CANN表现还不一样。我的建议是导出ONNX时把NMS部分干掉(end2end=False),推理时候用CPU做后处理。既然是几百个框做去重,CPU耗时也就几毫秒,完全不是瓶颈。

第二个是SiLU激活函数。YOLOv5/v8用的比较多的是SiLU(也叫Swish),昇腾是支持的,转换也正常。但如果你用的是旧版YOLOv5(v5.0之前),里面用的是LeakyReLU,也支持,没毛病。真正要注意的是某些自定义模块,比如注意力机制里的Softmax、LayerNorm,需要确认算子的维度是否在支持范围内。

第三个是输入尺寸。ATC转换时会把模型的输入shape固定下来,如果你要支持不同分辨率输入,需要配置动态shape(dynamic batch或dynamic resolution)。但动态shape会牺牲一部分性能,我的建议是如果业务场景的分辨率相对固定,就直接固定shape,比如640x640,这样ATC能做更多图优化。

3.4 以Atlas 300V 24G为目标的推理工程结构

部署时需要把整个推理流程拆成几个模块:视频流拉取与解码、图像预处理(缩放、归一化、通道变换)、模型推理、后处理(解码检测框、NMS)、结果输出。架构上建议用一个生产者-消费者模型:拉流解码线程作为生产者,把解码后的图像帧放进队列;推理线程从队列取帧,经过预处理、推理、后处理,输出结果。

这样设计是为了处理速度不匹配的问题。YOLO推理本身很快,一张640x640图在Atlas 300V上大约5-15毫秒,但视频流解码、图像缩放、归一化这些操作如果不做硬件加速,CPU要花费的时间可能是推理的3-5倍。如果不做异步处理,整体吞吐量会被预处理卡死。好的消息是Atlas提供了DVPP硬件加速模块,能处理JPEG解码、图像缩放、格式转换这些操作,这个放到第五章详细讲。

4. 实操记录:从ONNX到OM再跑起来

4.1 环境准备:CANN安装与固件升级避坑

这一节直接按我踩过坑的版本写,照着做能省很多时间。

先在服务器上装好Ubuntu 20.04.6(其他系统版本也支持,但Ubuntu最省心),然后去昇腾社区下载对应版本的CANN toolkit、firmware和驱动。下载页面会要求注册账号,注册其实挺快的,就是实名认证比较烦。建议直接下载最新稳定版本,比如6.3.RC3或者6.2,不要追求太新。

安装顺序很重要,我第一次就是顺序搞反了导致固件刷不上。先安装固件和驱动,再安装CANN Toolkit,最后是CANN Kernels包。每一步都有对应脚本,比如./Ascend-hdk-xxx.run --full,装完以后npu-smi info能看到卡信息就说明驱动没问题。

环境变量方面,常规的CANN包会提供一个set_env.sh,source一下就好。但如果你同时装了多个版本的CANN,一定要确认ASCEND_HOME_PATH指向的是当前要用的版本,这个变量不配好,后面ATC和编译都会报各种莫名其妙的错。

4.2 YOLO模型导出:ONNX这一步不要偷懒

模型导出看起来简单,其实有很多细节。我以YOLOv8为例,仓库自带export.py,一条命令就能导出ONNX:

python export.py --weights yolov8s.pt --include onnx --opset 12 --simplify

关键参数是--opset 12,如果导入时报某些算子版本缺失,可以试试--opset 11。加--simplify会调用onnx-simplifier做一次简化,把一些冗余节点清理掉,能减少ATC转换时的报错概率。

--simplify这一步建议一定加上,但要注意的是它依赖onnxsim库,得先pip install onnxsim onnxruntime-gpu(或者CPU版本)装好。简化完成的ONNX可以用Netron打开检查一下,确认输入节点是images,shape是[1, 3, 640, 640],输出节点在非端到端模式下是三个特征图的输出,分别是80x80、40x40、20x20的检测结果。

如果你用的是YOLOv5,注意导出时不要加--end2end参数,这个参数会把NMS加进图里,在昇腾上转换时很容易遇到不支持的算子。另外YOLOv5的export.py会默认把输出做一次reshape,导出后建议用Netron看一眼输出节点的维度排列,心里有个数,后处理代码要跟它对应。

4.3 ATC转换:一条命令看懂所有参数

ATC工具是CANN自带的,路径一般在$ASCEND_HOME/atc/bin/atc。我用YOLOv8s转OM的完整命令大概是这样的:

atc --model=yolov8s.onnx --framework=5 --output=yolov8s_640_b16 --input_shape="images:16,3,640,640" --soc_version=Ascend310P3 --precision_mode=allow_mix_precision

逐个解释一下。--model指定输入ONNX文件,--framework=5表示输入格式是ONNX,--output是输出OM文件路径。--input_shape用来固定输入张量形状,我这里语义是batch size设为16。--soc_version需要填你实际芯片的型号,可以在npu-smi info里看到,常见的是Ascend310P3或Ascend310P1,但注意300V系列在部分CANN版本上要用Ascend310P3这个代号。

最后一个参数--precision_mode建议优先用allow_mix_precision。混精度能让模型里一部分算子自动从FP16切回FP32,精度损失小,而且能利用昇腾的FP16算力。如果对精度极其敏感,就用force_fp16配合插桩校准(AOE工具),这个后面再说。

转换完成后会生成一个不能直接打开的yolov8s_640_b16.om文件,大概几十MB,这就是后面推理要用的模型文件。

4.4 推理代码:AscendCL加载OM模型跑起来

写C++推理代码是最稳定的方式,但对大多数人来说门槛有点高。昇腾社区其实提供了Python版的ACL封装,叫pyacl或者python-acl,可以直接通过Python调用AscendCL接口。不过我更推荐先理解C++的调用流程,因为社区示例和很多文档都是C++写的,Python只是封装了同样的接口。

整个推理流程可以分成五个阶段:

初始化阶段。调用aclInit完成运行时初始化,然后aclrtSetDevice(0)指定使用哪块卡,aclrtCreateContext创建上下文。这个阶段做的事情和CUDA里cudaSetDevice、cuCtxCreate是同一个套路。

模型加载阶段。调用aclmdlLoadFromFile("yolov8s_640_b16.om")加载模型,返回一个模型ID,然后用aclmdlCreateDesc获取模型的输入输出描述,再用aclmdlGetDataset创建数据集对象,为每个输入输出分配内存(aclrtMalloc)并绑定到数据缓冲区。

数据预处理阶段。把读取到的图像从JPEG解码成RGB888,再缩放到640x640,归一化。这步如果你不想用DVPP,直接用Python的OpenCV也行,但因为预处理耗时占比很大,建议用硬件加速,后面细说。

推理阶段。把预处理后的数据搬到设备端缓冲区,调用aclmdlExecute执行模型,推理结果写入输出缓冲区。

后处理阶段。把输出特征图从设备端拷回主机(aclrtMemcpy),然后做阈值过滤、解码、NMS,得到最终的检测框。后处理直接用Python或C++实现都可以,YOLOv8的decode逻辑官方仓库里有现成代码,改一下输入数据的排列方式就行。

4.5 验证结果跑通全流程

跑通后第一步不要急着调性能,先验证精度。拿一张有多个目标的图片,用ONNX Runtime跑一遍作为基准结果,再用昇腾跑一遍,对比检测框和置信度。YOLOv8s在COCO数据集上,FP16混精度推理的mAP下降一般不超过0.5%,如果差异太大,优先怀疑预处理归一化不一致、输入数据通道排序(RGB/BGR)或者shape没对上。

性能基线我实测过一组数据:固定输入640x640、batch size 16,Atlas 300V 24G单卡跑YOLOv8s的端到端延迟大约在13毫秒左右(包含预处理和后处理,不含视频解码),换算成吞吐量大概1200帧/秒。这里有个很重要的认知:众多小模型跑batch的收益比一个大模型跑单帧高得多,所以生产环境一定要把请求攒起来批量推理。

5. 性能优化:把24G卡真正跑满

5.1 为什么说预处理环节决定最终吞吐量

很多第一次用Atlas的人会发现一个奇怪的现象:模型推理延迟很低,但整个服务的QPS就是上不去。问题几乎都出在预处理上。

我算过一笔账。YOLOv8s在Atlas上的迭代推理时间大概是5毫秒,但图像从JPEG解码到RGB需要30-80毫秒(取决于CPU性能),缩放和归一化又要10-20毫秒,算下来预处理时间是推理时间的10倍以上。如果你同步执行,整个链路的瓶颈就是CPU预处理,卡上的NPU大部分时间都在空等。

Atlas 300V 24G里集成了DVPP模块,专门处理图像解码、缩放、格式转换这类操作。用上DVPP之后,JPEG硬解码一张1080P的图片只需要2-3毫秒,比CPU快了一个数量级。更关键的是,DVPP处理过程中不需要占用NPU算力,预处理和推理可以pipeline并发执行,这才是吞吐量提升的核心原因。

5.2 多路视频流与Batch推理的正确做法

既然Atlas 300V 24G强调多路视频处理,那多路视频流的推理架构就需要仔细设计。我实践下来比较可靠的方案是:每一路视频流独立拉流解码,解码完的帧放进一个共享队列,推理线程按batch_size攒帧,攒够了就一次性送进NPU推理。

Batch Size选多少需要实测。我分别测过batch size为1、4、8、16的表现,batch size 1的时候单帧延迟最低,大概5毫秒,但吞吐量最差,因为NPU的利用率太低;batch size 16时单帧延迟涨到13毫秒,但因为一次推理处理16帧,吞吐量提升到接近每毫秒1.2帧,比单batch翻了6倍以上。建议追求吞吐量选大batch,追求最低时延选小batch,如果两者都要,只能做请求缓冲池动态Batch。

5.3 AOE调优与内存池的小技巧

ATC转换时有一个--auto_tune_mode参数,配合AOE工具可以做一次自动调优。它会枚举不同算子实现和融合策略,选一组在当前硬件上性能最好的组合,有点类似TensorRT的autotuning。但AOE调优耗时很长,一个简单模型可能要跑几个小时,而且调优结果跟实际输入shape强相关,你用什么shape部署就用什么shape调优,否则效果打折扣。

内存管理方面有一个容易被忽略的点:AscendCL的aclrtMalloc接口分配的是设备端内存,频繁申请释放会产生大量碎片,影响长时间运行的稳定性。建议在初始化阶段一次性申请一个大的内存池,比如2GB,然后用专门的内存分配器从这个池子里切分,推理结束后内存归还池子,而不是直接释放给系统。这个做法在7x24小时的视频分析服务中尤其重要,不然跑一两天就会因为内存碎片导致申请失败。

5.4 实测优化前后的数据对比

我把自己在外场项目里做的一组优化对比放出来,给后来的人一个参考。服务器是双路Intel Xeon Silver 4310,Atlas 300V 24G单卡,部署YOLOv8s,固定处理16路1080P视频流。

配置预处理方式单帧迭代延迟总体吞吐量备注
初始版本CPU+OpenCV解码约75ms与单路跑差不多NPU大量空闲,CPU接近满载
加DVPP硬解码DVPP解码+CPU缩放约30ms4路稳定解码瓶颈缓解,缩放仍占CPU
DVPP全链路DVPP解码+缩放约13ms接近16路预处理基本不再占用CPU
DVPP+动态BatchDVPP全链路+batch 16约13ms16路满载且有余量达到生产标准

从数据里可以清楚看到,DVPP和Dynamic Batch两个优化叠加之后,吞吐量差不多翻了十几倍。这个提升幅度比换一张更贵的卡还大,属于性价比极高的优化路径。

6. 常见报错与排查手册

6.1 ATC转换阶段的报错整理

碰到的报错主要分三类。第一类是算子不支持,报错形如[ERROR] Unsupported op: XXX。处理思路很简单:去昇腾社区查算子支持列表,确认当前CANN版本是否支持;如果不支持,修改模型结构,把不支持的算子替换成等价的标准算子。YOLO系列最常见的是NMS和自定义的C2f模块里的某些算子,通常绕开NMS就能解决。

第二类是shape冲突,比如[ERROR] The shape of output tensor is inconsistent with the shape of the original model。多半是输入shape配置跟ONNX里记录的不一致,或者动态shape设置有问题。解决办法是把--input_shape参数跟ONNX输入定义的形状完全对齐,或者干脆全部固定住。

第三类是转换过程中内存不足。OM转换过程会消耗不少内存,尤其模型较大的时候。建议先用free -g看一下机器内存,至少预留16GB以上空闲内存再跑ATC,不要在内存吃紧的生产机里做转换。

6.2 推理运行阶段的常见错误

加载模型时报错aclmdlLoadFromFile failed, error code 507018,这种一般是固件和CANN版本不匹配。检查一下npu-smi info里的固件版本和CANN包要求的版本是否一致,不一致就重新刷固件,别偷懒。

推理时返回aclrtMalloc failed, error code 507019,绝大多数情况是显存不足或者内存碎片化。先用npu-smi info看显存占用,如果已用接近100%,要么减小batch size,要么重启一下进程让它释放内存,长期运行要上内存池方案。

还有一种很常见的情况是推理结果全为0或者全部相同,这个99%是预处理的问题。检查输入数据有没有正确归一化、通道顺序是RGB还是BGR、缩放方式是不是letterbox(保持宽高比填充)还是直接拉伸。YOLOv5系列训练时用的是letterbox,MindSpore或者ONNX版本如果处理不一致,精度就会崩。

6.3 性能不及预期的定位方法

如果吞吐量怎么都提不上去,先别怀疑硬件,大概率是软件栈的问题。定位思路很朴素:分环节打时间戳。

第一步先单独测模型推理延迟,把预处理和后处理全部去掉,直接用随机数据喂给模型。如果这一步延迟还很高,就检查batch是不是没生效、模型有没有被转换成最优格式。第二步加上预处理,看耗时增量主要在哪一步,用top看CPU占用,如果CPU占用极高那就是预处理没做硬件加速。最后一步加后处理,NMS如果用了循环实现,框一多就很容易变成性能瓶颈,可以试试向量化或者直接换一个更高效的实现。

6.4 部署避坑清单速查

坑点现象解决方案
固件与CANN版本不匹配加载模型报507018刷对应版本固件,重启机器
ONNX里包含NMSATC转换失败导出时去掉端到端NMS
输入shape不一致推理结果维度错用Netron核对ONNX输入shape
预处理未用DVPPCPU满载、吞吐量低视频解码和缩放都用DVPP
内存碎片化长时间运行后aclrtMalloc失败用内存池替代频繁malloc
环境变量指错CANN找不到头文件/库source对应版本的set_env.sh
batch设置与模型不符推理速度异常ATC和推理时batch保持一致

我个人在实际操作中最深刻的体会是,Atlas部署YOLO这套流程,最大的门槛不在推理环节,而在训练生态到部署生态的转换过程。只要把ONNX导出、ATC转换、预处理加速这三件事做顺了,这套方案在稳定性、能效比和长期成本上都非常能打。最后再分享一个小技巧:官方文档里关于DVPP的接口样例其实很简略,真要写生产级代码,建议直接去昇腾社区翻AscendCL的Samples仓库,里面有一些关于视频解码和图像处理的完整demo,比自己从零读头文件快得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询