## PR 主要改动总结 **1. 主要功能改动** 此 PR 优化了 WebGPU EP (Execution Provider) 的内核注册代码,通过在 `BuildKernelCreateInfo` 模板参数中直接使用 `class` 关键字进行前置声明,消除了大量冗余的独立前置声明代码。 **2. 解决的问题** 减少了代码样板文件(boilerplate),将原本需要分两步完成的内核注册(先前置声明,后在函数表中引用)简化为一步完成,删除了 762 行代码,仅新增 381 行,净减少约 380 行代码。 **3. 技术要点** 由于 C++ 要求前置声明的名称需要具有外部链接(external linkage),函数表从函数内部移到了函数外部作用域。这种优化方式已在其他执行提供程序中采用,保持了代码风格的一致性。 **4. 对 WebGPU 支持的影响** 这是一次纯重构改动,不影响 WebGPU 的功能特性,仅提升了代码的可维护性和简洁性。
## PR 主要改动总结 **核心改动:** 修复了 ONNX Runtime JavaScript 实现中的两个关键性 bug,涉及轴向归一化和 WebGPU Slice 算子。 **解决的问题:** 1. 修复了 `normalizeAxis()` 函数中的逻辑错误,将不可能为真的条件 `axis < -tensorRank && axis >= tensorRank` 中的 `&&` 改为 `||`,使其能够正确检测和拒绝超出有效范围的轴参数,避免潜在的数组越界访问 2. 为 WebGPU Slice 算子补充了 `step == 0` 的验证逻辑,与 CPU 实现保持一致,防止除零错误导致的未定义行为(`ceil((end-start)/step)` 计算会产生无穷大并导致类型转换异常) **技术影响:** 提升了 WebGPU 后端的健壮性和安全性,确保恶意或错误输入不会导致运行时崩溃或未定义行为,同时修复了 onnxjs 和 jsep 两个 JavaScript 实现路径中的共同缺陷。
## PR 主要改动总结 **1. 主要功能改动:** 修复了 Windows WebGPU CI 构建超时问题,通过优化测试执行策略减少资源消耗。 **2. 解决的问题:** - 移除了冗余的 `onnxruntime_test_all.exe` 测试执行(该测试已在 CTest 阶段覆盖) - 将 `onnxruntime_provider_test.exe` 拆分为 4 个 GTest 分片并行执行,解决了数百个测试共享单个 WebGPU 上下文导致的 GPU 资源耗尽问题 **3. 对 WebGPU 支持的影响:** 显著提升了 WebGPU Windows CI 的稳定性,避免了测试运行器在执行过程中无响应或崩溃,确保持续集成流程能够正常完成。 **4. 技术要点:** 通过 GTest 的 `GTEST_TOTAL_SHARDS` 和 `GTEST_SHARD_INDEX` 参数实现测试分片,避免 Dawn/WebGPU 在长时间运行大量测试时的资源耗尽问题。
## ONNX Runtime WebGPU PR 总结 ### 主要改动 修复了 BufferManager::Upload() 中的缓冲区溢出问题,该问题在上传非 16 字节对齐的数据时会导致数据损坏。 ### 解决的问题 原代码使用 16 字节对齐后的大小进行 GPU 缓冲区复制,当实际数据大小不是 16 的倍数时,会将未初始化的填充字节(垃圾数据)复制到目标缓冲区,覆盖后续数据。这导致在使用 onnxruntime-genai 等外部代码通过 CopyTensors API 上传部分数据时出现损坏,特别是在启用图捕获的 LLM 推理场景中,会引发 FlashAttention 的 'device lost' 崩溃。 ### 对 WebGPU 支持的影响 显著提升了 WebGPU 后端在处理奇数长度 prompt(如 1 或 3 个 token)的 LLM 推理任务时的稳定性和正确性。 ### 技术要点 修改后仅对暂存缓冲区大小使用 16 字节对齐(满足 WebGPU 要求),而 CopyBufferToBuffer 操作严格使用实际数据大小,避免复制越界的未初始化内存。
## PR 主要改动总结 **核心改动:** 此 PR 从 `onnxruntime-foundry-nuget` 包中移除了 WebGPU 组件,仅修改了 Azure Pipelines 的自定义 NuGet 打包配置文件。 **解决的问题:** 为 Foundry Local 提供支持,使其能够将 WebGPU 作为插件式执行提供程序(plugin-ep)独立下载和安装,而不是捆绑在主 NuGet 包中。 **对 WebGPU 支持的影响:** 这是一个打包策略调整,WebGPU 功能从内置组件变为可选插件,提高了部署灵活性,允许用户按需加载 WebGPU 支持,减小核心包体积。 **技术要点:** 改动非常轻量(仅 4 行代码变更),采用模块化架构设计,将执行提供程序与核心运行时解耦,符合插件化扩展模式。
## PR 主要改动总结 **核心功能:** 为 ONNX Runtime 的 WebGPU 后端添加了 `LinearAttention` 和 `CausalConvWithState` 两个算子的支持,这是基于 ONNX 提案实现的贡献算子。 **解决的问题:** 使 Qwen3.5 系列模型能够在 WebGPU 上高效运行,提供了 fp16 和 q4 量化版本的参考实现。这两个算子是新型注意力机制的关键组件,对提升模型推理性能至关重要。 **技术要点:** - 新增了完整的算子实现(~771 行核心代码)和单元测试(~1393 行测试代码) - 同时补充了相关的 RMS Norm、Rotary Embedding、Attention 等 LLM 基础算子的 WebGPU 实现 - 涉及 Reshape、Concat 等现有算子的优化调整,确保算子间的协同工作 **影响:** 这是 WebGPU 支持现代 LLM 架构的重要里程碑,使浏览器端能够原生运行 Qwen3.5 等新一代高效语言模型。
## PR 改动总结 **主要功能:** 为 ONNX Runtime 的 WebGPU 执行提供程序添加了 LSTM(长短期记忆网络)算子的完整支持,新增了约 666 行代码实现 LSTM 的 GPU 加速计算。 **解决的问题:** 填补了 WebGPU 后端对循环神经网络(RNN)中核心算子 LSTM 的支持空白,使得包含 LSTM 层的模型能够在 WebGPU 环境中运行,扩展了 WebGPU 后端对序列建模任务的支持能力。 **对 WebGPU 的影响:** 显著增强了 WebGPU 执行提供程序对深度学习模型的覆盖范围,特别是自然语言处理、时间序列预测等需要 LSTM 的场景,提升了浏览器端运行复杂 RNN 模型的能力。 **技术要点:** 实现包含独立的 LSTM 头文件和实现文件(lstm.h/cc),并在 WebGPU 执行提供程序中注册该算子,涉及 LSTM 特有的门控机制、隐藏状态管理和 GPU 计算着色器的适配。
## PR 主要改动总结 **核心功能:** 此 PR 为 ONNX Runtime 的 WebGPU Execution Provider (EP) 插件建立了完整的 CI/CD 打包流水线,支持 Windows (x64/arm64)、Linux (x64) 和 macOS (arm64) 四个平台的自动化构建和打包。 **解决的问题:** 通过新增 Azure Pipelines 配置文件和构建脚本,实现了 WebGPU 插件的跨平台自动化编译、打包和发布流程。主要包括主流水线文件 (`plugin-webgpu-pipeline.yml`)、各平台的构建阶段模板 (stage.yml)、以及构建变量设置模板,支持参数化配置 API 版本、包版本和构建类型。 **技术要点:** 采用模块化的流水线设计,每个平台有独立的 stage 模板文件;新增了 Linux 平台的构建脚本 (`build_webgpu_plugin_package.sh`);对 CMake 配置和分配器头文件进行了小幅调整以支持插件架构。整体改动以基础设施代码为主 (858 行新增),为 WebGPU EP 的插件化分发奠定了自动化基础。
## PR 主要改动总结 ### 核心功能 为 ONNX Runtime 的 WebGPU 后端新增了三个缺失的算子实现:**SpaceToDepth**、**ConstantOfShape** 和 **Compress**,共新增约 607 行代码。 ### 解决的问题 在优化 lfm2-vl 视觉模型时发现这些算子缺失导致推理过程中产生大量 **CPU 与 GPU 之间的数据拷贝**,严重影响性能。实现这些算子后,模型(特别是视觉编码器部分)的推理速度显著提升。 ### 技术实现 - 为每个算子分别创建了独立的头文件和实现文件(.h/.cc) - 在 `webgpu_execution_provider.cc` 中注册了新算子 - PR 开发主要借助 Claude Opus 4.6 生成,但经过人工审查、修正和测试验证 ### 影响意义 消除了 WebGPU 后端的关键算子空白,减少了推理时的 CPU-GPU 数据传输开销,增强了 WebGPU 在视觉模型上的实用性和性能表现。
## ONNX Runtime WebGPU MultiHeadAttention 修复总结 **主要改动:** 修复了 WebGPU 后端中 MultiHeadAttention 算子的 flash attention 路径在处理 past KV 缓存时的错误逻辑。当 `present_key/present_value` 输出未被请求时,flash attention 路径错误地仍然使用了 `past_key/past_value` 输入,而非 flash 路径则正确地忽略了这些输入。 **解决的问题:** 修复了在支持 subgroup 的 GPU 上(会选择 flash attention 路径)产生错误结果的问题。通过在 `ApplyFlashAttention` 中添加与 `ApplyAttention` 相同的检查逻辑:当 present 输出都为空时,将 past 输入置空并相应调整序列长度参数。 **技术要点:** 将函数参数签名从 const 引用改为按值传递,以允许在函数内部调整 past_key/past_value 和相关序列长度参数,确保两种 attention 实现路径的行为一致性。