问题背景
跑深度学习任务,需要SSH到服务器的登录节点,在登录节点里申请计算节点,申请成功后Terminal界面会自动跳转(即SSH)到所申请的计算节点。
登录节点算力有限且不能用GPU,所以涉及cuda的debug环节需要在计算节点里完成。
如果不具备条件(比如显卡机时极其有限或者申请用卡特别麻烦),平时开发模型很多人的做法是:
1)先在本地机器或登录节点的CPU环境里面调试模型。用CPU测试模型的前向传播当然是可行的——只是反向传播速度比较慢,用它来训练大模型不现实而已。把涉及cuda的部分都用torch.cuda.is_available()
括起来,也不会有没GPU运行不了的问题。
2)CPU环境测试通过后,把代码、数据集和所有其他文件上传到服务器(用SFTP手工上传,或者在github上用git push, git pull命令中转一下),在服务器申请一个交互式计算节点(interactive session,交互式即允许print()
),在Terminal端用指令的形式训练几个epoch,结合屏幕输出情况观察训练是否能正常进行
3)确定模型训练没问题后,在计算节点申请长时间的任务。用指令提交任务和程序入口。跑完后查看以文件形式输出的运行结果。
这样做当然是有些麻烦的,所以对于计算机时比较充分的选手们来说,能不能直接用交互式计算节点作为本地IDE的Python远程解释器,实现cuda相关代码的实时调试呢?这有时候是个比较玄学的问题,但在一些情况下完全是可行的,其关键就是在本地机器SSH的config文件中使用ProxyJump
关键字将登录节点作为跳板实现转发功能。
操作步骤
-
SSH登录公共节点
ssh [YOUR_ID]@[login node address] -
在登录节点中申请计算节点,并获取其SSH地址
申请算力这部分不同提供商采用的命令不同,就不放命令了。
自动进入计算节点后,输入echo $SSH_CONNECTION
,复制屏幕输出的第二个IP地址,再敲入nslookup xxx.xxx.xxx.xxx
命令获取其域名,下文记为[compute node address]。
*注:如果输入echo $SSH_CONNECTION
后输出为空白,说明计算节点的网络连接有问题,这种情况目前博主暂无解决办法。 -
将模型代码上传到服务器端
-
本地计算机上启动 VS Code,安装SSH插件, 点击左下角绿色的SSH标签, 依次点击 ‘Connect to Host’ - ‘Configure SSH Hosts’. 如果本地机器是Windows, 就选择 ‘C:\Users[YOUR_USER_NAME]\ .ssh\config’. 输入如下配置:
Host login_node
HostName [login node address]
User [YOUR_ID]
Host compute_node
HostName [compute node address]
ProxyJump login_node
User [YOUR_ID]
(注:这里的 login_node 和 compute_node 都可以改为你喜欢的名字)
保存关闭。
- 再次点击左下角绿色的SSH标签,按屏幕提示连接到 compute_node 即可。
IDE适配性
经博主测试,PyCharm貌似不支持根据系统SSH的config内容来自定义SSH连接,所以应该是不支持这种跳板。VS Code的表现就相对好很多。而且在文件同步方面,VS Code是直接在服务器端操作,PyCharm是本地操作后要同步一下才会上传到服务器端,文件多的时候就比较慢。