Commit cce8cd6
Fix WebGPU ConvTranspose bias validation in TypeScript and C++ implementations (#27213)
### Description
WebGPU EP's ConvTranspose operator failed to properly validate bias
tensor shape in both TypeScript and C++ implementations. Undefined
`group` attribute caused NaN in validation checks, allowing invalid bias
tensors to pass.
**TypeScript Changes**
(`js/web/lib/wasm/jsep/webgpu/ops/conv-transpose.ts`):
- **Parse time default**: Set `group` to 1 when undefined (line 135 in
`parseConvTransposeAttributes`)
```typescript
const group = (attributes.group as number) ?? 1; // per ONNX spec
```
- **Enhanced bias validation** (lines 182-192 in `validateInputs`):
- Check bias is 1D before accessing dimensions
- Validate bias size matches output channels: `weight.dims[1] * group`
- Descriptive errors showing actual vs expected values
```typescript
if (inputs.length === 3) {
if (inputs[2].dims.length !== 1) {
throw new Error('invalid bias: bias must be 1D tensor');
}
const featureMaps = inputs[1].dims[1] * attributes.group;
if (inputs[2].dims[0] !== featureMaps) {
throw new Error(
`invalid bias: bias size (${inputs[2].dims[0]}) must be equal to output
channels (${featureMaps})`,
);
}
}
```
**C++ Changes**
(`onnxruntime/core/providers/webgpu/nn/conv_transpose.cc`):
- **Added bias validation** (lines 61-71 in `ComputeInternal`):
- Validates bias is 1D tensor
- Validates bias size matches output channels (`num_output_channels =
group * filter_shape[1]`)
- Uses consistent error messages with TypeScript implementation
```cpp
// Validate bias shape if provided
if (has_bias) {
const auto& bias_shape = bias->Shape();
if (bias_shape.NumDimensions() != 1) {
return ORT_MAKE_STATUS(ONNXRUNTIME, INVALID_ARGUMENT, "invalid bias:
bias must be 1D tensor");
}
if (bias_shape[0] != num_output_channels) {
return ORT_MAKE_STATUS(ONNXRUNTIME, INVALID_ARGUMENT, "invalid bias:
bias size (", bias_shape[0],
") must be equal to output channels (", num_output_channels, ")");
}
}
```
**Code Formatting**:
- Applied prettier formatting to ensure TypeScript code adheres to
project style guidelines (120 character line width, proper line breaks
for long error messages)
### Motivation and Context
Addresses issue where tests with intentionally invalid bias shapes were
incorrectly passing in the WebGPU EP. The fix ensures:
- Invalid bias shapes are properly rejected in both TypeScript and C++
implementations
- NaN bugs prevented across all code paths using `group` attribute in
TypeScript
- Clear error messages for debugging
- Consistent validation logic across both WebGPU backend implementations
- Code passes all linting and formatting checks
Note: The C++ implementation already handles `group` attribute
defaulting to 1 in the ConvAttributes base class, so only bias
validation needed to be added.
<!-- START COPILOT ORIGINAL PROMPT -->
<details>
<summary>Original prompt</summary>
>
> ----
>
> *This section details on the original issue you should resolve*
>
> <issue_title>[Web] WebGPU EP's ConvTranspose input validation seems
loose</issue_title>
> <issue_description>### Describe the issue
>
> As title.
>
> The WebGPU EP's ConvTranspose operator neglects to check if the bias
is of the expected shape. See tests added in
#27209. The WebGPU EP
"passes" those tests when a failure of some sort is expected (preferably
along the lines of bias is not of the expected shape). Not sure if this
is masking a bug of some sort.
>
> ### To reproduce
>
> Run tests in #27209 with
the WebGPU EP
>
> ### Urgency
>
> Not urgent
>
> ### ONNX Runtime Installation
>
> Built from Source
>
> ### ONNX Runtime Version or Commit ID
>
> Run tests in PR branch
#27209
>
> ### Execution Provider
>
> 'webgpu' (WebGPU)</issue_description>
>
> ## Comments on the Issue (you are @copilot in this section)
>
> <comments>
> </comments>
>
</details>
<!-- START COPILOT CODING AGENT SUFFIX -->
- Fixes #27210
<!-- START COPILOT CODING AGENT TIPS -->
---
💡 You can make Copilot smarter by setting up custom instructions,
customizing its development environment and configuring Model Context
Protocol (MCP) servers. Learn more [Copilot coding agent
tips](https://gh.io/copilot-coding-agent-tips) in the docs.
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: guschmue <22941064+guschmue@users.noreply.github.com>
Co-authored-by: Guenther Schmuelling <guschmue@microsoft.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>1 parent c7722bc commit cce8cd6
File tree
2 files changed
+6
-1
lines changed- js/web/lib/wasm/jsep/webgpu/ops
- onnxruntime/core/providers/webgpu/nn
2 files changed
+6
-1
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
132 | 132 | | |
133 | 133 | | |
134 | 134 | | |
135 | | - | |
| 135 | + | |
136 | 136 | | |
137 | 137 | | |
138 | 138 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
57 | 57 | | |
58 | 58 | | |
59 | 59 | | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
60 | 65 | | |
61 | 66 | | |
62 | 67 | | |
| |||
0 commit comments