另一个 Slurm Python 接口
项目描述
yaspi - 另一个 slurm python 接口
的目标yaspi是提供一个接口来提交slurm作业,从而消除 sbatch 文件的乐趣。它通过recipes- 这些是用于生成 sbatch 脚本的模板和规则的集合。
安装
通过安装pip install yaspi。如果您更喜欢修改源代码,它是一个单独的 python 文件。
它应该被认为是(高度)实验性的。
执行
yaspi大量使用 slurm作业数组。
支持的食谱:
cpu-proc- 通过作业数组提交 CPU 作业的通用配方。gpu-proc- 通过作业数组提交 GPU 作业的通用配方。ray-光线调度器的作业提交。
依赖项
Python >= 3.6watchlogs
要求:
yaspi已在 CentOS Linux 版本 7.7.1908 上使用 slurm 18.08.7 和 Python 3.7 进行了测试。其他平台上的 YMMV。
使用和输出
yaspi可以从命令行使用,也可以直接从 python 程序使用。下面的示例中显示了命令行用法(每个参数的效果都记录在实现中)。
代码 - 使用 CPU 调度 slurm 作业数组:
prep_command='echo \"optional preparation cmd\"'
command='echo \"I am running on a CPU node\"'
yaspi --job_name=example \
--job_array_size=2 \
--cpus_per_task=5 \
--cmd="$command" \
--prep="$prep_command" \
--recipe=cpu-proc \
--mem=10G
效果:这将command作为 slurm作业数组的一部分在两个工人上运行该值。每个worker会被调度器分配5个CPU和10G内存。每个工人还将被传递两个额外的标志,--slurm(不带选项)和--worker_id(将被赋予作业数组中当前工人索引的 0 索引值),可用于将任务分配给工人。该--prep标志是可选的,将在主作业之前运行命令(例如,更改为适当的代码目录)。该命令的效果将是产生以下内容:
# run on CPU job array worker 0
optional preparation cmd
I am running on a CPU node --slurm --worker_id 0
# run on CPU job array worker 1
optional preparation cmd
I am running on a CPU node --slurm --worker_id 1
启动时,监视日志将生成稍微详细(和彩色)的输出(假设您的终端支持颜色序列):
代码 - 使用 GPU 调度 slurm 作业数组:
prep_command='echo \"optional preparation cmd\"'
job_queue="\"flags for worker 0\" \"flags for worker 1\""
command='echo \"I am running on a GPU node\"'
yaspi --job_name=example \
--job_array_size=2 \
--cpus_per_task=5 \
--gpus_per_task=1 \
--prep="$prep_command" \
--cmd="$command" \
--recipe=gpu-proc \
--job_queue="$job_queue" \
--mem=10G
效果:此命令类似于上述cpu-proc配方。同样,command将作为 slurm作业数组的一部分在两个工人上运行。每个worker将被调度器分配5个CPU和10G内存,以及一个GPU。另一个区别是gpu-proc它还采用了一个job_queue选项,可用于将选项分别传递给每个 GPU 工作人员。
附加功能 - 自定义指令:
前面的示例可以使用自定义指令进行扩展。例如,假设您希望向您sbatch的表单
添加一个额外的指令#SBATCH --comment "a harmless comment goes here"。您可以按如下方式执行此操作:
prep_command='echo \"optional preparation cmd\"'
job_queue="\"flags for worker 0\" \"flags for worker 1\""
command='echo \"I am running on a GPU node\"'
custom_directive='#SBATCH --comment "a harmless comment goes here"'
python yaspi.py --job_name=example \
--job_array_size=2 \
--cpus_per_task=5 \
--gpus_per_task=1 \
--prep="$prep_command" \
--cmd="$command" \
--recipe=gpu-proc \
--job_queue="$job_queue" \
--custom_directive="$custom_directive" \
--mem=10G
自定义指令也可以添加到 json 配置中。例如,要接收来自 slurm 的电子邮件,请添加一个"custom_directives"标志:
{
...
"custom_directives": "#SBATCH --mail-type=END,FAIL\n#SBATCH --mail-user=your_email_address",
}
代码 - 使用ray框架调度作业:
yaspi_dir=$(yaspi --install_location)
command="python $yaspi_dir/misc/minimal_ray_example.py"
yaspi --job_name=example \
--cmd="$command" \
--job_array_size=3 \
--cpus_per_task=2 \
--gpus_per_task=1 \
--mem=10G \
--recipe=ray
效果:使用 ray 框架调度作业的方式与前两个示例稍有不同(这两个示例都假设令人尴尬的并行处理,即工作人员之间没有通信)。ray receipe 类似地启动一个 slurm 作业数组,但将索引 0 处的作业分配为master,并将所有其他节点分配为worker节点。该命令仅在主节点上运行,然后使用 ray 将任务分配给工作节点。上面的命令将启动一个名为“example”的 slurm 作业,它:(1)通过 SLURM 数组作业初始化一个射线头节点和一组 2 个射线工作者;(2)$command从头节点启动。它将产生类似于以下的输出:
started ray head node
timestamp from worker: 2020-02-17 06:40:44.861733
timestamp from worker: 2020-02-17 06:40:44.861793
timestamp from worker: 2020-02-17 06:40:45.062484
timestamp from worker: 2020-02-17 06:40:45.065494
代码 - 直接从 python 使用 yaspi:
train_mnist.py 中给出了训练多个 MNIST 运行的示例。运行这个文件应该在 SLURM 上启动三个作业,每个作业都有不同的超参数,产生以下输出:
修改代码以使用 Yaspi:
使用 yaspi 运行现有的代码需要两件事:
- 包含 SLURM 设置的 json 文件(例如这些yaspi_settings)。此文件将设置您通常在 SBATCH 脚本中设置的选项(例如 GPU 数量、总作业持续时间等)以及您通常运行以设置作业环境的任何 bash 命令(这些是通过
"env_estup"选项提供的) - 脚本中某处的一小块逻辑(此处的 MNIST 示例可见)设置作业名称并调用 Yaspi
submit()函数。
使用代码快照目录:
直接从源代码文件夹启动 yaspi 作业的一个缺点是,如果您在将作业提交到 slurm 后编辑代码但作业尚未启动,则代码编辑将影响作业。由于这是(通常)不受欢迎的行为,您可以向 yaspi 提供额外的标志,以便它将当前文件夹中的源代码复制到新的“快照”目录并从那里启动。因此,您在使用 yaspi 启动后所做的任何本地代码更改都不会影响排队的作业。要传递的标志是:
--code_snapshot_dir snapshot_dir # <snapshot_dir> is the location where the snapshot of your code will be stored
--code_snapshot_filter_patterns patterns # <patterns> are a set of glob-patterns to determine which source code is copied
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。