# LingBot H200 分析计划：完成剩余全部 16 项验收

## Context

Codex 交接时（2026-09-10 06:12 UTC）`analysis/plan_acceptance_audit.json` 的 16 项要求无一完全通过：K0/K1/K2/A0/G0/H0/TAIL/NUM/RAW 部分完成，G1 未通过，H1–H5 未开始，WEB 持续更新。用户决定：**全部 16 项做到通过或以可审计方式闭合**，不设时间盒。

已确认的决策（grilling）：
1. 范围 = 全部 16 项。
2. 源码统一用冻结 Case D（`vllm-omni-uspbench` b9cdea7 + 冻结 diff 99d92c0…）；rebased c59234d 只作诊断，不参与验收。候选优化以补丁形式打在冻结 checkout 上（沿用 `cross_sdpa_flash_patch.py` 模式）。
3. 候选验收口径：数值在 **eager** 模式对 exact 参考按既定门槛判定（latent atol/rtol .03 且相对 L2 ≤ .01；像素 max_abs .03 且 RMSE ≤ .01，见 `scripts/compare_candidate_outputs.py`）；性能 A/B 在 eager 与默认 reduce-overhead 各做一次；最终长尾用生产默认模式。NUM 的编译模式跨启动不重复做有边界诊断（三步单变量控制），定位不到即以"已排除/剩余归因"闭合。
4. H1–H5 完成标准：计划逐条列出的每个候选各拿到一个带 experiment_id 的单变量 A/B 结论（通过 / 局部有效端到端无收益 / 未通过 / incompatible）；需回移植上游代码的候选只给一次有边界的移植尝试。

关键事实：480×832 稳态 14.4 FPS（已 > 12），704×1280 仅 4.89 FPS（差距 2.46×，靠同精度运行时优化不可能补齐，最终以"剩余差距"如实报告）。eager 跨启动逐位一致，默认编译模式不一致。

工作区 R = `/data/zhoutaichang/feature/Lingbot_world_realtime/runs/analysis_report_20260908`，P = `.../Lingbot_world_realtime/live-canvas`。

## 不变约束

- UID 2005 `gpu run --gpus N --wait … --timeout … --note …`，同时 ≤ 4 卡，不 `reserve`。四卡模型任务与单卡 NCU/回放任务不并行超过 4 卡。lzr 目前占 GPU4–7。
- NCU 只走 `run_missing_operator_ncu.py` / `run_capability_attention_ncu.py` 的 L20X-root bootstrap → setpriv UID2005 路线，严格限制在分配卡内。
- 不开子代理；新实验用新目录（`raw/<name>_v<N>/`），不覆盖失败证据；不放宽数值门槛；区分 profiler / 未插桩 / 独立算子 / 整模型时间。
- 进程退出以 `/proc/PID` + 终态 manifest 判定，不按命令名。
- 中文简洁沟通；每个阶段结束刷新报告并发布。

## 阶段 0：交接卫生与报告首页（仅 CPU，先做）

- 重启网页观察进程 `P/scripts/observe-evidence.py`（交接时 SIGTERM 的 1489129）。
- 新增 `scripts/build_front_summary.py`：生成报告首页摘要（16 项状态表 + 每项证据链接 + 已知负结果清单），插入 `build_evening_report.py` 的 `current_summary` 之前。REPORT_CN.md 已 160 KB，只加摘要不删历史。
- 把本计划写入 `R/plan/completion_plan_20260910.md` 并发布，作为后续每阶段的对照。

## 阶段 1：K0/K1/K2 —— 单次运行完整账本与全模型 MFU（硬门槛）

现状缺口：旧 nsys（109 万 kernel）与逐调用元数据来自不同运行，逐层映射与全模型 MFU 缺失。

