dsh-slurm:在 DeepSeek Harness 里提交与跟踪 Slurm 作业

前言

在集群上跑训练或批处理时,常见做法是另开终端 sbatch,再反复 squeue 看状态,结束后再回到对话里说明结果。DeepSeek Harness(DSH)把 Agent 和工具链放在同一套界面里;若要把 Slurm 队列接进这条工作流,就需要在 Host 侧通过 SSH 访问登录节点、在对话里提供提交与查询工具,并在作业结束时把日志摘要送回当前 Chat。下面介绍社区插件 dsh-slurm(仓库 zghehejun233/dsh-slurm,SkillHub 分类为工作流),它面向上述场景,且不在计算节点上部署额外 Agent 或守护进程。

这是什么

dsh-slurm 是 DSH 的 Slurm 队列插件(README 简述:Slurm queue for DeepSeek Harness)。维护者与分发以 GitHub 仓库 zghehejun233/dsh-slurm 为准;package.json 中作者字段为 ThuRAY,许可证为 MIT,当前包版本为 0.5.10。插件要求 DSH 0.2.2-rc.1 区间(>=0.2.2-rc.1 <0.2.3-0),Node.js 为 ^22.19.0 或 >=24。

它解决三件事:用结构化参数 sbatch 提交作业;在右侧边栏合并展示跟踪作业与实时队列;作业到达终态时向所属 Chat 投递一次完成消息(含状态、退出码、耗时与日志尾部),并可附带继续提示,让 Agent 在作业结束后自动接着做后续步骤。

环境与依赖

项目 要求
DeepSeek Harness 0.2.2-rc.1(见 README 兼容性说明)
Node.js ^22.19.0 或 >=24
SSH OpenSSH 客户端;密钥或 ssh-agent(BatchMode=yes)
可选 dsh-better-sidebar(≥0.28.2)用于面板;未安装时工具与完成跟进仍可用

集群侧不需要安装本插件对应的 Agent、守护进程或额外包:DSH 的 Host 进程通过 OpenSSH 连接登录节点,并复用 dsh-ssh 中的主机配置。

核心功能

集群选择

边栏面板标题区有 Cluster 下拉框,列表来自 ~/.dsh/dsh-ssh.json 以及插件配置中的 config.host。选中主机后写入 $DSH_HOME/slurm/prefs.json(权限 0600)并立即生效;各 slurm_* 工具默认使用该主机,单次调用仍可通过 host 参数覆盖。Agent 系统提示中会渲染「当前集群:」。若未使用 dsh-ssh,可在插件配置里设置 host 为 user@host[:port],再从同一下拉框选择。

右侧边栏面板

打开右侧边栏,点击 +,选择 Slurm queue / Slurm 队列。面板为只读:展示集群选择、运行中/排队/已完成计数、合并后的作业行(跟踪账本与实时 squeue 在 Host 侧合并,不重复显示)、进度条、最近完成记录与分区容量摘要。轮询在页面隐藏时暂停;有活跃作业时默认每 8 秒刷新(panelRefreshSeconds),空闲时 20 秒。连接失败会保留上一帧快照并提示。

Agent 工具

工具 作用
slurm_status 分区/GRES、节点 CPU/GPU、个人队列、账务历史及指定作业的 scontrol 详情
slurm_submit 经 stdin 写入批处理脚本,sbatch --parsable 返回作业 ID;followUp 注册完成唤醒;dryRun 仅打印命令
slurm_jobs 跟踪账本:最近状态、是否已通知、所属 Chat
slurm_logs 尾随 stdout/stderr,路径来自账本或 scontrol
slurm_cancel scancel 单个作业,不自动重提
slurm_watch 将已提交作业绑定到当前 Chat(attach)或停止跟踪(detach)
slurm_fetch 经 SFTP 递归下载到会话工作区或 $DSH_HOME/slurm/results 下的新目录,并拒绝符号链接逃逸

提交示例(摘自 README):

slurm_submit({
  script: "#!/bin/bash\n#SBATCH --job-name=train\npython train.py\n",
  partition: "gpu", gpus: 1, cpus: 8, mem: "64G", time: "02:00:00",
  followUp: true, prompt: "Training finished: inspect the log and report loss."
})

完成跟进(completion follow-up)

被跟踪作业进入终态后,监视器向所属 Chat 注入一条用户角色消息,包含作业 ID、主机、名称、状态、退出码、耗时、日志路径,以及不可信标注下的日志最后若干行(默认 40 行,logTailLines)和可选的 <continue prompt>。等待过程不消耗模型 token;仅完成消息触发新一轮对话。若 Chat 忙碌,消息进入收件箱;投递为至少一次语义,失败时按 30s / 2m / 10m / 30m / 1h 退避重试,最多五次,slurm_jobs 可查看 notifyFailedAt。若作业同时从 squeue 与 sacct 消失,状态保留为 MISSING,不会自动当作成功结束。

安装与启用

插件以当前 DSH 进程权限运行;安装前建议阅读仓库源码与 MIT 许可证。DSH 生态采用「一切皆插件」思路;SkillHub(插件目录页)为社区站点,与 DeepSeek / 幻方无官方从属关系。

桌面端(profile 为 desktop):

dsh plugin --profile desktop add dsh-slurm
# 然后退出并重新打开 DeepSeek Harness

由 dsh web 提供的 Web GUI(profile 为 web):

dsh plugin --profile web add dsh-slurm
dsh web

也可在 Web UI 中:Plugins → Add plugin,粘贴包名、release 的 .tgz 绝对路径或源码目录。安装或替换代码后需重启 DSH 一次,并对页面硬刷新(Cmd/Ctrl+Shift+R),以便 Host 与 Client 加载新模块代。

配置要点

Bundle 默认插入一行插件项,不自带默认主机:

- insert:
    - id: dsh-slurm
      name: dsh-slurm

常用字段(默认值见 README 配置表):

字段 默认 含义
host '' 未在面板选择时的回退主机:dsh-ssh 别名或 user@host[:port]
workdir '' 远程脚本/日志默认目录,空则为 $HOME
pollSeconds 60 监视器间隔(15–600)
panelRefreshSeconds 8 面板可见时轮询(3–60)
followUpByDefault true 提交时默认跟踪,除非显式关闭
continuePrompt 内置模板 支持 {jobId} {name} {state} 等占位符
maxLogBytes 65536 单次日志读取上限
connectTimeoutMs 10000 SSH 连接超时

安全与适用注意

批处理脚本经 stdin 发送;模型提供的值在到达远程 shell 前会加单引号,ssh 使用 -- 调用。面板 API 仅监听 loopback;切换集群的写入需 JSON 与同源 Origin。插件不存储密码或私钥,认证交给 OpenSSH 与 dsh-ssh 主机定义。完成消息中明确标注作业输出为不可信数据。slurm_fetch 使用 SFTP 批命令、不启远程 shell,并限制目标路径在工作区或 $DSH_HOME/slurm/results 内。

适合已在 Slurm 集群上工作、且希望把提交、查队列、读日志与「作业结束后继续对话」收拢到 DSH 里的开发者。若不配置 SSH 密钥或 dsh-ssh 主机,需先解决登录节点可达性,否则工具与面板无法读队列。

结尾

dsh-slurm 把 Slurm 的提交与观测接到 DSH 工具与边栏上,并用一次性完成消息把长跑作业和 Agent 回合衔接起来;集群侧仅需 SSH 可达的登录节点。进一步了解可查看 SkillHub 目录页 与 GitHub 仓库 中的 README 与 CHANGELOG。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