ONNX Runtime: cross-platform, high performance ML inferencing and training accelerator
Find a file
Jiajia Qin 80e9df826e
[js/webgpu] Optimize InstanceNormalization (#21995)
### Description
<!-- Describe your changes. -->
For InstanceNormalization, it has `y = scale * (x - mean) /
sqrt(variance + epsilon) + B` , where mean and variance are computed per
instance per channel. Calculating mean and variance per channel is a
reduce processing, which is NCHW layout friendly since it makes the
adjacent threads can access contiguous data in gpu memory.

This PR optimizes both NHWC and NCHW InstanceNormalization. To
efficiently calculate the mean and variance, we need to make sure the
input is NCHW instead of NHWC. Then use shared memory to do the reduce
operation to get `channel_scale` and `channel_shift`.

With this PR, getting `channel_scale` and `channel_shift` are same for
NHWC and NCHW InstanceNormalization. And the overall performance becomes
very close now.

Below data comes from SD Turbo profiling results.
Before (InstanceNormalization overall time: 140.84 ms)

InstanceNormalization\|InstanceNormComputeMean | 129.70
-- | -- 
InstanceNormalization\|InstanceNormalizationNHWC | 10.55
InstanceNormalization\|InstanceNormComputeChannelScaleShift | 0.59


After (InstanceNormalization overall time:  59.44 ms)

InstanceNormalization\|InstanceNormComputeChannelScaleShift | 28.57
-- | -- 
InstanceNormalization\|TransposeShared | 20.19
InstanceNormalization\|InstanceNormalizationNHWC | 10.68
2024-09-23 11:32:09 -07:00
.config
.devcontainer
.gdn
.github Create CMake option onnxruntime_USE_VCPKG (#21348) 2024-09-10 16:39:27 -07:00
.pipelines [DML EP] Update DML to 1.15.1 (#21695) 2024-08-12 14:16:43 -07:00
.vscode Stop VSCode appending file associations to settings.json (#21944) 2024-08-31 19:04:12 -07:00
cgmanifests Upgrade XNNPACK to latest version (#22012) 2024-09-17 10:12:16 -07:00
cmake Specify the paths of system tools when building Apple framework (#22056) 2024-09-23 17:19:30 +08:00
csharp Fix C# doc generation workflow (#21988) 2024-09-05 13:54:17 +10:00
dockerfiles [CUDA] Update Dockerfile.cuda with cuda 12.5.1 and cudnn 9 (#21987) 2024-09-05 15:25:40 -07:00
docs Matmul_nbits kernel for mlas sqnbits to support Fp16 inputs (#21807) 2024-09-13 14:55:08 -07:00
include/onnxruntime/core Fix std::chrono/date conflict for mac builds with C++20 (#22138) 2024-09-20 11:18:24 -07:00
java [Java] Exposing SessionOptions.SetDeterministicCompute (#18998) 2024-09-16 11:55:38 +10:00
js [js/webgpu] Optimize InstanceNormalization (#21995) 2024-09-23 11:32:09 -07:00
objectivec
onnxruntime Fix an issue that QNN models shared from other session use the session logger from that session (#22170) 2024-09-21 20:41:56 -07:00
orttraining Move Gelu and LayerNorm fusion to L1 optimization (#21332) 2024-09-09 13:27:52 +10:00
rust
samples
tools set CMAKE_SYSTEM_PROCESSOR in xnnpack.cmake (#22155) 2024-09-20 15:19:26 -07:00
winml Fix warnings (#21809) 2024-08-21 14:23:37 -07:00
.clang-format
.clang-tidy
.dockerignore
.gitattributes
.gitignore
.gitmodules Revert "Upgrade emsdk from 3.1.59 to 3.1.62" (#21817) 2024-08-22 11:21:00 -07:00
.lintrunner.toml [js] change default formatter for JavaScript/TypeScript from clang-format to Prettier (#21728) 2024-08-14 16:51:22 -07:00
build.bat
build.sh
build_arm64x.bat
CITATION.cff
CODEOWNERS
CONTRIBUTING.md
lgtm.yml
LICENSE
NuGet.config Update C# test projects (#21631) 2024-09-05 08:21:23 +10:00
ort.wprp
ORT_icon_for_light_bg.png
packages.config [DML EP] Update DML to 1.15.1 (#21695) 2024-08-12 14:16:43 -07:00
pyproject.toml Ignore ruff rule N813 (#21477) 2024-07-24 17:48:22 -07:00
README.md
requirements-dev.txt
requirements-doc.txt
requirements-lintrunner.txt Update ruff and clang-format versions (#21479) 2024-07-24 11:50:11 -07:00
requirements-training.txt
requirements.txt
SECURITY.md
setup.py [qnn ep] fix naming convention of ort-nightly-qnn package (#22157) 2024-09-19 17:33:31 -07:00
ThirdPartyNotices.txt
VERSION_NUMBER bumps up version in main from 1.19 -> 1.20 (#21588) 2024-08-05 15:46:04 -07:00

ONNX Runtime is a cross-platform inference and training machine-learning accelerator.

ONNX Runtime inference can enable faster customer experiences and lower costs, supporting models from deep learning frameworks such as PyTorch and TensorFlow/Keras as well as classical machine learning libraries such as scikit-learn, LightGBM, XGBoost, etc. ONNX Runtime is compatible with different hardware, drivers, and operating systems, and provides optimal performance by leveraging hardware accelerators where applicable alongside graph optimizations and transforms. Learn more →

ONNX Runtime training can accelerate the model training time on multi-node NVIDIA GPUs for transformer models with a one-line addition for existing PyTorch training scripts. Learn more →

Get Started & Resources

Builtin Pipeline Status

System Inference Training
Windows Build Status
Build Status
Build Status
Linux Build Status
Build Status
Build Status
Build Status
Build Status
Build Status
Build Status
Build Status
Mac Build Status
Android Build Status
iOS Build Status
Web Build Status
Other Build Status

Third-party Pipeline Status

System Inference Training
Linux Build Status

Data/Telemetry

Windows distributions of this project may collect usage data and send it to Microsoft to help improve our products and services. See the privacy statement for more details.

Contributions and Feedback

We welcome contributions! Please see the contribution guidelines.

For feature requests or bug reports, please file a GitHub Issue.

For general discussion or questions, please use GitHub Discussions.

Code of Conduct

This project has adopted the Microsoft Open Source Code of Conduct. For more information see the Code of Conduct FAQ or contact opencode@microsoft.com with any additional questions or comments.

License

This project is licensed under the MIT License.