From 97e1684c5ad81b3f58bf2f394e45d6e44fbe37c0 Mon Sep 17 00:00:00 2001 From: Simba Zhang Date: Fri, 14 Aug 2026 11:29:10 -0700 Subject: [PATCH] test: make the MoE fixture actually test nesting, and fix two harness faults MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Review follow-ups on #143/#144. All three findings were in code I wrote. **The MoE fixture tested nothing it claimed.** It used `qwen3_moe`, whose Swift configuration decodes from the root of config.json, so the expert count had to be at the top level; the nested copy underneath was never reached, because findExpertCounts is breadth-first and returns on the first hit. Both advertised properties — the nesting, and the `vision_config` decoy that "must not be mistaken" — were dead weight. Deleting the nested walk entirely would not have failed it. Rebuilt on `gemma4`, whose Gemma4Configuration decodes `text_config` and nothing else, so the count exists only one level down and the decoy is genuinely reached. `gemma4` also contains no "moe", so modelTypeImpliesMoE cannot rescue it — which is what made the qwen3_moe version untestable. Red-green verified, the check the previous version could not pass: reverting detection to the pre-#114 top-level single-key form fails the new assertion, and restoring it passes. The fixture now reproduces #112. The assertion also moved to the right gate. There are two: a config-level MoE check, and a model-level StreamableMoE conformance check. gemma4 passes the first and legitimately declines the second, so asserting "streaming enabled" would have tested the wrong thing. It now asserts only that detection did not reject. Incidentally covers the fused-expert remap — real gemma4 checkpoints ship `experts.gate_up_proj` as one tensor that sanitize splits into `switch_glu.gate_proj`/`up_proj`. A wrong split axis is a silent numerical fault. **Two harness faults.** cleanup() killed the server without waiting, and the readiness loop probed health before checking liveness. If a teardown outlived the 1s sleep, the next fixture would fail to bind, and its first probe would be answered by the previous server — assertions then run against the wrong checkpoint and report a false pass, not a flake. cleanup now waits, and liveness is checked first. The generator wrote into existing directories without clearing them, so files a builder stopped emitting survived and the fixture kept testing a shape the source no longer described. Each fixture's own directory is now cleared first — scoped to one known directory, which is also what keeps regeneration away from siblings like tests/fixtures/omni, whose assets belong to test-omni.sh. Suite: 6 passed, 0 failed, twice consecutively. Co-Authored-By: Claude Opus 5 --- scripts/make-test-fixtures.py | 124 +++++++++++++------- tests/fixtures/moe-nested/config.json | 47 ++++---- tests/fixtures/moe-nested/model.safetensors | Bin 227744 -> 319436 bytes tests/test-fixtures.sh | 52 +++++--- 4 files changed, 139 insertions(+), 84 deletions(-) diff --git a/scripts/make-test-fixtures.py b/scripts/make-test-fixtures.py index 953f437..ee2e48c 100755 --- a/scripts/make-test-fixtures.py +++ b/scripts/make-test-fixtures.py @@ -23,6 +23,7 @@ """ import json import os +import shutil import sys import numpy as np @@ -230,77 +231,107 @@ def build_gemma4_kv_shared(out, vestigial): def build_moe_nested(out): - """A Qwen3-style MoE: per-expert tensors, nested config, decoy vision count. - - Covers the MoE *load* path, which nothing else in CI touches — no MoE model is in - the matrix at all. Specifically: per-expert `mlp.experts.N.*` tensors being stacked - into `switch_mlp` by sanitize, and an expert count nested under `text_config` - rather than at top level. - - What it does NOT cover, despite the nesting, is the #112 detection bug itself. - That bug was `num_local_experts` being the only spelling checked, so a config - declaring `num_experts` was called dense. But `modelTypeImpliesMoE` treats any - model_type containing "moe" as MoE regardless of keys, so `qwen3_moe` is caught by - that fallback whatever the config says — verified by reverting detection to the - single-key form and watching this fixture still enable streaming. - - Reproducing #112 end to end needs a MoE architecture whose model_type does not - contain "moe" — deepseek_v3 (`n_routed_experts`) is the candidate. Its MLA - attention makes that a larger fixture; the profiler itself is covered directly by - ModelProfilerMoEDetectionTests in the meantime. + """Gemma 4 with a MoE text block, so the expert count is genuinely nested. + + An earlier version of this fixture used `qwen3_moe`, whose Swift configuration is + decoded from the root of config.json — so the expert count had to sit at the top + level, and the "nested" copy underneath it was never reached. `findExpertCounts` + is breadth-first and returned on the root hit, which made both the nesting and the + vision decoy dead weight. + + `Gemma4Configuration` decodes `text_config` and nothing else, so here the count + exists *only* one level down. That makes two things real rather than decorative: + the nested walk added in #112's review follow-up, and the rule that a count under + `vision_config` must not be mistaken for the language model's. + + It also covers the fused-expert remap: real gemma4 checkpoints ship + `experts.gate_up_proj` as one tensor that sanitize splits in half into + `switch_glu.gate_proj` / `switch_glu.up_proj`. A wrong split axis, or swapped + halves, is a silent numerical fault no unit test here would see. """ H, L, HEADS, KVH, HD = 64, 2, 4, 2, 16 INTER, MOE_INTER, EXPERTS, TOPK = 128, 32, 4, 2 + PLI, VPLI = 32, 16 rng = np.random.default_rng(0) text_config = { - "model_type": "qwen3_moe", + "model_type": "gemma4_text", "hidden_size": H, "num_hidden_layers": L, "intermediate_size": INTER, "num_attention_heads": HEADS, "num_key_value_heads": KVH, "head_dim": HD, - "num_experts": EXPERTS, - "num_experts_per_tok": TOPK, - "moe_intermediate_size": MOE_INTER, - "decoder_sparse_step": 1, - "mlp_only_layers": [], + "global_head_dim": HD, "rms_norm_eps": 1e-6, "vocab_size": VOCAB, + "rope_traditional": False, "rope_theta": 10000.0, - "tie_word_embeddings": False, + "sliding_window": 128, + "sliding_window_pattern": 1, "max_position_embeddings": 512, - "norm_topk_prob": True, + "num_kv_shared_layers": 0, + "use_double_wide_mlp": False, + "tie_word_embeddings": True, + "hidden_size_per_layer_input": PLI, + "vocab_size_per_layer_input": VPLI, + "final_logit_softcapping": 30.0, + "attention_k_eq_v": False, + "enable_moe_block": True, + "num_experts": EXPERTS, + "top_k_experts": TOPK, + "moe_intermediate_size": MOE_INTER, + } + # num_experts appears here and nowhere else at the root — that is the point. + cfg = { + "model_type": "gemma4", + "architectures": ["Gemma4ForConditionalGeneration"], + "vocab_size": VOCAB, + "text_config": text_config, + # A decoy the language-model walk has to skip. + "vision_config": {"model_type": "gemma4_vision", "num_experts": 999}, } - cfg = dict(text_config) - cfg["text_config"] = text_config - # Must not be mistaken for the language model's expert count. - cfg["vision_config"] = {"model_type": "qwen3_vl", "num_experts": 999} json.dump(cfg, open(os.path.join(out, "config.json"), "w"), indent=2) w = { - "model.embed_tokens.weight": rand(rng, VOCAB, H), - "model.norm.weight": ones(H), - "lm_head.weight": rand(rng, VOCAB, H), + "language_model.model.embed_tokens.weight": rand(rng, VOCAB, H), + "language_model.model.norm.weight": ones(H), + "language_model.model.embed_tokens_per_layer.weight": rand(rng, VPLI, L * PLI), + "language_model.model.per_layer_model_projection.weight": rand(rng, L * PLI, H), + "language_model.model.per_layer_projection_norm.weight": ones(PLI), } for i in range(L): - p_ = f"model.layers.{i}" + # A gemma4 wrapper checkpoint prefixes its text weights this way; matches + # what a real gemma-4-e2b ships. + p_ = f"language_model.model.layers.{i}" w[f"{p_}.self_attn.q_proj.weight"] = rand(rng, HEADS * HD, H) w[f"{p_}.self_attn.k_proj.weight"] = rand(rng, KVH * HD, H) w[f"{p_}.self_attn.v_proj.weight"] = rand(rng, KVH * HD, H) w[f"{p_}.self_attn.o_proj.weight"] = rand(rng, H, HEADS * HD) w[f"{p_}.self_attn.q_norm.weight"] = ones(HD) w[f"{p_}.self_attn.k_norm.weight"] = ones(HD) + w[f"{p_}.layer_scalar"] = np.ones(1, np.float16) + w[f"{p_}.mlp.gate_proj.weight"] = rand(rng, INTER, H) + w[f"{p_}.mlp.up_proj.weight"] = rand(rng, INTER, H) + w[f"{p_}.mlp.down_proj.weight"] = rand(rng, H, INTER) w[f"{p_}.input_layernorm.weight"] = ones(H) w[f"{p_}.post_attention_layernorm.weight"] = ones(H) - w[f"{p_}.mlp.gate.weight"] = rand(rng, EXPERTS, H) - # Per-expert tensors, the layout a real checkpoint ships; sanitize stacks - # these into switch_mlp. - for e in range(EXPERTS): - w[f"{p_}.mlp.experts.{e}.gate_proj.weight"] = rand(rng, MOE_INTER, H) - w[f"{p_}.mlp.experts.{e}.up_proj.weight"] = rand(rng, MOE_INTER, H) - w[f"{p_}.mlp.experts.{e}.down_proj.weight"] = rand(rng, H, MOE_INTER) + w[f"{p_}.pre_feedforward_layernorm.weight"] = ones(H) + w[f"{p_}.post_feedforward_layernorm.weight"] = ones(H) + w[f"{p_}.per_layer_input_gate.weight"] = rand(rng, PLI, H) + w[f"{p_}.per_layer_projection.weight"] = rand(rng, H, PLI) + w[f"{p_}.post_per_layer_input_norm.weight"] = ones(H) + # Router and experts are siblings of mlp on the decoder layer, not nested in it. + # Enabling the MoE block also builds a second pair of feedforward norms. + w[f"{p_}.pre_feedforward_layernorm_2.weight"] = ones(H) + w[f"{p_}.post_feedforward_layernorm_1.weight"] = ones(H) + w[f"{p_}.post_feedforward_layernorm_2.weight"] = ones(H) + w[f"{p_}.router.proj.weight"] = rand(rng, EXPERTS, H) + w[f"{p_}.router.scale"] = ones(H) + w[f"{p_}.router.per_expert_scale"] = ones(EXPERTS) + # Fused, as a real checkpoint ships it: sanitize splits dim -2 in half. + w[f"{p_}.experts.gate_up_proj"] = rand(rng, EXPERTS, 2 * MOE_INTER, H) + w[f"{p_}.experts.down_proj"] = rand(rng, EXPERTS, H, MOE_INTER) save_file(w, os.path.join(out, "model.safetensors"), metadata={"format": "pt"}) return len(w) @@ -319,7 +350,16 @@ def build_moe_nested(out): total = 0 for name, (fn, kwargs) in FIXTURES.items(): out = os.path.join(ROOT, name) - os.makedirs(out, exist_ok=True) + # Clear this fixture's own directory, and only its own. Writing over an existing + # one leaves behind files the current builder no longer emits — flip stray-shard + # off and its decoy shard and index survive, so the fixture keeps testing a shape + # the source no longer describes, and the printed size counts files that are not + # part of it. Scoping the removal to one known fixture directory is also what + # keeps regeneration from reaching siblings such as tests/fixtures/omni, whose + # assets belong to test-omni.sh and are not generated here. + if os.path.isdir(out): + shutil.rmtree(out) + os.makedirs(out) n = fn(out, **kwargs) write_tokenizer(out) size = sum(os.path.getsize(os.path.join(out, f)) for f in os.listdir(out)) diff --git a/tests/fixtures/moe-nested/config.json b/tests/fixtures/moe-nested/config.json index bfee7eb..8dc58d1 100644 --- a/tests/fixtures/moe-nested/config.json +++ b/tests/fixtures/moe-nested/config.json @@ -1,44 +1,39 @@ { - "model_type": "qwen3_moe", - "hidden_size": 64, - "num_hidden_layers": 2, - "intermediate_size": 128, - "num_attention_heads": 4, - "num_key_value_heads": 2, - "head_dim": 16, - "num_experts": 4, - "num_experts_per_tok": 2, - "moe_intermediate_size": 32, - "decoder_sparse_step": 1, - "mlp_only_layers": [], - "rms_norm_eps": 1e-06, + "model_type": "gemma4", + "architectures": [ + "Gemma4ForConditionalGeneration" + ], "vocab_size": 288, - "rope_theta": 10000.0, - "tie_word_embeddings": false, - "max_position_embeddings": 512, - "norm_topk_prob": true, "text_config": { - "model_type": "qwen3_moe", + "model_type": "gemma4_text", "hidden_size": 64, "num_hidden_layers": 2, "intermediate_size": 128, "num_attention_heads": 4, "num_key_value_heads": 2, "head_dim": 16, - "num_experts": 4, - "num_experts_per_tok": 2, - "moe_intermediate_size": 32, - "decoder_sparse_step": 1, - "mlp_only_layers": [], + "global_head_dim": 16, "rms_norm_eps": 1e-06, "vocab_size": 288, + "rope_traditional": false, "rope_theta": 10000.0, - "tie_word_embeddings": false, + "sliding_window": 128, + "sliding_window_pattern": 1, "max_position_embeddings": 512, - "norm_topk_prob": true + "num_kv_shared_layers": 0, + "use_double_wide_mlp": false, + "tie_word_embeddings": true, + "hidden_size_per_layer_input": 32, + "vocab_size_per_layer_input": 16, + "final_logit_softcapping": 30.0, + "attention_k_eq_v": false, + "enable_moe_block": true, + "num_experts": 4, + "top_k_experts": 2, + "moe_intermediate_size": 32 }, "vision_config": { - "model_type": "qwen3_vl", + "model_type": "gemma4_vision", "num_experts": 999 } } \ No newline at end of file diff --git a/tests/fixtures/moe-nested/model.safetensors b/tests/fixtures/moe-nested/model.safetensors index fab58e11ae70d48c6dace62f4aa0911660e19660..984e8d9df21227c59c0b530cd43119dc88b6c9b7 100644 GIT binary patch delta 92456 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

}{&QKO}Cdlp3ZFtYI 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 E2l+tyKL7v# delta 2050 zcmah~O=uHA6lOQE^e5V_+Qd+lv?^FS4KuTw-B~RS)T1D%2vw|7XrOAVRz0k!pq@kp zEdy3>LJp&NklxypAU*cvO+>+i2cZ{#5Sx>4-fa3$Hiu>3_rCAFH*epYEWY3M>i2g0 z#m;H_P}Agv@yh6!yuYJ+`tts1ajf0-h3}ET4Y(M&OM2uV>r@|FfQgc?vB|4rm5JiS z=&j228%0{2oVZr3MAs_UZ-OPi*hTpxy&E*ZCP5IEc%tS+s!x(^t`FHnaOz?1hIvNY zdr^aIB7Ej~33=E`ZOA4eH(AW+K^2`;kijY;Pu)Jn=r~t<^wcn z0+(@d{e})I-{(nf;PvuArRjt*8t|k>xN(7T8p5e9u2N7`il-A?qyNd%UC0Je=$eUaP~e*FLONlg>jj&)Yh$Xog9i*9 zR6)ti_!hb3xAud$Y)AsGpz-?5Ip;czsZk#9=kZ)#{%sj>5J88zVx@LmYAtJrM+v7q zzDLn-`?oA^JzzA-hsLBA?2v0D4kUc tb15)?fw}N81r>a/dev/null; SERVER_PID=""; } +# `kill` only asks. Without waiting for the process to go, the next fixture binds the +# same port while the previous server may still hold it — see the readiness loop below +# for why that is worse than a flake. +cleanup() { + if [ -n "$SERVER_PID" ]; then + kill "$SERVER_PID" 2>/dev/null + wait "$SERVER_PID" 2>/dev/null + fi + SERVER_PID="" +} trap cleanup EXIT run_fixture() { @@ -52,10 +61,14 @@ run_fixture() { "$BINARY" --model "$dir" --port "$PORT" --host "$HOST" > "$logfile" 2>&1 & SERVER_PID=$! + # Liveness is checked *before* the health probe on purpose. The other order lets a + # server that failed to bind (because the previous one still held the port) pass as + # ready on a probe answered by that previous server — the assertions then run + # against the wrong checkpoint and report a false pass rather than a failure. local ready=0 for _ in $(seq 1 60); do - if curl -sf "$url/health" >/dev/null 2>&1; then ready=1; break; fi if ! kill -0 "$SERVER_PID" 2>/dev/null; then break; fi + if curl -sf "$url/health" >/dev/null 2>&1; then ready=1; break; fi sleep 1 done @@ -97,29 +110,36 @@ for name in dense stray-shard kv-shared-absent kv-shared-present moe-nested; do run_fixture "$name" done -# The MoE fixture again, this time with --stream-experts. A model classified dense -# has the flag silently dropped and gets materialised whole, which is how #112 -# reached an OOM kill rather than an error message; asserting the flag was honoured -# is the closest end-to-end check available. -log "Shape: moe-nested (--stream-experts honoured)" +# The MoE fixture again with --stream-experts, to assert the *config-level* gate. +# +# #112: expert counts are spelled and nested differently per family, and a model +# misread as dense had --stream-experts silently dropped and was then materialised +# whole until the OS killed it. The check is that the config gate does not reject — +# not that streaming actually engages. Those are two separate gates: gemma4 passes +# detection but has no StreamableMoE conformance, so the second one legitimately +# declines. Asserting on the first is what tracks #112. +# +# This is a live check rather than a decorative one: `gemma4` contains no "moe", so +# the model_type fallback in modelTypeImpliesMoE cannot rescue it, and the count +# exists only inside text_config. Reverting detection to a top-level single-key form +# makes this fail. +log "Shape: moe-nested (nested expert count is detected)" MOE_LOG="/tmp/SwiftLM-test-fixture-moe-stream.log" "$BINARY" --model "$FIXTURE_DIR/moe-nested" --port "$PORT" --host "$HOST" \ --stream-experts > "$MOE_LOG" 2>&1 & SERVER_PID=$! ready=0 for _ in $(seq 1 60); do - curl -sf "http://$HOST:$PORT/health" >/dev/null 2>&1 && { ready=1; break; } kill -0 "$SERVER_PID" 2>/dev/null || break + curl -sf "http://$HOST:$PORT/health" >/dev/null 2>&1 && { ready=1; break; } sleep 1 done if [ "$ready" -ne 1 ]; then fail "moe-nested did not start with --stream-experts" -elif grep -qi "is not MoE" "$MOE_LOG"; then - fail "moe-nested was classified dense: $(grep -i 'is not MoE' "$MOE_LOG" | head -1)" -elif grep -q "SSD Expert Streaming enabled" "$MOE_LOG"; then - pass "moe-nested detected as MoE, --stream-experts honoured" +elif grep -q "is not MoE" "$MOE_LOG"; then + fail "nested expert count missed: $(grep 'is not MoE' "$MOE_LOG" | head -1)" else - fail "moe-nested: no streaming confirmation in log" + pass "moe-nested: expert count found under text_config, vision decoy ignored" fi cleanup