diff --git a/README.md b/README.md
index 5e3cca4..41967e1 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,9 @@
# sskj — 多平台大模型推理性能基准测试项目
+> **更新(2026-07-31 16:46:05 CST)**
+>
+> 统一 DeepSeek-V4-Pro 推理优化档案命名与导航:Phase 1/2 实验页分别更名为 `phase1_exp.html`、`phase2_exp.html`,代码页保持 `phase1_code.html`、`phase2_code.html`。主计划中的入口统一为“打开 Phase N 实验档案 / 代码详解”,并为实验页与代码页补齐双向链接。Phase 1 状态同步为固定点 11/11、混合 A/B 3/3、阶段总结果 14/14。
+>
> **更新(2026-07-31 16:27:58 CST)**
>
> 完成 Phase 2 Worker 通信代码分发的双节点真机 smoke test。Run `dsv4pro-phase2-stage-smoke-20260731-162326` 依次通过 Head/Worker P2P、两组单机 8-rank AllReduce 和一组双机 16-rank AllReduce,全部 `wrong_values=0`。两节点暂存文件 SHA256 一致;结束后 `/tmp` 暂存、通信容器和 GPU 进程均已清理。本次使用 1 MiB、单次迭代,仅验证执行链路,不作为正式性能数据。
diff --git a/docs/dsv4pro_pro6000d_2node_sglang/phase1_code.html b/docs/dsv4pro_pro6000d_2node_sglang/phase1_code.html
index 5f4e157..6d60e26 100644
--- a/docs/dsv4pro_pro6000d_2node_sglang/phase1_code.html
+++ b/docs/dsv4pro_pro6000d_2node_sglang/phase1_code.html
@@ -134,6 +134,10 @@
+
+ 返回推理优化主计划 ·
+ 打开 Phase 1 实验档案
+
文档边界:这是一份独立代码档案,只解释 Phase 1 实现,不承担阶段结论展示。
下文的行号均绑定提交
ca1f2f63375c。代码变更后应先更新基线提交,再重新核对行号。
diff --git a/docs/dsv4pro_pro6000d_2node_sglang/phase1_dsv4pro_pro6000d_2node_sglang_quick_map.html b/docs/dsv4pro_pro6000d_2node_sglang/phase1_exp.html
similarity index 69%
rename from docs/dsv4pro_pro6000d_2node_sglang/phase1_dsv4pro_pro6000d_2node_sglang_quick_map.html
rename to docs/dsv4pro_pro6000d_2node_sglang/phase1_exp.html
index d12d64d..baab43d 100644
--- a/docs/dsv4pro_pro6000d_2node_sglang/phase1_dsv4pro_pro6000d_2node_sglang_quick_map.html
+++ b/docs/dsv4pro_pro6000d_2node_sglang/phase1_exp.html
@@ -234,19 +234,23 @@
节点:174.1.51.5 + 174.1.51.7
拓扑:SGLang TP16 / EP2
- 更新:2026-07-30 22:55:37 CST
+ 更新:2026-07-31 16:46:05 CST
返回推理优化主计划
+ 打开 Phase 1 代码详解
阶段状态:已完成。
正式 Run dsv4pro-phase1-full-20260730-220916 在双 Rail
NET/IB + GDRDMA 下完成 9 个固定点和 3 个混合 A/B 结果,
- 共 12/12 成功,用时 28 分 36 秒;服务、容器与 16 张 GPU 已清理。
+ 共 12/12 成功,用时 28 分 36 秒。补充 Run
+ dsv4pro-phase1-long-decode-20260730-234236 完成长输出与
+ 长上下文 Decode 2/2。两个 Run 合计 11 个固定点和 3 个混合结果,
+ 14/14 成功;服务、容器与 16 张 GPU 已清理。
1. 目标与边界
@@ -287,7 +291,7 @@ dsv4pro_pro6000d_2node_sglang_tp16_quick_map/
quick_map_scenarios.tsv |
- 九个固定工作负载点 |
+ 十一个固定工作负载点 |
quick_map_results.py |
@@ -392,13 +396,16 @@ bash run_quick_map.sh stop
decode_throughput_1k_to_1k_c16 | 1K | 1K | 16 | Decode 吞吐 |
decode_throughput_1k_to_1k_c32 | 1K | 1K | 32 | Decode 吞吐 |
decode_throughput_1k_to_1k_c64 | 1K | 1K | 64 | Decode 高并发 |
+ long_output_decode_1k_to_4k_c16 | 1K | 4K | 16 | 持续 Decode 与 KV 增长 |
+ long_context_decode_128k_to_1k_c1 | 128K | 1K | 1 | 长上下文上的 Decode 成本 |
balanced_32k_to_1k_c8 | 32K | 1K | 8 | 综合压力 |
快速 Run 使用一次重复和一波测量请求,即 num_prompts=C。
- 32K/128K Prefill 不做昂贵的同形状 Warm-up;短 Prefill 与 Decode 使用一个
- Warm-up,并在正式计时前清空 Prefix Cache。固定矩阵不做 SLO 截断或自适应并发搜索。
+ 32K/128K Prefill 与 128K 长上下文 Decode 不做昂贵的同形状 Warm-up;
+ 短 Prefill、普通 Decode 与 1K → 4K 长输出 Decode 使用一个 Warm-up,
+ 并在正式计时前清空 Prefix Cache。固定矩阵不做 SLO 截断或自适应并发搜索。
5. SGLang Benchmark 与 Prefix Cache
@@ -534,13 +541,14 @@ wait "${background_pid}"
| Shell 语法 | 通过 | bash -n run_quick_map.sh |
| Python 单测 | 3/3 通过 | 场景唯一性、百分位回退、失败结果汇总 |
- | 完整 Dry-run | 通过 | 服务、九个固定点、混合 A/B、清理均展开成功 |
+ | 完整 Dry-run | 通过 | 服务、十一个固定点、混合 A/B、清理均展开成功 |
| 真实旧 Bench JSON 解析 | 通过 | 成功解析 P50/P95/P99 与吞吐字段 |
| 项目精简 | 通过 | 实验目录顶层仅保留一个 Shell 入口 |
| 双 Rail 传输门禁 | 通过 | Head 与 Worker 均识别 mlx5_0/mlx5_3,跨节点 Channel 使用 NET/IB/*/GDRDMA |
| 四点 Sanity | 4/4 通过 | 1K/32K Prefill 与 C1/C32 Decode 均恢复到合理量级 |
| 冷 Prefix 口径 | 通过 | 正式测量请求的 Head 日志显示 #cached-token: 0 |
| 完整真机 Run | 12/12 通过 | 固定矩阵 9/9,混合 A/B 3/3,运行期失败 0 |
+ | 长 Decode 补测 | 2/2 通过 | 1K → 4K C16 与 128K → 1K C1 均生成完整目标 OSL |
| 资源清理 | 通过 | 两节点相关容器与计算进程为 0,16 张 GPU 显存占用为 0 |
@@ -560,7 +568,9 @@ wait "${background_pid}"
| Run ID | dsv4pro-phase1-full-20260730-220916 | COMPLETED |
| 运行时间 | 28 分 36 秒 | 22:09:47 至 22:38:22 CST |
| 网络路径 | 双 Rail NET/IB + GDRDMA | mlx5_0 与 mlx5_3 |
- | 结果完整性 | 12/12 成功 | 固定点 9/9;混合 A/B 3/3 |
+ | 正式 Run 完整性 | 12/12 成功 | 固定点 9/9;混合 A/B 3/3 |
+ | 补充 Run | dsv4pro-phase1-long-decode-20260730-234236 | 固定点 2/2;约 12 分钟含服务启动与清理 |
+ | 阶段合计 | 14/14 成功 | 固定点 11/11;混合 A/B 3/3 |
@@ -596,7 +606,30 @@ wait "${background_pid}"
说明 Prefill 与 Decode 同时存在时干扰很强。
- 9.4 混合 Prefill/Decode A/B
+ 9.4 长 Decode 补测
+
+
+ | 场景 | Output TPS | TTFT P95 | TPOT P95 | E2E P95 |
+
+
+ | 1K → 4K,C=16 | 310.02 tok/s | 6.241 s | 50.33 ms | 211.364 s |
+ | 128K → 1K,C=1 | 12.43 tok/s | 49.326 s | 32.24 ms | 82.312 s |
+
+
+
+ 1K → 4K,C=16 相比 1K → 1K,C=16,
+ Output TPS 增加 4.99%,TPOT P95 只增加 0.62%。较长 Decode 没有出现
+ 稳态吞吐塌陷;吞吐略升是固定启动和 Prefill 成本被更多输出 token 摊薄。
+
+
+ 128K → 1K,C=1 的 TTFT 只比 128K → 1
+ 纯 Prefill 高 2.03%,而 TPOT P95 只比 1K → 1K,C=1
+ 高 2.47%。因此这次长上下文请求的主要新增成本在 Prefill,而不是每个 Decode
+ token。表中的 12.43 Output TPS 是把 49 秒 Prefill 也计入总时长的端到端值,
+ 不能把它误读为纯 Decode 速率。
+
+
+ 9.5 混合 Prefill/Decode A/B
| 指标 | A:仅 Decode | B:注入 128K Prefill | 变化 |
@@ -609,16 +642,23 @@ wait "${background_pid}"
- Phase 2 在上述长 Prefill、并发 Prefill和混合 A/B 之外,还会采集普通 Decode、
- 长输出 Decode 与长上下文 Decode。目标是区分计算、显存带宽、调度排队、
- 跨机通信、KV 增长和节点不均衡。
+ Phase 2 重放五个固定代表点:
+ 128K → 1,C=1、32K → 1,C=16、
+ 1K → 1K,C=32、1K → 4K,C=16、
+ 128K → 1K,C=1,再执行有无 128K 注入的混合 A/B。
+ 目标是区分计算、显存带宽、调度排队、跨机通信和节点不均衡。
完整产物:
报告、
逐点汇总、
聚合表、
- 运行清单。
+ 运行清单;
+ 长 Decode 补测的
+ 报告、
+ 逐点汇总
+ 和
+ 运行清单。
10. 经验教训
@@ -635,7 +675,15 @@ wait "${background_pid}"
不作为本阶段最终结果。
- 11. 运行命令
+ 11. 实验复现命令
+
+ 本节记录的是本阶段实际执行过的命令。长命令同时由程序原样保存到
+ results/<RUN_ID>/server/*_server_cmd.txt 和每个 Case 的
+ bench_cmd.txt;这些落盘文件是最终证据,正文中的换行仅用于阅读。
+
+
+ 11.1 实际执行:完整 Phase 1
+ 执行位置:174.1.51.5;脚本通过 SSH 启动 .7 Worker。
cd /data/hzy/sskj/experiments/pro6000/dsv4pro_pro6000d_2node_sglang_tp16_quick_map
tmux new-session -d -s dsv4pro-phase1-full \
@@ -643,11 +691,162 @@ tmux new-session -d -s dsv4pro-phase1-full \
2>&1 | tee /data/hzy/dsv4pro_phase1_full_20260730-220916.log"
tmux attach -t dsv4pro-phase1-full
+
+ all 的真实顺序是:
+ Worker 启动 → Head 启动 → /health → NET/IB 门禁 → fixed → mixed → stop → summarize。
+
+
+ 11.2 实际执行:Worker 服务
+
+ 展开 174.1.51.7 的完整 docker run
+ docker run -d \
+ --name dsv4pro_pro6000d_2node_sglang_tp16_quick_map_worker \
+ --gpus all \
+ --network host \
+ --ipc host \
+ --shm-size 20g \
+ --ulimit memlock=-1 \
+ --ulimit stack=67108864 \
+ -v /data/hf_models/DeepSeek-V4-Pro:/data/hf_models/DeepSeek-V4-Pro:ro \
+ -v /data/hzy/sglang_cache/dsv4_pro_tp16:/root/.cache \
+ -e CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \
+ -e PYTHONUNBUFFERED=1 \
+ -e HF_HUB_OFFLINE=1 \
+ -e TRANSFORMERS_OFFLINE=1 \
+ -e PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True \
+ -e NCCL_SOCKET_IFNAME=eth0 \
+ -e 'NCCL_IB_HCA==mlx5_0:1,mlx5_3:1' \
+ -e NCCL_CROSS_NIC=1 \
+ -e NCCL_DEBUG=INFO \
+ -e SGLANG_SHARED_EXPERT_TP1=1 \
+ --device /dev/infiniband/rdma_cm \
+ --device /dev/infiniband/uverbs0 \
+ --device /dev/infiniband/uverbs3 \
+ --entrypoint python3 \
+ lmsysorg/sglang:nightly-dev-cu13-20260720-b3570a45 \
+ -m sglang.launch_server \
+ --model-path /data/hf_models/DeepSeek-V4-Pro \
+ --tp-size 16 \
+ --ep-size 2 \
+ --nnodes 2 \
+ --node-rank 1 \
+ --dist-init-addr 10.101.0.11:20002 \
+ --trust-remote-code \
+ --host 0.0.0.0 \
+ --port 30002 \
+ --mem-fraction-static 0.9 \
+ --cuda-graph-max-bs-decode 64 \
+ --max-running-requests 256
+
+
+ 11.3 实际执行:Head 服务
+
+ 展开 174.1.51.5 的完整 docker run
+ docker run -d \
+ --name dsv4pro_pro6000d_2node_sglang_tp16_quick_map_head \
+ --gpus all \
+ --network host \
+ --ipc host \
+ --shm-size 20g \
+ --ulimit memlock=-1 \
+ --ulimit stack=67108864 \
+ -v /data/hf_models/DeepSeek-V4-Pro:/data/hf_models/DeepSeek-V4-Pro:ro \
+ -v /data/hzy/sglang_cache/dsv4_pro_tp16:/root/.cache \
+ -e CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \
+ -e PYTHONUNBUFFERED=1 \
+ -e HF_HUB_OFFLINE=1 \
+ -e TRANSFORMERS_OFFLINE=1 \
+ -e PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True \
+ -e NCCL_SOCKET_IFNAME=eth0 \
+ -e 'NCCL_IB_HCA==mlx5_0:1,mlx5_3:1' \
+ -e NCCL_CROSS_NIC=1 \
+ -e NCCL_DEBUG=INFO \
+ -e SGLANG_SHARED_EXPERT_TP1=1 \
+ --device /dev/infiniband/rdma_cm \
+ --device /dev/infiniband/uverbs0 \
+ --device /dev/infiniband/uverbs3 \
+ --entrypoint python3 \
+ lmsysorg/sglang:nightly-dev-cu13-20260720-b3570a45 \
+ -m sglang.launch_server \
+ --model-path /data/hf_models/DeepSeek-V4-Pro \
+ --tp-size 16 \
+ --ep-size 2 \
+ --nnodes 2 \
+ --node-rank 0 \
+ --dist-init-addr 10.101.0.11:20002 \
+ --trust-remote-code \
+ --host 0.0.0.0 \
+ --port 30002 \
+ --mem-fraction-static 0.9 \
+ --cuda-graph-max-bs-decode 64 \
+ --max-running-requests 256
+
+
+ NCCL_IB_HCA==... 的两个等号不是笔误:第一个是环境变量赋值分隔符,
+ 第二个是 NCCL HCA 列表的“精确匹配”前缀。
+
+
+ 11.4 实际执行:代表 Benchmark
+ 以下是正式 Run 的 128K → 1, C=1 冷 Prefix 命令:
+
+ 展开完整 sglang.benchmark.serving 命令
+ timeout --signal=TERM --kill-after=30s 7200s \
+docker run --rm \
+ --network host \
+ -v /data/hf_models/DeepSeek-V4-Pro:/data/hf_models/DeepSeek-V4-Pro:ro \
+ -v /data/yy/sskj/dataset/ShareGPT_V3_unfiltered_cleaned_split.json:/data/yy/sskj/dataset/ShareGPT_V3_unfiltered_cleaned_split.json:ro \
+ -v /data/hzy/sskj/experiments/pro6000/dsv4pro_pro6000d_2node_sglang_tp16_quick_map/results/dsv4pro-phase1-full-20260730-220916/cases/long_prefill_latency_128k_c1/rep1:/data/hzy/sskj/experiments/pro6000/dsv4pro_pro6000d_2node_sglang_tp16_quick_map/results/dsv4pro-phase1-full-20260730-220916/cases/long_prefill_latency_128k_c1/rep1 \
+ -e PYTHONUNBUFFERED=1 \
+ -e HF_HUB_OFFLINE=1 \
+ -e TRANSFORMERS_OFFLINE=1 \
+ --entrypoint python3 \
+ lmsysorg/sglang:nightly-dev-cu13-20260720-b3570a45 \
+ -m sglang.benchmark.serving \
+ --backend sglang \
+ --host 10.101.0.11 \
+ --port 30002 \
+ --dataset-name random \
+ --dataset-path /data/yy/sskj/dataset/ShareGPT_V3_unfiltered_cleaned_split.json \
+ --random-input-len 131072 \
+ --random-output-len 1 \
+ --random-range-ratio 1.0 \
+ --num-prompts 1 \
+ --max-concurrency 1 \
+ --request-rate 10000 \
+ --output-file /data/hzy/sskj/experiments/pro6000/dsv4pro_pro6000d_2node_sglang_tp16_quick_map/results/dsv4pro-phase1-full-20260730-220916/cases/long_prefill_latency_128k_c1/rep1/bench.jsonl \
+ --output-details \
+ --disable-tqdm \
+ --warmup-requests 0 \
+ --seed 42 \
+ --flush-cache
+
+
+ 其余固定点使用同一命令模板,只替换 ISL、OSL、并发、请求数、Warm-up、Seed
+ 和输出目录。每个点的最终展开命令保存在自己的 bench_cmd.txt。
+ 混合 A/B 的并行启动顺序和两条请求命令见第 6 节及相应 Case 目录。
+
+
+ 11.5 实际执行:长 Decode 补测
+ cd /data/hzy/sskj/experiments/pro6000/dsv4pro_pro6000d_2node_sglang_tp16_quick_map
+
+export CASE_IDS="long_output_decode_1k_to_4k_c16,long_context_decode_128k_to_1k_c1"
+export RUN_ID="dsv4pro-phase1-long-decode-20260730-234236"
+trap 'bash run_quick_map.sh stop' EXIT INT TERM
+bash run_quick_map.sh start
+bash run_quick_map.sh fixed
+
+ 11.6 停止、清理与检查
+ cd /data/hzy/sskj/experiments/pro6000/dsv4pro_pro6000d_2node_sglang_tp16_quick_map
+bash run_quick_map.sh stop
+
+curl -fsS http://10.101.0.11:30002/health || true
+docker ps --filter name=dsv4pro_pro6000d_2node_sglang_tp16_quick_map
+nvidia-smi --query-compute-apps=pid,process_name,used_memory --format=csv
下一阶段:
-
- Phase 2:硬件与资源竞争归因
+
+ 打开 Phase 2 实验档案
返回推理优化主计划
diff --git a/docs/dsv4pro_pro6000d_2node_sglang/phase2_code.html b/docs/dsv4pro_pro6000d_2node_sglang/phase2_code.html
index c4f5259..f2c62b8 100644
--- a/docs/dsv4pro_pro6000d_2node_sglang/phase2_code.html
+++ b/docs/dsv4pro_pro6000d_2node_sglang/phase2_code.html
@@ -113,6 +113,10 @@
+
+ 返回推理优化主计划 ·
+ 打开 Phase 2 实验档案
+
文档边界:本文只解释提交
39fc2ba565a3 的 Phase 2
代码和文件调用关系。Phase 1 负责模型服务与请求;Phase 2 负责通信基线、
diff --git a/docs/dsv4pro_pro6000d_2node_sglang/phase2_dsv4pro_pro6000d_2node_sglang_hardware_contention_attribution.html b/docs/dsv4pro_pro6000d_2node_sglang/phase2_exp.html
similarity index 99%
rename from docs/dsv4pro_pro6000d_2node_sglang/phase2_dsv4pro_pro6000d_2node_sglang_hardware_contention_attribution.html
rename to docs/dsv4pro_pro6000d_2node_sglang/phase2_exp.html
index 01d2fa1..8fc7ab1 100644
--- a/docs/dsv4pro_pro6000d_2node_sglang/phase2_dsv4pro_pro6000d_2node_sglang_hardware_contention_attribution.html
+++ b/docs/dsv4pro_pro6000d_2node_sglang/phase2_exp.html
@@ -135,7 +135,7 @@
节点:174.1.51.5 + 174.1.51.7
拓扑:SGLang TP16 / EP2
- 更新:2026-07-31 15:25:00 CST
+ 更新:2026-07-31 16:46:05 CST
@@ -762,7 +762,7 @@ tmux new-session -d -s dsv4pro-phase2 \
完整归因见 analysis.md,原始结构化摘要和两端 NCCL 证据已一并归档。
- 返回 Phase 1 实施记录
+ 返回 Phase 1 实验档案
返回推理优化主计划