Design, Implementation & Result Record

Phase 2:DeepSeek-V4-Pro 双机 Pro6000D SGLang 硬件与资源竞争归因

节点:174.1.51.5 + 174.1.51.7 拓扑:SGLang TP16 / EP2 更新:2026-07-31 13:59:12 CST
返回推理优化主计划

当前状态:Phase 2 首次正式双机 Run 已完成。 Run dsv4pro-phase2-20260731-130125 在 26 分 26 秒内完成 8/8 个 benchmark,无 OOM;GPU、CPU 和双 Rail RDMA 数据已完成首轮归因。 本阶段在此停止,不自动进入 Phase 3。

1. Phase 1 交接结果

代表负载关键结果Phase 2 用途
128K → 1,C=1Input TPS 2,710.16;TTFT P95 48.344 s纯长 Prefill 的计算、显存与通信归因
32K → 1,C=16Input TPS 3,112.77;TTFT P95 162.087 s并发 Prefill 的排队、Chunk 调度与节点均衡
1K → 1K,C=32Output TPS 461.68;TPOT P95 63.31 ms普通 Decode 的 GPU、CPU 与通信基线
1K → 4K,C=16Output TPS 310.02;TPOT P95 50.33 ms持续 Decode、KV 增长和稳态资源占用
128K → 1K,C=1TTFT P95 49.326 s;TPOT P95 32.24 ms分离长 Prefill 与长上下文 Decode 成本
1K → 1K,C=32 + 128K 注入Output TPS -24.08%;TPOT P95 +66.55%Prefill 干扰 Decode 时的硬件资源竞争

最终基线已由 Head 与 Worker 日志证明使用 mlx5_0/mlx5_3 双 Rail NET/IB + GDRDMA, 正式测量请求为冷 Prefix。正式矩阵 12/12、长 Decode 补测 2/2 均成功。 Phase 2 保持相同服务配置和请求口径。

2. 本阶段的边界

3. 待验证假设

假设预期硬件表现后续方向
DSV4/NSA Prefill Kernel 计算受限GPU 持续忙、高功耗和稳定频率;双 Rail 流量不高Phase 3 捕获 Kernel 与 Attention/Indexer 时间线
权重或激活显存带宽受限GPU Memory Utilization 高,SM 指标未必饱和;功耗可能低于纯计算补 DCGM/Profiler 的 DRAM Active,再看 Kernel
TP16 跨机通信受限RoCE 吞吐高或两条 Rail 明显失衡,GPU 出现等待NCCL_CROSS_NIC 0/1/2 快速 A/B,随后看 NCCL Timeline
CPU Scheduler 或 Kernel Launch 受限GPU 利用率锯齿或有空洞,单 CPU 核持续满载定位 Scheduler/Tokenizer 线程与 launch gap
频率、功耗或温度限制P-state、SM Clock 或 Power 持续异常,可能出现节流原因修正电源、散热或 Clock Policy 后复测
节点或 Rank 不均衡两节点或不同 GPU 的利用率、功耗、网络流量存在固定偏差检查 NUMA、GPU-NIC 亲和与慢 Rank

4. 诊断 Run

  1. 保存两节点静态快照:GPU/NIC/NUMA 拓扑、驱动、CUDA、镜像与服务命令。
  2. 复用 Phase 1 已验证的 run_quick_map.sh start 启动同配置双机服务。
  3. 在 Head 和 Worker 同时启动 GPU、CPU、网卡与 RDMA 采样,先记录 15 秒空闲基线。
  4. 依次重放 128K → 1, C=132K → 1, C=161K → 1K, C=32
  5. 重放 1K → 4K, C=16128K → 1K, C=1,观察持续与长上下文 Decode。
  6. 重放 1K → 1K, C=32 Control 与 128K Prefill 注入 Treatment,保留相同注入时序。
  7. 请求结束后继续采样 15 秒,再停止采集器和服务。
  8. 按时间戳将请求、GPU、CPU 和双 Rail 指标对齐,生成摘要与判定。
idle 15s
  │ 128K→1 C1 │ 32K→1 C16 │ 1K→1K C32
  │ 1K→4K C16 │ 128K→1K C1
  │ Decode Control │ Decode + Prefill
cooldown 15s

Head 与 Worker 的所有采集器覆盖完整诊断窗口。

Phase 1 中服务加载约 5 分 30 秒;五个固定负载加混合 A/B、静态快照、 采样和清理,目标仍控制在约 30 分钟内。

4.1 你只需要运行的入口

操作规则:先在 Worker .7 做一次 DCGM 准备,再只在 Head .5 执行 Phase 2 的 all 不要手工执行 Phase 1 的 startstop。 Phase 2 会在内部复用它们,并负责异常退出时的采集器、Head、Worker 清理。

