onnxruntime/js/web/docs/webgpu-operators.md
Alexander Visheratin e6c6184fee
[JS/WebGPU] Unsqueeze operator implementation (#16138)
### Description

This PR adds an implementation of the Squeeze operator to WebGPU JSEP.
The implementation follows the [operator
schema](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Unsqueeze).

To implement the `Unsqueeze` operator in the same fashion as the
`Squeeze`, I added the `ComputeOutputShape()` method to the
`UnsqueezeBase` class and made some slight modifications. Please let me
know if it is a bad idea and if I should move this method to the JS
implementation.

I also uncommented test case lines in the `suite-test-list.jsonc` file
for both Squeeze and Unsqueeze operators following @hariharans29's
[comment](https://github.com/microsoft/onnxruntime/pull/16024#issuecomment-1565113633).

### How was it tested

1. I created a model with only one operator:

```Python
import onnx.helper

node = onnx.helper.make_node(
    "Unsqueeze",
    inputs=["T", "axes"],
    outputs=["y"],
)
graph = onnx.helper.make_graph([node], "test", [onnx.helper.make_tensor_value_info("T", 1, [3, 4, 5]), onnx.helper.make_tensor_value_info("axes", 7, [2])], [onnx.helper.make_tensor_value_info("y", 1, [3, 1, 4, 5, 1])])
onnx.save(onnx.helper.make_model(graph), "unsqueeze.onnx")
```

2. I compiled the runtime using @fs-eire's
[instructions](https://gist.github.com/fs-eire/a55b2c7e10a6864b9602c279b8b75dce).
3. I ran the test models in the browser using this minimal setup:
```HTML
<html>
    <script src=".\dist\ort.webgpu.min.js"></script>
    <script>
        async function run() {
            const session = await ort.InferenceSession.create('unsqueeze.onnx', {executionProviders: ['webgpu']});
            console.log(session);
            const input = new ort.Tensor('float32', new Float32Array(60), [3, 4, 5]);
            const dim = new ort.Tensor('int64', [1n, 4n], [2]);
            const output = await session.run({ "T": input, "axes": dim });
            console.log(output);
        }
        run();
    </script>
</html>
```

### Motivation and Context

Improve operator coverage for WebGPU JSEP.
2023-06-01 12:23:02 -07:00

2.3 KiB

Operators Support Table

The following table shows ONNX operators and the supported opset domain/versions in WebGPU EP by ONNX Runtime Web. For example, 4-6, 8+ means ONNX Runtime Web currently support opset version 4 to 6, 8 and above.

This file is automatically generated from the def files via this script. Do not modify directly.

Operator Opset Comments
Abs ai.onnx(6-12,13+)
Acos ai.onnx(7+)
Acosh ai.onnx(9+)
Add ai.onnx(7-12,13,14+)
Asin ai.onnx(7+)
Asinh ai.onnx(9+)
Atan ai.onnx(7+)
Atanh ai.onnx(9+)
AveragePool ai.onnx(7-9,10,11+); com.ms.internal.nhwc(11+) need perf optimization; need implementing activation
Ceil ai.onnx(6-12,13+)
Clip ai.onnx(6-10,11,12,13+)
Conv ai.onnx(1-10,11+); com.ms.internal.nhwc(11+) need perf optimization; conv3d not supported; need implementing activation
Cos ai.onnx(7+)
Cosh ai.onnx(9+)
Div ai.onnx(7-12,13,14+)
Elu ai.onnx(6+)
Erf ai.onnx(9-12,13+)
Exp ai.onnx(6-12,13+)
Floor ai.onnx(6-12,13+)
Gemm ai.onnx(7-8,9-10,11+)
GlobalAveragePool ai.onnx(1+); com.ms.internal.nhwc(1+)
GlobalMaxPool ai.onnx(1+); com.ms.internal.nhwc(1+)
LeakyRelu ai.onnx(6-15,16+)
MatMul ai.onnx(1-12,13+)
MaxPool ai.onnx(1-7,8-9,10,11,12+); com.ms.internal.nhwc(11,12+) need perf optimization; need implementing activation
MemcpyFromHost ai.onnx(1+)
MemcpyToHost ai.onnx(1+)
Mul ai.onnx(7-12,13,14+)
Neg ai.onnx(6-12,13+)
Pow ai.onnx(7-11,12,13-14,15+)
Reciprocal ai.onnx(6-12,13+)
Relu ai.onnx(6-12,13,14+)
Reshape ai.onnx(5-12,13,14+) no GPU kernel
Shape ai.onnx(1-12,13-14,15+) no GPU kernel; an ORT warning is generated - need to fix
Sigmoid ai.onnx(6-12,13+)
Sin ai.onnx(7+)
Sinh ai.onnx(9+)
Sqrt ai.onnx(6-12,13+)
Squeeze ai.onnx(1-10,11-12,13+)
Sub ai.onnx(7-12,13,14+)
Tan ai.onnx(7+)
ThresholdedRelu ai.onnx(10+)
Transpose ai.onnx(1-12,13+) need perf optimization
Unsqueeze ai.onnx(1-10,11-12,13+)