## PR 主要改动总结 ### 核心功能 为 ONNX Runtime WebGPU 实现了 **TurboQuant 量化加速技术**,这是一个正在开发中的实验性功能,用于优化大语言模型的推理性能。 ### 技术实现 - 采用 **Hadamard 矩阵进行旋转变换**替代论文中的常规矩阵方法,实现了自定义的 TurboQuant 变体 - 主要集成在 Flash Attention 和 Group Query Attention (GQA) 模块中,新增了旋转量化 (rotate_quantize) 的 WebGPU shader 实现 - 基准测试显示在 Phi-4 模型上获得了显著性能提升:**prompt 处理速度达到 1790 tokens/s,token 生成速度为 99.8 tokens/s** ### 代码结构 新增了完整的 TurboQuant 基础设施,包括 Hadamard 变换核心逻辑、WGSL shader 模板、GQA 测试用例和详细的实现计划文档(646 行),共计 2700+ 行新代码,为后续优化奠定基础。
## PR 主要改动总结 **1. 主要功能:** 此 PR 为 ONNX Runtime 的 WebGPU 后端实现了 DeformConv(可变形卷积)算子,新增了约 370 行实现代码和相应的头文件。 **2. 解决的问题:** 添加 DeformConv 算子支持是为了运行 BiRefNet 模型,填补了 WebGPU 后端在该算子上的功能空缺。 **3. 对 WebGPU 的影响:** 增强了 WebGPU 执行提供程序的算子覆盖范围,使其能够支持更多依赖可变形卷积的深度学习模型,特别是图像分割类模型。 **4. 技术要点:** 在 `webgpu_execution_provider.cc` 中注册了新算子,实现遵循 ONNX 标准的 DeformConv 规范,同时更新了版本检查相关配置。
## PR 改动总结 **主要改动:** 修复了 WebGPU 后端中 MultiHeadAttention 算子在没有 present 输出时错误处理 past key/value 输入的问题。 **解决的问题:** 当 MHA 只有 1 个输出(无 present_key/present_value 输出)时,past key/value 应该被完全忽略以匹配 CPU 后端语义,但之前的实现仍将其传递给 shader,导致: - past 数据泄漏到注意力计算中,产生错误结果(输出 pastValue 数据而非预期的 V 数据) - shader 缓存键受到不必要的影响 **技术方案:** 在 `applyAttention()` 函数中引入 `effectivePastKey`/`effectivePastValue` 变量,当 `outputCount <= 1` 时将其设为 `undefined`,确保所有下游使用(shader 创建、输入数组)都基于这些有效值而非原始参数,从而正确隔离 past 数据的影响。
## 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 在长时间运行大量测试时的资源耗尽问题。
## PR 主要改动总结 **核心改动:** 此 PR 从 `onnxruntime-foundry-nuget` 包中移除了 WebGPU 组件,仅修改了 Azure Pipelines 的自定义 NuGet 打包配置文件。 **解决的问题:** 为 Foundry Local 提供支持,使其能够将 WebGPU 作为插件式执行提供程序(plugin-ep)独立下载和安装,而不是捆绑在主 NuGet 包中。 **对 WebGPU 支持的影响:** 这是一个打包策略调整,WebGPU 功能从内置组件变为可选插件,提高了部署灵活性,允许用户按需加载 WebGPU 支持,减小核心包体积。 **技术要点:** 改动非常轻量(仅 4 行代码变更),采用模块化架构设计,将执行提供程序与核心运行时解耦,符合插件化扩展模式。
## 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 主要改动总结 ### 核心功能 为 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 实现路径的行为一致性。