Download build/webgpu/bench.json from webgpu-kernels/com.microsoft.GatedRMSNorm: direct link, hf CLI and curl.
- Browser
- Download file 15.1 kB
-
https://huggingface.co/kernels/webgpu-kernels/com.microsoft.GatedRMSNorm/resolve/v1/build/webgpu/bench.json
- Command line
-
hf download hf://webgpu-kernels/com.microsoft.GatedRMSNorm@v1/build/webgpu/bench.json
-
curl -L -o bench.json https://huggingface.co/kernels/webgpu-kernels/com.microsoft.GatedRMSNorm/resolve/v1/build/webgpu/bench.json
15.1 kB
| { | |
| "tunableSpace": { "WORKGROUP_SIZE": [64, 128, 256, 512], "LANE_WORDS": [1, 2, 4, 8] }, | |
| "cases": [ | |
| { | |
| "name": "gated-rmsnorm-decode-h16-d128-f32", | |
| "preset": "smoke", | |
| "provenance": { | |
| "model": "Qwen3.5 / Qwen3-Next gated linear attention output norm", | |
| "notes": "One decoded token: 16 value heads of 128. The whole operator is 24 KB of traffic, so the measurement is launch latency rather than bandwidth." | |
| }, | |
| "vars": { "dtype": "float32", "count": 2048, "span": 128 }, | |
| "inputs": { | |
| "xT": { "shape": [1, 1, 2048], "dtype": "float32", "dist": "normal", "seed": 501, "scale": 1 }, | |
| "scaleT": { "shape": [128], "dtype": "float32", "dist": "uniform", "seed": 502, "min": 0.2, "max": 1.8 }, | |
| "gateT": { "shape": [1, 1, 2048], "dtype": "float32", "dist": "normal", "seed": 503, "scale": 2 } | |
| }, | |
| "outputs": { "yT": { "shape": [1, 1, 2048], "dtype": "float32" } }, | |
| "bench": { | |
| "metrics": [{ "type": "bandwidth", "value": "(args.count * 3 + args.span) * dtypeBytes(args.dtype)" }] | |
| } | |
| }, | |
| { | |
| "name": "gated-rmsnorm-decode-h16-d128-f16", | |
| "preset": "smoke", | |
| "provenance": { | |
| "model": "Qwen3.5 / Qwen3-Next gated linear attention output norm", | |
| "notes": "The float16 decode step, the dtype the shipped model graphs use." | |
| }, | |
| "vars": { "dtype": "float16", "count": 2048, "span": 128 }, | |
| "inputs": { | |
| "xT": { "shape": [1, 1, 2048], "dtype": "float16", "dist": "normal", "seed": 501, "scale": 1 }, | |
| "scaleT": { "shape": [128], "dtype": "float16", "dist": "uniform", "seed": 502, "min": 0.2, "max": 1.8 }, | |
| "gateT": { "shape": [1, 1, 2048], "dtype": "float16", "dist": "normal", "seed": 503, "scale": 2 } | |
| }, | |
| "outputs": { "yT": { "shape": [1, 1, 2048], "dtype": "float16" } }, | |
| "bench": { | |
| "metrics": [{ "type": "bandwidth", "value": "(args.count * 3 + args.span) * dtypeBytes(args.dtype)" }] | |
| } | |
| }, | |
| { | |
| "name": "gated-rmsnorm-prefill-s512-h16-d128-f32", | |
| "preset": "smoke", | |
| "provenance": { | |
| "model": "Qwen3.5 / Qwen3-Next gated linear attention output norm", | |
| "notes": "Measures gated RMS normalization over a 512-token prefill: 8192 rows (512 tokens x 16 heads) of 128 float32 channels each." | |
| }, | |
| "vars": { "dtype": "float32", "count": 1048576, "span": 128 }, | |
| "inputs": { | |
| "xT": { "shape": [1, 512, 2048], "dtype": "float32", "dist": "normal", "seed": 511, "scale": 1 }, | |
| "scaleT": { "shape": [128], "dtype": "float32", "dist": "uniform", "seed": 512, "min": 0.2, "max": 1.8 }, | |
| "gateT": { "shape": [1, 512, 2048], "dtype": "float32", "dist": "normal", "seed": 513, "scale": 2 } | |
| }, | |
| "outputs": { "yT": { "shape": [1, 512, 2048], "dtype": "float32" } }, | |
| "bench": { | |
| "primary": true, | |
| "metrics": [{ "type": "bandwidth", "value": "(args.count * 3 + args.span) * dtypeBytes(args.dtype)" }] | |
| } | |
| }, | |
| { | |
| "name": "gated-rmsnorm-prefill-s512-h16-d128-f16", | |
| "preset": "smoke", | |
| "provenance": { | |
| "model": "Qwen3.5 / Qwen3-Next gated linear attention output norm", | |
| "notes": "The float16 prefill of the same 8192 spans." | |
| }, | |
| "vars": { "dtype": "float16", "count": 1048576, "span": 128 }, | |
| "inputs": { | |
| "xT": { "shape": [1, 512, 2048], "dtype": "float16", "dist": "normal", "seed": 511, "scale": 1 }, | |
| "scaleT": { "shape": [128], "dtype": "float16", "dist": "uniform", "seed": 512, "min": 0.2, "max": 1.8 }, | |
| "gateT": { "shape": [1, 512, 2048], "dtype": "float16", "dist": "normal", "seed": 513, "scale": 2 } | |
| }, | |
| "outputs": { "yT": { "shape": [1, 512, 2048], "dtype": "float16" } }, | |
| "bench": { | |
| "primary": true, | |
| "metrics": [{ "type": "bandwidth", "value": "(args.count * 3 + args.span) * dtypeBytes(args.dtype)" }] | |
| } | |
| }, | |
| { | |
| "name": "gated-rmsnorm-single-group-d1536-f16", | |
| "preset": "smoke", | |
| "provenance": { | |
| "notes": "Measures gated RMS normalization over 512 rows of 1536 float16 channels each, normalized as a single group (H=1) rather than split across multiple heads." | |
| }, | |
| "vars": { "dtype": "float16", "count": 786432, "span": 1536 }, | |
| "inputs": { | |
| "xT": { "shape": [1, 512, 1536], "dtype": "float16", "dist": "normal", "seed": 521, "scale": 1 }, | |
| "scaleT": { "shape": [1536], "dtype": "float16", "dist": "uniform", "seed": 522, "min": 0.2, "max": 1.8 }, | |
| "gateT": { "shape": [1, 512, 1536], "dtype": "float16", "dist": "normal", "seed": 523, "scale": 2 } | |
| }, | |
| "outputs": { "yT": { "shape": [1, 512, 1536], "dtype": "float16" } }, | |
| "bench": { | |
| "metrics": [{ "type": "bandwidth", "value": "(args.count * 3 + args.span) * dtypeBytes(args.dtype)" }] | |
| } | |
| }, | |
| { | |
| "name": "gated-rmsnorm-single-group-d5120-f32", | |
| "preset": "smoke", | |
| "provenance": { | |
| "notes": "A 5120-wide span: wide enough that the row no longer fits in registers at this workgroup width, so the statistic and the store each walk it." | |
| }, | |
| "vars": { "dtype": "float32", "count": 1310720, "span": 5120 }, | |
| "inputs": { | |
| "xT": { "shape": [1, 256, 5120], "dtype": "float32", "dist": "normal", "seed": 531, "scale": 1 }, | |
| "scaleT": { "shape": [5120], "dtype": "float32", "dist": "uniform", "seed": 532, "min": 0.2, "max": 1.8 }, | |
| "gateT": { "shape": [1, 256, 5120], "dtype": "float32", "dist": "normal", "seed": 533, "scale": 2 } | |
| }, | |
| "outputs": { "yT": { "shape": [1, 256, 5120], "dtype": "float32" } }, | |
| "bench": { | |
| "metrics": [{ "type": "bandwidth", "value": "(args.count * 3 + args.span) * dtypeBytes(args.dtype)" }] | |
| } | |
| }, | |
| { | |
| "name": "gated-rmsnorm-small-span-d48-f16", | |
| "preset": "smoke", | |
| "provenance": { | |
| "notes": "A 48-element span over the same tensor: 16384 very short rows, where a workgroup-per-row schedule would leave most of every workgroup idle." | |
| }, | |
| "vars": { "dtype": "float16", "count": 786432, "span": 48 }, | |
| "inputs": { | |
| "xT": { "shape": [1, 512, 1536], "dtype": "float16", "dist": "normal", "seed": 541, "scale": 1 }, | |
| "scaleT": { "shape": [48], "dtype": "float16", "dist": "uniform", "seed": 542, "min": 0.2, "max": 1.8 }, | |
| "gateT": { "shape": [1, 512, 1536], "dtype": "float16", "dist": "normal", "seed": 543, "scale": 2 } | |
| }, | |
| "outputs": { "yT": { "shape": [1, 512, 1536], "dtype": "float16" } }, | |
| "bench": { | |
| "metrics": [{ "type": "bandwidth", "value": "(args.count * 3 + args.span) * dtypeBytes(args.dtype)" }] | |
| } | |
| }, | |
| { | |
| "name": "gated-rmsnorm-span-six-scalar-f32", | |
| "preset": "smoke", | |
| "provenance": { "notes": "A normalization span of six values leaves a two-element tail after four-wide groups." }, | |
| "vars": { "dtype": "float32", "count": 786432, "span": 6 }, | |
| "inputs": { | |
| "xT": { "shape": [1, 512, 1536], "dtype": "float32", "dist": "normal", "seed": 551, "scale": 1 }, | |
| "scaleT": { "shape": [6], "dtype": "float32", "dist": "uniform", "seed": 552, "min": 0.2, "max": 1.8 }, | |
| "gateT": { "shape": [1, 512, 1536], "dtype": "float32", "dist": "normal", "seed": 553, "scale": 2 } | |
| }, | |
| "outputs": { "yT": { "shape": [1, 512, 1536], "dtype": "float32" } }, | |
| "bench": { | |
| "metrics": [{ "type": "bandwidth", "value": "(args.count * 3 + args.span) * dtypeBytes(args.dtype)" }] | |
| } | |
| }, | |
| { | |
| "name": "gated-rmsnorm-prefill-s4096-h16-d128-f16", | |
| "preset": "model", | |
| "provenance": { | |
| "model": "Qwen3.5 / Qwen3-Next gated linear attention output norm", | |
| "notes": "A 4096-token prefill: 65536 spans, a working set far past cache so the bandwidth figure is a DRAM figure." | |
| }, | |
| "vars": { "dtype": "float16", "count": 8388608, "span": 128 }, | |
| "inputs": { | |
| "xT": { "shape": [1, 4096, 2048], "dtype": "float16", "dist": "normal", "seed": 561, "scale": 1 }, | |
| "scaleT": { "shape": [128], "dtype": "float16", "dist": "uniform", "seed": 562, "min": 0.2, "max": 1.8 }, | |
| "gateT": { "shape": [1, 4096, 2048], "dtype": "float16", "dist": "normal", "seed": 563, "scale": 2 } | |
| }, | |
| "outputs": { "yT": { "shape": [1, 4096, 2048], "dtype": "float16" } }, | |
| "bench": { | |
| "metrics": [{ "type": "bandwidth", "value": "(args.count * 3 + args.span) * dtypeBytes(args.dtype)" }] | |
| } | |
| }, | |
| { | |
| "name": "gated-rmsnorm-prefill-s2048-h16-d128-f32", | |
| "preset": "model", | |
| "provenance": { | |
| "model": "Qwen3.5 / Qwen3-Next gated linear attention output norm", | |
| "notes": "The float32 counterpart at the same 48 MB working set." | |
| }, | |
| "vars": { "dtype": "float32", "count": 4194304, "span": 128 }, | |
| "inputs": { | |
| "xT": { "shape": [1, 2048, 2048], "dtype": "float32", "dist": "normal", "seed": 571, "scale": 1 }, | |
| "scaleT": { "shape": [128], "dtype": "float32", "dist": "uniform", "seed": 572, "min": 0.2, "max": 1.8 }, | |
| "gateT": { "shape": [1, 2048, 2048], "dtype": "float32", "dist": "normal", "seed": 573, "scale": 2 } | |
| }, | |
| "outputs": { "yT": { "shape": [1, 2048, 2048], "dtype": "float32" } }, | |
| "bench": { | |
| "metrics": [{ "type": "bandwidth", "value": "(args.count * 3 + args.span) * dtypeBytes(args.dtype)" }] | |
| } | |
| }, | |
| { | |
| "name": "gated-rmsnorm-short-c5-r8193-float32", | |
| "preset": "smoke", | |
| "provenance": { | |
| "notes": "Measures gated RMS normalization over 8193 rows of 5 channels in float32, one row past a full 256-row group. Its smaller row count sets an overhead baseline against the float32 131,073-row sibling." | |
| }, | |
| "vars": { "dtype": "float32", "count": 40965, "span": 5 }, | |
| "inputs": { | |
| "xT": { "shape": [1, 8193, 5], "dtype": "float32", "dist": "normal", "seed": 551, "scale": 1 }, | |
| "scaleT": { "shape": [5], "dtype": "float32", "dist": "uniform", "seed": 552, "min": 0.2, "max": 1.8 }, | |
| "gateT": { "shape": [1, 8193, 5], "dtype": "float32", "dist": "normal", "seed": 553, "scale": 2 } | |
| }, | |
| "outputs": { "yT": { "shape": [1, 8193, 5], "dtype": "float32" } }, | |
| "bench": { | |
| "metrics": [{ "type": "bandwidth", "value": "(args.count * 3 + args.span) * dtypeBytes(args.dtype)" }] | |
| } | |
| }, | |
| { | |
| "name": "gated-rmsnorm-short-c5-r131073-float32", | |
| "preset": "smoke", | |
| "provenance": { | |
| "notes": "Measures gated RMS normalization over 131,073 rows of 5 channels in float32, one row past a full 256-row group. Its larger row count isolates per-row cost from the 8193-row float32 sibling's per-dispatch overhead." | |
| }, | |
| "vars": { "dtype": "float32", "count": 655365, "span": 5 }, | |
| "inputs": { | |
| "xT": { "shape": [1, 131073, 5], "dtype": "float32", "dist": "normal", "seed": 551, "scale": 1 }, | |
| "scaleT": { "shape": [5], "dtype": "float32", "dist": "uniform", "seed": 552, "min": 0.2, "max": 1.8 }, | |
| "gateT": { "shape": [1, 131073, 5], "dtype": "float32", "dist": "normal", "seed": 553, "scale": 2 } | |
| }, | |
| "outputs": { "yT": { "shape": [1, 131073, 5], "dtype": "float32" } }, | |
| "bench": { | |
| "metrics": [{ "type": "bandwidth", "value": "(args.count * 3 + args.span) * dtypeBytes(args.dtype)" }] | |
| } | |
| }, | |
| { | |
| "name": "gated-rmsnorm-short-c5-r131073-float16", | |
| "preset": "smoke", | |
| "provenance": { | |
| "notes": "Measures gated RMS normalization over 131,073 rows of 5 channels in float16, one row past a full 256-row group; compares against its float32 counterpart at the same shape." | |
| }, | |
| "vars": { "dtype": "float16", "count": 655365, "span": 5 }, | |
| "inputs": { | |
| "xT": { "shape": [1, 131073, 5], "dtype": "float16", "dist": "normal", "seed": 551, "scale": 1 }, | |
| "scaleT": { "shape": [5], "dtype": "float16", "dist": "uniform", "seed": 552, "min": 0.2, "max": 1.8 }, | |
| "gateT": { "shape": [1, 131073, 5], "dtype": "float16", "dist": "normal", "seed": 553, "scale": 2 } | |
| }, | |
| "outputs": { "yT": { "shape": [1, 131073, 5], "dtype": "float16" } }, | |
| "bench": { | |
| "metrics": [{ "type": "bandwidth", "value": "(args.count * 3 + args.span) * dtypeBytes(args.dtype)" }] | |
| } | |
| }, | |
| { | |
| "name": "gated-rmsnorm-short-c6-r131073-float16", | |
| "preset": "smoke", | |
| "provenance": { | |
| "notes": "Measures gated RMS normalization over 131,073 rows of 6 channels in float16, one row past a full 256-row group." | |
| }, | |
| "vars": { "dtype": "float16", "count": 786438, "span": 6 }, | |
| "inputs": { | |
| "xT": { "shape": [1, 131073, 6], "dtype": "float16", "dist": "normal", "seed": 551, "scale": 1 }, | |
| "scaleT": { "shape": [6], "dtype": "float16", "dist": "uniform", "seed": 552, "min": 0.2, "max": 1.8 }, | |
| "gateT": { "shape": [1, 131073, 6], "dtype": "float16", "dist": "normal", "seed": 553, "scale": 2 } | |
| }, | |
| "outputs": { "yT": { "shape": [1, 131073, 6], "dtype": "float16" } }, | |
| "bench": { | |
| "metrics": [{ "type": "bandwidth", "value": "(args.count * 3 + args.span) * dtypeBytes(args.dtype)" }] | |
| } | |
| }, | |
| { | |
| "name": "gated-rmsnorm-short-c7-r131073-float32", | |
| "preset": "smoke", | |
| "provenance": { | |
| "notes": "Measures gated RMS normalization over 131,073 rows of 7 channels in float32, one row past a full 256-row group; compares against its float16 counterpart at the same shape." | |
| }, | |
| "vars": { "dtype": "float32", "count": 917511, "span": 7 }, | |
| "inputs": { | |
| "xT": { "shape": [1, 131073, 7], "dtype": "float32", "dist": "normal", "seed": 551, "scale": 1 }, | |
| "scaleT": { "shape": [7], "dtype": "float32", "dist": "uniform", "seed": 552, "min": 0.2, "max": 1.8 }, | |
| "gateT": { "shape": [1, 131073, 7], "dtype": "float32", "dist": "normal", "seed": 553, "scale": 2 } | |
| }, | |
| "outputs": { "yT": { "shape": [1, 131073, 7], "dtype": "float32" } }, | |
| "bench": { | |
| "metrics": [{ "type": "bandwidth", "value": "(args.count * 3 + args.span) * dtypeBytes(args.dtype)" }] | |
| } | |
| }, | |
| { | |
| "name": "gated-rmsnorm-short-c7-r131073-float16", | |
| "preset": "smoke", | |
| "provenance": { | |
| "notes": "Measures gated RMS normalization over 131,073 rows of 7 channels in float16, one row past a full 256-row group; compares against its float32 counterpart at the same shape." | |
| }, | |
| "vars": { "dtype": "float16", "count": 917511, "span": 7 }, | |
| "inputs": { | |
| "xT": { "shape": [1, 131073, 7], "dtype": "float16", "dist": "normal", "seed": 551, "scale": 1 }, | |
| "scaleT": { "shape": [7], "dtype": "float16", "dist": "uniform", "seed": 552, "min": 0.2, "max": 1.8 }, | |
| "gateT": { "shape": [1, 131073, 7], "dtype": "float16", "dist": "normal", "seed": 553, "scale": 2 } | |
| }, | |
| "outputs": { "yT": { "shape": [1, 131073, 7], "dtype": "float16" } }, | |
| "bench": { | |
| "metrics": [{ "type": "bandwidth", "value": "(args.count * 3 + args.span) * dtypeBytes(args.dtype)" }] | |
| } | |
| } | |
| ] | |
| } | |