Skip to content

metal: add the missing f32 x bf16 mul_mv variants - #28741

Merged
ServeurpersoCom merged 1 commit into
ggml-org:masterfrom
ServeurpersoCom:metal-mul-mv-f32-bf16
Sep 23, 2026
Merged

ServeurpersoCom merged 1 commit into
ggml-org:masterfrom
ServeurpersoCom:metal-mul-mv-f32-bf16

Conversation

@ServeurpersoCom

Copy link
Copy Markdown
Contributor

Overview

On macOS, any depthwise 1D convolution over bf16 weights aborts with:

"kernel not found in any metal library: kernel_mul_mv_f32_bf16_short"

ggml_conv_1d_dw builds its im2col as f32 when the kernel is bf16, then calls mul_mat(im2col, kernel), which puts f32 in src0 and bf16 in src1. That combination is never instantiated: the library has f32_f32, f16_f32, f16_f16, bf16_f32 and bf16_bf16, but not f32_bf16. Other convolution paths do not hit it because conv_2d keeps its im2col in f16 whatever the kernel type.

Additional information

I paid attention to the guard because I have had that exact point raised on a previous PR, the bf16 kernels must stay behind GGML_METAL_HAS_BF16. The three variants are added next to their bf16 neighbours, inside the existing #if defined(GGML_METAL_HAS_BF16) block. That macro is injected at library compile time only when the device reports bf16 support, so devices without it are unaffected.

Tested on macOS by @pcuenca, who hit the original abort and confirms it is fixed.

Requirements

@ServeurpersoCom
ServeurpersoCom requested a review from a team as a code owner September 11, 2026 08:30
@github-actions github-actions Bot added ggml changes relating to the ggml tensor library for machine learning Apple Metal https://en.wikipedia.org/wiki/Metal_(API) labels Sep 11, 2026

@pcuenca pcuenca left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tested locally. Thanks a lot @ServeurpersoCom!

@ServeurpersoCom

ServeurpersoCom commented Sep 11, 2026 •

Copy link
Copy Markdown
Contributor Author

We'll test --outtype f16. If the quality matches, the fix is good but not urgent, since we'll publish both mmproj formats.

We’re taking a belt-and-suspenders approach. this fix OK also, because in vocoders, there are quite a few tensors/models that require the dynamic range provided by BF16.

@nikwen nikwen left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we add tests to test-backend-ops?

As far as I can tell, we have BF16 x F32 tests in there, but no F32 x BF16 tests yet.

@ServeurpersoCom

Copy link
Copy Markdown
Contributor Author

Should we add tests to test-backend-ops?

As far as I can tell, we have BF16 x F32 tests in there, but no F32 x BF16 tests yet.

Good catch, F32 x BF16 is never exercised. The test alone would not help though: the CPU backend refuses that combination, so the case would be skipped instead of compared. The CPU side has to land first, then the test makes sense.

ggml_conv_1d_dw builds its im2col as f32 when the kernel is bf16, then
multiplies the two, so a depthwise convolution over bf16 weights asks
for kernel_mul_mv_f32_bf16, which was never instantiated. The base, the
_4 and the _short families are filled in next to their bf16 neighbours,
inside the same runtime guard, so a device without bf16 support is
unaffected.
@ServeurpersoCom

Copy link
Copy Markdown
Contributor Author

Rebase only

@ServeurpersoCom
ServeurpersoCom merged commit 9575389 into ggml-org:master Sep 23, 2026
13 checks passed
frostyautumnleaf pushed a commit to frostyautumnleaf/llama.cpp that referenced this pull request Oct 5, 2026
ggml_conv_1d_dw builds its im2col as f32 when the kernel is bf16, then
multiplies the two, so a depthwise convolution over bf16 weights asks
for kernel_mul_mv_f32_bf16, which was never instantiated. The base, the
_4 and the _short families are filled in next to their bf16 neighbours,
inside the same runtime guard, so a device without bf16 support is
unaffected.
edwardyoon pushed a commit to edwardyoon/focus-llama that referenced this pull request Oct 7, 2026
ggml_conv_1d_dw builds its im2col as f32 when the kernel is bf16, then
multiplies the two, so a depthwise convolution over bf16 weights asks
for kernel_mul_mv_f32_bf16, which was never instantiated. The base, the
_4 and the _short families are filled in next to their bf16 neighbours,
inside the same runtime guard, so a device without bf16 support is
unaffected.

(cherry picked from commit 9575389)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Apple Metal https://en.wikipedia.org/wiki/Metal_(API) ggml changes relating to the ggml tensor library for machine learning

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants