Repository navigation
[WS1][CUDA][MiniMax-H3] token_refiner_block: two refiner blocks over the strict operator rows (RFC #420 stack 4/5) - #570
Open
fusheng-ji wants to merge 19 commits into
Open
fusheng-ji wants to merge 19 commits into
fusheng-ji wants to merge 19 commits into
Conversation
fusheng-ji
requested review from
EthanZero2Hero,
Flink-ddd,
KJLdefeated,
bitborne,
inaniloquentee and
ryankert01
as code owners
October 22, 2026 12:19
|
Important Review skippedToo many files! This PR contains 151 files, which is 51 over the limit of 100. To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch. Upgrade to a paid plan to raise the limit. This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.
|
fusheng-ji
force-pushed
the
feat/h3-token-refiner
branch
from
October 22, 2026 14:37
b9e6b1c to
67af796
Compare
…fixed-order Triton GEMM Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> (cherry picked from commit 650e2148c6f0e5dcdef136537e0e62f745020273) Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> (cherry picked from commit d099c0b)
Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> (cherry picked from commit b41f868)
…il-closed test instead of a skip Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> (cherry picked from commit 74e5b83)
…l keys Review finding (RL-Align#568): jointly permuting x and g changed dW/dbias because the token axis was reduced in call order. All projection ops (audio in/out, text context, Q/K/V) now take an optional logical_keys [T,2|3] (negative first column = padding); rows are reduced in ascending key order with padding dropped, active keys must be unique. Key format follows RL-Align#562. Adds the reviewer's repro plus permutation/padding tests for every row and Q/K/V. Co-authored-by: Yitao Wang <75578057+walker-ai@users.noreply.github.com> Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> (cherry picked from commit d2941f0)
…ready ordered rows Follows the canonical-row design of RL-Align#562: the Q/K/V node of the block graph supplies (batch row, position) keys so its dW is reduced in logical order, and rows that already arrive in canonical order are reduced in place (same bytes, no gather of x and g). Co-authored-by: Yitao Wang <75578057+walker-ai@users.noreply.github.com> Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> (cherry picked from commit 0da0583)
…block 0 node-by-node and 50-block/generation gates Squashes the one-block branch (its row-by-row history: timestep sinusoid, RMSNorm, AdaLN rows, sequence/tensor parallel norm rows, final AdaLN, one block, 50-block qualification) onto the current test-h3 so the pull request carries a reviewable, signed history. RFC RL-Align#420. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com>
…pull request Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com>
Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> (cherry picked from commit eaba5efe3df971ea9d1a969f53e48f09e09ed176) Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> (cherry picked from commit 7da0574)
Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> (cherry picked from commit b45190d08fc033c7e63ad821d3918eb32dd454f6) Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> (cherry picked from commit b5536d6)
Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> (cherry picked from commit ad1925045b522772bf56f8468b23cca47f04156b) Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> (cherry picked from commit f9041e8)
Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> (cherry picked from commit b44540e)
…ody) Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> (cherry picked from commit eab901b)
… weight loader, tests, doc Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> (cherry picked from commit d12a6bb26566fae58a309e76916af9aae767d487) Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> (cherry picked from commit b316869)
Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> (cherry picked from commit 1e3a2ea)
Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com> (cherry picked from commit 67af796)
…age import Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com>
fusheng-ji
force-pushed
the
feat/h3-token-refiner
branch
from
October 22, 2026 21:04
67af796 to
6de320d
Compare
fusheng-ji
added a commit
to fusheng-ji/RL-Kernel
that referenced
this pull request
Oct 22, 2026
…#570 Add a sanitized JSON replay of all six accuracy-test swiglu nodes on Hopper, with a cross-device reference to the B200 block=1/257 bound failure.
fusheng-ji
added a commit
to fusheng-ji/RL-Kernel
that referenced
this pull request
Oct 23, 2026
…#567 RL-Align#568 RL-Align#570 RL-Align#571 RL-Align#574 RL-Align#575 Test summaries (tests.json), runner outputs and figures measured on NVIDIA B200 (sm100), driver 580, CUDA 13.0, torch 2.13.0+cu130, MiniMax-H3@42ed227, clean trees at the PR heads eab901b, 3cf51bf, 6de320d, eb7840b, af3dcae and 4f7c5d1. Figures use B200 axis labels. No host names, paths or scheduler identifiers. Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com>
Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com>
Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com>
Signed-off-by: Wenbo Ji <36562829+fusheng-ji@users.noreply.github.com>
This branch has not been deployed
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.
Depends on the foundation PR (the branch contains it as a merge) and the projection rows.
What
token_refiner.blocks.0/1, 14 nodes each, no AdaLN, no RoPE, thenfinal_norm) as a node graph inh3_refiner.py, with forward and backward,provider and FP64 golden replays, and the same per-node comparison harness as the transformer block.
h3_rmsnorm,h3_qkv_gemm) or staysinterimfor rowsother contributors own (attention, SwiGLU, O / gate_up / down).
token_refinerstage;h3_weights.load_h3_tensorsreads real tensors from the sharded checkpoint.fingerprint.REFINER_NODES(checked by a test).Prior art & reuse decision
diffusers
MiniMaxH3TokenRefineris the reference graph; vLLM-Omni reuses its generic block, so there is no separate fused implementation to adopt. No new kernel is written here.Decision: compose existing rows; do not re-implement attention or the FFN GEMMs.
Results (H100 / Hopper)
Hopper pytest summary:
tests.json(132 collected, 132 passed @6de320dc, H100 sm90).Hopper test gate (PR head
6de320dc):test_h3_token_refiner.pyand the stacked files in Tests below — 132/132 pass on H100 pertests.json(includingtest_nodes_accuracy_repeat_batch_and_isolated[1-257]/swiglu). The six-case chained bound matrix isswiglu_tolerance_matrix.json(candidate ~0.0121 at block 1 / 257 tokens; provider chain matches on H100).Measured on NVIDIA H100 (93 GiB, sm90), driver 580, CUDA 13.0, torch 2.13.0+cu130, pinned
MiniMax-H3@42ed227weights, at head17d0e9e9(forward path unchanged, numbers not re-measured). Real block-0 weights, one block, forward.Numbers:
report.json. Repeat and batch invariance hold at every node. The first node that differs from theprovider is the
attentionnode. The time gap is almost entirely the interim bindings of rows other contributors own; the nodes this PR and the projection rows add are within about 2x of the provider.Results (B200 / Blackwell) — supplementary, not Hopper acceptance
Measured on NVIDIA B200 (179 GiB, sm100), driver 580.126, CUDA 13.0, torch 2.13.0+cu130, pinned
MiniMax-H3@42ed227weights, clean tree at6de320dc.One test fails on B200.
test_h3_token_refiner.py::test_nodes_accuracy_repeat_batch_and_isolated[1-257](block 1, 257 tokens), at theswiglunode: the candidate chain's relative error against the FP64 golden is 0.01211 and the bound is1.25 x provider + 1e-3 = 0.01116, with the provider at 0.00816. Result of the test file: 131 passed, 1 failed (132 collected);tests.json. The bound was not changed. On H100 the same case passes (candidate and provider chains both 0.012117; the six-case matrix isswiglu_tolerance_matrix.json).What a diagnostic on the B200 showed (separate runs, not part of the result above):
swigluerror is the same on both devices (0.01211 on B200, 0.012117 on H100); what differs is the provider chain (0.00816 on B200, 0.012117 on H100), which lowers the bound.swiglukernel is not less accurate than the provider: given the same input its error equals the provider's (0.00816), and on random BF16 input against FP64 it is more accurate (0.0017 against 0.0024) because it rounds once after FP32 math where the provider rounds twice.ffn_gate_upis equal for both chains (0.00818) andswigluis 0.01211 (candidate) against 0.00816 (provider). The direction is not systematic: block 0 with 257 tokens has the candidate below the provider (0.00829 against 0.01081) on the same device.Forward time of one refiner block (
report.json):Repeat and batch invariance hold in every case (
first_repeat_driftandfirst_batch_driftare none); the first difference from the provider is the interimattentionnode, as on H100.Status
Hopper (merge gate): graph vocabulary pinned to the fingerprint; forward and backward on real weights; repeat/batch invariance on H100; refiner pytest 132/132 pass on H100 at head
6de320dc.B200 (supplementary): 131/132 pytest pass; one chained-graph
swiglubound fail (provider chain lower than on H100, not a worse candidate kernel — seeswiglu_tolerance_matrix.json). No bound was widened; not treated as blocking Hopper review.Tests
python -m pytest tests/models/minimax_h3/test_h3_token_refiner.py tests/models/minimax_h3/test_h3_operator_trace.py \ tests/models/minimax_h3/test_h3_arch_fingerprint.py tests/models/minimax_h3/test_h3_projection_rows.py \ tests/models/minimax_h3/test_h3_one_block.py -q # 126 passedB200: same files, 131 passed, 1 failed (see Results (B200 / Blackwell)).
Scope / Known limitations
Evidence priority: maintainers reviewing RFC #420 on CUDA should use H100 sections and JSON under
pr_assets@d188d29e. B200 numbers document sm100 behaviour only.Strict mode is fail-closed: no TF32, no fast-math, no split-K; FP32 accumulation with one final rounding; unsupported shapes, dtypes and devices raise instead of falling back. Not part of this PR: video projections (#562), O / gate_up / down GEMMs (#554, #535), full attention (#553), ROCm, SGLang adapter, pipeline parallel. Replacing the interim bindings is tracked by those rows.