# [仅在 Worker 174.1.51.7 执行一次]
# 不需要 source、conda activate,也不要在 .7 运行 Phase 2 的 all
systemctl start nvidia-dcgm
systemctl is-active nvidia-dcgm
dcgmi discovery -l

# 预期:第二条输出 active,第三条列出本机 8 张 GPU

# [以下仅在 Head 174.1.51.5 执行]
cd /data/hzy/sskj/experiments/pro6000/dsv4pro_pro6000d_2node_sglang_hardware_contention_attribution

# 第一次先展开全部命令,不启动服务、不占用 GPU、不发送请求
DRY_RUN=1 RUN_ID=dsv4pro-phase2-dryrun-$(date +%Y%m%d-%H%M%S) \
  bash run_hardware_contention_attribution.sh all

# 正式实验:仍然只有同一个 all 入口,tmux 只负责断线后继续运行
RUN_ID=dsv4pro-phase2-$(date +%Y%m%d-%H%M%S)
tmux new-session -d -s dsv4pro-phase2 \
  "RUN_ID=${RUN_ID} bash run_hardware_contention_attribution.sh all \
   2>&1 | tee /data/hzy/${RUN_ID}.log"

tmux attach -t dsv4pro-phase2

.7 的三条命令只负责让 Worker DCGM Host Engine 可用; SGLang Worker、其余采集器和结果回收仍由 .5 的唯一入口通过 SSH 管理。 若需要机器重启后自动启动 DCGM,应由运维另行决定是否执行 systemctl enable nvidia-dcgm

all 内部执行顺序:

配置与工具门禁
  → Phase 1 start:启动同配置 TP16 服务
  → 两节点静态快照
  → 启动两节点采集器并记录 15 秒 idle
  → 五个固定 Case
  → 混合 Prefill/Decode A/B
  → 15 秒 cooldown
  → 停止采集器并保存后快照
  → Phase 1 stop:停止 Head/Worker
  → 生成按 Case 对齐的 CSV、JSON 与 report.md

Phase 1 的作用是提供已经验证过的双机 Docker 服务和 Benchmark 实现, 不是第二个用户入口。实际展开的服务、Benchmark 和采集命令都会写入 results/<RUN_ID>/service/commands/head|worker/collector_commands/,不依赖跨文档猜测。

5. 采集指标

层级连续采样静态或前后快照局限
GPU利用率、Memory Utilization、显存、功耗、SM/Memory Clock、温度、P-statenvidia-smi topo -m、Compute Processnvidia-smi 的 Memory Utilization 不是实际 HBM GB/s
CPU每核利用率、上下文切换、服务进程 CPU/内存NUMA 拓扑、容器 PID 与 CPU Affinity需要时间戳与 GPU Chunk 日志对齐
Networketh0/eth3 RX/TXethtool -S 错误计数前后差普通 netdev 统计不一定覆盖所有 RDMA 细节
RDMAmlx5_0/mlx5_3 port_xmit/recv_data 差分Port State、GID 与错误计数计数单位需要按设备定义换算
DCGM若可用则记录 SM Active、DRAM Active、Tensor Active、PCIe工具版本与可用 Field不可用时明确记录,不能用粗粒度指标冒充

6. 精简代码设计

已新增目录:

/data/hzy/sskj/experiments/pro6000/
dsv4pro_pro6000d_2node_sglang_hardware_contention_attribution/
文件职责当前状态
run_hardware_contention_attribution.sh唯一 Shell 入口;服务启停、双节点采集器、Case 编排、健康检查和 Trap 清理已实现
config.envPhase 1 相对路径、节点、五个固定 Case、混合 A/B 与采样策略已实现
hardware_contention_attribution.pyManifest、标记、Bench 校验、按 Case 时间窗切片和硬件摘要已实现
tests/test_hardware_contention_attribution.pyGPU 统计、RDMA 单位、Marker、嵌套结果与时间窗测试5/5 通过
README.md唯一入口、范围和结果目录说明已实现

Phase 2 不复制双机 Docker 启停实现。唯一入口在内部调用 Phase 1 的 run_quick_map.sh start/fixed/mixed/stop,只新增硬件采集、时间对齐和代表负载编排。 顶层仍只保留一个 Shell 文件,不创建额外 tmux、launch、start 或 stop 脚本。

7. 结果结构

results/<RUN_ID>/
  manifest.json
  run.log
  bench/
    bench_cmd.txt
    bench.log
    bench.jsonl
  service/
    head_server_cmd.txt
    worker_server_cmd.txt
    head_server.log
    worker_server.log
  head/
    gpu_samples.csv
    dcgm_dmon.log
    mpstat.log
    pidstat.log
    sar_net.log
    perf_stat.log
    docker_top.log
    numastat.log
    rdma.csv
    static_before.log
    static_after.log
    collector_commands/
  worker/
    ...
  collector_status.csv
  markers.csv
  bench_summary.csv
  gpu_summary.csv
  rdma_summary.csv
  case_windows.csv
  case_gpu_summary.csv
  case_rdma_summary.csv
  summary.json
  report.md

