为了解决抢占 GPU 资源的问题,最近 DIKU 开始推行 Slurm。
Slurm 任务调度工具(前身为极简 Linux 资源管理工具,英文:Simple Linux Utility for Resource Management,取首字母,简写为 SLURM),或 Slurm,是一个用于 Linux 和 Unix 内核系统的免费、开源的任务调度工具,被世界范围内的超级计算机和计算机群广泛采用。它提供了三个关键功能。第一,为用户分配一定时间的专享或非专享的资源 (计算机节点),以供用户执行工作。第二,它提供了一个框架,用于启动、执行、监测在节点上运行着的任务 (通常是并行的任务,例如 MPI),第三,为任务队列合理地分配资源。
大约 60%的 500 强超级计算机上都运行着 Slurm,包括 2016 年前世界上最快的计算机天河 - 2。
Slurm 使用基于 Hilbert 曲线调度或肥胖 网络拓扑结构的最适算法,以便优化并行计算机中的任务分配。
在用了 Slurm 之后,原来从 Local Machine 直接登录 GPU Server 这样的两层结构,变成了
Local Machine -> Gate -> Slurm -> GPU Server 这样的四层结构。以前的话,直接在 Local Machine 上登录 GPU Server,但 GPU 资源会一直被霸占或者什么的,引入 Slurm 就是为了更好地让大家利用资源。现在的话,必须先从 Local Machine ssh 登录 Gate Server,然后再从 Gate Server ssh 登录 Slurm,我们能登陆的就到这里了,在 Slurm 服务器上把 任务 提交,Slurm 会自动给分配计算资源,运行完后,会有类似 slurm-xxxxxx.out
这样的格式的输出,就相当于程序运行的结果
具体可以看 http://image.diku.dk/mediawiki/index.php/Slurm_Cluster
使用
Local Machine -> Gate Server
在 .ssh/config
中添加如下内容,记得把
1 | Host gate-diku |
然后运行 ssh gate-diku
就ssh 登录到了 Gate Server 上去了
Gate Server -> Slurm Server
登录 Gate Server 后同样的,vim .ssh/config
添加一样的内容,
1 | Host gate-diku |
然后运行 ssh cluster
就ssh 登录到了 Slurm Server 上去了。事实上,是可以直接从 Local Machine SSH 登录到 Cluster 的。
Slurm Server -> GPU Server
这一步,我们并不被允许直接登录 GPU Server 但是我们可以用 sbatch XXXX.sh
这样的命令提交我们的请求,也就是说我们要在 XXXX.sh 里面指定好我们要什么资源,要运行什么程序
以 Start a Job on the GPU cluster 为例
1 | #!/bin/bash |
总体的原则是 需要的资源越少,越会被提前安排。
--cpus-per-task=10
指定需要多少个 CPU,--gres=gpu:titanx:2
指定需要什么型号的 GPU,要几个,可以 --gres=gpu:1
即不一定非要 titanx,gpu 只要一个,但最好还是制定一下 GPU,因为里面有一个很老的 GTX 450,且不在列表上,被分配到这个上去就坑了。
#SBATCH --time=4:00:00
指定需要多长时间,这里是 4 hour,改少一点,和实际相符,如果太长的也会被往后排;太短超过了时间很可能会被中止。
注意 hostname
就保持不变,不要真改成什么 gpu01-diku-image
这种
查看
查看排队和运行情况
squeue | grep <kuid>
如果要看实时的输出
watch -n 1 "squeue | grep <kuid>"
实时查看 log file 的变动
tail -n 1 -f slurm-xxxxxx.out
上面的 1
都是指 1 秒。
问题
Check failed: err == CUDNN_STATUS_SUCCESS (6 vs. 0) CUDNN_STATUS_ARCH_MISMATCH
这个原因是因为 GPU 太老的问题,程序被分配到很老的 GPU 上去了。在 DIKU 的 cluster 中有一个很老的 GPU,解决方法就是在 sbatch 的 shell 文件中指定好新的 GPU。
如果您觉得我的文章对您有所帮助,不妨小额捐助一下,您的鼓励是我长期坚持的动力。