Fix conv2 gradients in grouped strided case on Metal#3800
Open
ericphanson wants to merge 1 commit into
Open
Conversation
Route grouped 2D convolutions with input dilation through the group-aware explicit GEMM fallback instead of falling through to dense Metal kernels. This fixes incorrect GPU dL/dx for grouped strided conv2d VJPs.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Route grouped 2D convolutions with input dilation through the group-aware explicit GEMM fallback instead of falling through to dense Metal kernels. This fixes incorrect GPU dL/dx for grouped strided conv2d VJPs.
Proposed changes
I had unexpected exploding gradients when implementing a mobileclip2 model with MLX, which were fine on cpu. Claude Fable produced the following MWE which shows the divergence between gradients of
conv2dwith cpu vs mlx:mwe.py
I used Codex (GPT 5.5) with that MWE to find and fix the dispatch issue PR'd here. It seems there is a bug in the fast path: when
input_dilation != 1it falls back to an ungrouped convolution instead. Here we check this and route toexplicit_gemm_conv_group_ND_gpuinstead.I verified that my original mwe (see above) works with this PR, and the new unit tests work on my PR branch and fail on main.
Checklist
Put an
xin the boxes that apply.pre-commit run --all-filesto format my code / installed pre-commit prior to committing changes