MLX Updates & Release Notes

Follow

10 updates curated from 1 source by the Releasebot Team. Last updated: Sep 2, 2026

Get this feed:
  • Aug 25, 2026
    • Date parsed from source:
      Aug 25, 2026
    • First seen by Releasebot:
      Sep 2, 2026
    ml-explore logo

    MLX by ml-explore

    v0.32.2

    MLX ships a broad release with new attention and fused kernel options, stronger normalization and optimizer validation, improved quantization and FFT behavior, and a long list of CPU, CUDA, Metal, and Windows fixes for stability and performance.

    What's Changed

    • Preserve subnormal float values when casting to bool by @reckylurker in #4224
    • Support assigning through a bare Ellipsis index by @Adityaj0 in #4314
    • Fix divmod truncating the quotient for floats by @ayaangazali in #4108
    • Add force_fused option to scaled_dot_product_attention by @hojin12312 in #4185
    • Reject a negative eps in the normalization layers by @ayaangazali in #4312
    • Bound GGUF metadata string/array values against the file mapping by @x14ngch3n in #4212
    • Read each K/V byte once in gqa-8 decode attention by @dudududukim in #4077
    • Fix fft vmap and jvp for transforms over a subset of axes by @kapellirohith in #4138
    • Fix median dropping NaN by @devteamaegis in #4146
    • Fix the CPU scan over a size one axis with a padded stride by @kapellirohith in #4139
    • Validate the optimizer betas at construction by @ayaangazali in #4310
    • RMSNormVJP backward writes a full {n_rows, D} gw_temp intermediate by @JasonHonKL in #4293
    • [Bug]: add default none value to axis parameter of the take_along_axis by @aaishwarymishra in #4357
    • Add a fused full-attention path for head_dim 256 on NAX devices by @wyanzhao in #3842
    • Update nanobind to 2.15.0 by @XXXXRT666 in #4337
    • Skip unnecessary simdgroup computations for quantised MOE matmuls on NAX by @RohanGautam in #4352
    • Add AI usage policy by @zcbenz in #4331
    • Raise cpu stream errors from synchronize by @robertomeroni in #4338
    • chore: Validate eps in Adam at construction by @vraj00222 in #4361
    • Bound winograd conv2d working set by tiling the batch by @Gusanidas in #4102
    • Use a 32-row block in qmm_t_nax when one block covers all of M by @dwijenpatel in #4171
    • Deduplicate fftshift and ifftshift by @Adityaj0 in #4318
    • Fix Log and Equal is_equivalent ignoring primitive state by @kapellirohith in #4266
    • Stabilize reduced-precision InstanceNorm by @ternaus in #4230
    • Normalize negative axes in sort and argsort by @deBrian07 in #4332
    • Clean up main thread compile cache before python interpreter shuts down by @zcbenz in #4373
    • chore: Check malformed jaccl hostfile that miss rdma in pairs by @erwinzhang7 in #4284
    • Round mxfp8 block scales up to avoid saturation by @dhiltgen in #4353
    • Add support for the array_namespace_info by @aaishwarymishra in #4334
    • Stop a failed CUDA graph commit from poisoning the encoder by @strayberry in #4356
    • Fix quantized kernels in JIT build by @dwijenpatel in #4372
    • [Metal][Performance] Avoid zero work in stride-2 ConvTranspose3d by @ternaus in #4343
    • [CUDA] Ce fused kernel by @nastya236 in #3947
    • Fix cpu exclusive scan for complex numbers by @ayaangazali in #4272
    • Support Relocatable CUDA DLLs on Windows by @dhiltgen in #4382
    • Use cast_to for fused AsType in compiled Metal kernels by @katlun-lgtm in #4351
    • Declare DLPackCompatible protocol members as methods, not settable attributes by @Adityaj0 in #4384
    • Fix quantizing sliced arrays by @zcbenz in #4381
    • Fix einsum dropping a trailing empty subscript by @Adityaj0 in #4299
    • Add script to run python tests by @zcbenz in #4393
    • Hold GIL in AttachedData destructor by @zcbenz in #4391

    New Contributors

    • @hojin12312 made their first contribution in #4185
    • @x14ngch3n made their first contribution in #4212
    • @vraj00222 made their first contribution in #4361
    • @ternaus made their first contribution in #4230
    • @strayberry made their first contribution in #4356

    Full Changelog: v0.32.1...v0.32.2

    Original source
  • Aug 18, 2026
    • Date parsed from source:
      Aug 18, 2026
    • First seen by Releasebot:
      Sep 2, 2026
    ml-explore logo

    MLX by ml-explore

    v0.32.1

    MLX ships a broad 0.32.1 update with faster RMSNorm, new searchsorted and pad capabilities, expanded Metal and CUDA support, better distributed handling, and many fixes for docs, dtype dispatch, shapes, zero-size inputs, and stability across CPU, GPU, and JIT paths.

    What's Changed

    • Fix int64 type cast error when loading GGUF metadata arrays by @danlee2002 in #3823
    • Document default values in normalization layer docstrings by @Pablosinyores in #3819
    • Warn at configure time when NAX kernels are disabled by @pierre427 in #3824
    • [CUDA][Improvement] RMSNorm forward speed up by @nastya236 in #3850
    • Fix captured random state in compile by @angeloskath in #3828
    • Fix JIT preamble header filter matching project paths containing "Xcode" by @apocryphx in #3873
    • Document default value of p in dropout layer docstrings by @ayaangazali in #3870
    • [WIP] [CUDA] fsdp by @nastya236 in #3768
    • Fix triplet_loss docstring to document the reduced output shape by @ayaangazali in #3884
    • Zero-copy CPU import: mx.array(host_buffer, copy=False) on unified memory by @HaoXuAI in #3872
    • Round MLX_SDPA_BLOCKS up to a multiple of 32 by @pierre427 in #3875
    • Reuse Metal WAR tracking hash tables by @neilmehta24 in #3882
    • Use unroll_count(4) for the NAX attention [email protected] loop by @wyanzhao in #3843
    • metal: add gemv_wide for fp16/bf16 matmuls of a few rows by @jessegross in #3888
    • Fix broken docstring rendering in Linear and RNN by @ayaangazali in #3890
    • Fix Adamax betas docstring and MultiOptimizer filters type by @ayaangazali in #3889
    • Fix incorrect nvfp4 quantized_matmul through the split-K path by @metascroy in #3854
    • [Metal] Avoid regex in custom kernel name generation by @aleroot in #3869
    • Fix prod dtype promotion when reducing a size-1 axis by @eyupcanakman in #3898
    • [CUDA] Fix grid overflow in gemm conv unfold kernels for >= 65,536 output positions by @AdamDLuz in #3893
    • [CUDA] columnwise quantize with tma by @nastya236 in #3157
    • metal: reduce NVFP4 scales per 16-lane group by @jessegross in #3934
    • Update homebrew in CI by @angeloskath in #3946
    • Make index autodiff errors explicitly recommend stop_gradient by @dogukanveziroglu in #3820
    • Making JACCL coordinator optional by @angeloskath in #3899
    • Fix docstring mismatches in the Python bindings by @ayaangazali in #3948
    • Raise a clear error for an invalid quantization mode in nn layers by @ayaangazali in #3914
    • Fix incorrect examples and outputs in the usage docs by @ayaangazali in #3956
    • Skip test_gather_qmm_sorted cpu test on M1 mac by @zcbenz in #3973
    • Fixes an axis mismatch bug in matrix norm for case -1 and 1 by @danlee2002 in #3827
    • Fix BatchNorm running variance estimator by @ishtihoss in #3817
    • Fix build error caused by TMA macro guard by @zcbenz in #3988
    • Fix Glorot/He uniform init docstrings to label the uniform bound, not sigma by @vineethsaivs in #3831
    • Fix custom metal kernel cache collision for same name, different source by @katlun-lgtm in #3833
    • Fix log_cosh_loss docstring to document the element-wise loss by @winklemad in #3846
    • Fix step activation docstring to match >= threshold behavior by @ayaangazali in #3902
    • docs: document the reduced-precision float32 default and MLX_ENABLE_TF32 by @stoyoda0012-cyber in #3894
    • Fix InstanceNorm Shape docstring to require at least 3 dimensions by @ayaangazali in #3903
    • Fix filter_and_map docstring argument order for filter_fn and is_leaf_fn by @ayaangazali in #3906
    • Export C++20 requirement to CMake consumers by @PhysicistJohn in #3971
    • Fix implicit thread address space qualifier becoming explicit in metal 4.1 by @louen in #3963
    • Fix Transformer ignoring a custom encoder or decoder with no parameters by @ayaangazali in #3962
    • docs: remove references to removed --no-verify-script launch flag by @latent-9 in #3959
    • added eye(0) support and tests by @aaishwarymishra in #3952
    • Refactor the JACCL ring and add threads for the multiple rings by @angeloskath in #3900
    • Fix shapeless matmul with dynamic batch dimensions by @varshneydevansh in #3813
    • Fix JIT build with old macOS SDK by @metascroy in #3853
    • Fix cholesky_inv documented argument name to match the binding by @ayaangazali in #3950
    • Add new_thread_unsafe_stream to the devices and streams docs by @ayaangazali in #3968
    • Add gather_qqmm by @zcbenz in #3757
    • Fix missing printoptions doc page from autosummary filename collision by @ayaangazali in #3985
    • Document ThreadLocalStream and iinfo in the API reference by @ayaangazali in #3986
    • Make "stop" optional in arange by @aaishwarymishra in #3982
    • Add softsign to the nn functions docs by @ayaangazali in #3989
    • Fix broken all_sum and Group references in the data parallelism example by @ayaangazali in #3996
    • Fix ast.metal_kernel typo in the custom Metal kernels guide by @ayaangazali in #3997
    • Fix unresolved mx.array docstring references by @ayaangazali in #3990
    • python: fix bfloat16 buffer format itemsize mismatch by @reckylurker in #3975
    • Template Metal complex scalar lanes by @PhysicistJohn in #3970
    • Pad 2D conv input channels to reach the specialized Metal kernel by @eyupcanakman in #3904
    • Support head dimension 96 in Metal full attention by @dhiltgen in #3943
    • Fix mx.remainder floored-mod for float16/bfloat16 on CPU by @sashko-zakharchuk in #3976
    • Fix sorted gather_mm activation row stride by @metascroy in #3960
    • Fix state corruption when a primitive throws during eval by @WindChimeRan in #3675
    • added complex support by @aaishwarymishra in #3984
    • Validate freeze and unfreeze keys against the whole model when recursing by @ayaangazali in #3966
    • Fix mlx.launch --python: flag is parsed but never forwarded to the launch script by @jonathan308 in #4002
    • Fix broken fully_shard reference in FullyShardedModule docstring by @ayaangazali in #4007
    • Use the current interpreter in the comparative benchmark runner by @ayaangazali in #4016
    • Document MLX environment variables by @XXXXRT666 in #4000
    • Fix CUDA batched GEMV grid overflow by @jasp-nerd in #3929
    • Fix all_gather benchmark collapsing its input to a scalar by @ayaangazali in #4017
    • Check threadgroup size in the 1-pass sdpa_vector dispatch by @apocryphx in #4018
    • Align example projects with the Python 3.10 minimum by @ayaangazali in #4024
    • Fix C++ benchmarks failing to build on overloaded astype by @ayaangazali in #4025
    • Fix conv_transpose maxBufferLength failures on Metal via tiled unfold by @eyupcanakman in #3845
    • Give each host a unique rank in Hostfile.from_list by @ayaangazali in #4027
    • Fix crash when reporting partial rings in mlx.distributed_config by @ayaangazali in #4026
    • docs: Do not pass MLX_METAL_FAST_SYNCH=1 by default by @katlun-lgtm in #4005
    • Fix signed-integer overflow in convolution shape arithmetic by @eyupcanakman in #3938
    • Template Metal C2C FFT scalar lanes by @PhysicistJohn in #3969
    • Fix segfault in expand_dims for out of bounds negative axes by @Gusanidas in #4021
    • Add optional dtype parameter to zeros_like and ones_like by @reckylurker in #4028
    • Fix mx.longsumexp output shape issue. by @JasonHonKL in #4030
    • Treat backend and envs as optional when parsing a hostfile by @ayaangazali in #4039
    • Report bad hostfiles as CLI errors in mlx.launch by @ayaangazali in #4040
    • Fix ceil error message to say ceil instead of floor by @PhysicistJohn in #4042
    • Fix installed static MLX package on Windows by @yingjiacai in #3848
    • Derive the qmv fast path K alignment from bits by @jlee5814 in #3965
    • Fix eigh UPLO and zero-size eigh/svd on the CPU by @kapellirohith in #3834
    • Add metadata to exported functions by @eyupcanakman in #3855
    • Fix empty matrix case in cholesky by @prady0t in #4033
    • Reject a negative max_norm in clip_grad_norm by @ayaangazali in #4058
    • Build extensions with the interpreter running the build by @ayaangazali in #4057
    • Reject negative dimensions in broadcast_to and random shapes by @ayaangazali in #4046
    • Report bad host arguments as CLI errors instead of tracebacks by @ayaangazali in #4045
    • Fix Metal FFT for sizes above 2**20 by @adityasingh2400 in #4013
    • Request MSL 4.1 from the runtime compiler on macOS 27 by @magnuslundstedt in #4052
    • Fix concurrent Metal kernel cache lookup by @kitty-eu-org in #4043
    • Refactor CPU ArgReduce dtype dispatch by @PhysicistJohn in #4066
    • Refactor NumberOfElements dtype dispatch by @PhysicistJohn in #4064
    • Refactor CPU Select dtype dispatch by @PhysicistJohn in #4065
    • Raise qmv batch limit for large matrices on M5-class GPUs by @pierre427 in #3791
    • Enable half-precision complex Metal FFT kernels by @PhysicistJohn in #3981
    • Fix: mx.distributed.sum_scatter crashes on a scalar(0-d) by @JasonHonKL in #4071
    • Return an empty result from pinv for zero-size inputs by @ayaangazali in #4069
    • Handle zero-size inputs in eig and qr on the CPU by @ayaangazali in #4068
    • Normalize biases before encoding in gather_qmm_rhs by @dudududukim in #4056
    • Keep randint samples inside [low, high) by @adityasingh2400 in https://github.com//pull/4012
    • Allow saving empty arrays to npy and safetensors by @ayaangazali in #4080
    • Fix DeviceType annotations for device and stream arguments by @XXXXRT666 in #4059
    • Refactor CPU DivMod dtype dispatch by @PhysicistJohn in #4088
    • Refactor CPU SegmentedMM dtype dispatch by @PhysicistJohn in #4087
    • Refactor CPU Arange dtype dispatch by @PhysicistJohn in #4085
    • Fix Device and Stream lexicographic ordering by @wgu9 in #4086
    • Enable complex64 scatter addition on GPU by @PhysicistJohn in #4078
    • Optimize large NVFP4 QMV on M5 Max by @dhiltgen in #3961
    • ring: fail on peer disconnect instead of hanging forever by @erwinzhang7 in #4060
    • Fix: propagate NaN when dealing with cummax and curmin by @JasonHonKL in #4047
    • Refactor CPU equal_nan dtype dispatch by @PhysicistJohn in #4095
    • Refactor CPU Matmul dtype dispatch by @PhysicistJohn in #4103
    • Refactor CPU Gather dtype dispatch by @PhysicistJohn in #4105
    • Refactor generic CPU unary dtype dispatch by @PhysicistJohn in #4106
    • Refactor generic CPU binary dtype dispatch by @PhysicistJohn in #4107
    • Validate pooling kernel size, stride and padding by @ayaangazali in #4101
    • Only reject max and min when a reduced axis is empty by @ayaangazali in #4079
    • Fix SinusoidalPositionalEncoding silently overriding explicit scale=0.0 by @YassineMA03 in #4098
    • Fix any and all treating -0.0 as nonzero by @ayaangazali in #4090
    • Fix Eigh CPU dtype error message by @PhysicistJohn in #4130
    • Fix random distribution dtype error messages by @PhysicistJohn in #4131
    • Fix safetensors dtype error formatting by @PhysicistJohn in #4132
    • Fix no-GPU synchronize error formatting by @PhysicistJohn in #4133
    • Fix: mx.isinf doens't consider imaginary plane. by @JasonHonKL in #4092
    • Refactor CPU Copy destination dtype dispatch by @PhysicistJohn in #4104
    • Refactor CPU GatherAxis dtype dispatch by @PhysicistJohn in #4109
    • Refactor inexact CPU unary dtype dispatch by @PhysicistJohn in #4111
    • Refactor CPU comparison dtype dispatch by @PhysicistJohn in #4112
    • Replace Ring's local dtype macro with common dispatch by @PhysicistJohn in #4120
    • Refactor CPU ArgSort dtype dispatch by @PhysicistJohn in #4123
    • Refactor CPU Softmax dtype dispatch by @PhysicistJohn in #4127
    • Use common dtype dispatch for Metal Arange by @PhysicistJohn in #4128
    • Pick BM from rows per expert in gather_qmm_rhs_nax by @dwijenpatel in #4023
    • Enable complex64 take_along_axis backward on Metal by @PhysicistJohn in #4094
    • Add mx.searchsorted with CPU, Metal and CUDA kernels by @erwinzhang7 in #4035
    • Stop integer power from hanging on a negative exponent by @ayaangazali in #4100
    • Fix second order gradients for sort, partition, topk and cummax/cummin by @Adityaj0 in #4117
    • Fix segfault on negative out of bounds axes in take_along_axis/put_along_axis by @Adityaj0 in #4118
    • Deduplicate slow CPU convolution dtype dispatch by @PhysicistJohn in #4126
    • Use common dispatch for compiled constants by @PhysicistJohn in #4129
    • Fix set_printoptions example by @PhysicistJohn in #4140
    • Clarify export output type diagnostic by @PhysicistJohn in #4141
    • Fix integer keys collision in tree_unflatten by @Solaris-star in #3878
    • Fix fence tracking for donated dynamic slice offsets by @michaelellis003 in #4099
    • Deduplicate distributed all-reduce construction by @PhysicistJohn in #4144
    • Deduplicate distributed socket errors by @PhysicistJohn in #4145
    • Remove redundant Metal bitwise dispatch by @PhysicistJohn in #4147
    • Deduplicate custom Metal kernel size validation by @PhysicistJohn in #4149
    • Deduplicate CUBLAS compute type cases by @PhysicistJohn in #4151
    • Refactor CPU Scatter dtype dispatch by @PhysicistJohn in #4155
    • fix(cpu): name the right routine in LUF and SVD error messages by @devteamaegis in #4167
    • Refactor CPU ArgPartition dtype dispatch by @PhysicistJohn in #4156
    • add complex to scalar to avoid raising warnings by linters by @aaishwarymishra in #4168
    • Refactor CPU Copy source dtype dispatch by @PhysicistJohn in #4170
    • Deduplicate Metal scan encoder setup by @PhysicistJohn in #4154
    • [Metal] Skip empty NAX GEMM output groups by @XXXXRT666 in #3941
    • docs: fix stale CLI invocations in LLM inference example by @deBrian07 in #4172
    • Increase ccache size in CI by @zcbenz in #3999
    • Fix hadamard_transform on the GPU for n = m with no power-of-2 factor by @axiom-of-choice in #4054
    • Refactor CPU Partition dtype dispatch by @PhysicistJohn in #4175
    • Refactor CPU ScatterAxis and MaskedScatter dtype dispatch by @PhysicistJohn in #4176
    • docs: document softmax's precise argument by @apocryphx in #4178
    • Send out of range trig arguments to libm by @ayaangazali in #4157
    • Add reflect and symmetric padding modes to mx.pad by @katlun-lgtm in #3608
    • docs: add a usage page on growing arrays by @apocryphx in #4019
    • Fix and enable non-transposed NAX qmm by @gordofreemo in #4051
    • Add scatter reduce for JACCL by @angeloskath in #3901
    • Fix diag for zero-size input by @devteamaegis in #4165
    • Add an inverse-CDF path to categorical sampling by @deescondrillas in #4177
    • Fail when a requested RDMA device is not found by @erwinzhang7 in #4180
    • Bound GGUF tensor data offsets against the file mapping by @robertomeroni in #4179
    • Shift by the max in log_softmax by @ayaangazali in #4169
    • Shift by the max in cross_entropy by @ayaangazali in #4188
    • Fix linalg.norm(x, keepdims=True) not keeping dims by @devteamaegis in #4166
    • Refactor inexact CPU binary dtype dispatch by @PhysicistJohn in #4194
    • Implement batched matmul for large 1D dot products by @Ved235 in #3580
    • Re-disable qmm_n_nax and fix group_size < 64 by @PhilipJohnBasile in #4202
    • fix: shell-quote the working directory in the distributed launch script by @bunlongheng in #4189
    • Report when no usable GID is found by @erwinzhang7 in #4191
    • Keep double precision for python floats in float64 operations by @nileshpatil6 in #4173
    • Jaccl ring multi wire fix by @angeloskath in #4193
    • Report why creating a queue pair failed by @erwinzhang7 in #4209
    • Add antialias support to nn.Upsample for linear and cubic modes by @lyonsno in #3677
    • Require pytorch 2.12 for metal dlpack tests by @zcbenz in #4206
    • Remove std::optional in C++ public interface by @zcbenz in #4207
    • Fix SliceUpdate JVPs with one traced input by @PhysicistJohn in #4200
    • Raise instead of hanging when reflect/symmetric pad gets an empty axis by @codeAnqiang-ma in #4223
    • Reuse Stockham twiddles in large batched Bluestein FFTs by @PhysicistJohn in #4084
    • Validate decay_steps and step_size in the schedulers by @ayaangazali in #4217
    • Add runnable distributed examples by @erwinzhang7 in #4219
    • Break monolithic MTLResidencySet into smaller sets by @JamesMcCarthy44 in #4211
    • [CUDA][Improvement] RMSNorm backward by @nastya236 in #3881
    • Fix MultiOptimizer on models containing empty modules by @erenmenges in #4215
    • Return tuple in meshgrid by @JasonHonKL in #4229
    • Add endpoint parameter to linspace by @AKnassa in #4184
    • Fix vmap of partition/argpartition dropping the kth argument by @Adityaj0 in #4116
    • Fix nan_to_num replacing inf with 0 for float16 and bfloat16 by @codeAnqiang-ma in #4222
    • Fix einsum not broadcasting batch dimensions in batched tensordot by @Adityaj0 in #4125
    • Dequantize in float32 by @RohanGautam in #4241
    • Reject complex in erf and erfinv by @ayaangazali in #4243
    • Make abs a no-op for unsigned types in the simd helpers by @ayaangazali in #4240
    • Fix quantize matrix multiplication floor issue by @JasonHonKL in #4251
    • Only use MPI backend for world size > 1 by @erwinzhang7 in #4210
    • Reject complex in expm1, sigmoid and arctan2 by @ayaangazali in #4257
    • Decompose small kernel-depth 3D convs into 2D convs by @katlun-lgtm in #3785
    • Fix Metal sort of a view with a negative stride by @robertomeroni in #4252
    • Mirror the depth axis in the decomposed 3D conv when flipped by @ayaangazali in #4277
    • Fix Metal row reductions on negative-stride views by @FU-max-boop in #4267
    • [CUDA] Fix custom kernel cache collision for same name, different source by @HaoXuAI in #4273
    • Fix ops rejecting integers larger than INT32_MAX by @FeliGame in #4255
    • Fix var/std for complex numbers by @ayaangazali in #4260
    • Fix int32 overflow in conv padded input and pad shapes by @eyupcanakman in #4258
    • Reject complex in remainder by @ayaangazali in #4270
    • Compare the macOS SDK version as a version when gating JACCL by @erwinzhang7 in #4286
    • Clamp ring socket transfers so a payload of 2 GiB or more can be sent by @erwinzhang7 in #4281
    • Replace hand-rolled axis normalization with normalize_axis_index in split/unstack/partition/topk by @Adityaj0 in #4288
    • Remove grouped output in CI by @zcbenz in #4195
    • [CUDA] Fix finding cuda 13 headers in JIT compilation by @zcbenz in #3995
    • Refactor wheel building script by @zcbenz in #3818
    • Make mx.compile cache erasing thread safe by @zcbenz in #4248
    • Add builds for free-threaded python by @zcbenz in #3812
    • Fix int32 overflow in concatenate/repeat/kron by @ayaangazali in #4303
    • Widen list elements that do not fit in int32 to int64 by @ayaangazali in #4305
    • Propagate CPU errors to events by @zcbenz in #3742
    • Fix mx.arange dtype inference overflow regression by @shoutoutuoadi325 in #4324
    • Add workflow to update pull request limit bypass list by @zcbenz in #4320
    • Support head dimension 72 in Metal full attention by @dhiltgen in #4330

    New Contributors

    • @pierre427 made their first contribution in #3824
    • @apocryphx made their first contribution in #3873
    • @ayaangazali made their first contribution in #3870
    • @HaoXuAI made their first contribution in #3872
    • @neilmehta24 made their first contribution in #3882
    • @wyanzhao made their first contribution in #3843
    • @metascroy made their first contribution in #3854
    • @aleroot made their first contribution in #3869
    • @AdamDLuz made their first contribution in #3893
    • @vineethsaivs made their first contribution in #3831
    • @winklemad made their first contribution in #3846
    • @stoyoda0012-cyber made their first contribution in #3894
    • @PhysicistJohn made their first contribution in #3971
    • @latent-9 made their first contribution in #3959
    • @aaishwarymishra made their first contribution in #3952
    • @reckylurker made their first contribution in #3975
    • @sashko-zakharchuk made their first contribution in #3976
    • @WindChimeRan made their first contribution in #3675
    • @jonathan308 made their first contribution in #4002
    • @jasp-nerd made their first contribution in #3929
    • @Gusanidas made their first contribution in #4021
    • @JasonHonKL made their first contribution in #4030
    • @yingjiacai made their first contribution in #3848
    • @jlee5814 made their first contribution in #3965
    • @kapellirohith made their first contribution in #3834
    • @prady0t made their first contribution in #4033
    • @magnuslundstedt made their first contribution in #4052
    • @kitty-eu-org made their first contribution in #4043
    • @dudududukim made their first contribution in #4056
    • @erwinzhang7 made their first contribution in #4060
    • @YassineMA03 made their first contribution in #4098
    • @dwijenpatel made their first contribution in #4023
    • @Adityaj0 made their first contribution in #4117
    • @Solaris-star made their first contribution in #3878
    • @michaelellis003 made their first contribution in #4099
    • @devteamaegis made their first contribution in #4167
    • @deBrian07 made their first contribution in #4172
    • @axiom-of-choice made their first contribution in #4054
    • @gordofreemo made their first contribution in #4051
    • @deescondrillas made their first contribution in #4177
    • @robertomeroni made their first contribution in #4179
    • @Ved235 made their first contribution in #3580
    • @PhilipJohnBasile made their first contribution in #4202
    • @bunlongheng made their first contribution in #4189
    • @nileshpatil6 made their first contribution in #4173
    • @codeAnqiang-ma made their first contribution in #4223
    • @JamesMcCarthy44 made their first contribution in #4211
    • @erenmenges made their first contribution in #4215
    • @AKnassa made their first contribution in #4184
    • @RohanGautam made their first contribution in #4241
    • @FU-max-boop made their first contribution in #4267
    • @FeliGame made their first contribution in #4255
    • @shoutoutuoadi325 made their first contribution in #4324

    Full Changelog: v0.32.0...v0.32.1

    Original source
  • All of your release notes in one feed

    Join Releasebot and get updates from ml-explore and hundreds of other software products.

    Create account
  • Jul 7, 2026
    • Date parsed from source:
      Jul 7, 2026
    • First seen by Releasebot:
      Sep 2, 2026
    ml-explore logo

    MLX by ml-explore

    v0.32.0

    MLX releases v0.32.0 with broad improvements across CUDA, Metal, CPU, and Windows, plus new array API and linalg support. It adds JIT and kernel caching, better quantization and DLPack handling, and dozens of fixes for correctness, performance, and stability.

    What's Changed

    Generate qmm implementaions with cmake by @zcbenz in #3424
    Enable swap for all CI building CUDA by @zcbenz in #3437
    Bump minor by @angeloskath in #3438
    [CUDA] Fix qmm_naive K-tail dispatch for FP quantized kernels by @Lyxot in #3445
    Keep gguflib input-validation asserts active in release builds by @qflen in #3436
    Reuse nightly build's ccache for release by @zcbenz in #3458
    Add barrier to JACCL by @Isalia20 in #3459
    Add determinant and sign-log-determinant functions to mlx.core.linalg by @abhilashreddys in #3416
    Define ST_F8_E8M0 by @pcuenca in #3448
    Clearer error when shape dimension overflows int32 by @serenposh in #3425
    [CUDA] Fix half type matmul in cutlass kernels by @zcbenz in #3469
    Fix indexing bug in slice update with op by @angeloskath in #3483
    Make device_count() return 0 when there is no GPU by @zcbenz in #3486
    Compute contiguity from the actual occupied data by @sofinvalery in #3475
    Do not use prebuilt cpu compile preamble when headers are installed by @zcbenz in #3463
    [CUDA] Separate main loop into a function in qmm by @zcbenz in #3443
    test: Upcast the random numbers before computing their average by @sofinvalery in #3488
    Pass deployment target when linking metallib by @dhiltgen in #3501
    Fix rope single token multiple sequences by @angeloskath in #3498
    Fix qvm_split_k incorrect batch stride calculation by @angeloskath in #3497
    Fix scatter_prod GPU hang on NaN with contention by @tillahoffmann in #3492
    [jaccl] Fix race on local_staging in MeshImpl::all_reduce by @kernelpool in #3451
    Add MLX_SDPA_BLOCKS env var for 2-pass vector kernel block-count override by @adurham in #3455
    mlx launch clean by @nastya236 in #3513
    [CUDA] Fix gather_mm by @zcbenz in #3503
    [CUDA] Guard qmm_naive scale and bias loads at tile boundaries by @Lyxot in #3509
    win: fix cuda build by @dhiltgen in #3532
    Improve DLPack-compatible array imports by @XXXXRT666 in #3495
    Apply the same thread-local approach to the CPU by @angeloskath in #3537
    removed automatic prepending python in mlx launch by @nastya236 in #3536
    ci: Show stack trace on crash by @zcbenz in #3538
    Handle non-multiple-of-8 spatial dims in depthwise conv2d Metal path by @qflen in #3446
    Remove reference to groups in Conv3D extra_repr by @GriffinMB in #3559
    Add buffer caching to no_gpu CPU allocator by @dhiltgen in #3554
    Fix steel GEMM safe load offset by @sofinvalery in #3560
    Fix singleton lifetime issues at process exit by @dhiltgen in #3555
    Fix doubled-word typos in docstrings by @LeSingh1 in #3561
    Fix off_x/off_y typo in steel BaseMMAFrag::load_safe by @mdegans in #3565
    Synchronize no-GPU cache eviction with CPU streams by @dhiltgen in #3566
    Add JIT compiler support for Windows by @dhiltgen in #3556
    [Metal] Reject tensor-scale nvfp4 in qqmm by @Brooooooklyn in #3551
    Detect int32 shape-product overflow at MLX compute-shape boundaries by @qflen in #3524
    Add copy keyword to mx.asarray by @eyupcanakman in #3510
    Fix typos in backend code comments by @adityasingh2400 in #3581
    Implement output_shapes for GatherMM and GatherQMM by @dexwritescode in #3485
    Fix activation docstring math in log_softmax and gelu_approx by @adityasingh2400 in #3590
    docs: expose missing Python APIs by @XXXXRT666 in #3598
    Fix CUDA all-reduce planning for large inputs by @sofinvalery in #3603
    Use uv in macOS CI by @zcbenz in #3491
    Fix HDRS_LIST building when paths in header inclusion tree include spaces by @lancelotblanchard in #3607
    Enable the Metal backend by default on iOS by @eyupcanakman in #3617
    Fix int32 overflow in matvec row offset and gather-MM batch stride by @aicayzer in #3609
    Fix signed-integer overflow (UB) in roll and tile shape arithmetic by @devYRPauli in #3604
    Fix complex VJPs for log and exp by @CameronChurchwell in #3605
    added env variables to propagate width by @nastya236 in #3618
    Correct p-norm computation in triplet_loss by @pchintar in #3613
    Fix threaded compile cache cleanup by @lucasnewman in #3628
    Handle invalid dimensions in SinusoidalPositionalEncoding by @pchintar in #3615
    Correct grammatical typo in label smoothing ValueError by @madhav1k in #3641
    Roll back compile cache entry when the first trace throws by @adityasingh2400 in #3635
    Raise on arange with step == 0 instead of undefined behavior by @devYRPauli in #3640
    Fix data race in tracing state by making it thread-local by @aicayzer in #3638
    Add missing break in bool_ switch case that would result in falling through to the uint8_t case by @psolanki in #3655
    Fix axis param in nll_loss by @ishtihoss in #3651
    Fix Adafactor factored update for params with more than 2 dims by @ishtihoss in #3652
    Emit valid kernel source for non-finite float constants by @tillahoffmann in #3648
    Validate inputs in GroupNorm and InstanceNorm by @ishtihoss in #3653
    Fix flaky test_siblings_without_eval by @zcbenz in #3621
    Fix intermittent wrong bias gradient in fast::layer_norm VJP (Metal WAR hazard) by @tillahoffmann in #3630
    NAX requires setting MACOSX_DEPLOYMENT_TARGET=26.2 by @zcbenz in #3622
    Catch error in CommandBuffer and poison the events by @zcbenz in #3523
    [Improvement] CopyType::Vector in concatenate if axis=0 and contiguous by @nastya236 in #3663
    Fix Q4_1 GGUF loading by @ricky-chaoju in #3664
    Fix tree_map_with_path for namedtuples by @chrismicah in #3674
    Fix gather_qmm NAX kernel name mismatch by @scyyh11 in #3632
    Add bits and smallest_normal to finfo by @katlun-lgtm in #3679
    Fix use-after-free when a custom Metal kernel is called with different dtypes in one graph by @discobot in #3662
    Fix dimension count in orthogonal initializer error message by @Pablosinyores in #3693
    fix grid for large uncontiguous input by @nastya236 in #3666
    Ignore numpy matmul warnings in test_blas by @zcbenz in #3657
    Fix repeat zero axis shape by @chrismicah in #3698
    Cache JIT-compiled CUDA kernels by @zcbenz in #3587
    [CUDA] JIT-compile qmm_naive by @zcbenz in #3576
    Support namedtuple and tuple subclasses in tree_merge by @Pablosinyores in #3703
    Fix mx.sort vjp to transpose the permutation by @obchain in #3700
    Add isdtype, result_type, and can_cast by @katlun-lgtm in #3681
    [fix] allow exporting custom Metal kernels without a Metal backend by @xthomaswang in #3650
    Make step activation inclusive at the threshold by @Pablosinyores in #3694
    Add new_thread_unsafe_stream API by @zcbenz in #3578
    Fix JVPs of power, divmod, and slice_update with partly traced inputs by @qflen in #3636
    Add flip and unstack by @katlun-lgtm in #3683
    Fix int16 overflow in NAX qmm edge-tile bounds by @scyyh11 in #3631
    Make gemv JIT compilable by @angeloskath in #3705
    Fix gaussian_nll_loss documented default reduction (none -> mean) by @Pablosinyores in #3715
    Fix optimizer epsilon validation message and AdaDelta eps doc by @Pablosinyores in #3712
    Add array API standard aliases for existing ops by @katlun-lgtm in #3678
    Fix ConvTranspose kernel size repr by @ishtihoss in #3724
    [CUDA] Disable managed memory on Tegra by @gmondada in #3701
    Update nanobind to 2.13.0 by @XXXXRT666 in #3722
    Fix JVPs of select, arctan2, masked_scatter, and bitwise ops by @qflen in #3633
    array API: add empty, empty_like (pure aliases), astype, matrix_transpose by @katlun-lgtm in #3729
    Add metal::set_metallib_path() to override the metallib search path by @olilarkin in #3597
    Add Metal DLPack zero-copy sharing by @XXXXRT666 in #3531
    Bump actions/checkout from 6 to 7 by @dependabot[bot] in #3741
    Fix shapeless compile eliding reductions over size-1 dimensions by @discobot in #3672
    [CUDA] JIT-compile qmm_sm80/qmm_sm90/gather_gemm by @zcbenz in #3706
    [CUDA] Make qmv support global scale by @zcbenz in #3723
    Add VJP for cumulative max and min scans by @devin-lai in #3599
    Fix abs jvp for complex inputs by @obchain in #3745
    Fix update_modules crash on over-length module lists by @Pablosinyores in #3743
    Add matrix_norm to array API namespace by @wgu9 in #3749
    Guard scatter_axis against 64-bit outputs on the GPU by @obchain in #3695
    Fix build on Apple clang 15 in cpu_nd_array_to_mlx by @obchain in #3751
    metal: cache x in registers in rms_single_row to avoid redundant global read by @will-march in #3754
    Document row-wise sparsity in nn.init.sparse by @Pablosinyores in #3752
    [CUDA] [Improvement] Rope without copy by @nastya236 in #3704
    Add small-batch quantized matvec kernel (qmv_wide) by @jessegross in #3764
    Fix docstring nits by @ishtihoss in #3758
    Fix logsumexp jvp to reduce along the axis by @obchain in #3708
    Add vecdot to array API namespace by @wgu9 in #3748
    Fix CPU dynamic slice copy bound for collapsed shapes by @Lyxot in #3739
    Enable fused SDPA vector kernel for asymmetric Q/V head dims (192, 128) by @yohann-bearzi in #3637
    array API: add positive, logical_xor, trunc, count_nonzero, diff, full_like by @katlun-lgtm in #3730
    array API: add cumulative_sum and cumulative_prod by @katlun-lgtm in #3731
    Fix complex vjps for several unary ops by @obchain in #3766
    Fix Upsample align_corners singleton output by @ishtihoss in #3769
    Add CI for Windows CUDA build by @zcbenz in #3775
    Fix multi-wire recv prefill deadlock in jaccl ring backend by @jasonpaulso in #3654
    fix: Quote hostname in mlx.launch ssh commands by @varshneydevansh in #3783
    Fix BatchNorm docstring to cover 4D input and test the NHWC path by @Pablosinyores in #3782
    Fix kl_div_loss docstring formula and two doc nits by @Pablosinyores in #3788
    Fix HardShrink to accept its documented lambd argument by @Pablosinyores in #3786
    Refactor macOS CI by @zcbenz in #3806
    Bypass the PyTorch index TLS issues by @angeloskath in #3808
    Fix fp quantized matvec for output dim < 8 by @katlun-lgtm in #3804
    Fix CUDA RMSNorm small-row dispatch by @dhiltgen in #3792
    Fix Conv3d docstring argument order (padding before dilation) by @Pablosinyores in #3793
    Add math mode option for custom Metal kernels by @shubhxho in #3728
    Fix binary_cross_entropy docstring argument order (weights before with_logits) by @Pablosinyores in #3807
    Fix compiled kernel correctness for negative-strided inputs by @lyonsno in #3720
    Use large runner for Windows CUDA builds by @zcbenz in #3809
    Fix wrong type parameter passed to gemm_splitk_nax by @zcbenz in #3810
    Document default value of dilation in conv layer docstrings by @Pablosinyores in #3811
    Fix CPU gather transposing column-contiguous slices by @tillahoffmann in #3647
    Fix infinite norm negative axis mismatch bug for matrices with 2 or more dimensions. by @danlee2002 in #3756
    Fix conv2 gradients in grouped strided case on Metal by @ericphanson in #3800

    New Contributors

    @qflen made their first contribution in #3436
    @Isalia20 made their first contribution in #3459
    @abhilashreddys made their first contribution in #3416
    @serenposh made their first contribution in #3425
    @sofinvalery made their first contribution in #3475
    @tillahoffmann made their first contribution in #3492
    @adurham made their first contribution in #3455
    @GriffinMB made their first contribution in #3559
    @LeSingh1 made their first contribution in #3561
    @mdegans made their first contribution in #3565
    @eyupcanakman made their first contribution in #3510
    @adityasingh2400 made their first contribution in #3581
    @dexwritescode made their first contribution in #3485
    @lancelotblanchard made their first contribution in #3607
    @aicayzer made their first contribution in #3609
    @devYRPauli made their first contribution in #3604
    @pchintar made their first contribution in #3613
    @madhav1k made their first contribution in #3641
    @psolanki made their first contribution in #3655
    @ishtihoss made their first contribution in #3651
    @ricky-chaoju made their first contribution in #3664
    @chrismicah made their first contribution in #3674
    @scyyh11 made their first contribution in #3632
    @katlun-lgtm made their first contribution in #3679
    @discobot made their first contribution in #3662
    @Pablosinyores made their first contribution in #3693
    @obchain made their first contribution in #3700
    @xthomaswang made their first contribution in #3650
    @gmondada made their first contribution in #3701
    @olilarkin made their first contribution in #3597
    @devin-lai made their first contribution in #3599
    @wgu9 made their first contribution in #3749
    @will-march made their first contribution in #3754
    @yohann-bearzi made their first contribution in #3637
    @jasonpaulso made their first contribution in #3654
    @varshneydevansh made their first contribution in #3783
    @shubhxho made their first contribution in #3728
    @lyonsno made their first contribution in #3720
    @danlee2002 made their first contribution in #3756
    @ericphanson made their first contribution in #3800

    Full Changelog: v0.31.2...v0.32.0

    Original source
  • Apr 22, 2026
    • Date parsed from source:
      Apr 22, 2026
    • First seen by Releasebot:
      Sep 2, 2026
    ml-explore logo

    MLX by ml-explore

    v0.31.2

    MLX adds wider CUDA quantized matmul support, CUDA FFT support, and multi-threaded independent computations, while also improving thread safety, Metal performance, and a range of bug fixes across vmap, sorting, streams, and builds.

    Highlights

    Wider support for cuda quantized matmuls (#3352, #3268, #3321, #3417, #3255)

    MLX can be used by multiple threads for independent computations (#3405, #3348, #3281, #3423)

    Added CUDA FFT support

    JACCL is now a standalone lib (#3412)

    What's Changed

    Bump by @angeloskath in #3244

    win: re-enable and fix cuDNN performance by @dhiltgen in #3242

    Fix crashes in multi-threaded process teardown by @louen in #3167

    [CUDA] Add FFT support by @lucasnewman in #3243

    [CUDA] Implement MaskedScatter by @Lyxot in #3151

    docs: fix PyTorch to MLX conversion example by @LxYuan0420 in #3265

    update requirements for Macbook Neo by @tosh in #3257

    fix comparison op JVP returning bool tangents instead of input dtype by @mm65x in #3253

    fix nn.GRU skipping bhn bias when hidden is None by @mm65x in #3252

    [CUDA] Pipelined QMM by @zcbenz in #3255

    tests: harden memory leak check in test_siblings_without_eval by @booxter in #3088

    Slice update with operation by @angeloskath in #3266

    Nax Refactor by @jagrit06 in #3271

    Fix building with CUDA toolkit 13.2 by @zcbenz in #3273

    [CUDA] fp and int4 quants for qmm_sm80 by @zcbenz in #3268

    Fix repr of conv layers by @angeloskath in #3275

    Merge DeviceStream into CommandEncoder by @zcbenz in #3264

    [CUDA] Search system-installed CUDA toolkit for headers by @zcbenz in #3277

    Create default random key lazily by @zcbenz in #3278

    Support indexing with any type which implmented index by @aisk in #3210

    Fix sort NaN handling for float16 and bfloat16 by @Lyxot in #3269

    Use thread local storage for frontend compile cache by @zcbenz in #3280

    [Metal][Performance]: Add split-K for quantized matmul (small M) by @Ziqiao-git in #3120

    [Metal] Fix depthwise conv 1D kernel name for large variant by @Brooooooklyn in #3289

    Fix stale transform copy-chain leaks by @Brooooooklyn in #3290

    Implement Pad::vmap to replace NYI stub by @Aristide021 in #3304

    logo files by @andresy in #3308

    Fix vmap + floor_divide: preserve integer dtype by @robert-johansson in #3292

    Fix moved-from shape bug in broadcast_arrays causing vmap bus error by @Aristide021 in #3310

    Use nb::ndarray for checking arrays by @zcbenz in #3283

    Add output_shapes for AddMM by @pHequals7 in #3262

    Manage Metal objects with smart pointers by @zcbenz in #3282

    [CUDA] support sorting complex numbers by @Lyxot in #3286

    Add norm parameter to FFT transforms (backward/ortho/forward) by @Aristide021 in #3287

    Make each thread have its own default stream by @zcbenz in #3281

    [CUDA] Implement BlockMaskedMM by @Lyxot in #3299

    Fix np bfloat16 misinterpreted as complex by @kellen-sun in #3146

    Remove no longer needed const_cast by @zcbenz in #3325

    Bump actions/deploy-pages from 4 to 5 by @dependabot[bot] in #3334

    Fix use after move by @angeloskath in #3343

    Decouple CommandEncoder from Device by @zcbenz in #3316

    Add vmap for BroadcastAxes by @angeloskath in #3344

    Add fftfreq, rfftfreq and scalar axes for fftshift/ifftshift by @declanhealy2 in #3298

    [Metal] Support sorting complex numbers by @Lyxot in #3314

    [CUDA] Fallback QMM by @zcbenz in #3315

    Make CommandEncoder thread local by @zcbenz in #3348

    [CUDA] 3/5/6-bit quants for qmm_naive by @zcbenz in #3352

    Fix regression in array creation by @angeloskath in #3353

    Use metal as the front-end for the metal linker by @louen in #3354

    Add printoptions by @ChristophePRAT in #3333

    Add a convenience for making local streams in python by @angeloskath in #3355

    Fix CMake finding wrong Python during pip install by @fijimunkii in #3375

    [CUDA] Add GatherQMM for quantized gather matmul by @Lyxot in #3321

    fix: fail build when Metal compiler header resolution fails by @dogukanveziroglu in #3332

    Fix: Correct cross-attention query routing in Post-LN TransformerDecoderLayer by @suryawanshishantanu6 in #3382

    [CUDA] Thread safety by @zcbenz in #3367

    Fix test "test get streams" missing initialization by @dseredkin in #3376

    Conjugate VJP and JVP support by @CameronChurchwell in #3386

    Fix int16 overflow in SDPA NAX mask indexing for KV sequences > 32K by @Clydingus in #3361

    Avoid joining threads on exit by @zcbenz in #3388

    Add clear_streams API for cleanup before exit by @zcbenz in #3395

    Update nanobind version to v2.12.0 by @jrp2014 in #3396

    Jaccl refactor by @angeloskath in #3412

    Fixes for CUDA CI by @zcbenz in #3413

    Validate safetensors data offsets by @MillaFleurs in #3364

    Validate safetensors data offsets against file boundaries by @matinsaurralde in #3410

    Document sort stability and NaN handling by @NeuralNoble in #3400

    ThreadLocalStream in C++ by @zcbenz in #3405

    Fix jaccl init bug by @angeloskath in #3418

    Segmented mm nax kernel by @angeloskath in #3419

    [CUDA] gather_mm by @zcbenz in #3414

    [CUDA] GatherQMM matrix-matrix sm80/naive path by @Lyxot in #3417

    [CUDA] Handle residue k in qmm_naive by @zcbenz in #3379

    Speed up NAX split-K by better tuning and routing and fix NAX addmm by @angeloskath in #3422

    Make Scheduler::enqueue thread safe by @zcbenz in #3423

    Fix flaky TestVmap.test_vmap_masked_scatter by @zcbenz in #3421

    Fix synchronize for ThreadLocalStream by @angeloskath in #3429

    Fix bytes_per_key truncation in random kernels (Metal + CUDA) by @dogukanveziroglu in #3432

    Throw meaningful error when Metal device is not found by @dogukanveziroglu in #3428

    Fix kernel cache collision in Compiled constructor by @dogukanveziroglu in #3427

    Fix mx.prod vjp for complex types by @CameronChurchwell in #3433

    New Contributors

    @LxYuan0420 made their first contribution in #3265

    @tosh made their first contribution in #3257

    @mm65x made their first contribution in #3253

    @booxter made their first contribution in #3088

    @Ziqiao-git made their first contribution in #3120

    @Brooooooklyn made their first contribution in #3289

    @Aristide021 made their first contribution in #3304

    @pHequals7 made their first contribution in #3262

    @declanhealy2 made their first contribution in #3298

    @fijimunkii made their first contribution in #3375

    @dogukanveziroglu made their first contribution in #3332

    @suryawanshishantanu6 made their first contribution in #3382

    @dseredkin made their first contribution in #3376

    @CameronChurchwell made their first contribution in #3386

    @Clydingus made their first contribution in #3361

    @jrp2014 made their first contribution in #3396

    @matinsaurralde made their first contribution in #3410

    @NeuralNoble made their first contribution in #3400

    Full Changelog: v0.31.1...v0.31.2

    Original source
  • Mar 12, 2026
    • Date parsed from source:
      Mar 12, 2026
    • First seen by Releasebot:
      Sep 2, 2026
    ml-explore logo

    MLX by ml-explore

    v0.31.1

    MLX ships a patch release with faster CUDA quantization and GEMV improvements, new Hadamard transform and SegmentedMM support, hybrid sharding, better distributed config, and a set of bug fixes for save/load, LayerNorm VJP, rope, split, and einsum_path.

    What's Changed

    Bump the patch version by @angeloskath in #3185
    Skip Hopper-only kernels in CI by @zcbenz in #3184
    [CUDA] Fsdp (easy) by @nastya236 in #3130
    Fix ref leak in mx.save/load with file like object by @aisk in #3187
    Fix/missing libs in docs by @ChristophePRAT in #3190
    feat: adding the bartlett function by @Vlor999 in #3155
    Bump actions/download-artifact from 7 to 8 by @dependabot[bot] in #3189
    Bump actions/upload-artifact from 6 to 7 by @dependabot[bot] in #3188
    [CUDA] Quantized GEMV by @zcbenz in #3180
    [CUDA] Use fp16 accumulation for 4-bit quant in GEMV by @zcbenz in #3197
    [CUDA] implement Hadamard transform by @Lyxot in #3179
    Improve mlx.distributed_config by @angeloskath in #3199
    PR#3226 Fix by @MillaFleurs in #3227
    PR #3220 LayerNorm VJP returns zeros_like(weight) instead of zeros_like(bias placeholder) by @MillaFleurs in #3231
    [CUDA] Faster compilation and batch support in QMV by @zcbenz in #3213
    Validate num_splits in split by @MillaFleurs in #3234
    Fix return value in einsum_path for simple contractions by @MillaFleurs in #3232
    Validate dims in rope by @MillaFleurs in #3230
    Fix assigning bool to float16/bfloat16 by @MillaFleurs in #3229
    Fix load_weights with strict=False to filter extra weights before update by @gmin7 in #3214
    Remove custom fp4/fp8 classes by @zcbenz in #3212
    [CUDA] Support 3/5/6-bit quants in QMV by @zcbenz in #3236
    Hybrid sharding by @nastya236 in #3194
    win: fix cuda build by @dhiltgen in #3204
    Remove quantized_utils.cuh by @zcbenz in #3237
    [CUDA] Implement SegmentedMM by @Lyxot in #3238
    Add initial tuning for M5 pro and max by @jagrit06 in #3211
    [CUDA] Use qmv kernel for fp quantizations by @zcbenz in #3239

    New Contributors

    @ChristophePRAT made their first contribution in #3190
    @Lyxot made their first contribution in #3179
    @gmin7 made their first contribution in #3214

    Full Changelog: v0.31.0...v0.31.1

    Original source
  • Similar to MLX with recent updates:

  • Mar 1, 2026
    • Date parsed from source:
      Mar 1, 2026
    • First seen by Releasebot:
      Sep 2, 2026
    ml-explore logo

    MLX by ml-explore

    v0.31.0

    MLX adds initial CUDA QMM support, major 3D convolution speedups, and continued qqmm improvements, while also refining Metal and CUDA performance, quantization, attention, export behavior, and Hopper-focused optimizations.

    Highlights

    Initial version of QMMs for CUDA (#3160)

    JACCL mesh bandwidth improvements (#3174)

    Massive speedups for 3D convs (#3147)

    Continued improvements to qqmm (#3106, #3022)

    What's Changed

    Patch bump by @angeloskath in #3102

    is_available() should check the device index too by @andresy in #3107

    Fix residency set with user provided buffer by @awni in #3108

    Cleanup test_fast_sdpa.py by @zcbenz in #3112

    [CUDA] Set current device before allocating memory by @zcbenz in #3110

    Quantize module to QQLinear by @nastya236 in #3106

    [CUDA] Use cuDNN SDPA for decoding when using fixed-size KV cache by @zcbenz in #3113

    register pressure by @nastya236 in #3116

    Fix precision in Metal fused attention by @awni in #3119

    [CUDA] Attention sinks in cuDNN SDPA by @zcbenz in #3118

    Fix donation in sdpa vector by @angeloskath in #3121

    Manage stream placement in import function by @awni in #3127

    fix: propagate quantization mode in QuantizedAllToShardedLinear / QuantizedShardedToAllLinear by @vskiwi in #3133

    [featuring] - add hanning window function by @Vlor999 in #3124

    feat: adding the hamming function by @Vlor999 in #3135

    Tensor scale nvfp4 by @nastya236 in #3022

    Fix fence synchronization accross command buffers by @awni in #3144

    Export: preserve Dtype state values in export callback arguments by @skryl in #3145

    [Metal] Fix 32-bit integer overflow in conv3d unfold kernel by @kellen-sun in #3143

    [Metal][Performance] Add implicit matmul pathway for mx.conv3d by @belkakari in #3147

    [Metal] Fix event leak by @awni in #3159

    [CUDA] FPxINT quantized matmul for Hopper by @zcbenz in #3160

    feat: implement mlx.core.blackman by @Vlor999 in #3136

    Enable setting thread block cluster for Hopper and later by @zcbenz in #3168

    [CUDA][NCCL] group split by @nastya236 in #3172

    JACCL refactor and small update by @angeloskath in #3174

    [CUDA] Heuristics for Hopper QMM by @zcbenz in #3173

    Fix compile_fuse broadcast split aliasing bug by @robert-johansson in #3166

    Enable passing in a GPU architecture string via env var by @angeloskath in #3176

    Bump the minor version by @angeloskath in #3183

    New Contributors

    @vskiwi made their first contribution in #3133

    @Vlor999 made their first contribution in #3124

    @skryl made their first contribution in #3145

    @kellen-sun made their first contribution in #3143

    @belkakari made their first contribution in #3147

    @robert-johansson made their first contribution in #3166

    Full Changelog: v0.30.6...v0.31.0

    Original source
  • Feb 6, 2026
    • Date parsed from source:
      Feb 6, 2026
    • First seen by Releasebot:
      Sep 2, 2026
    ml-explore logo

    MLX by ml-explore

    v0.30.6

    MLX releases v0.30.6 with much faster bandwidth on macOS and several CUDA, WSL, and build fixes.

    Highlights

    Much faster bandwidth with JACCL on macOS >= 26.3 (some numbers)

    What's Changed

    • patch by @awni in #3093
    • Disable managed memory on WSL when concurrentManagedAccess is not supported by @jessegross in #3095
    • Fix non simd f16 build by @awni in #3097
    • Fix 2pass sdpa on < M2 by @awni in #3099
    • JACCL update by @angeloskath in #3094
    • Fix qmv_impl for small N by @manuelcandales in #3096
    • Patch for multi device CUDA by @awni in #3100

    New Contributors

    • @manuelcandales made their first contribution in #3096

    Full Changelog: v0.30.5...v0.30.6

    Original source
  • Feb 3, 2026
    • Date parsed from source:
      Feb 3, 2026
    • First seen by Releasebot:
      Sep 2, 2026
    ml-explore logo

    MLX by ml-explore

    v0.30.5

    MLX releases a patch update with CUDA and Metal performance tuning, memory fallbacks, and fixes for masking, ALiBi slopes, NAX overflow, Windows tests, and indexing errors, plus a new distributed docs example and other stability improvements.

    What's Changed

    • patch by @awni in #3074
    • [CUDA] Fallback Event impl when there is no hardware cpu/gpu coherency by @zcbenz in #3070
    • Tune CUDA gaph sizes on B200 and H100 by @awni in #3077
    • [Docs] Simple example of using MLX distributed by @stefpi in #2973
    • Use lower-right causal mask alignment consistently by @Anri-Lombard in #2967
    • Fix ALiBi slopes for non-power-of-2 num_heads by @vovw in #3071
    • More useful error for large indices by @awni in #3079
    • Fix nax condition for iphone by @awni in #3083
    • Fallback to pinned host memory when managed memory is not supported by @zcbenz in #3075
    • Fix failing python tests on Windows by @zcbenz in #3076
    • [Metal] Tune splitk gemm dispatch conditions and partition sizes by @awni in #3087
    • Fix for NAX overflow. by @awni in #3092

    New Contributors

    • @stefpi made their first contribution in #2973
    • @vovw made their first contribution in #3071

    Full Changelog: v0.30.4...v0.30.5

    Original source
  • Jan 27, 2026
    • Date parsed from source:
      Jan 27, 2026
    • First seen by Releasebot:
      Sep 2, 2026
    ml-explore logo

    MLX by ml-explore

    v0.30.4

    MLX adds faster CUDA and Metal performance for long-context LLM inference, with better support for consumer GPUs, dense MoEs, grouped-query attention, and several backend and packaging fixes.

    Highlights

    Metal: Much faster vector fused grouped-query attention for long context

    CUDA: Several improvements to speed up LLM inference for CUDA backend

    CUDA: Support for dense MoEs

    CUDA: Better support for consumer GPUs (4090, 5090, RTX 6000, ...)

    What's Changed

    • patch bump for next release by @awni in #2991
    • Fix fence by @awni in #2998
    • Reverts changing the MLX_IBV_DEVICES to MLX_JACCL_DEVICES by @angeloskath in #2999
    • fix distributed all_to_sharded bias shard axis from -2 to -1 by @gufengc in #2987
    • Fix sharding of quantized models with non-power-of-2 bits by @kernelpool in #3006
    • Update CCCL to v3.1.3 by @zcbenz in #3012
    • Fix python package install path in stubgen by @zcbenz in #3009
    • Type Enhancement for Func Transforms and Bug Fix by @XXXXRT666 in #3003
    • Do not clear disk space in setup-linux by @zcbenz in #3013
    • Do not give workflow boolean inputs default values by @zcbenz in #3014
    • Fix negative dim indexing by @MillaFleurs in #2994
    • Windows CI by @zcbenz in #3021
    • Optimize erf function with expm1f in Metal backend by @bjornefisk in #3025
    • [CUDA] Faster grouped mm by @zcbenz in #3011
    • PR 3007 Fix Seg Fault by @MillaFleurs in #3008
    • Use higher precision for linspace with double by @awni in #3029
    • Handle data smaller than BUFFER_SIZE in jaccl recv by @rltakashige in #3033
    • build 26.0 release in actions by @awni in #3035
    • Remove xmlrunner from macOS CI by @zcbenz in #3032
    • Columnwise quantize by @nastya236 in #2989
    • Turn nccl_stub into a normal target by @zcbenz in #3037
    • Use cuda::std for math ops by @zcbenz in #3041
    • win: symbol exports and minor fixes by @dhiltgen in #3024
    • CUDA gather mv by @angeloskath in #3039
    • Link with prebuilt OpenBLAS and fix shared libs build on Windows by @zcbenz in #3036
    • Allow take on empty array when it makes sense by @awni in #3046
    • Add missing include to buffer_cache.h by @Anri-Lombard in #3053
    • Build and test python package on Windows CI by @zcbenz in #3049
    • Fix some MSVC compilation errors by @zcbenz in #3048
    • Use C++20 by @zcbenz in #3050
    • Faster two pass sdpa by @awni in #3023
    • Find system-installed cuDNN on Windows by @zcbenz in #3052
    • Fix some NVCC warnings when building CUDA backend with MSVC by @zcbenz in #3038
    • Hide symbols by default for mac/linux by @zcbenz in #3057
    • [CUDA] Fast sorting by @awni in #3060
    • Fix flaky macOS test by @awni in #3063
    • Update pre-commit hooks and versions for clang-format, black, and isort by @NripeshN in #3059
    • GPU discovery by @dhiltgen in #3055
    • Add NAX Split-K GEMM for large-K matmuls to improve performance by @hxu296 in #3018
    • Improve CPU discovery by @dhiltgen in #3068
    • Fix long cache file path on Windows by @zcbenz in #3065
    • Better support consumer CUDA GPUs by @jessegross in #3056
    • Delay load CUDA libs and resolve DLL paths at runtime by @zcbenz in #3061
    • Do not require ConcurrentManagedAccess when not used by @zcbenz in #3062
    • Fp qmv by @awni in #2984
    • remove thrust by @awni in #3067

    New Contributors

    • @gufengc made their first contribution in #2987
    • @kernelpool made their first contribution in #3006
    • @bjornefisk made their first contribution in #3025
    • @rltakashige made their first contribution in #3033
    • @dhiltgen made their first contribution in #3024
    • @hxu296 made their first contribution in #3018
    • @jessegross made their first contribution in #3056

    Full Changelog: v0.30.3...v0.30.4

    Original source
  • Jan 13, 2026
    • Date parsed from source:
      Jan 13, 2026
    • First seen by Releasebot:
      Sep 2, 2026
    ml-explore logo

    MLX by ml-explore

    v0.30.3

    MLX adds nvfp4 and mxfp8 quantized ops on Metal and CUDA, plus faster copies, new gather and qq linear support, fp8 Python exposure, and a range of CUDA, CI, and bug fixes.

    Highlights

    Support nvfp4 and mxfp8 quantized ops on Metal

    Support nvfp4 and mxfp8 quantized-quantized matrix-matrix multiplication on CUDA

    What's Changed

    Bump the patch version by @angeloskath in #2922

    Faster copy for col contig to row contig by @awni in #2917

    Fix cuda release by @awni in #2925

    Metal logging by @CC-Yeh in #2904

    fix cuda release part 2 by @awni in #2926

    new[CI]: add linux sanitizer tests by @incertum in #2860

    patch bump by @awni in #2927

    Fix CUDA pypi release by @awni in #2929

    Move allocate_workspace to cuda/utils.h by @zcbenz in #2923

    Allow dry run for PyPI release workflow by @zcbenz in #2928

    Set rpath with cmake for CUDA build by @zcbenz in #2932

    Fix nightly build by @zcbenz in #2933

    Set install rpath of python bindings with cmake by @zcbenz in #2934

    Fix pid in local launch by @angeloskath in #2936

    Make CUDA CI run faster by @zcbenz in #2939

    refactor: use perf_counter for accurate benchmarking by @Satyam12singh in #2940

    Fix for non row-contig scales by @awni in #2941

    Fix stubgen by @zcbenz in #2942

    ci: add macOS 26 target by @madrob in #2937

    Fix float64 size in data_types.rst by @pdevine in #2948

    Fixes in mlx.distributed_config by @angeloskath in #2947

    Metal/CPU nvfp4 and mxfp8 by @awni in #2946

    [CUDA] Implement gather_mm_rhs by @zcbenz in #2902

    Fetch nanobind with cmake by @zcbenz in #2949

    refactor: use time.perf_counter for consistent and accurate benchmarking by @Satyam12singh in #2943

    BUG FIX - Addition of missing parameter in random::uniform by @hwiesmann in #2963

    Fix doc issues in mlx.nn.init.he_normal and mlx.nn.hard_tanh by @Redempt1onzzZZ in #2968

    fix numpy dtype bug by @awni in #2960

    QQ linear by @nastya236 in #2931

    fix array allocator with user buffer and deleter by @andresy in #2971

    Swizzle scales by @nastya236 in #2979

    Fix grid_dim_x calculations by @CC-Yeh in #2980

    Add asarray to array_namespace by @Anri-Lombard in #2966

    fix doc by @CC-Yeh in #2988

    replace MLX_IBV_COORDINATOR with MLX_JACCL_COORDINATOR by @Evanev7 in #2986

    Fix RandomBits::is_equivalent to include width by @MillaFleurs in #2978

    Don't try to use NAX at run-time if kernels aren't there by @awni in #2982

    Expose to/from fp8 in Python and don't auto-convert fp8 when loading from safetensors by @awni in #2985

    Allow some non 2D inputs in qqmm by @awni in #2981

    New Contributors

    @pdevine made their first contribution in #2948

    @hwiesmann made their first contribution in #2963

    @Anri-Lombard made their first contribution in #2966

    @Evanev7 made their first contribution in #2986

    @MillaFleurs made their first contribution in #2978

    Full Changelog: v0.30.1...v0.30.3

    Original source

This is the end. You've seen all the release notes in this feed!

Releasebot

Curated by the Releasebot team

Releasebot is an aggregator of official product update announcements from hundreds of software vendors and thousands of sources.

Our editorial process involves the manual review and audit of release notes procured with the help of automated systems.