Announcements & Breaking Changes
- Upgraded to ONNX 1.22.0 and protobuf 6.33.5 (#28754, #29606, #28967). Graph optimizer opset version checks were updated accordingly (#28966).
- cuDNN and cuFFT are now optional at runtime for the CUDA EP, and
nvrtcis no longer linked, which significantly reduces the required CUDA redistributable footprint (#29252, #29808, #29705, #29620). - An experimental C/C++ API surface was introduced.
OrtModelPackageApinow lives in the experimental C API and may change in future releases (#28746, #29142, #28990). - Deprecated / removed:
- SkipLayerNorm strict mode is deprecated (#29388).
- The TensorRT fused causal attention kernels were removed from the CUDA EP (#29143).
- The dynamic WGSL generator (duktape/Node) path was removed in favor of the Python
wgsl-genimplementation (#29141, #28355). CUDA_QUANT_PREPROCESSis off by default (#29687).
- NPM packages are now published from the CUDA 13 pipeline (#28773).
- The CUDA 12.8 package architecture list was refreshed for this release (#29711).
Security Fixes
Memory safety & input validation
- Hardened the ORT FlatBuffer model loader against malformed buffers, and removed now-redundant table offset validation (#28186, #29068)
- Fixed type confusion in raw-pointer
bind_inputcausing an out-of-bounds write (#28839) - Fixed out-of-bounds pointer in
TensorAtfor sub-byte packed types (#28973) - Fixed arbitrary memory read, out-of-bounds dereference, and other OOB accesses in kernels (#28991, #29011, #29012, #29014)
- Validated
Col2Iminputs to prevent heap over-read (#28706) - Hardened
CropAndResizeagainst malformedcrop_sizetensors (#28766) - Validated
BeamSearchvocab_sizeagainst logits width (#28774) - Fixed bounds in
WhisperDecoderSubgraph::CreateInitialFeeds(#29239) - Validated
SparseAttentionCSR indices/key lengths and rejected zero-dimensionblock_row_indices(#29015, #29242) - Clamped derived sequence lengths and KV-cache index in CUDA GroupQueryAttention, and fixed a CPU GQA out-of-bounds read in the past-KV buffer (#29240, #29447)
- Clamped 1D attention
mask_indexto valid bounds (#29449) - Validated
MaxpoolWithMaskkernel rank against input spatial rank (#29253) - Rejected CUDA BERT
EmbedLayerNorm/SkipLayerNormshapes exceeding 32-bit output indexing (#29264) - Fixed the optional-output guard in
DecoderAttention/MultiHeadAttentionshape inference and negative-axis handling inExpandDimsshape inference (#29268, #29448) - Fixed
TreeEnsembletarget id validation and added input validation toLinearClassifier(#29293, #29060) - Fixed
DynamicQuantizeLSTMzero-point/scale validation typos (#29462) - Handled non-trivially-copyable types in
Loop/Scanoutput concatenation (#29397) - Normalized bool tensor
raw_datato{0, 1}on unpack (#29238) - Addressed hardening gaps in
Resize,PadFusion, and LoRA handling (#28779, #28780, #28801) - Fixed unbounded lifetime on
WithOutputTensorin the Rust bindings (#29251)
Integer overflow & allocation size
- Guarded
MlasConvPrepareworking-buffer products andConvTransposepad computation with SafeInt (#29444, #29446) - Fixed signed-int overflow in
SamplingState::Initthat could cause a heap buffer overflow (#29443) - Hardened QMoE against integer overflow and partial K tiles (#29067)
- Validated
B/scales/zero-points shape inMatMulNBits::PrePack(#29445) - Pre-checked
ConstantOfShapeoutput size against the input initializer before constant folding (#28751) - Fixed integer overflow in RKNPU implicit bias allocation (#29249)
- Fixed WebGPU out-of-bounds reads in
Pad(int64/int32 truncation),Slice, andGatherBlockQuantized(#28721, #28704, #28718)
Supply chain & tooling
- Updated protobuf to mitigate CVE-2026-0994 and bumped ONNX/protobuf to fix additional CVEs (#28967, #29606)
- Avoided shell injection in the training helper and switched Triton compile helpers to
subprocess(#28776, #28775) - Validated archive extraction paths in the transformers tooling (#28777)
- Validated and inlined external data in node tensor attributes during session initialization (#29250)
- Enabled Spectre-mitigated MSVC libraries for BinSkim builds (#29624)
- Bumped npm dependencies:
shell-quote,esbuild,tmp,ws,protobufjs,js-yaml,tar,markdown-it,@babel/core(#29022, #29044, #29055, #29057, #29061, #29062, #29063, #29079, #29090, #29156)
New Features
Execution Provider ABI & Plugin EPs
- Model Package support Phase 2, plus authoring tools, schema versioning, and folding
external_datainto session options (#28271, #28989, #29501) - Added an API to select the best compiled-model compatibility info from candidate strings (#28387)
- Added crypto support: applications can supply I/O callbacks to an EP, with callback and fallback helpers (#28624)
- Implemented name-based partitioning with accompanying documentation (#28903)
- Added Linux NPU discovery through sysfs accel devices (#28703)
- Relaxed
CompileModelvalidation to accept zero-inputOrtModelgraphs (#28771) - CUDA plugin EP: user compute stream with CUDA graph, kernel sync stream exposed for scratch allocation, and Windows ARM64 packages (#29221, #29244, #28896, #28789)
- WebGPU plugin EP version bumped to 0.3.0 (#29056)
Core APIs & Runtime
- Added
OrtErrorCodedocumentation, single-sourced the values soStatusCodestays in sync, and addedOrtErrorCode::ORT_DEVICE_RESET(#29018, #29065, #29748) - Added memory statistics to profiling output (#29058)
- Added EP version logging on inference failure, in the
EpDeviceUsageevent, and ORT version logging (#28794) - User-supplied external initializers are now used in place when already on the planned device (#29013)
model_external_initializers_file_folder_pathis now honored for file-path model loads (#29459)- Added a Python API for
HOST_ACCESSIBLEOrtValueallocation (#28038)
Quantization Tooling
- Added
CudaQuantizertoonnxruntime.quantization(#29509) - Registered
Flattenas a Direct8Bit op in the Python QDQ static quantizer (#28340) - Skipped
MaxPoolduring FP8 static quantization and fixed the FP8 (FLOAT8E4M3FN) scale reference distribution (#28488, #29350) - Added Float16/BFloat16/Float8 support in the
TensorArraycustom op (#28335) - Clarified CPU parameter recommendations in the quantization docs (#28415)
Execution Provider Updates
NVIDIA CUDA EP
Attention & LLM decode
- Enabled XQA by default for FP16/BF16 GroupQueryAttention, and extended XQA decode with attention sink, sliding window, and QK-Norm support (#29046, #29162, #29177, #29186)
- Upgraded
cudnn_frontendto 1.24 and enabled cuDNN SDPA for MHA/GQA (#28849) - Added decode-optimized LinearAttention (GatedDeltaNet) kernels (#28985)
- Optimized FlashDecode split planning for local-window GQA and fixed Flash/Lean attention split heuristics (#29161, #29554)
- Updated the GroupQueryAttention contrib op documentation (#29173)
MoE & quantized GEMM
- Prepacked int4/int8 QMoE expert weights in the
PrePackhook, symmetric withMatMulNBits, and fixed the prepack to always use the SM80 layout (#28749, #28978, #28965) - Optimized the QMoE SoftmaxTopK router for small-batch decode, added a Split-K2 SwiGLU GEMV kernel, defaulted to fp16 accumulation for fp16 activations, and fused the MoE router bias into the
MatMulNBitsGEMV (#28980, #29167, #29166, #29170) - Added a batched small-M GEMV path for 4-bit/8-bit
MatMulNBits(#29451) - Enabled fpA_intB GEMM in CUDA builds with configurable options, added prepacked fpA_intB weight support, and enabled native SM90,
block_size=32, and fused bias (#29622, #29499, #29585) - Fixed a QMoE profiler cross-stream race and made it CUDA-graph-capture safe (#29584)
Coverage, dependencies & fixes
- Added cuDNN-free
ArgMax/ArgMin/ReduceSumand fixedLogSoftmaxon the plugin EP (#29620) - Filled the CUDA opset gap for
SoftplusandSoftsignup to opset 22 (#28982) - Fixed the XQA GroupQueryAttention
cudaErrorInvalidValueon Blackwell (sm_120) (#29706) - Initialized large-head FMHA shared memory per kernel variant (#29140)
- Fixed CUDA/cuDNN DLL preload paths for the CUDA 13 consolidated wheel layout, and fixed the
libcudart.so.13hard dependency that broke import on CPU-only Linux (#29202, #29590) - Fixed a null allocator passed to plugin EP kernel
PrePack, and plugin EP allocator deleter lifetime (#29658, #29663) - Removed unused code in
moe_kernels.cu(#29295)
WebGPU EP
- Added KV cache quantization for ORT WebGPU (#28059)
- Fused FlashAttention decode kernels and extended them to any sequence length (#28389)
- Fused Q/K RMSNorm into GroupQueryAttention for Qwen3-style models (#28484)
- Gemma 4 enablement: indirect dispatch for FlashAttention graph capture, and INT64 support for
Equal/Sub/Where/ReduceSumunder theenable_int64flag (#29236, #29392) - Added a session-level buffer pool for graph capture reuse and made
max_num_pending_dispatchesconfigurable (#28761, #28894) - Added 2-bit quantization support to
GatherBlockQuantized(#29054) - Enabled
Castto int64 by default and switched to naive reduction (#28804, #28174) - Default non-debug validation mode is now disabled (#28679)
- Tuned parameters for the gemm-subgroup kernel (#28760)
- Enabled FlashAttention for batched GQA with right-padded prompts and fixed batched right-padded prefill with
do_rotary(#29247, #29002) - Fixed a GQA decode split-reduce
head_sizeout-of-bounds race, thepast_state == present_statebuffer aliasing case, andGatherBlockQuantizeddispatch failure for empty indices (#29593, #28753, #29030) - Fixed nearest half-tie handling for
round_prefer_ceil/round_prefer_floor(#28757) - Skipped
MatMulNBitsMlpFusionwhen the kernel is unavailable (#29089) - Fixed profiling timestamp alignment with the ORT profiler (#29021)
CoreML EP
- Added
WhereandAndbuilders (#28597) - Fixed extended minimal builds with the Core ML EP (#29387)
- Fixed the
"model_path" must not be emptyerror (#29394) - Fixed CoreML-enabled static builds on macOS (#27960)
QNN EP
- Fixed a segfault in
PadNodeGroupSelector::Checkwhendq_nodesis empty (#28733) - Added a
Gatherhandler for the transpose optimizer (#28755)
WebNN EP
- Added support for 8-bit
MatMulNBits(#29025) - Removed unnecessary casts around normalization ops (#29024)
OpenVINO / VitisAI / DML / XNNPACK / VSINPU
- OpenVINO EP development updates (#28954)
- VitisAI: recognize native-endian in-memory address tag in
process_ext_address(#29248) - DML: fixed batched readback size (#28680)
- XNNPACK: fixed Clip/Relu fusion when the producer output has other consumers (#28814)
- VSINPU: fixed EP build error (#29440)
CPU & Core Optimizations
MLAS
- Added AVX512 (+VNNI) 2-bit weight CPU kernels (#29064)
- Added ARM64 2-bit weight CPU kernels (#29466)
- Extended the NHWC-sans-transposes path to support depthwise convolutions, and fixed NHWC conv support gating (#28565, #29127)
- Added RISC-V RVV INT8 GEMM/GEMV, M=1 routing, and activation kernels (#28308)
- Fixed a fastmath corner case in
sbgemm_neon_kerneland fixed failing KleidiAI NHWC unit tests (#28394, #29010) - Hinted GCC >= 12 on aarch64 for bf16/fp16 capability probes (#28785)
CPU Attention & Kernels
- Added flash attention for non-quantized CPU GroupQueryAttention, plus a FP32 GEMV decode kernel (#28962, #29216)
- Fixed packed-QKV and broadcast-head bias strides in quantized GQA flash attention (#28963)
- Enabled pre-packed weight sharing for CPU
MatMulNBits(#29163) - Added int8/uint8 CPU support for
SpaceToDepthand int8 forDepthToSpace(#29154) - Fixed CPU Attention causal mask alignment and
is_causalbottom-right alignment for external KV cache (#29050, #28958) - Fixed CPU GQA NaN output for right-padded batched prompts with rotary embeddings (#29069)
- Fixed
ReverseSequencereturning zeros for zero-length sequences (#28759) - Fixed a regression in
RandomForestClassifierbinary classification predictions (#28685)
Graph, Optimizer, and Fusion
- Fixed NHWC second-pass EP assignment cleanup (#27858)
- Rejected QDQ
Gemm→QGemmfusion whenalpha != 1with bias, and validated DQ scale/zero-point shapes beforeQGemmfusion (#28131, #28714) - Fixed incorrect output for QDQ
Resizewith non-nearest interpolation modes underORT_ENABLE_ALL(#28454) - Fixed INT64 initializer data propagation and the
Shape→Gather→TopKrank-1 regression (#28778, #29084) - Fixed a
TransposeOptimizertype error on zero-point-lessDequantizeLinear(#29192) - Fixed
SimplifiedLayerNormfusion with a node-producedPowexponent (#29196) - Fixed DropQDQ not dropping Q/DQ around opset-22
MaxPool(#29201) - Recovered
Conv/ConvTransposerank from weights when the input shape is unknown (#29149) - Fixed
STFTcomplex input frame offsets (#28961)
Web & JavaScript
- Forwarded WebGPU EP buffer cache mode options from JS (#29017)
- Added a Python implementation for
wgsl-genand removed the dynamic WGSL generator path (#28355, #29141) - Switched NPM publishing to consume from the CUDA 13 pipeline, and fixed the Node.js packaging stage to use CFS (#28773, #29006)
- Fixed a Dawn parallel build race condition in the
wasm_Release/build-wasmCI (#29040)
Language Bindings
Python
- Added an API for
HOST_ACCESSIBLEOrtValueallocation (#28038) - Made the TF converter tolerate a missing
requestspackage (#28825)
Java
- Released
outputHandlesArrin theOrtTrainingSession.evalStepJNI binding (#29576)
Rust
- Fixed unbounded lifetime on
WithOutputTensor(#29251)
Build, Packaging & CI
- Updated the cpuinfo dependency and integrated
cpuinfo_deinitialize()(#28245) - Built with abseil 20250814 under NVCC (#28586)
- Fixed the Linux CUDA 13.3 build (abseil + CCCL parse errors) and the Windows CUDA 13.3 build for VS 2026 (#29042, #29266)
- Fixed the Windows build for SM90 and later, and CUDA packaging build errors (#29776, #29580)
- Fixed the wrong ORT version in Windows DLL VersionInfo for pipeline builds (#29545)
- Fixed Python and CUDA packaging pipeline failures (#29200, #29241)
- Installed Java in the Windows NuGet packaging job and added Java setup to the Windows x64 QNN CI pipeline (#29774, #29754)
- Sharded Windows ASan test runs and fixed ASan OOM in QDQ Gemm transformer tests (#29503, #28797)
- Propagated and fixed
PIP_INDEX_URLpiping for container build stages (#29803, #29823) - Removed deprecated docfx in favor of a newer docs validation method (#29812)
- Fixed a build failure from a direct ONNX schema include in layernorm optimizer tests (#29073)
- Test stability: fixed a data race in CUDA graph tests, a non-deterministic CUDA custom-op test, a thread-pool parameter self-assignment, duplicate schema registration, and incorrect string tensor creation (#29398, #29082, #28799, #29219, #29218)
- Encapsulated the global random seed in a function and improved
LinearRegressortest coverage (#28979, #29083)
Contributors
Thanks to our 103 contributors for this release!
@adrastogi, @ankitm3k, @apsonawane, @ArsalanShakil, @bachelor-dou, @bopeng1234, @cbourjau, @chilo-ms, @chunghow-qti, @chwarr, @claude, @Craigacp, @crvineeth97, @dabhattimsft, @daijh, @danielsongmicrosoft, @derdeljan-msft, @edgchen1, @elwhyjay, @ericcraw, @eserscor, @fanchenkong1, @feich-ms, @fs-eire, @FuZoe, @gaugarg-nv, @gblong1, @GopalakrishnanN, @grybouilli, @guschmue, @haoxli, @hariharans29, @hnsyprst, @Honry, @intbf, @ishwar-raut1, @jambayk, @Jaswanth51, @jatinwadhwa921, @javier-intel, @jiafatom, @Jiawei-Shao, @JonathanC-ARM, @justinchuby, @jwludzik, @Kotomi-Du, @kpkbandi, @lucka-me, @maoger, @martin-klacer-arm, @maxwbuckley, @MayureshV1, @mc-nv, @mcollinswisc, @mdvoretc-intel, @mingyueliuh, @mklimenk, @n1harika, @namgyu-youn, @neilmsft, @orlmon01, @Osamaali313, @prathikr, @preetha-intel, @psakhamoori, @qiurui144, @qjia7, @qti-hungjuiw, @qti-yuduo, @quic-muchhsu, @raagrawal, @RajeevSekar, @Reranko05, @Rishi-Dave, @RyanMetcalfeInt8, @Sammy-Dabbas, @sanaa-hamel-microsoft, @sayanshaw24, @selenayang888, @sfatimar, @sgbihu, @Shivani767, @ssam18, @susbhere, @sushraja-msft, @tairenpiao, @the0cp, @tianleiwu, @titaiwangms, @umireon, @vthaniel, @wangw-1991, @wenqinI, @xadupre, @xenova, @xhcao, @xiaofeihan1, @xieofxie, @xuke537, @yen-shi, @yinli-systems, @yuslepukhin, @ZackyLake
Full Changelog: v1.27.1...v1.28.0