
ONNX Runtime CoreML 执行提供程序的 NeuralNetwork 格式算子支持清单与限制详解【免费下载链接】onnxruntimeONNX Runtime: cross-platform, high performance ML inferencing and training accelerator项目地址: https://gitcode.com/GitHub_Trending/on/onnxruntime在 Apple 平台上使用 ONNX Runtime 的 CoreML 执行提供程序Execution Provider时模型能否被完整卸载到 Core ML 运行直接取决于 ONNX 算子是否落在 Core ML 支持集合内。本文围绕仓库中 coreml_supported_neuralnetwork_ops.md 这份“NeuralNetwork 格式支持算子表”完整讲解其中每个算子的支持限制constant 要求、维度约束、属性取值约束等并结合 usability_checker.py 的解析逻辑与 coreml 提供程序源码 说明该清单在构建链路中的实际用途帮助读者准确判断模型在 CoreML NeuralNetwork 格式下的可移植性与分区行为。一、这份文档的定位CoreML EP 双格式支持清单之一文档头部的注释写明了它的来源与同步关系Keep in sync with doco generated from /docs/execution-providers/CoreML-ExecutionProvider.md on the gh_pages branch也就是说它与 gh_pages 分支由 CoreML-ExecutionProvider 文档生成页保持同步。在 ONNX Runtime 的 CoreML 执行提供程序中一个 ONNX 图最终可以编译为两种 Core ML 模型格式NeuralNetwork 格式——即本文档描述的算子支持面对应文件 coreml_supported_neuralnetwork_ops.mdMLProgram 格式——支持面更广对应文件 coreml_supported_mlprogram_ops.md。两份清单位于同一目录 tools/ci_build/github/apple/且都被移动端的可用性检查工具 tools/python/util/mobile_helpers/usability_checker.py 显式引用。其中checker()函数分别用两个文件名建立检查器# Check for NeuralNetwork CoreML model def check_nn_coreml(model, require_fixed_input_sizes): return check_coreml_partitions(model, require_fixed_input_sizes, coreml_supported_neuralnetwork_ops.md) # Check for MLProgram CoreML model def check_mlprogram_coreml(model, require_fixed_input_sizes): return check_coreml_partitions(model, require_fixed_input_sizes, coreml_supported_mlprogram_ops.md)这表明该清单不是给人“看个大概”的说明页而是被 CI 工具按机器可解析的 Markdown 表格格式维护的功能开关文档——表格中出现的算子即视为受支持表格未列出的算子会触发图分区partitioning或回退。二、NeuralNetwork 格式支持的完整算子清单以下为 coreml_supported_neuralnetwork_ops.md 中的完整算子表包含全部限制说明Note 列OperatorNoteai.onnx:Addai.onnx:ArgMaxai.onnx:AveragePoolOnly 2D Pool is supported.ai.onnx:BatchNormalizationai.onnx:Castai.onnx:Clipai.onnx:Concatai.onnx:ConvOnly 1D/2D Conv is supported. Weights and bias should be constant.ai.onnx:DepthToSpaceOnly DCR mode DepthToSpace is supported.ai.onnx:Divai.onnx:Flattenai.onnx:GatherInputindiceswith scalar value is not supported.ai.onnx:GemmInput B should be constant.ai.onnx:GlobalAveragePoolOnly 2D Pool is supported.ai.onnx:GlobalMaxPoolOnly 2D Pool is supported.ai.onnx:LeakyReluai.onnx:LRNai.onnx:MatMulInput B should be constant.ai.onnx:MaxPoolOnly 2D Pool is supported.ai.onnx:Mulai.onnx:PadOnly constant mode and last two dim padding is supported. Input pads and constant_value should be constant. If provided, axes should be constant.ai.onnx:PowOnly supports cases when both inputs are fp32.ai.onnx:PReluInput slope should be constant. Input slope should either have shape [C, 1, 1] or have 1 element.ai.onnx:Reciprocalai.onnx:ReduceSumai.onnx:Reluai.onnx:Reshapeai.onnx:Resize4D input.coordinate_transformation_modeasymmetric.modelinearornearest.nearest_modefloor.exclude_outside false.scalesorsizesmust be constant.ai.onnx:ShapeAttributestartwith non-default value is not supported. Attributeendis not supported.ai.onnx:Sigmoidai.onnx:SliceInputsstarts,ends,axes, andstepsshould be constant. Empty slice is not supported.ai.onnx:Softmaxai.onnx:SplitIf provided,splitsmust be constant.ai.onnx:Squeezeai.onnx:Sqrtai.onnx:Subai.onnx:Tanhai.onnx:Transpose这份清单覆盖了约 38 个ai.onnx域算子整体可以分成四类无限制算子、常量constant约束算子、维度约束算子、属性取值约束算子。下面逐类展开。三、限制条件分类解析3.1 无附加限制的算子以下算子在表中 Note 为空表示在 NeuralNetwork 格式下可直接转换Add、ArgMax、BatchNormalization、Cast、Clip、Concat、Div、Flatten、LeakyRelu、LRN、Mul、Reciprocal、ReduceSum、Relu、Reshape、Sigmoid、Softmax、Squeeze、Sqrt、Sub、Tanh、Transpose。这类算子涵盖了基础四则运算、常用激活函数Relu、Sigmoid、Tanh、LeakyRelu、Softmax、归一化BatchNormalization、LRN、以及形状类算子Flatten、Reshape、Squeeze、Transpose、ArgMax、Shape是移动端 CNN 类模型图的主干。3.2 常量输入约束权重和索引必须来自 initializer多个算子要求特定输入必须是常量constant通常即 ONNX initializer这是 Core ML NeuralNetwork 格式对“可静态编译”要求最直接的体现ConvWeights and bias should be constant卷积核与偏置必须来自常量张量同时维度上只支持 1D/2D Conv。Gemm / MatMulInput B should be constant即矩阵乘法中右侧矩阵必须是常量——这正对应 CNN 中“激活 × 权重”的模式而两个动态张量相乘常见于注意力中的 QK 乘积不满足该约束。Padpads与constant_value必须为常量若提供axes则也必须是常量且只支持 constant 填充模式和最后两个维度的填充。Slicestarts、ends、axes、steps全部要求为常量并且空切片Empty slice不受支持。Split若提供splits则必须为常量。Resizescales或sizes必须是常量。PReluslope必须为常量且形状须为[C, 1, 1]或只有 1 个元素。这些约束的共性是Core ML 在编译模型时会把常量输入固化进计算图中而动态数据路径上的“数据依赖控制/索引”则难以表达。从 usability_checker.py 的解析逻辑看这些限制说明本身也会作为“caveats”被检查器读取并在分析报告里列出_SupportedOpsChecker.get_caveats()会把形如op:caveat的条目汇总输出也就是说 CI 检查不仅判断“支不支持”还会把限制条件如实呈现给开发者。3.3 维度约束以 2D 为核心的池化与卷积AveragePool / GlobalAveragePool / GlobalMaxPool / MaxPool均注明Only 2D Pool is supported.。ConvOnly 1D/2D Conv is supported.这意味着该清单面向的是以图像/音频1D为主的传统模型形态3D 池化视频、点云等场景在 NeuralNetwork 格式下会落到不支持集合。对比同目录的 MLProgram 清单 coreml_supported_mlprogram_ops.md其对应条目写的是Only 2D Pool is supported currently. 3D and 5D support can be added if needed.——格式限制在两个清单中基本一致但 MLProgram 侧预留了扩展说明。3.4 属性取值与特殊形态约束几个算子对属性值或张量形态有精确要求是移植模型时最容易踩坑的部分Resize限制最多逐条列出输入必须是 4D即 NCHW 形态coordinate_transformation_mode必须为asymmetricmode只能为linear或nearestnearest_mode必须为floorexclude_outside必须为 falsescales或sizes必须为常量。Shapestart属性使用非默认值不受支持end属性本身不受支持。因此Shape节点只能按“完整输出所有维度”的默认用法出现。DepthToSpace仅支持 DCR 模式ONNX 中的默认模式CRD模式不在本清单内。有趣的是 MLProgram 清单中该项为If mode is CRD the input must have a fixed shape.——即 MLProgram 格式反而支持 CRD要求固定形状这体现了两格式能力面的不对称。Gatherindices为标量值时不受支持即索引必须是向量而非单个标量。Pow仅当两个输入都是 fp32 时支持。Slice除常量要求外额外的“空切片不受支持”属于形态级限制。3.5 与 MLProgram 清单的关键差异将两份清单对照阅读可以看到 NeuralNetwork 格式本清单是 MLProgram 清单的子集式关系主要差异点包括差异点NeuralNetwork本文档MLProgram对照算子覆盖面约 38 个算子无 Elementwise 扩展集多出 And/Cos/Ceil/Elu/Erf/Exp/Gelu/GridSample/GroupNormalization/HardSigmoid/Identity/InstanceNormalization/LayerNormalization/Max/ReduceMean/ReduceMax/Round/Sin/Softplus/Tile/ConvTranspose/GatherND 等MatMul 约束Input B 应为常量注明Only support for transA 0, alpha 1.0 and beta 1.0ConvTranspose未列出不支持支持但权重/偏置须为常量且有多个属性限制DepthToSpace仅 DCR 模式CRD 模式需固定形状ReduceSum 书写表中写作ai.onnx.ReduceSum点号分隔属原表笔迹同表体系差异结论基于对上述两份仓库内 Markdown 表格的逐行对照实际行为以各自 EP 构建代码为准。实践含义如果模型包含 LayerNormalization、Gelu、ConvTranspose、Erf、TanhMatMul 的动态组合如 Transformer 主干等应优先选择 MLProgram 格式本清单对应的 NeuralNetwork 格式更适合以 CNN 结构为主、且常量占比高的模型。四、这份清单如何被工具链消费4.1 可用性检查器对表格的机器解析usability_checker.py 中的_SupportedOpsChecker类是这份文档的主要消费者之一。它按固定规则解析 Markdown 表格with open(filename) as f: for line in f: # were looking for a markdown table with 2 columns. first is op name. second is caveats # op name is domain:op if line.startswith(|): pieces line.strip().split(|) if len(pieces) 4: # pre-first |. op, caveat, post-last | domain_op pieces[1] caveat pieces[2] caveat caveat.replace(br/, ) # remove some HTML tags # skip lines that dont have the : which separates the domain and op # e.g. the table header will fail this check if : in domain_op: self._ops[domain_op] caveat可以确认三点实现事实表格第一列必须是domain:op形式不含:的行——如表头——会被跳过第二列是限制说明br/会被替换为空格is_op_supported(node)用node.domain缺省为ai.onnx加op_type拼出键值判断支持性get_caveats()把实际命中算子的限制条目汇总供报告输出。因此维护这份文档时的格式纪律两列表格、ai.onnx:前缀、br/换行是被代码直接依赖的——这也是文档头部强调“Keep in sync with doco”的原因文档页、gh_pages 生成页与 CI 解析三方需要同步。4.2 检查结果如何影响分区决策checker()函数先以require_fixed_input_sizes True评估模型再在存在动态输入时以require_fixed_input_sizes False复评一次并在两种PartitioningInfo.TryWithEP结论NO/MAYBE/YES中取优suitability partition_info.suitability() ... if fixed_shape_suitability ! PartitioningInfo.TryWithEP.NO: logger.info(Shapes can be altered using python -m onnxruntime.tools.make_dynamic_shape_fixed)也就是说该清单直接参与“这个模型是否适合交给 CoreML EP”的自动化判定动态形状修复与否都会重新走一遍算子支持性检查。检查器最终返回的逻辑是NNAPI、CoreML NeuralNetwork、CoreML MLProgram 三者中任一不为 NO 即认为模型对移动端 EP 可用。五、支持面背后的实现CoreML Provider 的 Builder 架构清单中每一个“受支持算子”在运行时都对应 onnxruntime/core/providers/coreml/ 下一个 ONNX→Core ML 的构建器。从源码结构看builders/impl/目录按算子提供了独立的*_op_builder.cc实现例如与本文档条目直接对应的文件包括conv_op_builder.cc——Conv 的 1D/2D 与常量权重检查depthtospace_op_builder.cc——DCR 模式限制的实现位置batch_norm_op_builder.cc、clip_op_builder.cc、cast_op_builder.cc、concat_op_builder.cc、argmax_op_builder.cc、LRN_op_builder.cc 等通用基础类 base_op_builder.h 提供统一的构建/校验骨架builders/helper.cc提供共享工具函数。这种“每算子一构建器 基类统一校验”的结构与清单中的逐算子限制一一对应清单中某条 Note 之所以存在正是因为对应构建器在CanBuild()/构建阶段会对维度、常量性、属性取值做硬性检查检查失败则该节点无法进入 Core ML 分区图会被切开并由其它 EP如 CPU承接。因此阅读该文档时若需要对某条限制求根按算子名到builders/impl/下找同名*_op_builder.cc即可定位实现证据。六、工程使用建议模型选型先过清单把一个 ONNX 模型交给 CoreML EP 之前先对照本文档第二节表格逐节点核对含未列出的算子如 ConvTranspose、LayerNormalization、Gelu、Sin/Cos 等时优先考虑 MLProgram 格式见 coreml_supported_mlprogram_ops.md。常量约束要落实到 initializerGemm/MatMul 的 B、Conv 的权重与偏置、Pad/Slice/Split/Resize 的控制输入、PRelu 的 slope 必须固化在 initializer 中而不是运行时张量注意力类模型里“动态矩阵 × 动态矩阵”的 MatMul 是 NeuralNetwork 格式的硬性边界。Resize/Shape/DepthToSpace 三处最易失败它们对属性取值asymmetric、linear/nearest、floor、exclude_outsidefalseShape 的 start/endDCR 模式有精确要求导出 ONNX 时应对齐这些取值。用官方工具自查仓库提供的 usability_checker.py 会输出每个 EP 的适配度NO/MAYBE/YES与命中的 caveats 列表并以make_dynamic_shape_fixed提示动态形状修复路径在 INFO 级别下运行可获得完整分区分析。维护同步义务修改该表格需同步 gh_pages 生成文档并保证两列 Markdown 格式|分隔、br/换行、domain:op命名否则 usability_checker.py 的解析len(pieces) 4与: in domain_op判定会静默漏掉条目。七、小结coreml_supported_neuralnetwork_ops.md 是 ONNX Runtime CoreML 执行提供程序中 NeuralNetwork 格式算子支持面的权威清单它以机器可解析的两列 Markdown 表格形式列出了约 38 个受支持算子及各自的常量、维度与属性限制。该清单既是模型移植的核对单也是 usability_checker.py 等 CI 工具的判定数据源其背后每一条限制都能在 onnxruntime/core/providers/coreml/builders/impl/ 的逐算子构建器中找到对应实现。理解这张表并对照 MLProgram 清单的差异是决定模型能否完整卸载到 Apple 芯片、以及图将如何被分区的关键依据。【免费下载链接】onnxruntimeONNX Runtime: cross-platform, high performance ML inferencing and training accelerator项目地址: https://gitcode.com/GitHub_Trending/on/onnxruntime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考