中央厨房里,总厨遇到一个头疼的问题:顾客最爱点的“大菜”——卷积、矩阵乘法这类重复度极高的张量运算,交给全能厨师(CPU)做太慢,请来的大火灶(GPU)又快又猛,可动辄几百瓦的耗电让小店根本扛不住。于是,他订制了一台“炒菜机器人”——NPU(神经网络处理器)。这机器人只擅长几样拿手菜,但动作麻利、省电省地方,插在电池上就能干活。可问题来了:机器不识字,总厨怎么把菜谱交给它?答案就是本文的主角——NPU Provider。它像一位“翻译官兼分派员”,把菜谱(计算图)译成机器能懂的按钮指令,并把合适的菜分给合适的设备执行。接下来,我们就以这家中央厨房为舞台,从认识机器人开始,一路拆解它的定位、编译流程、部署场景、性能优势与生态接入方式。
对 AI 从业者而言,理解 NPU Provider 是掌握边缘端高效推理部署的关键:它直接决定了模型在专用芯片上的性能表现与资源开销,是模型从“能跑”迈向“跑得快、跑得省”的必经之路。
目录
可视化演示
演示ONNX Runtime NPU Provider执行流程:EP注册展示四阶段工作流;算子拆分展示模型图按算子分配到CPU/GPU/NPU;低功耗对比展示NPU相对CPU的每瓦算力优势与功耗节省。
本节配有交互动效(进入视口后自动加载,约 3KB)。
NPU EP四阶段流程 注册→拆分→编译→执行 AppendExecutionProvider 图编译为NPU指令序列
NPU 处理器认知:认识这位“专灶大厨”
中央厨房里,总厨发现一个难题:顾客点得最多的“招牌大菜”——卷积、矩阵乘法这类批量爆炒的活,普通厨师(CPU)虽然全能,但炒得慢、汗流浃背还费电;请来的大火灶(GPU)火力猛,可实在耗电,小店面根本养不起。于是他订制了一台“炒菜机器人”——NPU(Neural Processing Unit,神经网络处理器)。这台机器人只做几样拿手菜,但动作极其麻利:一次颠勺能同时照顾几十口锅,而且功率只有几瓦,插在电池上就能转起来。
这台机器人的“拿手菜”在数学上对应什么呢?神经网络里占比最高的运算就是矩阵乘法(MatMul)和卷积(Conv)。这两种运算可以拆成海量互不依赖的乘加操作(MAC),天然适合并行。NPU 的核心正是一大片乘加单元阵列(MAC Array),它们像几十个灶头同时开火,把 CPU 要一个个排队算的乘加任务,成百上千路并行完成,张量计算吞吐自然远高于通用处理器。
与 CPU 相比,NPU 不是通用的可编程处理器,而是为固定算子模式深度优化的专用芯片。CPU 需要分支预测、乱序执行来应付各种程序,NPU 只关心“读数据→乘加→累加→写回”这一条流水线,晶体管利用率极高。因此,NPU 常被集成进边缘 SoC(如瑞芯微、高通等芯片)中,与 CPU、GPU 共用一块小面积,主打低功耗、高能效的推理场景。衡量它到底有多“省”的指标,就是能效比:
回到厨房:这台机器人之所以受欢迎,正是因为它“吃电少、出菜多”。但光有机器还不够——总厨得想办法把菜谱交到它手里,这就轮到 NPU Provider 登场了。
- 计算量符号C_ops 表示模型推理需要完成的乘加运算总次数,NPU 的并行乘加阵列在单位时间内能让这个数飞快增长。
- 能耗符号能耗 E 等于功率 P 乘以时间 T,功率代表设备单位时间消耗的电能,时间代表推理耗时。
- 能效比符号用计算量除以能耗,得到每单位能量完成的运算量,数值越大说明每一度电干出的活越多。
Provider 核心定位:中央厨房的分派单
总厨的办公桌上堆满了菜谱(模型),每张菜谱上都写着几十道工序(算子)。过去,他习惯把所有工序交给全能厨师(CPU);如今来了炒菜机器人,他需要一张“分派单”:哪些工序交给机器人,哪些继续留在厨师手里。这张分派单,在 ONNX Runtime 的世界里就叫执行提供者(Execution Provider,EP)。
ONNX Runtime 是一个跨平台推理引擎,相当于中央厨房的“总经理”:它自己不亲自炒菜,而是把计算图交给不同的 EP 去执行。CPU EP 是全能厨师,什么算子都能跑;CUDA EP 是 GPU 大火灶;而我们的 NPU Provider 就是把算子分派给炒菜机器人的那位“专属传菜员”。它的核心职责是硬件抽象适配:让上层的 ONNX Runtime 不用关心底层 NPU 是瑞芯微还是高通,只要通过统一的 EP 接口对接即可。
具体到分派策略,NPU Provider 在加载模型时会检查图中每个算子节点,判断它是否在自家“拿手菜清单”(算子支持集合)里。这个决策可以写作一个简单的分派函数:
有了分派单,总厨心里有了底:机器人和厨师各司其职。但分派只是第一步——机器人不识字,接下来还得有人把菜谱翻译成它听得懂的按钮指令。
- 算子对象o_i 是计算图中的第 i 个算子节点,每个算子是待分派的一次“烹饪动作”。
- 支持集合S_npu 是 NPU 算子库支持的算子类型集合,只有命中集合的算子才能进“机器菜谱”。
- 分派函数Assign 逐算子检查是否属于支持集合,属于则送入 NPU,否则留在 CPU,最终形成两张子图。
编译执行流程:把菜谱译成按钮指令
炒菜机器人再聪明,也看不懂文字菜谱。它只认自己的操作面板——一长串按钮指令。NPU Provider 的另一个关键职责就是翻译:把计算图编译成 NPU 可执行的指令序列。这个过程大致分三步。第一步是计算图解析:读取 ONNX 模型文件,得到一张由节点(算子)、边(张量数据流)和权重参数组成的计算图,相当于把菜谱上的文字拆成一条条工序卡片。
第二步是算子映射转换:把 ONNX 标准算子翻译成 NPU 厂商算子库中的对应实现。例如 ONNX 的 Conv 算子会映射到瑞芯微 RKNN 工具链的卷积算子;若某个算子(如 Softmax 的特殊变体)在 NPU 算子库里找不到对应物,它就会被标记为“不支持”,留在 CPU 上执行。第三步是指令序列生成:NPU 厂商的编译器把映射后的子图进一步编译成 NPU 芯片能直接执行的二进制指令(例如 .rknn 格式的模型),运行时加载后即可“照单炒菜”。
这个“翻译”过程用公式表达就是:
这套“翻译”机制还内置了回退降级机制:万一某算子编译失败或运行时不支持,Provider 会自动把它降级到 CPU 执行,保证推理不中断——就像机器人遇到不会做的菜,总厨立刻喊全能厨师补上,绝不让客人干等。
- NPU 子图G_npu 是切分后由支持算子构成的子图,相当于从完整菜谱中抽出机器人负责的那几道工序。
- 编译器C 负责把图结构翻译成硬件指令,通常由 NPU 厂商的编译工具链实现(如 RKNN Toolkit)。
- 指令序列I_npu 是 NPU 能直接执行的指令队列,推理时无需再逐算子解析,直接整串执行。
部署应用场景:小摊车也能开旗舰店
炒菜机器人最大的优势是什么?机器小巧、用电节省、不需要专门的大厨房。这让总厨有了新想法:以前只有大商场才能开的餐厅(云端数据中心),现在推一辆小摊车(边缘设备)就能营业。边缘 AI 推理正是 NPU Provider 的主战场:智能摄像头里跑人脸识别、车牌检测,工业传感器里跑异常诊断,全是它的用武之地。
物联网设备则更进一步:大量设备靠电池供电,只有几瓦的功耗预算。NPU 的低功耗特性让“端侧智能”成为可能——数据无需全部上传云端,直接在设备本地完成推理,既省流量又保护隐私。当然,设备上不只有 NPU,还有 CPU 和其他单元,这就引出了异构计算协同:CPU 负责图像缩放、数据归一化等预处理,把张量喂给 NPU;NPU 完成核心推理后,CPU 再做非极大值抑制等后处理。每一环各司其职,才能让整个流水线最有效率。
在资源受限的嵌入式环境里,内存和电量都捉襟见肘,任何一个环节掉链子都会拖垮整体性能。端到端推理时延可以拆解为四段:
回到小摊车的比喻:NPU Provider 不是让摊车“什么菜都做”,而是让摊车精准做好那几道招牌菜,把配菜和装盘交给厨师,整条出餐线又快又省。
- 预处理耗时T_pre 是 CPU 上完成图像缩放、归一化、通道变换等操作的耗时,为 NPU 准备标准输入。
- 推理耗时T_infer 是 NPU 执行指令序列的核心计算耗时,通常由 NPU 的算力和指令优化程度决定。
- 后处理耗时T_post 包括解码、阈值过滤、非极大值抑制等,把网络输出变成可用结果。
- 数据搬运耗时T_io 是 CPU 与 NPU 之间拷贝张量的耗时,子图切分得越碎,这部分开销越大。
性能优化特性:又快又省的秘密
为什么炒菜机器人能同时端出几十份菜?因为它把“颠勺”这个动作专用化了——不需要思考下一步炒什么,只需要机械地重复批量操作。NPU 的性能优势正是来源于这种专用化。首先是高算力发挥:NPU 内部动辄集成数百上千个乘加单元,且支持权重驻留片上 SRAM、相邻卷积窗口数据复用,让算力利用率远高于通用芯片。
其次是低延迟推理:相比 CPU 需要频繁取指、译码、分支预测,NPU 执行指令序列时几乎是流水线直通,单次推理延迟可稳定在毫秒级,适合对实时性要求苛刻的场景。第三是能效比提升:这正是前文能效比公式的现实注脚——同功耗下 NPU 的吞吐可以比 CPU 高一个数量级,这让靠电池供电的物联网设备也能跑起实时 AI。此外还有内存带宽优化:NPU 通过专用缓存层级和量化存储(如 INT8 权重)减少外部内存访问,带宽压力大幅下降。
这些优势最终汇聚成一个直观的指标——加速比:
但别忘了:机器人再快,若“拿手菜”覆盖不全,大量工序来回搬运反而拖慢节奏。真正的加速,来自覆盖率、切分质量与数据搬运开销之间的精妙平衡——这也正是 NPU Provider 设计与调优的核心艺术。
- CPU 耗时T_CPU 是计算图全部在 CPU 上执行的端到端推理耗时,作为性能对比的基线。
- NPU 耗时T_NPU 是接入 NPU Provider 后,核心算子由 NPU 执行的端到端耗时。
- 加速比两者相除,S > 1 表示 NPU 更快;S < 1 则说明切分开销过大,需要优化子图划分。
生态集成路径:把新厨具接进后厨
总厨想把市面上最新的炒菜机器人引进后厨,但他不希望每买一台新机器就推翻整个厨房的管理制度。最好的办法,是给所有机器规定一个统一的“电源插口和操作面板”标准。在 ONNX Runtime 的生态里,这个标准就是 EP 注册机制。
任何想接入 ONNX Runtime 的 NPU 厂商,都需要实现一个执行提供者(实现 IExecutionProvider 接口),然后在创建推理会话时把它注册进去。这样上层应用只需一行配置,就能让模型自动分派到对应 NPU 上执行——就像插上电源,按几下标准按钮,机器人就开始工作。对于模型里那些 NPU 没内置的“私房菜”,开发者还可以通过自定义算子接口注册自己的实现,让算子覆盖率进一步提升。
接入之后,调试分析工具不可或缺。ONNX Runtime 自带的 Profiler 可以按节点输出耗时,厂商工具链(如 RKNN-Toolkit)则提供仿真、可视化、精度对比等能力,帮助开发者定位性能瓶颈和精度损失。最后是多平台支持:不同厂商的 NPU 指令集各不相同(瑞芯微 RKNN、地平线、寒武纪、高通等),NPU Provider 的算子覆盖度决定了模型能多大程度“跑在机器上”。覆盖度公式如下:
从这个角度看,NPU Provider 的生态建设就像不断扩充“机器菜谱”:支持算子越多、调试工具越完善、接入方式越标准,这台“专灶大厨”在边缘 AI 时代就能走得更远。
- 图的算子集合G 是计算图中全部算子节点构成的集合,代表一张菜谱里所有工序。
- 交集运算G ∩ S_npu 表示“既在图中、又被 NPU 支持”的算子集合,即能进入机器菜谱的工序。
- 覆盖率交集大小除以图中算子总数,覆盖率越高,NPU 发挥的空间越大,回退开销越小。
AI 应用场景
智能安防摄像头实时目标检测
阶段:推理部署阶段
解决的问题:传统安防摄像头把视频流上传云端做检测,带宽成本高、延迟大、隐私风险高。在摄像头本地用 CPU 跑行人/车辆检测模型,帧率往往只有个位数且功耗超标。通过 NPU Provider 将检测模型编译为 NPU 指令序列,可在 5W 级功耗下实现 20+ FPS 的本地实时检测,只有告警片段才上传云端。
具体案例:某安防厂商在园区出入口部署集成 NPU 的智能摄像机,使用 ONNX Runtime 加载 YOLOv5 模型并注册 NPU Provider。模型推理延迟从 CPU 的约 200ms 降至 25ms,整机功耗仅 4.8W,一台摄像机即可覆盖双向四车道的车辆识别。
工业物联网设备预测性维护
阶段:模型优化与端侧部署
解决的问题:工厂产线电机上安装的振动传感器需要持续分析频谱数据,判断设备是否出现异常。若把所有数据上传云端,不仅流量巨大,而且网络抖动会耽误告警。NPU Provider 让一维卷积异常检测模型在传感器端本地运行,只上报异常结果。
具体案例:某制造企业为产线电机加装物联网振动监测模块,模块内的 NPU 通过 NPU Provider 执行异常检测推理,单次推理能耗约 0.3 焦耳,一块锂电池可支撑数月持续监测,成功预警了三次轴承早期失效。
智能座舱语音交互助手
阶段:推理服务部署
解决的问题:车载语音助手需要实时完成唤醒词检测、语音识别和意图理解,若依赖云端会有明显时延且断网即失效。座舱 SoC 内置的 NPU 通过 NPU Provider 承担流式语音模型的推理,实现全本地、低延迟的语音交互。
具体案例:某新能源车厂在座舱域控制器中接入 NPU Provider,将语音唤醒模型推理时延控制在 30ms 以内,功耗仅 1.2W,即便在地下车库无网络环境下,语音助手也能秒级响应。
Python 演示
# -*- coding: utf-8 -*-"""模拟 ONNX Runtime 中 NPU Provider 的算子分派与异构执行流程""" class NpuDevice: """模拟神经网络处理器: 支持部分算子, 速度快功耗低""" def __init__(self, speed=8.0, power=5.0): self.speed = speed self.power = power self.supported = {"Conv", "MatMul", "Relu", "Add"} self.gc_count = 0 def run(self, op): self.gc_count += 1 return op["cost"] / self.speed class CpuDevice: """模拟通用 CPU: 任何算子都能跑, 速度慢功耗高""" def __init__(self, speed=1.0, power=65.0): self.speed = speed self.power = power self.gc_count = 0 def run(self, op): self.gc_count += 1 return op["cost"] / self.speed class NpuProvider: """模拟 NPU Provider: 图解析 -> 算子映射 -> 分派执行""" def __init__(self, npu, cpu): self.npu = npu self.cpu = cpu self.free_lists = {"npu_ops": [], "cpu_ops": []} def partition(self, graph): """把计算图切分为 NPU 子图与 CPU 回退子图""" for op in graph: if op["type"] in self.npu.supported: self.free_lists["npu_ops"].append(op) else: self.free_lists["cpu_ops"].append(op) def execute(self, graph): """按分派结果执行, 返回 (CPU耗时, NPU耗时)""" t_cpu = 0.0 t_npu = 0.0 for op in graph: if op in self.free_lists["npu_ops"]: t_npu += self.npu.run(op) else: t_cpu += self.cpu.run(op) return t_cpu, t_npu def build_graph(): """构造小型计算图: Conv -> Relu -> MatMul -> Add -> Softmax""" return [ {"type": "Conv", "cost": 100}, {"type": "Relu", "cost": 10}, {"type": "MatMul", "cost": 80}, {"type": "Add", "cost": 8}, {"type": "Softmax", "cost": 20}, ] def main(): npu = NpuDevice(speed=8.0, power=5.0) cpu = CpuDevice(speed=1.0, power=65.0) provider = NpuProvider(npu, cpu) graph = build_graph() provider.partition(graph) t_cpu, t_npu = provider.execute(graph) all_cpu_time = sum(op["cost"] for op in graph) / cpu.speed hybrid_time = t_cpu + t_npu npu_energy = npu.power * t_npu cpu_energy = cpu.power * t_cpu print("计算图算子总数:", len(graph)) print("NPU 承接算子:", len(provider.free_lists["npu_ops"])) print("CPU 回退算子:", len(provider.free_lists["cpu_ops"])) print("纯 CPU 推理耗时: %.2f" % all_cpu_time) print("NPU 混合推理耗时: %.2f" % hybrid_time) print("端到端加速比: %.2f 倍" % (all_cpu_time / hybrid_time)) print("NPU 耗电 %.2f, CPU 耗电 %.2f" % (npu_energy, cpu_energy)) if __name__ == "__main__": main()
self.supported = {"Conv", "MatMul", "Relu", "Add"}定义 NPU 的“拿手菜清单”,对应真实 NPU 厂商算子库中的支持集合 S_npu。def partition(self, graph):核心分派逻辑:遍历图中的每个算子,命中支持集合的送入npu_ops,否则进入cpu_ops回退列表。if op["type"] in self.npu.supported:逐算子检查是否属于 NPU 算子支持集合,这与 ONNX Runtime 中 GetCapability 的判断逻辑一致。t_npu += self.npu.run(op)NPU 以 speed=8 的系数执行算子,耗时远小于 CPU,模拟专用硬件的高吞吐。all_cpu_time = sum(op["cost"] for op in graph) / cpu.speed计算“所有算子都跑 CPU”的基线耗时,作为加速比的对照。print("端到端加速比: %.2f 倍" % (all_cpu_time / hybrid_time))输出混合执行相对纯 CPU 的加速比,验证 NPU Provider 的收益。
常见误区
误区NPU 不是神经网络处理器吗?那我把整个模型都交给它,CPU 就可以彻底休息了。
正解NPU 只擅长卷积、矩阵乘、激活这类规整的张量算子,像 Softmax 的某些变体、动态形状算子、自定义算子往往不在支持集合内。NPU Provider 的核心价值是“合理分工”:CPU 负责预处理、后处理和不受支持的算子回退,NPU 负责核心计算,两者协同而非替代。把整个模型硬塞给 NPU,只会导致大量回退和数据搬运,性能反而更差。
为何常见:初学者看到 NPU 惊人的算力宣传,容易忽略其指令集和算子覆盖范围的限制,误以为“专芯”等于“全包”。
误区既然 NPU 算力强,我把推理切到 NPU Provider 上,速度肯定比 CPU 快好几倍。
正解端到端加速比取决于三个因素:算子覆盖率、子图切分质量、CPU 与 NPU 间的数据搬运开销。如果模型中大量算子不被支持,或者图被切得七零八落,张量在 CPU 和 NPU 之间反复拷贝,延迟可能比纯 CPU 还高。只有覆盖率高、切分合理时,加速比 S 才会显著大于 1。
为何常见:只看到硬件算力参数,忽略了异构执行中通信和调度的真实开销,犯了“局部最优等于全局最优”的直觉错误。
误区Provider 不就是调用 NPU SDK 的封装吗?写个 native 层调一下驱动就完事了。
正解NPU Provider 的职责远不止驱动调用:它要解析计算图、查询算子支持能力、切分子图、把 ONNX 算子映射到厂商算子库、调用编译器生成指令序列、管理内存布局、处理动态形状回退。本质上,它是一个“图编译器 + 运行时调度器”,驱动调用只是最后一步“按下按钮”的动作。
为何常见:把抽象层次想得太浅,忽视了计算图编译和内存管理的复杂度,低估了 Provider 作为软件栈的关键地位。
误区NPU 才几瓦功耗,肯定比 CPU 弱,只是省电而已,性能上没什么可期待的。
正解对于神经网络典型算子,NPU 的专用乘加阵列提供极高并行度,单位功耗吞吐远超通用 CPU。低功耗不是“性能妥协”,而是“专芯专用”的设计结果——它只做更少类型的事,但每件事都做得更快。能效比公式 η = C/(P×T) 正是衡量这种“每度电的产出”的标尺。
为何常见:用通用芯片“功耗=性能”的直觉去套专用芯片,忽略了架构差异带来的能效比跃升。
面试题
Q1. NPU 的英文全称及其主要定位是什么?
- A.网络处理器,负责数据包转发
- B.神经网络处理器,专做张量计算← 正确答案
- C.通用处理器,执行所有程序
- D.图像处理器,用于图形渲染
答案:B。NPU 全称 Neural Processing Unit,专为神经网络推理设计,擅长卷积、矩阵乘等张量运算;网络处理对应 NP(Network Processor),图形渲染对应 GPU,通用计算对应 CPU。
Q2. 在 ONNX Runtime 中,NPU Provider 的本质角色是什么?
- A.模型格式转换工具
- B.模型训练加速框架
- C.数据预处理模块
- D.算子执行提供者← 正确答案
答案:D。执行提供者(EP)负责接管计算图中算子的实际执行。NPU Provider 将可支持的算子分派到 NPU 执行,是运行时的计算后端,而非格式转换、训练或预处理的工具。
Q3. 下列哪种运算最适合交给 NPU 执行?
- A.字符串的模式匹配
- B.矩阵乘法与卷积← 正确答案
- C.文件与磁盘管理
- D.网络协议栈解析
答案:B。NPU 内部是大量并行的乘加(MAC)阵列,专为矩阵乘法、卷积这类规整且可并行的张量运算定制,而字符串匹配、文件管理和协议解析属于通用计算任务,更适合 CPU。
Q4. 计算图中存在 NPU 不支持的算子时,NPU Provider 通常如何处理?
- A.抛出异常终止推理
- B.将算子回退到 CPU← 正确答案
- C.跳过算子不执行
- D.自动改用 GPU 执行
答案:B。Provider 会做图切分:支持算子形成 NPU 子图,不支持的留在 CPU 子图,两者协同完成推理。绝不跳过算子(破坏语义)或抛出异常(中断服务),也不会自动切换 GPU。
Q5. NPU Provider 将计算图编译为指令序列的正确顺序是?
- A.图解析,算子映射,指令生成← 正确答案
- B.算子映射,图解析,指令生成
- C.指令生成,图解析,算子映射
- D.图解析,指令生成,算子映射
答案:A。先解析计算图拿到节点和边结构,再逐算子映射到 NPU 算子库,最后把映射后的子图编译成 NPU 可执行的指令序列。顺序颠倒会导致缺少输入或无法编译。
Q6. 以下哪些属于 NPU 相对 CPU 的优势?
- A.任意程序都全面加速
- B.张量运算吞吐更高← 正确答案
- C.单位算力功耗更低← 正确答案
- D.支持所有编程语言
答案:BC。NPU 是专用芯片,在卷积、矩阵乘等张量运算上吞吐远超 CPU,同时以低功耗著称。但它的指令集和算子库有限,并不会对任意程序加速,也不支持所有编程语言。
Q7. NPU Provider 部署在边缘设备上有哪些优点?
- A.推理延迟更低更稳定← 正确答案
- B.功耗预算显著降低← 正确答案
- C.无需改动任何模型
- D.数据无需全部上云← 正确答案
答案:ABD。本地 NPU 推理缩短延迟、降低功耗、减少云端依赖。但模型通常需要经过厂商工具链编译适配为 NPU 指令序列(如 .rknn),存在一定的格式转换成本,不能说“无需任何改动”。
Q8. 影响 NPU Provider 端到端加速比的最主要因素是?
- A.训练时的学习率取值
- B.数据增强策略的选择
- C.算子覆盖与搬运开销← 正确答案
- D.模型参数初始化方式
答案:C。加速比 S = T_CPU / T_NPU,取决于 NPU 算子覆盖率、子图切分质量和 CPU 与 NPU 间的数据搬运开销。学习率、数据增强和参数初始化都属于训练阶段因素,与推理时的加速比无关。
Q9. 关于能效比公式 η = C/(P×T),下列说法正确的是?
- A.功耗越高能效比越大
- B.完成计算量越大能效比越高← 正确答案
- C.推理时间越长能效比越高
- D.能效比与计算量并无关联
答案:B。能效比 = 计算量 / 能耗,能耗 = 功率 × 时间。相同能耗下完成更多计算量,能效比越高;功耗增大或时间变长都会让分母变大,反而降低能效比。
Q10. 以下哪些手段能有效提升 NPU Provider 的算子覆盖率?
- A.算子融合减少无效的映射开销← 正确答案
- B.为缺失算子注册自定义实现← 正确答案
- C.调低模型输入分辨率大小
- D.删除无法映射的算子节点
答案:AB。算子融合可将多个算子合并成一个复合算子,降低映射难度并减少搬运;注册自定义实现能直接补齐 NPU 算子库缺失的算子。调低输入分辨率属于精度与性能的权衡,并非提升覆盖率;删除节点则会破坏计算图语义,是错误做法。