免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

ONNX Runtime Web WebGPU 算子支持全景:支持表、opset 域与源码实现解析

ONNX Runtime Web WebGPU 算子支持全景:支持表、opset 域与源码实现解析 ONNX Runtime Web WebGPU 算子支持全景支持表、opset 域与源码实现解析【免费下载链接】onnxruntimeONNX Runtime: cross-platform, high performance ML inferencing and training accelerator项目地址: https://gitcode.com/GitHub_Trending/on/onnxruntimeONNX Runtime Web 通过 WebGPU 执行提供程序WebGPU EP将 ONNX 模型中的算子卸载到 GPU 上执行而webgpu-operators.md正是描述这一能力边界的权威清单。本文以该支持表为骨架结合仓库内自动生成脚本与算子注册源码完整解读算子覆盖范围、opset 域语义、已知限制以及支持表的生成与维护机制帮助你判断某个 ONNX 模型能否在浏览器 GPU 环境下被高效覆盖并理解支持表中一行数据背后从注册宏到 GPU kernel 的完整链路。支持表是什么由注册表自动生成的权威清单js/web/docs/webgpu-operators.md的定位是一份Operators Support Table算子支持表它回答了最核心的问题ONNX Runtime Web 的 WebGPU EP 当前支持哪些 ONNX 算子以及每个算子支持哪些 opset 域与版本区间。与一般人工维护的文档不同该文件的头部明确声明This file is automatically generated from the def files via this script. Do not modify directly.也就是说这份表格不是手写的而是由脚本从算子定义def文件自动解析生成的。生成脚本位于 js/web/script/generate-webgpu-operator-md.ts其工作流程可以概括为读取两个算子注册源文件onnxruntime/core/providers/js/js_execution_provider.cc标准 ONNX 算子 NHWC 内部域算子onnxruntime/contrib_ops/js/js_contrib_kernels.cccom.microsoft贡献算子。用 5 组正则匹配ONNX_OPERATOR_VERSIONED_KERNEL_CLASS_NAME、ONNX_OPERATOR_KERNEL_CLASS_NAME、ONNX_OPERATOR_VERSIONED_TYPED_KERNEL_CLASS_NAME、ONNX_OPERATOR_TYPED_KERNEL_CLASS_NAME、ONNX_OPERATOR_TWO_TYPED_KERNEL_CLASS_NAME这几种注册宏提取出 EP 名、opset 域、起止版本号和算子名。校验 EP 名必须为kJsExecutionProvider并将kOnnxDomain/kMSInternalNHWCDomain/kMSDomain分别映射为ai.onnx/com.ms.internal.nhwc/com.microsoft。汇总后按算子名排序输出为 Markdown 表格。因此支持表的每一行都对应源码中真实存在的一条 kernel 注册记录——凡是表中出现的算子都能在 js_execution_provider.cc 或 js_contrib_kernels.cc 的function_table中找到对应的BuildKernelCreateInfo...条目。这份文档既是用户侧的兼容性参考也是开发者侧注册完整性的可验证产物。如何读懂表格opset 域与版本区间语法表头为| Operator | Opset | Comments |其中 Opset 列是信息量最大的部分文档给出了明确的读法约定For example,4-6, 8means ONNX Runtime Web currently support opset version 4 to 6, 8 and above.具体来说7支持 opset 7 及以上所有版本。它对应源码中的ONNX_OPERATOR_KERNEL_CLASS_NAME无版本区间约束的单版本注册例如Sin在 js_execution_provider.cc 中注册为kOnnxDomain, 7。7-12, 13支持 opset 7~12 与 13 及以上。它对应ONNX_OPERATOR_VERSIONED_KERNEL_CLASS_NAME(6, 12, ...)与ONNX_OPERATOR_KERNEL_CLASS_NAME(13, ...)的组合例如Abs在源码中即为6-12加13两条注册。1-10, 11-12, 13三个连续区间的拼接代表算子 schema 在 ONNX 规范演进中多次变更EP 为每个版本段都提供了 kernel如ArgMax、Gather、Softmax等。分号分隔的多个域例如AveragePool显示为ai.onnx(7-9,10,11-18,19); com.ms.internal.nhwc(7-9,10,11-18,19)表示该算子在标准 ONNX 域和内部 NHWC 域各有一套完整的版本覆盖详见下文三个 opset 域一节。一个值得注意的细节是10如AveragePool的7-9,10,11-18单个数字代表该版本区间只有恰好这一个版本ver[0] ver[1]在源码中体现为ONNX_OPERATOR_VERSIONED_KERNEL_CLASS_NAME(10, 10, AveragePool)这种起止相同的版本段注册。三个 opset 域ai.onnx、com.ms.internal.nhwc 与 com.microsoft支持表中所有算子分属三个 domain它们语义完全不同域来源宏含义ai.onnxkOnnxDomainONNX 标准算子域绝大多数算子属于此域com.ms.internal.nhwckMSInternalNHWCDomain微软内部使用的 NHWC 数据布局算子域是 ORT 在执行布局转换后layout transformer 将 NCHW 图转为 NHWC 图为算子注册的 NHWC 版本 kernelcom.microsoftkMSDomain微软贡献算子域contrib ops如 Attention、Gelu 等高性能融合算子ai.onnx标准算子域覆盖 ONNX 官方 schema 中绝大部分常用算子从逐元素数学运算Add、Mul、Sin、Exp到张量操作Reshape、Transpose、Gather、规约ReduceMean、ReduceMax、神经网络层Conv、MaxPool、BatchNormalization、控制流If乃至信号处理DFT都有覆盖。opset 区间普遍延伸到 21说明对较新的 ONNX 规范版本跟进及时。com.ms.internal.nhwcNHWC 布局的并行注册从 js_execution_provider.cc 的ShouldConvertDataLayoutForOp可以看出JS EP 支持将图布局转换为 NHWC 以获得 GPU 友好的内存访问模式。布局转换后原本ai.onnx域的算子会以com.ms.internal.nhwc域的 kernel 执行。支持表中Conv、ConvTranspose、AveragePool、MaxPool、GlobalAveragePool、GlobalMaxPool、BatchNormalization、InstanceNormalization、DepthToSpace、GridSample、Resize等布局敏感的算子都成对注册了 NHWC 版本。一个例外是Resize源码注释js_execution_provider.cc说明 NHWC 的 Resize 实现存在待修复问题因此在布局转换时Resize节点会保持原布局与ai.onnx域不会被切到 NHWC 域执行。com.microsoftTransformer 生态贡献算子com.microsoft域主要服务于大模型/Transformer 推理全部注册于 js_contrib_kernels.cc版本统一为1。包括Attention、MultiHeadAttention、GroupQueryAttention、RotaryEmbedding、BiasAdd、BiasSplitGelu、FastGelu、Gelu、QuickGelu、FusedConv、MatMulNBits、GatherBlockQuantized、SkipLayerNormalization、SkipSimplifiedLayerNormalization等。其中GatherBlockQuantized是唯一使用ONNX_OPERATOR_TWO_TYPED_KERNEL_CLASS_NAME注册的算子为UInt4x2/Int4x2与int32_t/int64_t的组合各注册了一条 kernel服务于 4-bit 块量化模型。特别地LayerNormalization的历史注册比较特殊注释说明它曾错误地使用kOnnxDomain作为 contrib op 注册因此源码中保留了ai.onnx(1-16,17)的版本化注册js_contrib_kernels.cc而SimplifiedLayerNormalization也以ai.onnx(1)出现。完整算子支持表下表完整收录 webgpu-operators.md 的全部 108 个算子。为便于阅读按功能类别分组呈现Opset 与 Comments 列的内容与原表逐字一致。逐元素数学与三角函数OperatorOpsetCommentsAbsai.onnx(6-12,13)Acosai.onnx(7)Acoshai.onnx(9)Addai.onnx(7-12,13,14)Asinai.onnx(7)Asinhai.onnx(9)Atanai.onnx(7)Atanhai.onnx(9)Ceilai.onnx(6-12,13)Cosai.onnx(7)Coshai.onnx(9)Divai.onnx(7-12,13,14)Equalai.onnx(7-10,11-12,13-18,19)Erfai.onnx(9-12,13)Expai.onnx(6-12,13)Floorai.onnx(6-12,13)Greaterai.onnx(7-8,9-12,13)GreaterOrEqualai.onnx(12-15,16)HardSigmoidai.onnx(6)HardSwishai.onnx(14)LeakyReluai.onnx(6-15,16)Lessai.onnx(7-8,9-12,13)LessOrEqualai.onnx(12-15,16)Logai.onnx(6-12,13)Mulai.onnx(7-12,13,14)Negai.onnx(6-12,13)Notai.onnx(1)Powai.onnx(7-11,12,13-14,15)Reciprocalai.onnx(6-12,13)Sigmoidai.onnx(6-12,13)Sinai.onnx(7)Sinhai.onnx(9)Sqrtai.onnx(6-12,13)Subai.onnx(7-12,13,14)Tanai.onnx(7)Tanhai.onnx(6-12,13)ThresholdedReluai.onnx(10)Whereai.onnx(9-15,16)类型转换、裁剪与激活OperatorOpsetCommentsCastai.onnx(6-8,9-12,13-18,19-20,21)Clipai.onnx(6-10,11,12,13)Eluai.onnx(6)Geluai.onnx(20); com.microsoft(1)规约与索引OperatorOpsetCommentsArgMaxai.onnx(1-10,11-12,13)ArgMinai.onnx(1-10,11-12,13)CumSumai.onnx(11-13,14)DFTai.onnx(17-19,20)ReduceL1ai.onnx(1-10,11-12,13-17,18)ReduceL2ai.onnx(1-10,11-12,13-17,18)ReduceLogSumai.onnx(1-10,11-12,13-17,18)ReduceLogSumExpai.onnx(1-10,11-12,13-17,18)ReduceMaxai.onnx(1-10,11,12,13-17,18-19,20)ReduceMeanai.onnx(1-10,11-12,13-17,18)ReduceMinai.onnx(1-10,11,12,13-17,18-19,20)ReduceProdai.onnx(1-10,11-12,13-17,18)ReduceSumai.onnx(1-10,11-12,13)ReduceSumSquareai.onnx(1-10,11-12,13-17,18)张量形状与数据搬运OperatorOpsetCommentsConcatai.onnx(1-3,4-10,11-12,13)DepthToSpaceai.onnx(11-12,13); com.ms.internal.nhwc(11-12,13)Einsumai.onnx(12)Expandai.onnx(8-12,13)Flattenai.onnx(1-8,9-10,11-12,13-20,21)Gatherai.onnx(1-10,11-12,13)GatherElementsai.onnx(11-12,13)GatherNDai.onnx(11,12,13)MemcpyFromHostai.onnx(1)MemcpyToHostai.onnx(1)Padai.onnx(2-10,11-12,13-17,18,19-20,21)Rangeai.onnx(11)Reshapeai.onnx(5-12,13,14-18,19-20,21)no GPU kernelScatterNDai.onnx(11-12,13-15,16-17,18)Shapeai.onnx(1-12,13-14,15-18,19-20,21)no GPU kernel; an ORT warning is generated - need to fixSliceai.onnx(1-9,10,11-12,13)Softmaxai.onnx(1-10,11-12,13)Splitai.onnx(1,2-10,11-12,13-17,18)Squeezeai.onnx(1-10,11-12,13-20,21)Tileai.onnx(6-12,13)Transposeai.onnx(1-12,13-20,21)need perf optimizationUnsqueezeai.onnx(1-10,11-12,13-20,21)Ifai.onnx(1-10,11-12,13-18,19-20,21)卷积、池化与神经网络层OperatorOpsetCommentsAveragePoolai.onnx(7-9,10,11-18,19); com.ms.internal.nhwc(7-9,10,11-18,19)need perf optimization; need implementing activationBatchNormalizationai.onnx(7-8,9-13,14,15); com.ms.internal.nhwc(7-8,9-13,14,15)Convai.onnx(1-10,11); com.ms.internal.nhwc(1-10,11)need perf optimization; conv3d is not supported; need implementing activationConvTransposeai.onnx(1-10,11); com.ms.internal.nhwc(1-10,11)need perf optimization; ConvTranspose3d is not supported; need implementing activationFusedConvcom.microsoft(1)Gemmai.onnx(7-8,9-10,11-12,13)GlobalAveragePoolai.onnx(1); com.ms.internal.nhwc(1)GlobalMaxPoolai.onnx(1); com.ms.internal.nhwc(1)GridSampleai.onnx(16-19); com.ms.internal.nhwc(16-19)InstanceNormalizationai.onnx(6); com.ms.internal.nhwc(6)LayerNormalizationai.onnx(1-16,17)MatMulai.onnx(1-12,13)MaxPoolai.onnx(1-7,8-9,10,11,12); com.ms.internal.nhwc(1-7,8-9,10,11,12)need perf optimization; need implementing activationResizeai.onnx(10,11-12,13-17,18,19); com.ms.internal.nhwc(10,11-12,13-17,18,19)CoordinateTransformMode align_corners is not supported with downsamplingSimplifiedLayerNormalizationai.onnx(1)Transformer 与量化融合算子com.microsoft 域OperatorOpsetCommentsAttentioncom.microsoft(1)need implementing mask and past/presentBiasAddcom.microsoft(1)BiasSplitGelucom.microsoft(1)FastGelucom.microsoft(1)GatherBlockQuantizedcom.microsoft(1)GroupQueryAttentioncom.microsoft(1)MatMulNBitscom.microsoft(1)MultiHeadAttentioncom.microsoft(1)need implementing mask and past/presentQuickGelucom.microsoft(1)RotaryEmbeddingcom.microsoft(1)SkipLayerNormalizationcom.microsoft(1)SkipSimplifiedLayerNormalizationcom.microsoft(1)Comments 列解读已知限制与未完成项Comments 列是官方维护者留下的已知问题清单对实际选型至关重要no GPU kernelReshape、Shape这两个算子虽然完成了 EP 注册但没有对应的 GPU shader 实现。从源码结构看它们的执行会落到 CPU 路径这类算子在 ORT 中常由 CPU 回退或GetCpuPreferredNodes机制处理参见 js_execution_provider.cc 的 capability 划分逻辑Shape还会产生一条待修复的 ORT warning。need perf optimizationAveragePool、MaxPool、Conv、ConvTranspose、Transpose功能可用但性能仍有优化空间属于后续迭代重点。conv3d / ConvTranspose3d is not supported3D 卷积在 WebGPU EP 中不支持包含 3D 卷积的模型会回退到 CPU 或报错。need implementing activationConv、ConvTranspose、AveragePool、MaxPool算子自身可执行但与激活函数融合fused activation尚未实现。CoordinateTransformMode align_corners is not supported with downsamplingResizeResize 在下采样场景下不能使用align_corners坐标变换模式否则结果不正确或不受支持。need implementing mask and past/presentAttention、MultiHeadAttention这两个注意力算子当前仅支持基础形态attention mask 与 past/present KV 缓存尚未实现——涉及长序列、带掩码的 Transformer 模型需要留意。从源码看一行支持背后的实现链路支持表并非孤立的静态文档每一行都对应一段真实的执行链路kernel 注册在 js_execution_provider.cc 的RegisterKernels()中所有算子通过BuildKernelCreateInfoONNX_OPERATOR_*_KERNEL_CLASS_NAME(kJsExecutionProvider, ...)构建KernelCreateInfo并注册进KernelRegistry贡献算子则由RegisterJsContribKernels()js_contrib_kernels.cc追加注册。能力划分GetCapabilityJsExecutionProvider::GetCapabilityjs_execution_provider.cc遍历图中的每个节点通过kernel_lookup.LookUpKernel(node)查询 WebGPU kernel 是否存在——查不到就跳过因此不在支持表中的算子绝不会被 WebGPU EP 接管会保留给其他 EP如 CPU执行。GPU 程序生成以 JS 实现路径为例WebGPU 侧的 shader 程序与数据布局实现在 js/web/lib/wasm/jsep/webgpu/ops/ 下按算子组织如conv.ts、matmul.ts、attention.ts、group-query-attention.ts、matmulnbits.ts等与表内算子一一呼应。注意该 TypeScript 目录目前标记为JSEP已废弃新算子与性能工作已转移到原生 C WebGPU EPonnxruntime/core/providers/webgpu/详见 docs/JSEP_Deprecation.md 与 js/web/lib/wasm/jsep/README.mdWebNN 路径不受影响。如何核对与使用这份支持表查询模型兼容性用onnxPython 包导出模型时记录每个算子的 domain 与 opset 版本逐一对照上表注意 opset 区间是支持范围而非全部版本均可用版本段之间不连续的缺口如1-10, 11-12, 13中间段说明对应 schema 版本有独立实现。验证表格与源码一致性由于表格由脚本自动生成怀疑某算子数据过时时可重新运行 js/web/script/generate-webgpu-operator-md.ts 再与js/web/docs/webgpu-operators.md对比该脚本依赖 js_execution_provider.cc 与 js_contrib_kernels.cc 中的注册宏因此新增算子的正确姿势是在源码中完成注册宏与 kernel 实现而非直接编辑文档。观察实际 fallback 行为部署时可通过 ORT 日志观察算子的 EP 分配webgpu kernel not found in registries for Op type: ...js_execution_provider.cc以此确认模型中被 WebGPU 接管与回退到 CPU 的节点分布再结合 Comments 列的限制注释评估性能预期。对照同类支持表仓库还维护了 WebGL 与 WebNN 的算子支持表js/web/docs/webgl-operators.md、js/web/docs/webnn-operators.md三个后端能力边界各不相同迁移后端时建议逐一比对。小结js/web/docs/webgpu-operators.md是 ONNX Runtime Web WebGPU EP 能力的单一事实来源它以 108 个算子、三个 opset 域ai.onnx、com.ms.internal.nhwc、com.microsoft的完整覆盖描绘了当前浏览器 GPU 推理的能力边界以 Comments 列透明地记录了性能与功能限制并通过自动生成脚本与源码注册表保持严格一致。理解这张表就等于理解了 ONNX Runtime Web 在 WebGPU 后端上什么能跑、跑在哪个域、有哪些坑是模型选型与问题排查时最值得首先查阅的仓库文档。【免费下载链接】onnxruntimeONNX Runtime: cross-platform, high performance ML inferencing and training accelerator项目地址: https://gitcode.com/GitHub_Trending/on/onnxruntime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表