批处理运行层设计方案(Slurm × Virtuoso Spectre)¶
主题:
hpc_slurm_20261003| 状态:设计稿(未实施) | 日期:2026-10-04 上游依据:docs/HANDOFF.md§2#2/#9、docs/BASELINE.md§7、pll_cal_20261003/SOP.md(成本与波形口径) 实施记录(待产出):本目录SOP.md;运行手册:本目录RUNBOOK.md
0. 一句话¶
把「ADE-XL 里设置好的 200 点扫描」变成「Slurm 上一核一点并行跑、三层存储、可复现、可回收、失败可控」的批处理流水线。
1. 目标与边界¶
目标(本期做)
| # | 目标 | 验收判据 |
|---|---|---|
| G1 | 打通 ADE-XL → Slurm 的作业派发 | 一个 3 点小扫描能自动落到计算节点跑完 |
| G2 | 波形输出裁剪落地 | 单点波形 ≤ 50 MB(现 3.9 GB/点) |
| G3 | 三层存储规范落地 | workdir 在 Lustre、临时产物在 $TMPDIR、结果只 stage-out 必要文件 |
| G4 | 日志可归因 | 每个 job 有独立目录,含 CDS.log / spectre.out / 启动日志 |
| G5 | 幂等与失败容忍 | 重跑第二次零变更;单点失败不影响其余;超阈值即停 |
| G6 | 可复现 | 仿真默认值固化到 .cdsenv;工具版本与 partition 写入作业头 |
明确不做(本期边界)
- 不改原理图、不改器件模型(阶段 1 已收口)
- 不建版图链路(阶段 4)
- 不引入 ADE-XL 之外的仿真管理器
- 不扩集群规模,只用现有 3 节点 × 8 核
已知硬约束(实测)
| 约束 | 值 | 影响 |
|---|---|---|
| 算力 | 3 节点 × 8 核 = 24 核 / 45 GB,全 KVM 虚拟机 | 200 点最多并行 24 个 |
| 网络 | 无 IB/RoCE,纯千兆 | 只适合「点间并行」,不适合紧耦合 MPI |
| 分区时限 | compile 1 天 / regression 8 h / long 3 天 | test_lock 单点 ≈56 核时 ⇒ 必须投 long |
| license | .29 605 FEATURE 全部 permanent uncounted |
不限并发座位;但 Slurm 不排队等 license,运行期才失败 |
| 存储 | /projects 余 1.1 T;Lustre 295 G(余 280 G);/local_scratch 50 G/节点 |
780 GB 不能硬扛,必须裁剪 |
2. 架构设计¶
2.1 分层¶
【设置层】 交互式 GUI(.249 本机) EDA-XL:test / corner / 扫描变量 / save 白名单
│ 写入 cellview + ADE state(进 /projects,版本可追溯)
▼
【调度层】 hpc-submit .28 ADE-XL job policy → generic launcher → sbatch
│
▼
【执行层】 slurm-work .18/.19/.20 每 job = 1 核 1 点;spectre 本体
│ workdir / 临时产物 / 波形
▼
【数据层】 /projects ←→ /mnt/lustre/scratch ←→ $TMPDIR(/local_scratch)
│
▼
【观测层】 日志与结果归集 每 job 独立目录 + 汇总报告
2.2 关键决策:ADE-XL 如何对接 Slurm¶
实测依据:IC617 的 ADE-XL 目录存在 tools/dfII/etc/tools/adexl/axlGenericJobLauncher_enc.ils(通用作业启动器),且 ADE-XL 配置树中有整套 adexl.distribute 分发变量 ⇒ ADE-XL 具备「自定义作业启动器」能力,可包装 sbatch 对接 Slurm。
推荐路线 A(ADE-XL 原生分发:Command Job Policy + srun) —— 2026-10-04 文档实测确定
- ADE-XL 的 Job Policy 有五种 Distribution Method:Local / Remote-Host / Command / LBS(来源:
doc/adexl/adexlSimulating.html)。 - Command 方式:在 Command 字段填「命令前缀」,ADE-XL 会把 icrp 启动命令追加在其尾部并在本地主机执行,即
Command + icrpStartupCommand。 - Slurm 映射:
Command = srun -p long -N1 -n1 -t 3-00:00:00 --mem=4G(srun前台阻塞,等价 LSF 的bsub -I)。 - 必须用 interactive 语义(文档明示):ADE-XL 靠本地 proxy 进程推断 ICRP 状态、发
SIGTERM、检测 pending 并重提交;非阻塞的sbatch会丢失该控制。 - 优点:test/corner/扫描/结果收集仍由 ADE-XL 管理;无需触碰加密的
axlGenericJobLauncher_enc.ils。 - 待实测:
srun与 icrp 启动命令的参数拼接是否被正确解析(S3 最小验证)。 - 本环境约束(2026-10-04 实测):GUI 宿主
.249无 Slurm 客户端,Command 在本地主机执行 ⇒ 命令须写成ssh root@192.168.31.28 srun -p long …(.249 root → .28 免密已通)或经 wrapper 脚本中转。
备选路线 B(Job Array 直调,降级方案)
- 用 ADE-XL 只做「设置」,导出网表与扫描矩阵;由自研 runner 生成 N 个网表 →
sbatch --array=0-199分发 → 直接调spectre - 优点:与已跑通的
pll_cal_20261003/cal_run.sh同模式、完全可控、job array 天然一对一 - 代价:失去 ADE-XL 的数据库/波形管理,结果要靠自研 runner 归集
决策规则:实施第 1 步用「3 点小扫描」同时验路线 A;A 通过则用 A,不通过立即转 B,不反复试探(同一逻辑失败 2 次即终止)。
2.3 关键 ADE-XL 配置项(实测存在,待设值)¶
| 变量 | 默认 | 本方案取值意图 |
|---|---|---|
adexl.distribute maxJobFailPerPolicy |
3 | 失败容忍阈值:单 policy 内失败 > 3 即停(与部署规范的分批失败阈值对应) |
adexl.distribute jobFileDir |
"" | 指向 /mnt/lustre/scratch/...,避免作业文件压 NFS |
adexl.distribute maxNFSSyncWait |
60 | NFS 等待上限,需按实测调 |
adexl.distribute numRetriesOnError |
1 | 保持 1,不无限重试 |
adexl.icrpStartup runCompleteTimeout |
1800 | 需按 test_lock 单点实际时长(≈2.4 h 起)显著调高 |
3. 工程布局¶
proj1/verif/batch_0/ # 本工程的运行目录(进 /projects)
├── conf/
│ ├── defaults.yaml # 随工程:分区、资源、超时、裁剪档位
│ ├── env.yaml # 环境覆盖:路径、license、节点
│ └── contract.yaml # 环境契约:os/工具版本/存储/分区上限
├── bin/
│ ├── batch.py # 入口(门禁 → 生成 → 提交 → 监控 → 收集)
│ ├── precheck.py # 只读预检查(独立子命令 + 变更前门禁)
│ └── collect.py # 结果归集与汇总
├── tmpl/
│ ├── job.sbatch # 单点作业模板
│ └── launcher.sh # ADE-XL generic launcher 包装(调 sbatch)
├── runs/<tag>/ # 每次批跑一个 tag(幂等单元)
│ ├── logs/<jobid>/{cds.log,spectre.out,submit.log}
│ ├── results/ # stage-out 回来的必要结果
│ └── report.md # 本次汇总
└── docs/(SOP.md / RUNBOOK.md)
设计工作区(本机 design/hpc_slurm_20261003/)只放方案与文档,脚本与数据一律进 proj1。
4. 三层存储映射(硬性)¶
| 层 | 路径 | 放什么 | 生命周期 |
|---|---|---|---|
| Tier1 NFS | /projects/design/rain01/proj1/verif/batch_0/ |
输入网表、ADE state、裁剪后的结果 | 持久 |
| Tier0 Lustre | /mnt/lustre/scratch/users/rain01/<jobid>/ |
作业 workdir、psf 波形、job 文件 | 30 天老化 |
| 本地 | $TMPDIR(prolog 注入) |
编译中间产物、工具临时文件 | 作业结束即删 |
坑(必须写进模板):EDA 编译产物默认落 cwd,不在 $TMPDIR。作业脚本必须 cd "$TMPDIR" 或显式指定,否则元数据压力仍全压共享层。
5. 波形裁剪策略(先定再批跑)¶
现状 3.9 GB/点 的来源:psfascii 文本格式 × 全部节点 × conservative/maxstep=10ps 的密步长。三档裁剪:
| 档 | 措施 | 预期效果 | 适用 test |
|---|---|---|---|
| L1 节点白名单 | 只 save 关键节点(VCO 输出、div8 输出、PFD UP/DN、CP 输出、LPF 输出、FB),约 6~8 个 | 从「全节点」降到 8 个 | 全部 |
| L2 格式与步长 | psfascii → 二进制 psf;对非关键节点设抽稀输出(strobeperiod 类选项) |
文本→二进制通常降一个量级 | test_lock / test_pnoise |
| L3 measurement 替代 | test_mc 只取最终频点/功耗等标量,用 measurement/calcVal 落盘,不落波形 |
单点从 GB 降到 KB | test_mc |
目标:200 点总量从 780 GB → < 10 GB(估算,须以 L1 单点实测校准后再批量提交)。
硬门禁:L1 裁剪后的单点体积必须先实测一次(跑 1 个点、量 du),据此外推 200 点总量,确认 ≤ /projects 余量的 50% 才允许批跑。这是本方案的阻断项。
S2 实测结论(2026-10-04,vco5 网表;详见 SOP.md §6):① 格式(psfascii→psfbin)仅 3.4×、节点白名单线性(2→8 节点 ≈3×),都不足以达标;② 唯一数量级杠杆是输出抽稀(strobeperiod,实测 75~83×),skipcount=10 仅 ~11×;③ compression=yes 反效果(体积 ×1.73,禁用);④ 达标路径 = psfbin + strobeperiod ≤ 100p,60 µs/8 节点 ≈ 44.8 MB(200 点 ≈ 9 GB),勉强进 50 MB 门禁;⑤ 代价:100 ps 抽稀对 GHz 节点严重欠采样,只适合慢节点/包络——白名单须按「要不要 GHz 波形」分组定 strobeperiod。以上为 vco5(11 管)数字,pll_top(179 管)须在阶段 2 用真实 test_lock 单点复校。
6. 执行流程¶
1 门禁(只读) precheck:契约 + license + 存储余量 + 分区可用性 + 节点空闲
└ 任一 BLOCK → 终止,不提交任何作业
2 生成(幂等) 按 tag 生成 N 个作业定义;已存在且内容一致 → 跳过
3 提交 sbatch(route A:ADE-XL generic launcher / route B:--array)
4 监控 按状态量轮询(squeue),不用固定 sleep;单点失败计入阈值
5 收集 仅 stage-out 裁剪后的结果回 /projects;波形留在 Lustre
6 清理 trap 删 $TMPDIR;Lustre 靠老化 timer 兜底
7 报告 runs/<tag>/report.md:成功/失败/耗时/体积
门禁项明细(第一版)
| 检查 | 级别 | 判据 |
|---|---|---|
| 环境契约(os/工具版本/模块可用) | BLOCK | 与 contract.yaml 一致 |
| license 可达且 FEATURE 可检出 | BLOCK | .29 可连 |
/projects 余量 ≥ 预估总量 × 2 |
BLOCK | 预估由 L1 实测校准 |
| Lustre 余量 ≥ 单点波形 × 并发数 | BLOCK | 防止并发打满 295 G |
| 目标分区时限 ≥ 单点预估时长 | BLOCK | test_lock 必须落 long |
| 计算节点无他人作业 | WARN | sinfo / squeue 复核 |
| 运行身份 | BLOCK | 必须以 rain01 提交 |
7. 幂等、失败容忍与回滚¶
- 幂等单元 = tag:
runs/<tag>/已存在且内容一致 → 跳过;重跑同一 tag 默认拒绝(--force才覆盖,且先备份) - 失败容忍:单点失败不中断整批;失败数 >
maxJobFailPerPolicy(3) 或 > 批大小 10% → 停止后续批次 - 重试:
numRetriesOnError=1,禁止无限重试,禁止换参数绕过失败 - 回滚:本层不改系统状态,回滚 = 删
runs/<tag>/+ 清理 Lustre 该批 jobid 目录;不触碰design/pll45/下的 cell - 清理保护:删除前按实机路径推导受保护对象(
/projects与$HOME在保护名单内),推导失败即拒绝执行
8. Slurm 作业模板(草案)¶
#!/bin/bash
#SBATCH -J pll_%a
#SBATCH -p long # test_lock 必须 long(compile 1 天不够)
#SBATCH -N 1
#SBATCH -n 1 # 一核一点
#SBATCH --array=0-199%24 # 并发上限 24(= 集群总核数)
#SBATCH -t 3-00:00:00
#SBATCH -o logs/%A_%a.log
#SBATCH --mem=4G
# 固定入口:必须以 rain01 身份(root 跑会让 cell 属主变 root:design → SCH-1217)
module load cadence && module load virtuoso/IC06.17.700
export CDS_LOAD_ENV=CWD
cd "$TMPDIR" || exit 1 # 中间产物落本地层
trap 'rm -rf -- "${TMPDIR:-}"' EXIT # 临时层自清
WD=/mnt/lustre/scratch/users/rain01/$SLURM_JOB_ID
mkdir -p "$WD" && cd "$WD"
# 运行点 ${SLURM_ARRAY_TASK_ID}(route B:自带 runner 调用 spectre)
9. 实施步骤¶
| 阶段 | 内容 | 产出 | 阻断判据 |
|---|---|---|---|
| S1 | 环境契约 + 预检查脚本 | contract.yaml、precheck.py |
门禁可独立跑、全项可枚举 |
| S2 ✅ | 波形裁剪单点实测(2026-10-04 完成,见 SOP.md) |
九组对照 + 线性/可读性验证 + 外推 | 达标路径 = psfbin+strobe≤100p ≈44.8 MB/点(卡边缘);compression=yes 禁用 |
| S3 | 路线 A 最小验证(Command Job Policy + srun,3 点扫描)【方案已定,待 GUI 执行】 |
3 点自动跑完的证据 | 不通即转路线 B |
| S4 | 作业模板 + 幂等生成器 | job.sbatch、batch.py |
连续跑两次第二次零变更 |
| S5 | 结果归集与报告 | collect.py、report.md |
失败点可归因到具体 job |
| S6 | 小批量试跑(如 8 点) | 真实数字 | 全绿才放 200 点 |
| S7 | 200 点批跑 | 正式结果 | 按门禁放行 |
顺序理由:S2/S3 是两个未验证的关键假设,必须先证;否则后面全白做。
10. 风险与未决项¶
| # | 风险 / 未决 | 影响 | 处置 |
|---|---|---|---|
| R1 | ADE-XL generic launcher 对接方式未知(.ils 加密) | 路线 A 可能不通 | S3 最小验证;不通转路线 B |
| R2 | test_lock 单点 ≈56 核时是未含 PFD/CP/LPF 的下界 |
全链路可能超 long 的 3 天上限 | S2 实测全链路单点时长;超限则缩时长或拆段 |
| R3 | CDS_LIC_ONLY=1 语义未核实 |
理论上可能影响工具启动 | 实施前查清;实测未阻碍运行 |
| R4 | 裁剪后体积是估算 | 可能仍超预期 | S2 硬门禁校准 |
| R5 | Lustre 无 HA、单 MDT/OST | 并发写压力 | 限制并发、波形按 job 分目录 |
| R6 | maxarray 24 并发 vs NFS 元数据压力 |
I/O 抖动 | 并发可下调;按实测调 |
11. 与部署规范的适用裁剪(说明,非照搬)¶
本工程按 deployment-tool-engineering 走,但因领域特殊,以下条款裁剪并说明:
| 规范条款 | 本工程处置 |
|---|---|
| bundle / 离线包仓库 / manifest 签名 | 不适用——工具链在只读共享盘由 Lmod 提供,非本工程交付物 |
| 危险目标判定 | 沿用——转化为「清理 scratch 时的路径保护推导」,删除前必须推导受保护对象 |
| 环境契约 contract.yaml | 沿用,内容为 os/模块版本/分区上限/存储余量/license |
| 配置分层 defaults→env→site→CLI | 沿用,新环境只加 env.yaml |
| 三态幂等(done/pending/unknown) | 沿用,unknown 一律中止 |
| 分批 + 失败阈值 + 超阈值回滚 | 沿用,映射到 maxJobFailPerPolicy |
| 执行通道 provider 抽象 | 改造:执行通道是 Slurm 而非 SSH,抽象为「本地 / sbatch」两实现 |
| 漂移检测 | 部分适用:检测「作业产物与期望不符」,但无「系统期望态」概念 |
12. 版本与留痕¶
- 本方案为设计稿,实施后由
SOP.md承接八章结构(步骤/验证/回滚/坑) - 每次批跑的 tag 与结果进
runs/<tag>/report.md,成本数字回填measured-baselines.md
来源:
/home/rain/Documents/eda_tools_ins/design/hpc_slurm_20261003/DESIGN.md| 最后更新:2026-10-04 01:46(由build/sync.py同步,请勿在站点侧修改)