最近一个同学的提醒下,发现自己之前直接在节点上运行python文件是错误的,我也不知道这样会不会影响其他用户的程序,但是我发现用coco数据集训练YOLO网络分类的时候,运行的速度也比较慢。由于当时的粗心,没有看到平台使用指南里面说的需要使用Slurm资源管理系统来运行计算程序,在和同学的讨论下,初步学会了Slurm的使用。

Slurm资源管理系统介绍

SLURM (Simple Linux Utility for Resource Management)是一种可用于大型计算节点集群的高度可伸缩和容错的集群管理器和作业调度系统,被世界范围内的超级计算机和计算集群广泛采用。SLURM 维护着一个待处理工作的队列并管理此工作的整体资源利用。它以一种共享或非共享的方式管理可用的计算节点(取决于资源的需求),以供用户执行工作。SLURM 会为任务队列合理地分配资源,并监视作业至其完成。如今,SLURM 已经成为了很多最强大的超级计算机上使用的领先资源管理器,如天河二号上便使用了 SLURM 资源管理系统参考链接

Slurm常用指令介绍

作业提交

作业提交形象的说就是相当于提交备案的感觉,因为你要使用超算平台上的资源进行计算的话,你需要定义很多的参数,比如任务名称、任务输出文件名称、需要使用的节点数、任务数量、每个任务的配置的cpu数量、每个节点的任务数量、区域选择、GPU数量等。首先需要新建一个作业脚本(job.sh),在定义好参数之后,运行下面的命令提交作业:

sbatch job.sh

获取帮助信息

其实这是个十分便捷而且有效的方法,对于使用任何的工具,官方的帮助文档应该都是很好的学习资料。sbatch的帮助文档中,包含所有参数的说明和使用说明。运行下面的命令即可获取帮助文档:

sbatch --help

获取系统信息

这是一个十分重要的信息,系统信息在参数赋值的时候会使用到。在我和同学尝试运行作业文件的时候,一直报错:no specificed partition,但是我们的作业文档是在学校系统里面直接复制过来的,只是在最后加了一个计算语句,后来通过查看系统信息才发现,高性能计算平台上partition定义的名称跟作业例子里使用的名称不一致,通过运行以下命令便可获得系统信息,输出的信息如下图,最左边的那一列才是partition名称,最后通过修改这个名称,我们便可以运行作业了,运行之后会输出一个作业的ID。

sinfo

在这里插入图片描述

其他常用的指令

  • 取消指定ID作业
scancel ID
  • 查看作业调度系统中的所有作业
squeue
  • 查看作业的详细信息
scontrol show job ID
  • 查询已经结束的作业
sacct -j ID

作业文件编写

作业文件参数的定义是 运行深度学习python文件的关键,也是计算资源配置的关键。下面以配置GPU资源来运行python文件为例子来说明作业文件参数定义。在这里插入图片描述

  • job-name
    作业任务的名称,该例子名称为test,这个是当你打印任务详情的时候,除了任务ID以外,区分任务的其他依据。

  • output
    .任务运行的输出,名称为test。输出文件里不会出现报错信息,假如你的python文件运行不成功,错误信息会出现在xx.err文件里面。output文件会和job.sh文件存在于同一个目录下面。

  • error
    存放报错信息的文件

  • nodes、ntasks、cpus-per-task、ntask-per-node
    nodes:申请的节点数量
    ntasks:任务数量
    cpus-per-task:每个任务分配的cpu数量
    ntask-per-node:每个节点的任务
    这是节点信息与cpu资源分配参数的设置,这些参数之间应该有一定的关系,但是我目前还没有搞懂,等过两周再仔细研究这个资源分配参数的设置

  • partition
    这就是之前我们遇到的问题,计算区域选择。假如你要选择GPU进行训练,那么就需要选择GPU-Partition。输入sinfo就可以获得分区信息。

  • gpus
    为任务分配的gpu数量

  • time
    任务运行的时间,这个参数系统中设置了一个最大值。

运行python文件

我们需要将定义的job.sh文件放在和python文件一个目录下,对于需要在自己定义的Anaconda环境中运行的python文件,应在sh文件中加上以下语句:注意这里使用的是source而不是conda。

source activate Anaconda-env-name

最后一切准备好之后,就可以在sh文件中加上python运行语句就行

结果测试

cd到sh文件目录下,运行下面的命令

sbatch job.sh

假如输出如下图,就说明任务提交成功,后面的数字就是任务的ID。
在这里插入图片描述
运行以下命令便可以查看任务目前的状态,有四种,分别为等待(Pending)、运行(Running)、完成(Completed)、失败(Failed),完成后便可以在out和err文件中查看输出与报错信息。

sacct -j ID-number

总结

本博客只是初步的总结,以后假如需要在高性能平台上运行深度学习程序的话,还有很多需要进一步学习的东西。其次平台资源的调用机制目前还是不清楚,之后进一步完善吧。

参考

北京大学高性能计算校级公共平台使用指南.

Logo

快速构建 Web 应用程序

更多推荐