【问题标题】:Why can't I run multiple instances of the same python script simulataniously in SLURM为什么我不能在 SLURM 中同时运行同一个 python 脚本的多个实例
【发布时间】:2019-03-28 06:05:56
【问题描述】:

我一直在努力尝试让 python 脚本的多个实例在 SLURM 上运行。在我的登录节点中,我已经安装了 python3.6,并且我有一个 python 脚本“my_script.py”,它将一个文本文件作为输入来读取运行参数。我可以使用

在登录节点上运行此脚本
python3.6 my_script.py input1.txt

此外,我可以提交一个脚本 submit.sh 来运行该作业:

#!/bin/bash
#
#SBATCH --job-name=hostname_sleep_sample
#SBATCH --output=output1.txt
#SBATCH --cpus-per-task=1
#
#SBATCH --mem=2G

python3.6 my_script.py input1.txt

这运行良好并按预期执行。但是,如果我提交以下脚本:

#!/bin/bash
#
#SBATCH --job-name=hostname_sleep_sample
#SBATCH --output=output2.txt
#SBATCH --cpus-per-task=1
#
#SBATCH --mem=2G

python3.6 my_script.py input2.txt

当第一个运行时,我在 output2.txt 中收到以下错误消息:

/var/spool/slurmd/job00130/slurm_script: line 9: python3.6: command not 
found

当我尝试将作业作为数组提交时,我发现我遇到了同样的问题。例如,当我使用 sbatch 提交以下内容时:

!/bin/bash
#
#SBATCH --job-name=hostname_sleep_sample 
#SBATCH --output=out_%j.txt
#SBATCH --array=1-10
#SBATCH --cpus-per-task=1
#
#SBATCH --mem=2G
echo PWD $PWD
cd $SLURM_SUBMIT_DIR
python3.6 my_script.py input_$SLURM_ARRAY_TASK_ID.txt
~  

我发现只有 out_1.txt 显示作业已运行。任务 2-10 的所有输出文件都显示相同的错误消息:

/var/spool/slurmd/job00130/slurm_script: line 9: python3.6: command not 

我正在使用 Google Cloud Platform 中的 Compute Engine API 创建的 HPC 集群中运行所有这些脚本。我使用以下教程来设置 SLURM 集群:

https://codelabs.developers.google.com/codelabs/hpc-slurm-on-gcp/#0

为什么 SLURM 无法同时运行多个 python3.6 作业,我怎样才能让我的数组提交工作?我花了几天时间研究 SLURM 常见问题解答和其他堆栈问题,但我还没有找到解决此问题的方法或首先找到导致问题的适当解释。

谢谢

【问题讨论】:

  • 会不会是第一个作业在一台机器上运行,而第二个作业在另一台机器上运行?在第二个节点上,没有安装 Python3?您的集群的结构是什么?
  • 欢迎来到 Stackoverflow!正如 Damien 所建议的,您能否编辑您的帖子以包含集群配置 yaml 文件。
  • 我找不到用于创建集群的 yaml 文件,但我使用了教程中的模板。我现在已经解决了这个问题。
  • @damienfrancois 在我的提交脚本中指定 --cpus-per-task=1 和 --tasks-per-node=2 时,我现在无法让我的任务数组为每个节点运行多个任务.您能否向我指出一个示例提交脚本,以根据 mem 和 cpu 设置使用来自 taks 数组的任务填充节点?我还没有找到一个很好的例子来工作,我真的很感激。
  • slurm 是否配置为在同一个节点上运行多个作业?配置文件中SelectType的值是多少?

标签: python google-cloud-platform google-compute-engine slurm


【解决方案1】:

我发现我做错了什么。我创建了一个包含两个计算节点、compute1 和 compute2 的集群。在某些时候,当我试图让事情正常工作时,我使用以下命令向 compute1 提交了一个作业:

# Install Python 3.6
sudo yum -y install python36

# Install python-setuptools which will bring in easy_install
sudo yum -y install python36-setuptools

# Install pip using easy_install
sudo easy_install-3.6 pip

来自以下帖子:

How do I install python 3 on google cloud console?

这已经在 compute1 上安装了 python3.6,这就是我的作业将在 compute1 上运行的原因。但是,我认为这个脚本没有成功运行,我从未将它提交给 compute2,因此发送到 compute2 的作业无法调用 python3.6。出于某种原因,我认为 Slurm 使用的是登录节点中的 python3.6,因为我在我的 sbatch 提交中找到了它的路径。

在 cluster2 上安装 python3.6 后,我可以根据以下链接导入所有本地安装的 python 库,包括

import sys
import os

sys.path.append(os.getcwd()) 

在我的 python 脚本的开头。

How to import a local python module when using the sbatch command in SLURM

【讨论】:

    猜你喜欢
    • 2021-07-01
    • 2017-01-10
    • 2021-06-06
    • 1970-01-01
    • 2015-10-31
    相关资源
    最近更新 更多