1. 新脚本 `scripts/run_ledger_capture_v1.py`（沿用 `run_nsys_worker_flush_diagnostic.py` 的 overlay-patch 模式）：同一次 nsys 运行中，用 NVTX range 标注 request/chunk/step/stage/layer/rank，并在 worker 里同时装 `operator_metadata_capture.py` 的 TorchDispatchMode 记录每次 ATen 调用（shape/dtype/stride/layout + NVTX 上下文 id）。480×832 与 704×1280 各 1 次四卡运行，2 epoch，`--profile-mode nsys`。这是诊断采集，与干净计时分开。
2. 新脚本 `scripts/build_kernel_ledger_v1.py`：从 nsys SQLite 导出 `kernel_invocations.jsonl`（每次调用：名称、时长、stream、rank、物理 GPU UUID、NVTX 祖先链、对应 ATen 调用签名）、`kernel_groups.csv`（名称+shape+dtype+layout+阶段+backend+并行上下文分组）、`coverage.json`（调用数/GPU 时间/组覆盖，unknown 单列）。复用 `link_nsys_runtime.py`、`summarize_kernel_families.py`、`match_operator_launch_signatures.py`。
3. 关键路径与阶段 exclusive/inclusive 时间（K0）：复用 `analyze_worker_chunk_activity.py`、`analyze_worker_longest_gaps.py` 输出，补 CPU 因果链（osrt trace 中的 wait/IPC 事件与 chunk 边界关联）。
4. K2 逐组硬件归因：对新账本中每个 signature 组，若已有 59 个代表输入/183 kernel 的 NCU 可按签名匹配则复用（`audit_operator_replay_signature_coverage_v2.py`），否则新增代表输入采集（`missing_operator_capture.py` → `run_missing_operator_ncu_batch.py`，单卡串行）。每组产出 `bottlenecks.json` 条目：主/次瓶颈、计数器证据、替代解释、上限区间、unresolved 原因。
5. 全模型 MFU：模型有效 FLOPs（扩展 `summarize_recorded_model_mac_work.py` 到全部算子族，不只所选算子）÷（端到端 GPU 时间 × H200 BF16 dense 规格峰值）；另列本机校准上限（`same_gpu_reference.json`，仅同卡数据）。Roofline 散点用 `build_graph_points.py` 生成。
6. 验收：每次调用可定位到 NVTX 上下文；每组有归因或明确 unresolved；K0/K1/K2 三项在 `build_plan_acceptance_audit.py` 中更新证据。

GPU：2 × 四卡 ≈ 1 h 各；NCU 补采单卡 ≈ 10–20 h 串行（可 3 单卡并行）。

## 阶段 2：NUM —— 编译模式不重复的有边界诊断

复用 `run_execution_control.py`（`--execution-mode`）与 `compare_execution_control_outputs.py`，每步各 2 次启动 × 2 epoch，四卡：
1. `LINGBOT_COMPILE_MODE=default`（compile 无 CUDA Graph）→ 是否重复。
2. 固定 `CUBLAS_WORKSPACE_CONFIG=:4096:8`、`torch.backends.cudnn.benchmark=False`、`use_deterministic_algorithms` 可用子集 → 是否重复。
3. 若仍不重复：沿用 `rng_diagnostic_hook_v6.py` 模式做逐层首次分歧定位（保存每层 chunk0 step0 输出 hash）。
产出 `analysis/compile_repeatability_bisect_v1.json`。三步后未定位则写"已排除 X/Y，剩余归因 Z，unresolved"。GPU ≈ 6 × 四卡 × 20 min。

## 阶段 3：H4 —— 输出与传输（已有局部正结果，最先能闭合）

1. 整模型单变量 A/B：`scripts/run_output_fusion_model_ab_v1.py`（沿 `run_cross_sdpa_model_ab_v2.py` 结构）：eager 参考 → 融合候选（把 `output_conversion_ab_v1.py` 的 Triton kernel 以补丁装入 worker 的 uint8 转换路径），同四卡；40 输出要求 exact（融合是位精确的，门槛为 exact 而非容差）；每个计时样本保存完整输出。再做默认编译模式性能 A/B 与 704×1280。
2. pinned D2H + staging buffer 复用：单变量补丁，计入分配、生命周期与消费者等待成本；同上 A/B。
3. 像素 IPC / 编码 / 真正交付：扩展 `run_lossless_media_roundtrip_v1.py` 为服务内实测（rank0 uint8 → 跨进程接收 → FFV1 编码完成），分别计 GPU-ready / CPU-ready / 接收 / 编码完成四个时间戳。
产出 `analysis/h4_*_audit_v1.json`，更新 `optimization_transfer_matrix.json` 的 H4 条目。

## 阶段 4：A0/G0 收尾

- A0：补 Attention MFU–Shape 曲线、最快后端热力图、相对加速热力图（数据已在 `attention_graph_points.csv`、`fa3_interface_dispatch_comparison.json`；扩展 `plot_attention*.py`）。MFU 分母用规格峰值 + 同卡校准两条线。
- G0：GEMM M/N/K、卷积尺寸/通道、elementwise 元素数、copy/NCCL 字节四类 Shape 曲线；NCCL 组从阶段 1 账本取消息大小与暴露时间。完整 Roofline（DRAM 与 L2 分层标注）。
- 仅 CPU + 少量单卡回放。

## 阶段 5：H1 / H2 / H3 / H5 单变量消融

