VSCode远程SSH配置srun分配GPU调试Python脚本故障咨询
原有操作流程
目标是优化手动操作链路,实现直接在VSCode中调用GPU资源完成代码调试与sanity测试,原有手动流程如下:
- 连接SSH代理服务器
- 连接目标SSH登录节点
- 调用conda激活对应虚拟环境
- 执行srun命令申请GPU计算资源,执行命令为:
srun -p normal.q --mem=20GB --cpus-per-task=2 --gres=gpu:quadro_rtx_6000:1 /bin/bash -i
- 运行目标Python脚本
已完成基础配置
- 已编写自定义SSH配置文件,完成SSH免密密钥、proxyCommand代理跳转规则配置,配置内容如下:
Host runningHostWithoutGPU HostName host User myuser ProxyCommand C:\Windows\System32\OpenSSH\ssh.exe -q -x ProxyHost -W %h:22 IdentityFile ~/.ssh/id_rsa RemoteCommand srun -p normal.q --mem=20GB --cpus-per-task=2 --gres=gpu:quadro_rtx_6000:1 /bin/bash -i
- VSCode Server已成功在目标登录节点部署,代理链路连接正常,支持在远端主机编辑、保存文件
- VSCode Python解释器设置中可正常识别目标conda虚拟环境
现存问题
配置后srun命令未实际执行,SSH连接仅停留在登录节点未跳转至GPU计算节点,启动Python文件运行时无法调用GPU资源。
已尝试的无效方案
- 为调试器配置preRunning前置任务,编写shell脚本执行srun资源申请命令,未产生效果
- 在SSH配置中添加remoteCommand参数:原生Windows ssh.exe可通过该配置成功跳转至GPU节点,但VSCode无法通过该配置建立正常连接。
可行配置方案
方案1:适配Remote-SSH机制直连计算节点(推荐,支持断点调试、代码补全全功能)
之前加remoteCommand连不上的核心原因很简单:VSCode Remote-SSH默认会把服务端程序部署在SSH连接落地的第一台机器(也就是登录节点),直接配RemoteCommand跳srun到计算节点时,节点上没有运行对应的VSCode Server进程,连接必然失败。
- 先用不带RemoteCommand的SSH配置正常连到登录节点,在登录节点用户家目录下创建脚本
srun_gpu.sh,内容填入资源申请命令:
#!/bin/bash srun -p normal.q --mem=20GB --cpus-per-task=2 --gres=gpu:quadro_rtx_6000:1 --pty $SHELL -l
写完给脚本加执行权限:chmod +x ~/srun_gpu.sh
2. 打开本地VSCode的设置,搜索Remote.SSH: Remote Command,找到runningHostWithoutGPU主机对应的配置项,填入远程执行命令:bash -i -c "~/srun_gpu.sh"
3. 关键配置,绝大多数连接失败都是漏了这步:继续搜索Remote.SSH: Use Local Server,勾选对应主机的配置项。开启后VSCode会把服务端进程直接启动在RemoteCommand最终跳转的目标机器(也就是GPU计算节点)上,不会再默认部署到登录节点。
4. 断开现有SSH连接重连,等VSCode在计算节点完成Server部署后,选择提前识别到的conda虚拟环境作为Python解释器即可,此时不管是直接运行代码还是打断点调试,都会在GPU节点上执行,可正常调用显卡资源。
方案2:自定义终端跳转(适合轻量sanity测试,无需修改SSH核心配置)
如果不需要复杂断点调试,只是改完代码快速跑通验证逻辑,用这个方案更灵活,不会因为srun资源排队卡住整个VSCode连接:
- 删除SSH配置里的RemoteCommand项,保持现有能正常连接登录节点的配置即可,保证VSCode可以正常打开远端目录、编辑保存文件。
- 连接到登录节点后,打开VSCode远端用户设置,搜索
Terminal > Integrated > Profiles: Linux,新增一个名为「GPU计算节点终端」的配置项,内容如下:
{ "GPU计算节点终端": { "path": "/bin/bash", "args": ["-i", "-c", "srun -p normal.q --mem=20GB --cpus-per-task=2 --gres=gpu:quadro_rtx_6000:1 /bin/bash -i"] } }
- 后续需要运行脚本时,在VSCode终端下拉菜单选择新建的GPU节点终端,等srun申请到资源、终端跳转到计算节点后,手动激活conda环境执行Python脚本即可。
注意事项:如果集群srun申请资源需要排队,使用方案1时整个VSCode连接会等待资源分配完成后才加载完成,排队期间显示连接中属于正常现象,不是程序卡死。如果排队时间较长建议优先用方案2,编辑文件不受登录节点限制,需要跑代码时再单独开终端申请资源。
内容的提问来源于stack exchange,提问作者Tankwell

