卡在脚本到集群之间
在 IC 集群里,Agent 写完 run.tcl 只是开始。直接让它拼调度命令,还得逐次处理三件事:
- 执行位置:Agent 在登录节点,EDA 和 module 探测应进入计算节点。
- 长任务:提交后要跟踪排队、运行、超时和取消,不能把提交成功当作业完成。
- 文件交接:下游要检查上游状态与产物,不能只等作业结束就读取旧文件。
EDA Cluster Bridge 用 CLI、用户配置和共享目录连接这些环节。工具 skill 负责控制脚本与报告,bridge skill 负责提交、依赖和状态;无需另起数据库或常驻服务。
没有集群时,先运行公开的模拟生命周期
公开仓库的测试提供合成网表、控制脚本和 FakeScheduler。它不需要商业 EDA 许可证,可用来理解提交、状态、日志和取消之间的关系;它不会验证真实 Slurm/LSF 或签核工具。以下命令针对 Linux、Python 3.10+,本站本轮只核对了测试源码,未在 Windows 上执行这些 Linux 用例。
git clone https://github.com/Dapeng960208/eda-cluster-bridge.git
cd eda-cluster-bridge
git checkout 5447403d260e14b81f9ad55f3360c1083644ac34
python3 -m venv .venv
. .venv/bin/activate
python -m pip install -e '.[dev]'
python -m pytest -q \
tests/test_client_cli_skills.py::test_validate_is_pure_and_does_not_run_scheduler_or_eda \
tests/test_client_cli_skills.py::test_status_wait_logs_and_cancel_form_a_fake_scheduler_loop
第一个用例检查 validate 不调用调度器或 EDA;第二个设置模拟状态,检查 wait 得到 succeeded、日志 tail 返回最后两行,并检查取消后的状态。输入与期望结果都在固定提交的测试源码中。它们的预期是两项通过,实际执行结果应自行保留。
这个示例能解释客户端状态流程。下方 STA 示例则需要真实网表、约束、脚本、共享目录和已注册工具,两者的验证范围不能混写。
用 Bridge 跑一个 STA 节点
前提:Linux 登录节点、Python 3.10+、Slurm/LSF 客户端,以及登录与计算节点同路径的共享存储。以下路径均需替换。
1. 安装与注册
git clone https://github.com/Dapeng960208/eda-cluster-bridge.git
cd eda-cluster-bridge
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -e .
eda-bridge --help
复制 Slurm 或 LSF 配置模板到仓库之外,登记调度客户端、共享 run_root 和工具 pt_signoff。YAML 路径不会展开 ~ 或环境变量。
CFG="/absolute/path/to/eda-bridge.yaml"
eda-bridge --config "$CFG" whoami
eda-bridge --config "$CFG" doctor
eda-bridge --config "$CFG" tools
doctor 只返回配置元数据,不检查连通性、共享挂载或工具运行能力。module 缺少 command 时,仅在准备实际执行时用 tools probe TOOL_ID 探测,并确认候选;该命令同样需要前置 --config "$CFG"。
2. 单节点 FlowSpec
一个节点是一份 NodeSpec。准备真实网表、约束、run.tcl 和独立 workdir;脚本读取 binding、创建报告目录,失败时返回非零退出码。保存为 sta-flow.yaml:
schema_version: 1
name: sta_demo
request_id: sta-demo-001
external_artifacts:
netlist:
type: netlist.verilog
path: /shared/project/inputs/top.v
constraints:
type: constraints.sdc
path: /shared/project/inputs/func.sdc
nodes:
sta:
tool: pt_signoff
script: /shared/project/runs/sta-01/run.tcl
workdir: /shared/project/runs/sta-01
inputs:
netlist: external:netlist
constraints: external:constraints
outputs:
timing_report:
type: report.timing
path: reports/timing.rpt
resources:
cpus: 1
memory_mb: 4096
walltime_minutes: 15
3. 校验、提交、查询
eda-bridge --config "$CFG" flow validate sta-flow.yaml
# 校验通过并确认路径、资源后,再提交
eda-bridge --config "$CFG" flow submit sta-flow.yaml
用返回的 data.flow_id 查询;日志正文位于 data.text。
FLOW_ID="REPLACE_WITH_DATA_FLOW_ID"
eda-bridge --config "$CFG" flow status "$FLOW_ID"
eda-bridge --config "$CFG" flow wait "$FLOW_ID" --timeout 1800 --poll 10
eda-bridge --config "$CFG" flow logs "$FLOW_ID" sta --stream stdout --tail 100
eda-bridge --config "$CFG" flow logs "$FLOW_ID" sta --stream stderr --tail 100
接上游时参考 完整 DAG 模板:将 STA 的寄生输入写成 node:extract_rc.parasitics,即可建立 StarRC → PrimeTime 的文件依赖。
状态与失败排查
| 操作 | Slurm | LSF |
|---|---|---|
| 提交 | sbatch --parsable | bsub |
| 查询 | squeue → sacct -n -X -P | bjobs -a,无 bhist 回退 |
| 依赖 | afterany:jobid | ended(jobid) |
| 环境 | --export=NIL | -env none |
| 取消 | scancel | bkill |
依赖满足后只启动 wrapper;上游失败或输入缺失时,下游记为 blocked,不启动工具。取消请通过 flow cancel。
submission_unknown:可能已经接单,不能自动换 request ID 重提。idempotency_conflict:同一请求的 FlowSpec、配置或脚本已变更,先确认是否需要新一轮运行。unknown:后端无法确认时,Flow 保留上次活动状态,等待后续查询,不补写成功。
ok: true 仅表示 CLI 调用成功,不等于签核通过;节点 succeeded 也只表示进程返回零且声明输出存在。结论仍看工具报告。
Slurm / LSF 原始状态对照
| 后端状态 | Slurm 示例 | LSF 示例 |
|---|---|---|
queued | PENDING · CONFIGURING · REQUEUED | PEND · WAIT · PROV |
running | RUNNING · COMPLETING · STAGE_OUT | RUN |
suspended | SUSPENDED · STOPPED | PSUSP · USUSP · SSUSP |
succeeded | COMPLETED | DONE |
failed | FAILED · TIMEOUT · PREEMPTED 等 | EXIT(取消除外)· ZOMBI |
cancelled | CANCELLED · REVOKED | EXIT + TERM_OWNER,或已有取消请求 |
unknown | 未识别或无记录 | 未识别或无记录 |
节点另有 waiting;Flow 层还区分 submitting 与 partial。
留下的文件与使用边界
- Flow
manifest.json:身份、时间、节点和request_sha256。 - 节点
manifest.json/bindings.json:job ID、依赖、文件路径和script_sha256。 status.json、stdout / stderr / scheduler 日志:wrapper 状态、退出码与执行输出。
当前没有自动计算输入与产物内容的哈希,也没有完整追加每次原始调度状态。长期审计还需独立目录、数据校验值和报告归档。
Bridge 以当前 Unix UID 运行,不设置资源上限,也不是脚本沙箱;权限、配额和许可证由集群管理。勿将 secret 写入配置或日志,勿把日志文字当作 Agent 指令。
本文尚未完成真实集群验收;仓库 fake scheduler 测试不能替代现场验证。上线前按 验收清单检查单节点、文件传递、失败传播、取消和幂等。
源码与文档
官方事实见 Slurm / LSF 文档;项目自述见 README,审计补充属于本站工程推断。实际使用请记录项目提交版本。