8. 验收结果

9. 实施记录

时间代码或运行结果
2026-07-30 15:46 CST创建 Phase 2 设计与档案采用单入口和独立轻量采样,不复制双机服务启动逻辑
2026-07-30 22:55:37 CST完成 Phase 1 阶段交接双 Rail 门禁和 12/12 正式结果通过;选定纯 Prefill、并发 Prefill、混合干扰三个诊断负载
2026-07-31 12:26:00 CST完成 Phase 2 代码扩展为五个固定负载和混合 A/B;实现双节点 GPU/DCGM/CPU/NUMA/网络/RDMA 采集、时间对齐和异常清理
2026-07-31 12:26:00 CST本地验证bash -n、Python 编译、5 项单元测试与全流程 Dry-run 通过;未占用 GPU
2026-07-31 13:27:51 CST完成正式双机 RunRun dsv4pro-phase2-20260731-130125:8/8 benchmark 成功,总用时 26 分 26 秒,无 OOM
2026-07-31 13:40:03 CST完成首轮结果归因排除原始双 Rail 带宽饱和、整机 CPU 饱和和频率塌陷作为首要原因;锁定 TP16 Kernel、调度与同步时间线

10. 真机结果

Run:dsv4pro-phase2-20260731-130125,状态 COMPLETED运行时间为 13:01:25 至 13:27:51 CST, 8 个结果全部成功,0 个失败。正式入口仅在 174.1.51.5 执行; Worker 服务和采集器由脚本通过 SSH 自动启动。

cd /data/hzy/sskj/experiments/pro6000/dsv4pro_pro6000d_2node_sglang_hardware_contention_attribution

RUN_ID=dsv4pro-phase2-20260731-130125
tmux new-session -d -s dsv4pro-phase2 \
  "RUN_ID=${RUN_ID} bash run_hardware_contention_attribution.sh all \
   2>&1 | tee /data/hzy/${RUN_ID}.log"

10.1 代表负载

CaseInput TPSOutput TPSTTFT P95TPOT P95
128K → 1, C=12,618.530.0250.036 s
32K → 1, C=163,116.200.10161.899 s
1K → 1K, C=32447.41447.4110.144 s65.63 ms
1K → 4K, C=1679.35317.411.727 s50.01 ms
128K → 1K, C=11,610.8912.5948.489 s32.12 ms

10.2 混合 Prefill/Decode

Decode 指标Control注入 128K Prefill变化
Output TPS454.39345.20-24.03%
TTFT P959.437 s9.869 s+4.58%
TPOT P9566.17 ms110.36 ms+66.79%
E2E P9572.225 s117.941 s+63.30%

这再次证明 Prefill 会明显干扰正在进行的 Decode。ITL P95 仍约为 62 ms,并不与 TPOT 恶化矛盾:少量同步长停顿可能不足全部 token 间隔的 5%, 因而会被全局 token 级 ITL P95 隐藏,而请求级 TPOT 和 E2E 会暴露它。

10.3 GPU、CPU 与通信

10.4 卡间通信路径

范围实际路径本轮是否测量
单机 8 卡内部无 NVLink;NCCL P2P/IPC 走 PCIe。GPU0–3、GPU4–7 各自在 PCIe Switch 内为 PIX,两组之间为 SYS采集了 DCGM PCIe 指标;未做独立 P2P 带宽/延迟微基准
两机之间mlx5_0 + mlx5_3 双 Rail NET/IB + GDRDMA已测量每 Case HCA 流量、均衡性和错误增量

在进入 Phase 3 前只需一次性补 p2pBandwidthLatencyTest、单机 8 卡 all_reduce_perf 和双机 16 卡 all_reduce_perf, 分开量化机内 PCIe 与跨机 RoCE 的硬件基线;后续阶段不重复跑这些微基准。

10.5 首轮结论与采集限制

当前证据支持把下一步缩到 TP16 的 Kernel、Scheduler、PCIe/RDMA Collective 和 Rank 同步时间线。Phase 3 只分析真实请求中通信出现的位置、耗时和与计算的 重叠关系,不重复 Phase 2 的平均 GPU/CPU/RDMA 采集。原始双 Rail 带宽、整机 CPU 容量和降频都不像首要瓶颈;但 Phase 2 粗粒度指标还不能给出具体 Kernel 根因。

返回 Phase 1 实施记录

返回推理优化主计划