From 5927b6bfc31b122652429484944377ac65c25148 Mon Sep 17 00:00:00 2001 From: Gahow Wang Date: Sun, 19 Jul 2026 18:31:47 +0800 Subject: [PATCH] Add Qwen235 state replay diagnosis --- ...xed-pd-state-matched-diagnosis-20260719.md | 45 +++ ...ot_qwen235_state_matched_diagnosis_mock.py | 43 +++ .../qwen235-state-matched-diagnosis-mock.png | Bin 0 -> 96149 bytes .../run_qwen235_fixed_pd_state_replay.py | 336 ++++++++++++++++++ .../test_fidelity_envelope.py | 52 +++ 5 files changed, 476 insertions(+) create mode 100644 .research/experiments/qwen235-fixed-pd-state-matched-diagnosis-20260719.md create mode 100644 runs/frontier-fidelity-envelope-v1/plot_qwen235_state_matched_diagnosis_mock.py create mode 100644 runs/frontier-fidelity-envelope-v1/qwen235-state-matched-diagnosis-mock.png create mode 100644 runs/frontier-fidelity-envelope-v1/run_qwen235_fixed_pd_state_replay.py diff --git a/.research/experiments/qwen235-fixed-pd-state-matched-diagnosis-20260719.md b/.research/experiments/qwen235-fixed-pd-state-matched-diagnosis-20260719.md new file mode 100644 index 0000000..fd45f4a --- /dev/null +++ b/.research/experiments/qwen235-fixed-pd-state-matched-diagnosis-20260719.md @@ -0,0 +1,45 @@ +# 实验:Qwen235 Fixed-PD state-matched decode diagnosis + +> **状态:** 已批准,执行中 +> +> 本 card 记录 Qwen235 Fixed-PD 在真实 collective profile 后仍保留 30%+ selection regret 的下一层判因实验。 + +## Claim 与决策 + +- **Parent claim:** Qwen235 Fixed-PD 的错误排序来自 action-conditioned decode residual,而不是缺失的 TP8 all-reduce profile。 +- **目的:** 区分 simulator 错在 state distribution,还是相同 state 下的 conditional execution-time composition。 +- **Competing hypotheses:** H1:Frontier 生成的 decode batch/context/graph state 与真机不同;H2:state 对齐后 Frontier 仍把 TP8/EP8 预测得更快,误差位于 MoE/EP、graph 或 attention 的 conditional stage model。 +- **事前预测:** 真机 config contrast 为 `TP8-TP4=+6.95 ms/token`,A1 simulator 为 `-20.07 ms/token`。若 H1 成立,用真实 state 重加权后 contrast 应翻正;若 H2 成立,matched-state contrast 仍为负。 +- **判定规则:** 先比较 frozen-real coarse state 与 full-ledger Frontier state。state 明显不匹配则补 iteration telemetry;state 支持重叠且 matched-state predictor 仍反序,才进入 stage breakdown。任何 stage 只有在 measured substitution 能使 winner 翻转时才称为 decision-bearing root cause。 + +## Setup + +- **自变量:** state source(frozen real / Frontier);后续 matched-state replay 中固定 decode batch、context-length、graph bucket 与 routing load。 +- **控制变量:** Qwen235 FP8、vLLM 0.20.0、H20、Fixed-PD 4096→256、0.2 req/s/GPU、MBT8192、MNS64、TP4/EP1 与 TP8/EP8、Frontier commit、r2 operator profiles、A1 measured collective CSV 全部冻结。 +- **选择 MNS64:** A1 中 MNS64/128 的 TTFT/TPOT/E2E 完全相同;先去掉不提供判别力的重复维度。 +- **第一阶段:** CPU-only 重放原 A1 commands,只打开 `frontier_stage_batch_ledger` 与 individual batch metrics;验证 request metrics 与原 A1 bitwise/score 等价。真机先复用 3 次 frozen server logs 的 10 秒 Running/Waiting/KV samples,明确标为 coarse proxy,不冒充 per-iteration batch。 +- **第二阶段触发条件:** coarse proxy 不足以判断或 state mismatch 显著时,短窗口重跑真机并采集 per-iteration `decode_batch_size/context_length_hist/cudagraph bucket`;否则进入 matched-state whole-decode-step。 +- **Metrics:** decode batch/token distribution、prefill fraction、scheduler steps/s、graph bucket/padding、queue/KV proxy;configuration contrast `TP8-TP4`;stage measured-substitution 后的 winner。 + +## 预期产物与 review + +- **预期数据:** 两个 Frontier full-ledger replays;三次真机日志的 coarse state summary;state overlap/reweighting verdict;必要时的 short-window iteration telemetry。 +- **Figure prototype:** `../../runs/frontier-fidelity-envelope-v1/qwen235-state-matched-diagnosis-mock.png`。左图对比 real/sim state;右图展示 H1 与 H2 下 matched-state contrast 的可区分方向。全部数值标为 schematic/mock。 +- **人工 review:** 已批准(用户在分析方案后要求“推进”)。 +- **Review 意见:** 先做最便宜的 state audit,不直接启动完整 Nsight sweep;每一步只在能改变下一决策时升级证据成本。 + +## 复现信息 + +- **Code:** AITuner `feature/sim`;运行 commit 待冻结。Frontier `6e8e0d845bceff11b0b62cb29df3a1a93411fdd4`。 +- **Environment:** dash0;Frontier replay CPU-only;后续真机才使用 4/8×H20。 +- **输入:** `/home/admin/cpfs/wjh/aituner/qwen235-collective-profile-ablation-20260719-r1/sim/fixed-pd` 与 frozen real campaign `/home/admin/cpfs/wjh/aituner/qwen235-v020-fourcase-20260719-r1/real/fixed-pd`。 +- **产物路径:** `/home/admin/cpfs/wjh/aituner/qwen235-fixed-pd-state-diagnosis-20260719-r1`。 +- **已知 deviation:** frozen real logs 的 Running 指标是 10 秒采样的 active-request proxy,不是 scheduler iteration ledger;不能单独支持 matched-state causal claim。 + +## 结果 + +- **观察事实:** 待运行。 +- **异常:** 待运行。 +- **含义:** 待运行。 +- **Claim update:** unchanged +- **下一步:** 运行两项 CPU state replay 与 coarse real-state analysis。 diff --git a/runs/frontier-fidelity-envelope-v1/plot_qwen235_state_matched_diagnosis_mock.py b/runs/frontier-fidelity-envelope-v1/plot_qwen235_state_matched_diagnosis_mock.py new file mode 100644 index 0000000..39300ad --- /dev/null +++ b/runs/frontier-fidelity-envelope-v1/plot_qwen235_state_matched_diagnosis_mock.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python3 +"""Render the reviewed schematic for Qwen235 state-matched diagnosis.""" + +from pathlib import Path + +import matplotlib.pyplot as plt +import numpy as np + + +OUTPUT = Path(__file__).with_name("qwen235-state-matched-diagnosis-mock.png") + + +def main() -> None: + figure, axes = plt.subplots(1, 2, figsize=(11.2, 4.4)) + + labels = ["TP4/EP1", "TP8/EP8"] + x = np.arange(2) + width = 0.34 + axes[0].bar(x - width / 2, [5, 12], width, label="Real proxy (mock)") + axes[0].bar(x + width / 2, [8, 8], width, label="Frontier ledger (mock)") + axes[0].set_xticks(x, labels) + axes[0].set_ylabel("Active decode requests / iteration") + axes[0].set_title("(a) Does Frontier reproduce real state?") + axes[0].legend(frameon=False) + + scenarios = ["Observed\nA1", "Matched state\nif H1", "Matched state\nif H2", "Real"] + contrasts = [-20.07, 4.0, -18.0, 6.95] + colors = ["#d95f02", "#1b9e77", "#d95f02", "#1b9e77"] + axes[1].bar(np.arange(4), contrasts, color=colors) + axes[1].axhline(0, color="black", linewidth=0.9) + axes[1].set_xticks(np.arange(4), scenarios) + axes[1].set_ylabel("TP8 - TP4 TPOT (ms/token)") + axes[1].set_title("(b) State mismatch or execution model?") + axes[1].text(0.02, 0.97, "SCHEMATIC / MOCK DATA", transform=axes[1].transAxes, + va="top", fontsize=9, color="#8c2d04") + + figure.suptitle("Qwen235 Fixed-PD state-matched diagnosis", fontsize=13) + figure.tight_layout() + figure.savefig(OUTPUT, dpi=180, bbox_inches="tight") + + +if __name__ == "__main__": + main() diff --git a/runs/frontier-fidelity-envelope-v1/qwen235-state-matched-diagnosis-mock.png b/runs/frontier-fidelity-envelope-v1/qwen235-state-matched-diagnosis-mock.png new file mode 100644 index 0000000000000000000000000000000000000000..bed9a021d7c67268402021afab6fc73a59fe42ef GIT binary patch literal 96149 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 literal 0 HcmV?d00001 diff --git a/runs/frontier-fidelity-envelope-v1/run_qwen235_fixed_pd_state_replay.py b/runs/frontier-fidelity-envelope-v1/run_qwen235_fixed_pd_state_replay.py new file mode 100644 index 0000000..995b185 --- /dev/null +++ b/runs/frontier-fidelity-envelope-v1/run_qwen235_fixed_pd_state_replay.py @@ -0,0 +1,336 @@ +#!/usr/bin/env python3 +"""Replay the two Qwen235 Fixed-PD A1 cells with Frontier state outputs. + +The frozen command is the experimental input. This runner changes only the +metrics output/run id and the two existing state-observation flags, then checks +that request-level scorer inputs are byte-identical to the frozen A1 run. +""" + +from __future__ import annotations + +import argparse +import hashlib +import importlib.util +import json +import os +import subprocess +import sys +import time +from pathlib import Path +from typing import Any + + +HERE = Path(__file__).resolve().parent +REPO_ROOT = HERE.parents[1] +TELEMETRY_ROOT = REPO_ROOT / "runs/telemetry-residual" +sys.path.insert(0, str(TELEMETRY_ROOT)) + +from common_state import summarize_frontier # noqa: E402 +from run_frontier_state import enable_state_outputs, find_state_metrics # noqa: E402 + + +CONFIGS = ("tp4_ep1_mns64", "tp8_ep8_mns64") +ALLOWED_FLAG_CHANGES = { + "--metrics_config_output_dir", + "--metrics_config_run_id", + "--no-metrics_config_store_frontier_stage_batch_ledger", + "--metrics_config_store_frontier_stage_batch_ledger", + "--no-metrics_config_keep_individual_batch_metrics", + "--metrics_config_keep_individual_batch_metrics", +} + + +def load_module(name: str, path: Path): + spec = importlib.util.spec_from_file_location(name, path) + if spec is None or spec.loader is None: + raise ImportError(path) + module = importlib.util.module_from_spec(spec) + sys.modules[spec.name] = module + spec.loader.exec_module(module) + return module + + +def sha256_file(path: Path) -> str: + digest = hashlib.sha256() + with path.open("rb") as source: + for chunk in iter(lambda: source.read(1 << 20), b""): + digest.update(chunk) + return digest.hexdigest() + + +def atomic_json(path: Path, payload: Any) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + temporary = path.with_suffix(path.suffix + ".tmp") + temporary.write_text(json.dumps(payload, indent=2, sort_keys=True) + "\n") + os.replace(temporary, path) + + +def replace_option(command: list[str], option: str, value: str) -> list[str]: + result = list(command) + if result.count(option) != 1: + raise ValueError(f"expected exactly one {option}, found {result.count(option)}") + index = result.index(option) + if index + 1 >= len(result) or result[index + 1].startswith("--"): + raise ValueError(f"{option} has no value") + result[index + 1] = value + return result + + +def option_value(command: list[str], option: str) -> str: + if command.count(option) != 1: + raise ValueError(f"expected exactly one {option}, found {command.count(option)}") + return command[command.index(option) + 1] + + +def _semantic_options(command: list[str]) -> dict[str, tuple[str, ...]]: + """Parse CLI tokens sufficiently to audit this controlled command edit.""" + + result: dict[str, tuple[str, ...]] = {} + index = 0 + while index < len(command): + token = command[index] + if not token.startswith("--"): + index += 1 + continue + values: list[str] = [] + index += 1 + while index < len(command) and not command[index].startswith("--"): + values.append(command[index]) + index += 1 + if token in result: + raise ValueError(f"duplicate option in frozen command: {token}") + result[token] = tuple(values) + return result + + +def transform_command( + command: list[str], *, metrics_root: Path, run_id: str +) -> list[str]: + result = replace_option( + command, "--metrics_config_output_dir", str(metrics_root.resolve()) + ) + result = replace_option(result, "--metrics_config_run_id", run_id) + result = enable_state_outputs(result) + + before = _semantic_options(command) + after = _semantic_options(result) + changed = { + option + for option in set(before) | set(after) + if before.get(option) != after.get(option) + } + if not changed <= ALLOWED_FLAG_CHANGES: + raise ValueError(f"unapproved command changes: {sorted(changed - ALLOWED_FLAG_CHANGES)}") + required = { + "--metrics_config_output_dir", + "--metrics_config_run_id", + "--no-metrics_config_store_frontier_stage_batch_ledger", + "--metrics_config_store_frontier_stage_batch_ledger", + "--metrics_config_keep_individual_batch_metrics", + } + if not required <= changed: + raise ValueError(f"required controlled changes missing: {sorted(required - changed)}") + return result + + +def environment(frontier_source: Path, python_deps: Path) -> dict[str, str]: + result = os.environ.copy() + result.update( + { + "PYTHONPATH": ":".join([str(python_deps), str(frontier_source)]), + "CUDA_VISIBLE_DEVICES": "", + "NVIDIA_VISIBLE_DEVICES": "void", + "WANDB_DISABLED": "true", + "VIDUR_DISABLE_WANDB": "1", + "FRONTIER_LOG_LEVEL": "WARNING", + "PYTHONDONTWRITEBYTECODE": "1", + } + ) + return result + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser() + parser.add_argument("--base-sim-root", type=Path, required=True) + parser.add_argument("--output-root", type=Path, required=True) + parser.add_argument("--frontier-source", type=Path, required=True) + parser.add_argument("--python-deps", type=Path, required=True) + parser.add_argument("--config", action="append", choices=CONFIGS) + parser.add_argument("--timeout-seconds", type=float, default=1200) + parser.add_argument("--resume", action="store_true") + return parser.parse_args() + + +def run_cell( + *, + config: str, + base_sim_root: Path, + output_root: Path, + frontier_source: Path, + python_deps: Path, + timeout_seconds: float, + resume: bool, + q30: Any, +) -> dict[str, Any]: + base_run = base_sim_root / "runs" / config / "eval" + base_command_path = base_run / "command.json" + base_result_path = base_run / "result.json" + if not base_command_path.is_file() or not base_result_path.is_file(): + raise FileNotFoundError(f"frozen A1 inputs missing under {base_run}") + base_command = json.loads(base_command_path.read_text()) + base_result = json.loads(base_result_path.read_text()) + if base_result.get("status") != "completed": + raise ValueError(f"frozen A1 result is not completed: {base_result_path}") + + run_root = output_root / config + result_path = run_root / "result.json" + if resume and result_path.is_file(): + previous = json.loads(result_path.read_text()) + if ( + previous.get("status") == "PASS" + and previous.get("inputs", {}).get("base_command_sha256") + == sha256_file(base_command_path) + and previous.get("inputs", {}).get("base_result_sha256") + == sha256_file(base_result_path) + ): + return previous + if run_root.exists() and any(run_root.iterdir()): + raise FileExistsError(f"refusing non-empty output: {run_root}") + run_root.mkdir(parents=True, exist_ok=True) + + command = transform_command( + base_command, + metrics_root=run_root / "frontier_metrics", + run_id=f"qwen235_fixed_pd_state_{config}", + ) + atomic_json(run_root / "command.json", command) + manifest = { + "schema": "qwen235-fixed-pd-state-replay-v1", + "config": config, + "inputs": { + "base_run": str(base_run.resolve()), + "base_command_sha256": sha256_file(base_command_path), + "base_result_sha256": sha256_file(base_result_path), + "base_request_metrics_sha256": base_result["request_metrics_sha256"], + }, + "controlled_changes": [ + "metrics output directory", + "metrics run id", + "full Frontier stage/batch ledger enabled", + "individual batch metrics enabled", + ], + "command_sha256": sha256_file(run_root / "command.json"), + "frontier": { + "source": str(frontier_source), + "git_head": subprocess.check_output( + ["git", "-C", str(frontier_source), "rev-parse", "HEAD"], text=True + ).strip(), + }, + "environment": { + "PYTHONPATH": ":".join([str(python_deps), str(frontier_source)]), + "CUDA_VISIBLE_DEVICES": "", + "NVIDIA_VISIBLE_DEVICES": "void", + "FRONTIER_LOG_LEVEL": "WARNING", + }, + } + atomic_json(run_root / "run_manifest.json", manifest) + + started = time.monotonic() + with (run_root / "stdout.log").open("w") as stdout, ( + run_root / "stderr.log" + ).open("w") as stderr: + try: + completed = subprocess.run( + command, + cwd=frontier_source, + env=environment(frontier_source, python_deps), + stdout=stdout, + stderr=stderr, + timeout=timeout_seconds, + check=False, + ) + returncode = int(completed.returncode) + except subprocess.TimeoutExpired: + returncode = 124 + elapsed_seconds = time.monotonic() - started + if returncode != 0: + failure = { + "status": "STOP", + "config": config, + "returncode": returncode, + "elapsed_seconds": elapsed_seconds, + } + atomic_json(run_root / "failure.json", failure) + raise RuntimeError(f"state replay failed: {failure}") + + fallback_evidence = q30.collective_fallback_evidence(run_root) + if fallback_evidence: + raise RuntimeError(f"collective-profile fallback detected: {fallback_evidence}") + paths = find_state_metrics(run_root) + request_metrics_sha256 = sha256_file(paths["requests"]) + scorer_equivalent = request_metrics_sha256 == base_result["request_metrics_sha256"] + if not scorer_equivalent: + raise RuntimeError( + f"observation changed scorer input for {config}: " + f"{request_metrics_sha256} != {base_result['request_metrics_sha256']}" + ) + state = summarize_frontier( + system_metrics_path=paths["system"], + request_metrics_path=paths["requests"], + batch_metrics_path=paths["batches"], + ledger_path=paths["ledger"], + ) + atomic_json(run_root / "common-state.json", state) + result = { + "schema": "qwen235-fixed-pd-state-replay-result-v1", + "status": "PASS", + "config": config, + "elapsed_seconds": elapsed_seconds, + "returncode": returncode, + "inputs": manifest["inputs"], + "scorer_equivalence": { + "request_metrics_byte_identical": scorer_equivalent, + "request_metrics_sha256": request_metrics_sha256, + "base_metrics": base_result["metrics"], + }, + "state_artifacts": { + name: {"path": str(path.resolve()), "sha256": sha256_file(path)} + for name, path in paths.items() + }, + "common_state": state, + "collective_fallback_evidence": fallback_evidence, + } + atomic_json(result_path, result) + return result + + +def main() -> None: + args = parse_args() + for name in ("base_sim_root", "output_root", "frontier_source", "python_deps"): + setattr(args, name, getattr(args, name).resolve()) + selected = tuple(args.config or CONFIGS) + q30 = load_module("q235_state_q30", HERE / "run_frontier_qwen30_exact_trace_surface.py") + results = [] + for config in selected: + result = run_cell( + config=config, + base_sim_root=args.base_sim_root, + output_root=args.output_root, + frontier_source=args.frontier_source, + python_deps=args.python_deps, + timeout_seconds=args.timeout_seconds, + resume=args.resume, + q30=q30, + ) + results.append(result) + print(json.dumps({"config": config, "status": result["status"]}), flush=True) + aggregate = { + "schema": "qwen235-fixed-pd-state-replay-aggregate-v1", + "status": "PASS" if all(result["status"] == "PASS" for result in results) else "STOP", + "results": results, + } + atomic_json(args.output_root / "state_replay.json", aggregate) + + +if __name__ == "__main__": + main() diff --git a/runs/frontier-fidelity-envelope-v1/test_fidelity_envelope.py b/runs/frontier-fidelity-envelope-v1/test_fidelity_envelope.py index 0c4c298..d045f95 100644 --- a/runs/frontier-fidelity-envelope-v1/test_fidelity_envelope.py +++ b/runs/frontier-fidelity-envelope-v1/test_fidelity_envelope.py @@ -135,6 +135,58 @@ class FidelityEnvelopeTest(unittest.TestCase): self.assertEqual(len(evidence), 1) self.assertEqual(evidence[0]["log"], "stdout.log") + def test_qwen235_state_replay_changes_observation_flags_only(self) -> None: + module = load("run_qwen235_fixed_pd_state_replay.py") + base = [ + "/usr/bin/python3", + "-m", + "frontier.main", + "--metrics_config_output_dir", + "/frozen/metrics", + "--metrics_config_run_id", + "frozen", + "--no-metrics_config_store_frontier_stage_batch_ledger", + "--attn_tensor_parallel_size", + "8", + "--moe_expert_parallel_size", + "8", + "--communication_collective_profile_path", + "/profiles/real-allreduce.csv", + ] + transformed = module.transform_command( + base, metrics_root=Path("/new/metrics"), run_id="state-run" + ) + self.assertEqual( + module.option_value(transformed, "--attn_tensor_parallel_size"), "8" + ) + self.assertEqual( + module.option_value(transformed, "--communication_collective_profile_path"), + "/profiles/real-allreduce.csv", + ) + self.assertIn( + "--metrics_config_store_frontier_stage_batch_ledger", transformed + ) + self.assertIn("--metrics_config_keep_individual_batch_metrics", transformed) + self.assertNotIn( + "--no-metrics_config_store_frontier_stage_batch_ledger", transformed + ) + + def test_qwen235_state_replay_rejects_implicit_ledger_base(self) -> None: + module = load("run_qwen235_fixed_pd_state_replay.py") + base = [ + "/usr/bin/python3", + "-m", + "frontier.main", + "--metrics_config_output_dir", + "/frozen/metrics", + "--metrics_config_run_id", + "frozen", + ] + with self.assertRaisesRegex(ValueError, "explicitly disable one full Frontier ledger"): + module.transform_command( + base, metrics_root=Path("/new/metrics"), run_id="state-run" + ) + def test_materialize_qwen235_allreduce_requires_serving_contract(self) -> None: module = load("materialize_qwen235_v020_allreduce.py") with tempfile.TemporaryDirectory() as temporary: