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
https://github.com/microsoft/onnxruntime/pull/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 https://github.com/microsoft/onnxruntime/pull/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
https://github.com/microsoft/onnxruntime/pull/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 microsoft/onnxruntime#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>