每个候选：补丁文件 `scripts/patches/h<N>_<name>_patch.py` → 局部数值审核（真实捕获输入 + FP64 抽样，沿 `audit_cross_sdpa_flash_impl.py`）→ 整模型 eager A/B（40 输出门槛）→ 通过者做默认模式性能 A/B → 通过者做 704。每个候选一个 experiment_id 写入 `optimization_transfer_matrix.json`。

- **H1**（触发条件：阶段 1 账本显示 gather/pack/all-to-all 组暴露时间）：(a) 只换 self-attention 后端（直接 paged vs gather+FA varlen）；(b) 只减重排（QKV 交换后省 contiguous/transpose）；(c) 只换 transport：Fast Ulysses #6340 SymmMem 路径回移植尝试一次，冻结 checkout 不含即 incompatible；(d) 合并胜出项。测量有效/padding FLOPs、gather 字节、NCCL payload、rank skew。
- **H2**：先在默认编译模式下核对 torch.compile 已融合的 Norm/RoPE/modulation/residual（账本中 Triton fused kernel 名）；只对未融合邻接对做单个 Triton 融合候选；rank-local embedding/RoPE 构造先证明分片数学等价再实验。记录 launch 数、DRAM 字节、寄存器/spill、occupancy。
- **H3**：以同一组保存 latent 对照串行参考与 Case D 四 rank 分片，逐块列卷积/Norm/上采样/激活/halo/gather/layout/alloc（`analyze_vae_components_704.py` 已有分拆）；候选：编译/融合、去重复 cast/contiguous、halo 打包、缓冲复用；两个 channels-last 已知为负结果保留。FP32 语义不变。
- **H5**：先保存串行基线；单对重叠 decode‖D2H、D2H‖IPC/encode，再组合；实现 chunk_id/CUDA event/buffer owner/有限队列/背压；测试慢消费者、取消、错误退出、末块 flush、帧丢失/重复；用 nsys 显示真实 overlap 与 SM/copy engine 争用；TTFC、P95/P99、rollout FPS 分别报告。

GPU：每个整模型 A/B ≈ 1 h 四卡；预计 15–20 个候选 → 20–30 h 四卡串行。

## 阶段 6：G1 集成与 TAIL 最终验收（同时闭合 RAW 缺口）

1. 通过的单项按关键路径收益排序组合，检查输出、显存峰值、各 rank 时间、背压与取消。
2. 最终配置与原始参考：两分辨率 × 3 次独立启动 × 1 warmup + 250 session（≥1000 稳态间隔），默认模式，**每次保存全部 250 session 完整输出**（修改 `run_tail_baseline.py` 的保存策略；预计 ≈ 400 GB，/data 剩 112 TB）。复用 `audit_completed_tail_runs.py`、`tail_block_sensitivity.py` 做 P99 块敏感性。
3. 报告 FPS>12 的可验证配置（480）与 704 的剩余差距倍数。

GPU：6–12 × 四卡 × 50–100 min。

## 阶段 7：RAW / WEB 收尾与发布

- `index_raw_data.py`、`index_derived_data.py`、`package_analysis_snapshot.py`；更新 `REPRODUCE_CN.md`；`build_plan_acceptance_audit.py` 逐项更新证据与时间戳（16 项每项写"通过"或"有边界闭合 + 原因"）。
- `build_evening_report.py` → `bash P/scripts/publish-evidence.sh`；新 JSON/PNG/SVG 手工 SCP 到 `Personal-Agent:/home/ubuntu/world-model/public`，urllib + SHA 核验。
- 每个阶段结束都执行一次本步骤（不是只在最后）。

## 顺序与并行

阶段 0 → 1（四卡采集 2 次，之后 NCU 单卡批与阶段 2/3 的四卡任务交替，总占用 ≤ 4 卡）→ 2 → 3 → 4（CPU，可与 GPU 任务并行）→ 5 → 6 → 7。四卡任务用 `--wait` 排队，不抢占 lzr。

## 验证

- 每个新脚本先在 CPU/单卡小输入自检（`validate_capture.py` 模式），再提交四卡。
- 每个实验目录有 `manifest.json` 终态（status ≠ running）、命令、分配卡 UUID、源码 SHA、输入 hash。
- 每个"更快"结论同时给出：数值门槛结果、局部收益、eager 与默认模式端到端收益、样本数与置信区间。
- 最终 `plan_acceptance_audit.json` 的 `full_plan_complete` 只在 16 项全部为"通过"或"有边界闭合"且证据时间戳晚于本计划时才置 true；网页发布后 HTTP 拉回比较 SHA。
