dsh-pku-cluster: Integrating Peking University Weiming Teaching Cluster No. 2 into DeepSeek Harness

前言

在 DeepSeek Harness(DSH)里让 agent 往 HPC 集群提交作业,常见做法是自己在终端反复 ssh、输密码和手机令牌。教学二号集群不支持密钥登录,只能密码加 OTP,每开一个新 shell 或新工具链都要再来一遍。WSL2 用户还会遇到另一层问题:Windows 上的学校 VPN 只接管 Windows 网络栈,WSL 里往往 ping 不通登录节点。

下面介绍社区插件 dsh-pku-cluster(维护者 KonataRings):在 DSH 侧边栏完成一次登录后,用 OpenSSH ControlMaster 复用连接,并提供 pku 命令供 agent 与本地 shell 上传、提交、查队列;在 Windows + WSL2 场景下内置 loopback 中继,让 WSL 里的 ssh 能经 Windows VPN 到达集群。

这是什么

dsh-pku-cluster 是 DSH 的客户端类插件:宿主侧写 ~/.pku-cluster/ 下的登录驱动与 CLI,客户端侧在侧边栏提供「连接集群」面板。目标环境是北京大学未名教学二号上机账号;loginHost 可在配置里改,但 pku jobs 等命令按 CraneSched / Slurm 习惯编写,换集群需自行核对。

插件以当前 DSH 进程权限运行,会往家目录写入脚本与配置。安装前建议在 GitHub 仓库 查看源码与 MIT 许可证。

核心功能

侧边栏点「连接集群」,输入学号、门户密码和 OTP 后,状态点变绿即表示 ControlMaster 已建立。README 说明:一次认证约可复用 8 小时(ControlPersist=8h),期间 ssh / scp / rsync 经同一条 master;密码与 OTP 只经 stdin 交给 login.py,插件不保存密钥。学号会写入 ~/.pku-cluster/config.json(权限 600),不属于机密字段。

凭据不落盘之外,还有这些已文档化的能力:

  • 多路 SSH:~/.pku-cluster/pku 提供 status、run、push / pull、sbatch、jobs、log、shell、down 等子命令,无需改 ~/.ssh/config。
  • WSL 与 VPN 桥接:Windows 上插件在 WSL 虚拟网卡对应地址监听 relayPort(默认 2222),转发到 loginHost:22;Linux / macOS 直连登录节点。
  • 零额外 Python 依赖:登录驱动仅用标准库 pty。
  • Diagnose:面板内自检 Python、pty、ssh、端点可达性等,并给出修复提示。

DSH 退出或重启时,中继随插件进程关闭,复用连接会失效——这是发布版的设计,不是疏漏。

前置条件

项目 要求
账号 教学二号上机账号(学号 / 工号)
OTP 已在 https://hpc.pku.edu.cn/authotp/otp 绑定手机令牌;手机时间需准确
网络 校内网,或校外先连学校 VPN(Windows 上为 iSecSP)
系统 Windows 11 + WSL2,或 Linux / macOS
工具 ssh、rsync(WSL 内可 sudo apt install openssh-client rsync)
DSH 能安装本地插件;Node 引擎要求 >=20(见 package.json)

不适合需要完全无人值守访问的场景:平台限制为密码 + OTP,无法密钥免密。

安装与启用

任选一种官方方式(<profile> 换成你的 DSH profile,例如 desktop):

从 GitHub(需本机已装 Git):

dsh plugin --profile <profile> add git+https://github.com/KonataRings/dsh-pku-cluster.git

未装 Git 时可用压缩包(README 示例标签为 v0.1.1):

dsh plugin --profile <profile> add https://github.com/KonataRings/dsh-pku-cluster/archive/refs/tags/v0.1.1.tar.gz

或从 npm:

dsh plugin --profile <profile> add dsh-pku-cluster

包页:https://www.npmjs.com/package/dsh-pku-cluster。

装完后完全退出 DSH 再重开(不是刷新页面)。侧边栏底部靠近「移动访问」处会出现「连接集群」。同一 profile 内不要重复安装同名插件,以免路由与客户端模块 id 冲突。

首次使用

  1. 校外先连 VPN,确认 Windows 上 iSecSP 的 TAP 适配器为 Up。
  2. 打开侧边栏 连接集群,填写学号、密码、当前 OTP(约 30 秒有效)。
  3. 点 Log in;首次会按 accept-new 接受主机指纹。
  4. 面板显示 connected、状态点为绿即成功。异常时用 Diagnose 逐项排查。

典型用法

登录成功后,在 WSL 或本机执行 ~/.pku-cluster/pku。README 中的完整提交流程如下:

mkdir -p ~/proj && cd ~/proj
cat > job.sh <<'SH'
#!/bin/bash
#SBATCH -J myjob
set -euo pipefail
WORKDIR=/nfs-share/home/<学号>/proj
cd "$WORKDIR"
RAW="${SLURM_CPUS_PER_TASK:-4}"; CPUS=$(printf '%.0f' "$RAW")
export OMP_NUM_THREADS="$CPUS" MKL_NUM_THREADS=1
source ~/miniforge3/etc/profile.d/conda.sh
conda activate dmet-minimal
python -u main.py
SH

pku push main.py proj/
pku sbatch job.sh proj/
pku jobs
pku log proj/job.out 80

文档强调两点:调度器会复制脚本执行,工作目录须写死绝对路径;SLURM_CPUS_PER_TASK 可能是 "4.00" 这类浮点字符串,给 OMP_NUM_THREADS 前应先取整。

若希望每个新对话里的 agent 默认走 pku,把 README 中的「集群(北大教学二号)」段落写入项目的 AGENTS.md 或 skill,说明先 VPN、再侧边栏登录,以及禁止在登录节点跑计算、一律 sbatch。

配置(可选)

在 profile 的 cordis.patch.yml 里覆盖插件 config:

- id: pku-cluster
  name: dsh-pku-cluster
  config:
    loginHost: wmjx2-login.pku.edu.cn
    loginPort: 22
    relayPort: 2222
    distro: ''
    autoInstall: true

distro 留空时取 wsl -l -q 的第一个发行版;autoInstall: false 时插件不再自动写入 ~/.pku-cluster/*。

适用场景与注意

适合:有教学二号账号,在 DSH 里希望 agent 直接 pku push + pku sbatch,减少终端重复认证;Windows + WSL2 且已用学校 VPN 的用户。

不适合:其他学校集群(需改 host 并自测队列命令)、无头服务器、或期望 DSH 重启后仍保持 SSH master 而不重新登录(发布版中继不独立常驻)。

卸载示例:

dsh plugin --profile <profile> remove dsh-pku-cluster
rm -rf ~/.pku-cluster

插件不改 ~/.ssh/config,也不写系统服务;社区目录 skillhub.cn 插件页 与 GitHub 相互独立,均非 DeepSeek / 幻方官方应用商店。

结尾

dsh-pku-cluster 把教学二号特有的密码 + OTP 与 WSL/VPN 网络差异收进 DSH 侧边栏和一条 pku CLI,让 Harness 里的 agent 能在复用连接上完成传文件、交作业、看队列。需要细节、排障与兼容性说明时,以仓库 README 为准。

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

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

Xiaoye