Skip to content

dsv41 metal: the registered glue kernels (norms, RoPE, FP8 and FP4 round trips, embed, join, mean) - #1711

Merged
ashhart merged 1 commit into
ashhart:mainfrom
gilby:dsv41-metal-pr/07-glue-kernels
Nov 3, 2026
Merged

ashhart merged 1 commit into
ashhart:mainfrom
gilby:dsv41-metal-pr/07-glue-kernels

Conversation

@gilby

@gilby gilby commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor

What this changes

The registered glue kernels (glue.metal): RMSNorm, RoPE, the FP8 and FP4 act_quant round trips, the embedding, the MoE join and the hc mean, each in one stated order and checked against float64.

Main's shared files change only by one-line hooks; this part's records, suites and limits go into the family's own files (dsv41_metal_records.zig, metal_dsv41_main.zig, metal_dsv41_limits.zig).

Part 7 of 18 of the stack for #1676; stacks on dsv41-metal-pr/06-matvecs-phase1-glue (part 6, #1710), on main with parts 1 to 5 (#1705 to #1709) merged.

Receipt

  • Environment, with the TensorFold commit, MLX or PyTorch version, machine and GPU, checkpoint and revision: TensorFold 89f66a0 on main ad98b60 (native Zig 0.17.0; no MLX or PyTorch); Apple M3 Ultra (60-core GPU), 96 GB, macOS, for the kernel and device tests; checkpoint deepseek-ai/DeepSeek-V4.1-Flash-1017.
  • Exactness, from tools/bench_concurrent.py --alone --serial or token_sha against "draft": false: n/a: kernels only; the kernel contract checks each launch geometry's bits against the others and against float64.
  • Decode speed before and after, from tools/bench_openai.py: measured on the PR that turns serving on.
  • Prompt speed before and after: the cold first request's ttft_s from tools/bench_cache.py --require-cold on a long prompt, or "n/a" with the reason when the change cannot reach prompt processing: measured on the PR that turns serving on.
  • Tests run, with pass, fail and skip counts: zig build test tf-kernel-contract -Dcpu=apple_m1: exit 0, 621/621 steps succeeded; kernel contract, tf-kernel-contract --only dsv41 (Metal): SUMMARY 48 kernels: 48 pass gates 1-4, 0 fail, 0 known findings; 93 controls: 93 red as planted, 0 missed; 0 limit problems; gates 99467 ms, limits 159 ms; python3 tools/zig/lean_check.py: 5044 files, 424 problems, the same count as main (5027 files, 424). Zig's summary counts only the test binaries it ran in that invocation, so the step count is the comparable figure.
  • Not run, and why: CUDA: no CUDA code changes; Metal on M1, M2, M4 and M5: one M3 Ultra only (the contract's limits check covers the M1 to M5 pipeline limits).

Checklist

  • Every token still goes through the lane rounds. No serial path, and nothing that needs drafts off.
  • Drafted output equals "draft": false, a resumed prompt equals a fresh one, and concurrent equals solo.
  • No precision traded for speed. If the bits change, the description says which sums change and why.
  • A new or changed GPU kernel is registered with the kernel contract (docs/kernel-contract.md); each backend's SUMMARY line is in the receipt.
  • Prompt processing is no slower than the last release.
  • The description says which platforms I ran, Metal M1 to M5 and CUDA, and which I could not.
  • New tests fail before the change, pass after it, and skip cleanly without their dependency.
  • Comments and docstrings are one line. No measurements or history in the source.
  • No personal data, machine names, internal hosts or local paths. No AI attribution lines.

@ashhart

ashhart commented Nov 1, 2026

Copy link
Copy Markdown
Owner

Thanks @gilby. Rebased and clean on main, Kimi untouched, and the SUMMARY (41 kernels, 79 controls red as planted) is what we'd want. This lands after #1706-#1710, once tf-kernel-contract --only dsv41 passes on our Macs.

@ashhart

ashhart commented Nov 2, 2026

Copy link
Copy Markdown
Owner

Thanks @gilby: nothing owed from you here. Every kernel in this part is gated against float64 with planted controls, and the push is a clean rebase. We're running tf-kernel-contract --only dsv41 on our M5 Ultra over the whole stack, then it lands in stack order after #1710 (#1712 has one small ask for route_select controls).

@ashhart

ashhart commented Nov 2, 2026

Copy link
Copy Markdown
Owner

Our Metal kernel contract over the stack (tf-kernel-contract --only dsv41, head #1713, M5 Ultra): 65 kernels pass gates 1-4, 0 fail, 0 known findings; 121 controls, 121 red as planted, 0 missed; 0 limit problems. That clears the device side for #1711 to #1713. They land in order after #1710, with #1712's one ask (route_select controls) first.

@ashhart ashhart mentioned this pull request Nov 2, 2026
6 of 9 tasks
@gilby
gilby force-pushed the dsv41-metal-pr/07-glue-kernels branch from fec314e to 89f66a0 Compare November 3, 2026 05:30
…und trips, embed, join, mean)

glue.metal holds the layer's small launches in one stated order each: RMSNorm with fp32 or bf16 weights, RoPE,
act_quant and fp4_act_quant round trips, the embedding, the MoE join and the hc mean. Registered with the contract
against float64, and bit-equal to the phase-1 glue.
@ashhart
ashhart force-pushed the dsv41-metal-pr/07-glue-kernels branch from 89f66a0 to ee5e01f Compare November 3, 2026 09:34
@ashhart
ashhart merged commit a23942a into ashhart:main Nov 3, 2026
4 of 7 checks passed
@ashhart

ashhart commented Nov 3, 2026

Copy link
Copy Markdown
Owner

Thank you @gilby. This is merged into main with your commits under your own name, so you're listed as a TensorFold contributor. It ships in the next release, credited to you in the changelog and the release notes.

@ashhart

ashhart commented Nov 3, 2026

Copy link
Copy Markdown
Owner

Thanks @gilby! This is in TensorFold 1.2.2, out now: https://github.com/ashhart/TensorFold/releases/tag/v1.2.2

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants