2026-08-01 15:29:26 +08:00

168 lines
12 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Phase 2.5 CodeDSV4-Pro 双机 SGLang RDMA 需求建模</title>
<style>
:root { --canvas:#eef3f4; --paper:#fff; --ink:#182126; --muted:#5a6970; --line:#d4dee1; --navy:#17363d; --teal:#087c72; --teal-soft:#e8f5f3; --amber:#a64c14; --amber-soft:#fff1e7; --code-bg:#17252b; --code-ink:#eaf2f3; }
* { box-sizing:border-box; letter-spacing:0; }
body { margin:0; color:var(--ink); background:var(--canvas); font-family:"PingFang SC","Microsoft YaHei",Arial,sans-serif; font-size:16px; line-height:1.72; }
header { color:#f6fbfb; background:var(--navy); border-bottom:5px solid #d2692b; }
.header-inner,main { width:min(100% - 36px,1120px); margin:0 auto; }
.header-inner { padding:34px 0 30px; }
h1 { margin:0; font-size:clamp(28px,4vw,42px); line-height:1.25; }
h2 { margin:42px 0 15px; padding-bottom:8px; font-size:25px; border-bottom:2px solid #adbbc0; }
h3 { margin:28px 0 10px; color:#21454d; font-size:19px; }
.eyebrow { margin:0 0 6px; color:#9edbd5; font-size:13px; font-weight:700; }
.meta { margin-top:15px; color:#d6e5e7; font-size:14px; }
main { margin-top:30px; margin-bottom:70px; padding:38px 48px 58px; background:var(--paper); border:1px solid var(--line); border-radius:6px; }
a { color:var(--teal); }
code { padding:2px 5px; color:#85380d; background:var(--amber-soft); border-radius:3px; font-family:"SFMono-Regular",Consolas,monospace; overflow-wrap:anywhere; }
pre { margin:14px 0 22px; padding:16px 18px; overflow:auto; color:var(--code-ink); background:var(--code-bg); border-radius:5px; font:13px/1.62 "SFMono-Regular",Consolas,monospace; }
pre code { padding:0; color:inherit; background:transparent; }
table { width:100%; margin:16px 0 26px; border-collapse:collapse; font-size:14px; }
th,td { padding:9px 11px; vertical-align:top; text-align:left; border:1px solid var(--line); overflow-wrap:anywhere; }
th { color:#153b41; background:#eaf2f2; }
.callout { margin:18px 0 26px; padding:14px 18px; background:var(--teal-soft); border-left:4px solid var(--teal); }
.warning { margin:18px 0 26px; padding:14px 18px; background:var(--amber-soft); border-left:4px solid var(--amber); }
li+li { margin-top:5px; }
@media(max-width:760px){main{padding:28px 20px 42px}table{display:block;overflow-x:auto}}
</style>
</head>
<body>
<header>
<div class="header-inner">
<p class="eyebrow">STANDALONE CODE WALKTHROUGH / PHASE 2.5</p>
<h1>DSV4-Pro 双机 Pro6000D SGLang RDMA 需求建模:代码详解</h1>
<div class="meta">实现提交:<code>c5fa700c50c0</code> 正式 Run<code>dsv4pro-phase2_5-20260801-130007</code> 唯一入口:<code>run_rdma_demand_modeling.sh all</code></div>
</div>
</header>
<main>
<p><a href="./推理优化计划.html">返回推理优化主计划</a> · <a href="./phase2_5_exp.html">打开 Phase 2.5 实验档案</a></p>
<div class="callout"><strong>边界:</strong>Phase 2.5 不复制模型服务和采集器。它复用 Phase 1 的双机 TP16 服务/benchmark 与 Phase 2 的精确窗口、GPU/RDMA 采集能力,只新增“并发 Scout → 自动选点 → 业务 OSL Confirm → 需求拟合”这一层编排和分析。</div>
<h2>1. 文件职责与调用关系</h2>
<table>
<thead><tr><th>文件</th><th>职责</th><th>调用关系</th></tr></thead>
<tbody>
<tr><td><code>config.env</code></td><td>定义 ISL/OSL、Scout 并发、重复次数、平台阈值和 400G 目标</td><td>被唯一入口 source</td></tr>
<tr><td><code>run_rdma_demand_modeling.sh</code></td><td>生成场景、调用 Phase 2、串行运行 Scout/Confirm、清理服务</td><td>唯一人工入口</td></tr>
<tr><td><code>rdma_demand_model.py</code></td><td>对齐 benchmark/HCA 窗口,计算 bytes/token拟合平台并生成报告</td><td>Scout 后选点Confirm 后最终汇总</td></tr>
<tr><td><code>test_rdma_demand_model.py</code></td><td>覆盖 HCA counter 单位、平台选择、线性换算和拟合输出</td><td>本地/CI 回归测试</td></tr>
<tr><td>Phase 2 <code>run_hardware_contention_attribution.sh</code></td><td>启动服务、采集 Head/Worker、切正式测量窗</td><td>由 Phase 2.5 以环境变量调用</td></tr>
<tr><td>Phase 1 <code>run_quick_map.sh</code></td><td>双机服务启停与 SGLang benchmark</td><td>由 Phase 2 内部复用</td></tr>
</tbody>
</table>
<pre><code>run_rdma_demand_modeling.sh all
├─ validate_config + write_manifest
├─ run_scout
│ ├─ write_scenario_file(64K→1, C=1/4/16/32/64)
│ ├─ Phase 2 all服务 + 18 个采集器 + 5 Case
│ └─ rdma_demand_model.py scout → recommendation.env
├─ run_confirm
│ ├─ 读取自动选择的 C=4/16/64
│ ├─ Phase 2 all重启服务 + 18 个采集器 + 每点 2 次)
│ └─ rdma_demand_model.py final
└─ Phase 2 stop → 双节点清理</code></pre>
<h2>2. 配置层</h2>
<p><code>config.env:5-7</code> 通过相对路径找到 Phase 1/2不依赖执行命令所在目录。<code>config.env:10-16</code> 定义 64K Scout 与 1K Confirm<code>18-21</code> 定义 5% 平台阈值、400G 物理目标和 360G 实用目标。</p>
<pre><code>ISL=65536
SCOUT_OSL=1
CONFIRM_OSL=1024
SCOUT_CONCURRENCIES="1 4 16 32 64"
SCOUT_REPETITIONS=1
CONFIRM_REPETITIONS=2
PLATEAU_GAIN_PCT=5
TARGET_RAIL_GBPS=400
PRACTICAL_RAIL_GBPS=360</code></pre>
<p><code>SAMPLE_INTERVAL_S=1</code> 只决定 HCA/GPU 时间序列分辨率;<code>SCENARIO_TIMEOUT_S=7200</code> 是单个 benchmark 的保护上限,不是期望耗时。</p>
<h2>3. Shell 唯一入口</h2>
<h3>3.1 参数检查与场景生成</h3>
<p><code>run_rdma_demand_modeling.sh:42-71</code> fail-fast 检查依赖脚本、整数参数和并发列表。<code>73-100</code> 生成 Phase 2 能读取的 TSV并为每个形状生成稳定的 case id。</p>
<h3>3.2 复用 Phase 2而不是复制采集代码</h3>
<p><code>103-134</code> 构造一个数组命令把场景、Case、重复次数和采样周期作为环境变量传给 Phase 2。它显式关闭 mixed case 与通信 microbenchmark因为 Phase 2.5 只测模型 RDMA 需求,不重复已完成的硬件基线。</p>
<pre><code>RUN_MIXED_CASE=0
RUN_COMMUNICATION_BASELINE=0
SCENARIO_FILE=.../scout.tsv
FIXED_CASE_IDS=rdma_scout_...
bash run_hardware_contention_attribution.sh all</code></pre>
<h3>3.3 两阶段控制流</h3>
<p><code>136-152</code> 跑完 Scout 后立即调用 Python并写出 <code>recommendation.env</code><code>154-180</code> 读取推荐并发,生成 64K→1K Confirm。<code>217-225</code><code>run_all</code> 严格串行执行,异常信号触发 stop 清理。</p>
<div class="warning"><strong>为什么服务会启动两次:</strong>Scout 结束后 Phase 2 会清理服务Confirm 使用全新的 Prefix Cache、采集器和服务生命周期避免 Scout 状态污染确认结果。</div>
<h2>4. Python 如何从计数器变成需求模型</h2>
<h3>4.1 精确时间窗与 HCA 单位</h3>
<p><code>rdma_demand_model.py:87-115</code><code>(case_id,repetition)</code> 对齐 benchmark、窗口和 RDMA 汇总。<code>117-147</code> 在正式窗口内计算相邻 HCA counter 的速率IB <code>port_*_data</code> 单位是 4-octet因此必须乘 4再乘 8 转为 bit/s。</p>
<pre><code>gbps = (counter_delta × 4 bytes × 8 bits) / duration_s / 1e9</code></pre>
<h3>4.2 单 Case 指标</h3>
<p><code>171-281</code> 汇总四条观测边Head/Worker × 两个 HCA的 Rail Mean/P95/Max、双 Rail 单向合计、Rail 不均衡、错误计数和 GPU 利用率。通信强度按每条 Rail 平均发送字节计算:</p>
<pre><code>bytes_per_input_token_per_rail
= mean(head/worker × mlx5_0/mlx5_3 xmit_bytes)
/ total_input_tokens</code></pre>
<p>这里不把 TX+RX 相加,因为那会把同一份跨机数据重复计数。</p>
<h3>4.3 平台、拐点与自动选点</h3>
<p><code>362-392</code> 比较相邻并发点。只有 Rail Mean 与 Input TPS 增益同时低于 5%,当前点才是平台候选。随后选择平台前一点、平台点和最高稳定点;本 Run 得到 <code>4 16 64</code></p>
<pre><code>if bandwidth_gain &lt; 5% and input_tps_gain &lt; 5%:
plateau_c = current_concurrency</code></pre>
<h3>4.4 线性通信强度与饱和曲线</h3>
<p><code>352-360</code> 用过原点线性斜率拟合 <code>rail_gbps/input_tps</code>,再还原为 bytes/token。<code>318-350</code> 用双曲线 <code>B(C)=B∞×C/(K+C)</code> 拟合并发饱和曲线;<code>394-447</code> 组合两者,判断模型计算或网络谁先到平台。</p>
<pre><code>required_input_tps
= target_rail_gbps / linear_gbps_per_input_tps
if fitted_bandwidth_asymptote &lt; 360:
verdict = COMPUTE_OR_MODEL_THROUGHPUT_LIMITED_BEFORE_RDMA_SATURATION</code></pre>
<p>本 Run 的 RMSE 为 0.277 Gbit/s五个 Scout 点与饱和曲线贴合良好;拟合上限 80.32 Gbit/s与 C=16/32/64 的 79.90/79.93/79.97 一致。</p>
<h2>5. 输出文件如何阅读</h2>
<table>
<thead><tr><th>输出</th><th>用途</th></tr></thead>
<tbody>
<tr><td><code>rdma_case_metrics.csv</code></td><td>每次重复的 benchmark + GPU + Rail 对齐数据,是审计主表</td></tr>
<tr><td><code>rdma_demand_model.json</code></td><td>完整拟合参数、平台点、目标 TPS 和最终 verdict</td></tr>
<tr><td><code>rdma_demand_report.md</code></td><td>面向人的 Scout/Confirm 摘要</td></tr>
<tr><td><code>recommendation.env</code></td><td>Shell 可直接 source 的 Confirm 并发列表</td></tr>
<tr><td><code>{scout,confirm}/case_windows.csv</code></td><td>每个正式 benchmark 的精确起止时间</td></tr>
<tr><td><code>{scout,confirm}/{head,worker}/rdma.csv</code></td><td>原始 HCA counter 时间序列,仅保留在服务器完整结果中</td></tr>
<tr><td><code>commands/*.cmd.txt</code></td><td>实际传给 Phase 2 的完整可复现命令</td></tr>
</tbody>
</table>
<h2>6. 测试与验收门槛</h2>
<ul>
<li><code>python3 -m unittest test_rdma_demand_model.py</code>4/4 通过。</li>
<li><code>bash -n run_rdma_demand_modeling.sh</code> 与 Python compile通过。</li>
<li><code>DRY_RUN=1 ... all</code>:展开 5 个 Scout 和 3×2 个 Confirm不启动服务。</li>
<li>正式 RunScout 5/5、Confirm 6/6两个阶段各 18/18 个采集器正常启停,共保存 72 条 STARTED/STOPPED 生命周期事件。</li>
<li>11 个测量结果全部 <code>COMPLETED</code><code>rdma_error_delta=0</code></li>
<li>结束后 Head/Worker 均无实验容器16 张 GPU 为 0 MiB / 0%。</li>
</ul>
<h2>7. 行号索引</h2>
<table>
<thead><tr><th>功能</th><th>文件与行</th></tr></thead>
<tbody>
<tr><td>配置与路径</td><td><code>config.env:3-36</code></td></tr>
<tr><td>校验与场景生成</td><td><code>run_rdma_demand_modeling.sh:42-100</code></td></tr>
<tr><td>Phase 2 调用</td><td><code>run_rdma_demand_modeling.sh:103-134</code></td></tr>
<tr><td>Scout / Confirm</td><td><code>run_rdma_demand_modeling.sh:136-180</code></td></tr>
<tr><td>唯一 all 与清理</td><td><code>run_rdma_demand_modeling.sh:206-264</code></td></tr>
<tr><td>HCA interval rate</td><td><code>rdma_demand_model.py:117-147</code></td></tr>
<tr><td>Case 对齐汇总</td><td><code>rdma_demand_model.py:171-281</code></td></tr>
<tr><td>饱和拟合</td><td><code>rdma_demand_model.py:318-350</code></td></tr>
<tr><td>平台选点</td><td><code>rdma_demand_model.py:362-392</code></td></tr>
<tr><td>需求模型与 verdict</td><td><code>rdma_demand_model.py:394-447</code></td></tr>
<tr><td>报告输出</td><td><code>rdma_demand_model.py:449-517</code></td></tr>
</tbody>
</table>
<h2>8. 复用时必须重新标定的边界</h2>
<p>这套代码可复用,但 <code>3.332 MB/token/rail</code> 不是通用常数。换模型、量化、TP/EP、节点切分、backend、Prefill/Decode 形状或 Prefix Cache 策略后,都必须重新跑 Scout。代码输出的是“当前部署实现的经验模型”不是由参数量单独推导出的理论通信量。</p>
</main>
</body>
</html>