168 lines
12 KiB
HTML
168 lines
12 KiB
HTML
<!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 Code:DSV4-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 < 5% and input_tps_gain < 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 < 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>正式 Run:Scout 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>
|