## 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 实现路径的行为一致性。
## PR 主要改动总结 ### 核心改动 此 PR 更新了 CUDA 后端的 TopK 算子注册机制,将原本仅支持 opset 11 的开放式注册拆分为两部分:opset 11-23 的版本化注册和 opset 24 的新开放式注册。 ### 解决的问题 修复了 CUDA TopK 算子版本不匹配导致的性能问题。之前当模型使用 opset 11 以上的 TopK 节点时,`VerifyVersion` 会拒绝非版本化的内核注册,导致算子静默回退到 CPU 执行,产生不必要的主机与设备间数据拷贝开销。 ### WebGPU 关联 此改动使 CUDA EP 与 CPU 和 WebGPU provider 的 TopK 算子注册模式保持一致,遵循了 PR #27728 建立的统一版本管理规范。 ### 技术要点 无内核逻辑变更,仅调整注册宏(`ONNX_OPERATOR_VERSIONED_KERNEL_EX` 和 `ONNX_OPERATOR_KERNEL_EX`),因为 opset 24 的 schema 与现有 `TopK<true>` 实现完全兼容。
## PR 主要改动总结 **主要功能:** 新增运行时执行提供器(Execution Provider)可用性检测 API,区别于现有的编译时 `get_available_providers()`,新 API 能在运行时验证所需的共享库文件是否实际存在于磁盘上。 **解决的问题:** 解决了编译时可用但运行时缺少依赖(如 CUDA、cuDNN 库文件)导致的执行失败问题。通过 `get_usable_providers()` 和 `is_provider_usable()` API,用户可以在加载模型前预先判断特定 EP(如 CUDAExecutionProvider)是否真正可用。 **WebGPU 影响:** 虽然 PR 标题提及 WebGPU,但改动主要针对通用 EP 检测机制。该机制同样适用于 WebGPU EP,可在运行时检测 WebGPU 相关依赖库是否存在。 **技术要点:** 扩展了 `ProviderInfo` 结构体添加 `library_base_name` 字段作为单一数据源,使用 `std::filesystem::exists()` 进行文件系统级别的库文件检查,同时提供 Python 和 C++ 双语言接口支持。