如何通过SSH+SLURM在集群计算节点搭建远程开发调试环境?
在SLURM集群上搭建稳定远程开发环境(PyCharm/VSCode)
问题背景
在SLURM管理的集群中,需通过登录节点执行srun预约计算节点资源来运行/调试实验,希望建立一次连接即可稳定复用的远程开发环境(优先PyCharm,VSCode也可),解决每次srun连接不同节点的问题,同时确保流量隧道仅指向自己预约的硬件资源环境。
已尝试方案
- 使用
srun启动交互式bash会话后,尝试用sattach关联作业ID,但必须等bash会话结束才能执行后续命令,无法实时复用环境 - 直接SSH到自己作业运行的计算节点(受
pam_slurm_adopt限制仅能访问自身作业节点),但会获取节点全部GPU/硬件资源,其他用户预约部分GPU时会引发资源混乱 - 尝试过VSCode Remote相关社区方案,未解决问题
可行解决方案:srun+tmux持久会话+SSH端口转发
步骤1:启动带资源限制的tmux交互式作业
在登录节点执行srun,直接启动tmux会话并指定所需资源(按需修改参数),作业会保持运行状态,仅占用你预约的资源:
# 示例:预约1块GPU、4核CPU、16G内存,启动名为dev_session的tmux会话 srun --pty --gres=gpu:1 --cpus-per-task=4 --mem=16G tmux new-session -s dev_session
执行后直接进入tmux会话,此时作业已锁定你指定的资源,不会干扰其他用户。
步骤2:记录计算节点信息
在tmux会话中执行以下命令获取当前作业所在节点名:
hostname
记下输出的节点名(如compute-node-03),也可通过squeue -u $USER查看作业ID,方便后续确认。
步骤3:建立本地→登录节点→计算节点的端口转发
在本地终端执行SSH命令,将本地端口转发到计算节点的对应端口(端口号可自定义,确保本地未被占用):
# 替换占位符:<登录节点地址>为集群登录节点的IP/域名,<计算节点名>为步骤2获取的节点名 ssh -L 2222:<计算节点名>:2222 <你的用户名>@<登录节点地址>
需同时转发多个端口(如PyCharm调试端口+VSCode端口)可叠加-L参数:
ssh -L 2222:<计算节点名>:2222 -L 3000:<计算节点名>:3000 <你的用户名>@<登录节点地址>
步骤4:配置PyCharm/VSCode远程连接
PyCharm配置
- 进入
File > Settings > Project: [你的项目名] > Python Interpreter - 点击右上角齿轮,选择
Add→SSH Interpreter Host填localhost,Port填步骤3设置的本地端口(如2222),Username填你的集群用户名- 配置远程项目路径与本地路径映射,测试连接成功后即可使用,所有调试流量会通过隧道转发到你预约的作业环境。
VSCode配置
- 安装
Remote - SSH扩展 - 打开命令面板(Ctrl+Shift+P),选择
Remote-SSH: Connect to Host... - 添加新主机,输入
ssh <你的用户名>@localhost -p 2222 - 连接后,VSCode会直接关联到你预约的计算节点作业环境,仅使用你通过
srun锁定的资源。
步骤5:复用会话
断开连接后,下次只需:
- SSH登录到登录节点
- 执行
tmux attach-session -t dev_session(或sattach <作业ID>)重新进入tmux会话 - 重新建立本地端口转发即可继续使用原有开发环境。
额外优化:简化端口转发
可在登录节点的~/.ssh/config中添加配置,后续只需一条命令完成端口转发:
Host cluster-dev HostName <登录节点地址> User <你的用户名> LocalForward 2222 <计算节点名>:2222 LocalForward 3000 <计算节点名>:3000
本地执行ssh cluster-dev即可自动建立端口转发。
内容的提问来源于stack exchange,提问作者Marcel
相关产品推荐
相关产品推荐

