What's Changed
Adding VJP for the scaled dot product attention. by @tpegolotti in #4563
python: Add pos support to array by @aaishwarymishra in #4488
Add Python 3.15 and 3.15t support by @XXXXRT666 in #4555
Add fixed size unique operation by @louen in #4501
Fix normalizing single-element slice with negative stride by @axiom-of-choice in #4446
Patch bump to 0.32.4 by @zcbenz in #4582
Adding VJP for gated delta net. by @tpegolotti in #4565
Fix col_reduce_longcolumn for negative-stride views by @mateuuszzzzz in #4529
Clear CUDA errors once reported and raise eval errors in buffer protocol by @aleroot in #4523
Improve pre-M5 metal memory usage for SDPA D512 by @dhiltgen in #4518
Fix split data size span by @michalk8 in #4540
Re-introduce Array API Tests suite by @prady0t in #4433
Fix view inside of a vmap by @michalk8 in #4586
Fix cumsum of a non-contiguous bool by @michalk8 in #4590
docs: contraction dtype requirements in matmul/einsum by @simeetnayan81 in #4550
Fixing cooperative tensor build issues on Mac OS 27 by @tpegolotti in #4594
Handle EOF and EINTR in ParallelFileReader::read by @Ritabanm in #4532
Clamp slice bounds when a slice is combined with an array index by @IshaanPotle in #4513
Fixes grouped Conv1d/Conv2d init to use in_channels // groups by @CodeWithMoin in #4544
Fix mx.view misaligned offset by @michalk8 in #4585
[CUDA] Add fp_gather_qmv to optimize gather_qmm by @dhiltgen in #4508
Fix eval cleanup deadlock by committing GPU streams before waiting by @ronaldmannak in #4556
Fix shared_buffer_reshape contiguity flags by @michalk8 in #4589
Fix view last axis stride by @michalk8 in #4587
Fix empty unsigned sum/prod failing on Metal by @CodeWithMoin in #4546
[CUDA] Add gather_qmm_rhs_sm80 by @dhiltgen in #4554
python: Fix bare ellipsis setitem by squeezing leading singleton dimensions by @shaeantoine in #4561
Fix row/col contiguous flags in view by @michalk8 in #4588
Do not cache failed distributed backend initialization by @ronaldmannak in #4558
Fix reduction over large arrays by @nicoloangileri in #4549
docs: Correct the export callback type in the guide by @ssmall256 in #4578
Fix MultiOptimizer crash when an optimizer's group is empty by @ishtihoss in #4570
Fix fft size one by @michalk8 in #4591
Sanitize '-' in make_template_hash for metal kernel by @gokay-ai in #4584
Fix as_strided contiguity by @sofinvalery in #4575
Reject non-aligned pointers when converting to mx.array by @michalk8 in #4592
Fix conjugation in complex VJPs for inverse trig ops, cos, sqrt, and rsqrt by @devYRPauli in #4606
Fix complex to bool by @michalk8 in #4593
[jaccl] second cable for the mesh by @nastya236 in #4607
Fix vmap of scatter placing the batch axis wrongly in the updates by @Adityaj0 in #4322
Unroll TK=4 keys per iter in sdpa_vector_2pass_1 by @Stonesjtu in #4596
Fix CPU float16 SIMD comparison masks by @crabel99 in #4602
Add jvp support for logcumsumexp by @navthings in #4611
[CUDA] Export CommandEncoder and Device by @erwinzhang7 in #4619
Use the fast qmv kernel for outputs not divisible by 8 by @wyanzhao in #4516
Fix ResidencySets reading autoreleased error object by @Brooooooklyn in #4623
Use the small-channel implicit gemm loader for C_per_group = 8 (and depthwise C % 8) by @zsun6 in #4617
[CUDA] Reduce floor for fp_gather_qmv by @dhiltgen in #4620
Fix default.metallib lookup under swift test with Swift Build by @heckj in #4527
Fix metal validation error when passing empty vector by @aleroot in #4622
Replace Black formatter with ruff by @aaishwarymishra in #4600
Tune M1 quantized matmul dispatch for six-row large shapes by @DeadByDawn101 in #4629
[metal] Add env var based residency refresh interval by @dhiltgen in #4633
Promote integer inputs in logcumsumexp by @vijay-kapse in #4625
Fix slicing's non contiguous start by @michalk8 in #4599
Fix float16 overflow in clip_grad_norm by @ishtihoss in #4626
Collapse the non sorted axes to pick the contiguous sort kernel by @kapellirohith in #4366
Fix 32 bit dispatch grid overflow in Metal reductions by @Lyxot in #4437
Fix gpu boolean masking in 0 dim array by @aaishwarymishra in #4635
Fix vmap of an inverse real FFT to an odd length by @vijay-kapse in #4637
Fix cross-process race in CPU compile cache by @MarcosAsh in #4638
Update acknowledgments for past pinv contribution by @adi-dhulipala in #4645
Fix foreign buffer ownership by @michalk8 in #4634
Add MLX_CONV_WINOGRAD switch to disable winograd for conv2d by @ishaanzee in #4639
Keep split-K quantized matmul partials in float32 by @mattt in #4641
Thin N GEMM kernels by @Isalia20 in #4640
Add 1-bit affine quantization support (Metal) by @khosravipasha in #3161
Update Metal Complex division in numpy style to avoid overflow condition. by @aaishwarymishra in #4644
Fix pickle bfloat16 strides by @michalk8 in #4649
Fix metal negative stride index in masked_scatter/scatter/SDPA mask/segmented_gemm by @michalk8 in #4650
Fix missing break binary bool by @michalk8 in #4651
Fix cpu binary_op_dispatch_dims on large data by @Prudctual in #4648
Add FloorDivide primitive for integer floor division by @CodeAndCanvas728 in #4642
[Metal] Fix SDPA max threadgroup for M1/M2 generation by @dhiltgen in #4643
Fix incorrect output mask computation in mx.block_masked_mm by @michalk8 in #4652
Add thin M GEMM dispatch by @Isalia20 in #4654
Fix Python dtpye -> mlx conversion narrowing by @michalk8 in #4656
Fix input/output scalar merging in compile by @michalk8 in #4658
Validate .npy shape in mlx/io/load.cpp by @SounLabs in #4657
Replace "pull_request_target" event with "pull_request" in update_bypass_list workflow by @zcbenz in #4667
[CUDA] Only count consecutive misses in the LRUCache thrashing check by @ddalcu in #4661
Fix conv input gradient shape with uneven or large padding by @MarcosAsh in #4662
Fix missing stream in layer_norm and sdpa fallbacks by @AkshayShah03 in #4663
Fix direct CPU conv writing past output by @SashaMIT in #4668
Add stft and istft to mlx.core.fft by @eyupcanakman in #3639
Fix lost rank output in the distributed launcher by @tc3oliver in #4615
Fix split-K test compatibility on M5, M6 by @magnuslundstedt in #4677
Fix signedness warning in quantized Metal tail bounds check by @jrp2014 in #4675
fix batched row count mismatch in metal qvm_split_k by @Prudctual in #4673
fix metal conv bounds checks and integer overflows by @Prudctual in #4672
python: Make arctan2/radians/degrees support scalar inputs by @SleepAviator in #4679
Fix missing add_temporary in pad_gpu/fill_gpu by @ronaldmannak in #4660
Enable non-transposed NAX gather_qmm_rhs by @Lyxot in #4684
Add Metal extension build support by @XXXXRT666 in #4004
Adding minmax method to MLX to follow Numpy/Jax API by @aaishwarymishra in #4674
Fix missing stream in gather matmul indices cast by @petrukha-ivan in #4687
[BUG] Metal fence deadlock by @nastya236 in #4689
New Contributors
@mateuuszzzzz made their first contribution in #4529
@IshaanPotle made their first contribution in #4513
@CodeWithMoin made their first contribution in #4544
@shaeantoine made their first contribution in #4561
@nicoloangileri made their first contribution in #4549
@ssmall256 made their first contribution in #4578
@gokay-ai made their first contribution in #4584
@Stonesjtu made their first contribution in #4596
@crabel99 made their first contribution in #4602
@navthings made their first contribution in #4611
@heckj made their first contribution in #4527
@DeadByDawn101 made their first contribution in #4629
@vijay-kapse made their first contribution in #4625
@ishaanzee made their first contribution in #4639
@mattt made their first contribution in #4641
@khosravipasha made their first contribution in #3161
@CodeAndCanvas728 made their first contribution in #4642
@SounLabs made their first contribution in #4657
@ddalcu made their first contribution in #4661
@AkshayShah03 made their first contribution in #4663
@SashaMIT made their first contribution in #4668
@tc3oliver made their first contribution in #4615
@SleepAviator made their first contribution in #4679
@petrukha-ivan made their first contribution in #4687
Full Changelog : v0.32.3...v0.32.4