如何 运行 Slurm 上的 Pytorch 脚本?

How to run Pytorch script on Slurm?

我正在努力使用基本的 python 脚本,该脚本使用 Pytorch 在 Slurm 上打印 CUDA 设备。

这是 sinfo 的输出。

(ml) [s.1915438@sl2 pytorch_gpu_check]$ sinfo -o "%.10P %.5a %.10l %.6D %.6t %.20N %.10G"
 PARTITION AVAIL  TIMELIMIT  NODES  STATE             NODELIST       GRES
  compute*    up 3-00:00:00      1 drain*              scs0123     (null)
  compute*    up 3-00:00:00      1  down*              scs0050     (null)
  compute*    up 3-00:00:00    120  alloc scs[0001-0009,0011-0     (null)
  compute*    up 3-00:00:00      1   down              scs0010     (null)
developmen    up      30:00      1 drain*              scs0123     (null)
developmen    up      30:00      1  down*              scs0050     (null)
developmen    up      30:00    120  alloc scs[0001-0009,0011-0     (null)
developmen    up      30:00      1   down              scs0010     (null)
       gpu    up 2-00:00:00      2    mix       scs[2001-2002] gpu:v100:2
       gpu    up 2-00:00:00      2   idle       scs[2003-2004] gpu:v100:2
  accel_ai    up 2-00:00:00      1    mix              scs2041 gpu:a100:8
  accel_ai    up 2-00:00:00      4   idle       scs[2042-2045] gpu:a100:8
accel_ai_d    up    2:00:00      1    mix              scs2041 gpu:a100:8
accel_ai_d    up    2:00:00      4   idle       scs[2042-2045] gpu:a100:8
accel_ai_m    up   12:00:00      1   idle              scs2046 gpu:1g.5gb
s_highmem_    up 3-00:00:00      1    mix              scs0151     (null)
s_highmem_    up 3-00:00:00      1   idle              scs0152     (null)
s_compute_    up 3-00:00:00      2   idle       scs[3001,3003]     (null)
s_compute_    up    1:00:00      2   idle       scs[3001,3003]     (null)
s_gpu_eng    up 2-00:00:00      1   idle              scs2021 gpu:v100:4

我可以访问 accel_ai 分区。

这是我正在尝试 Python 的文件 运行。

(ml) [s.1915438@sl2 pytorch_gpu_check]$ cat gpu.py 
import torch
print(torch.__version__)
print(f"Is available: {torch.cuda.is_available()}")

try:
    print(f"Current Devices: {torch.cuda.current_device()}")
except :
    print('Current Devices: Torch is not compiled for GPU or No GPU')

print(f"No. of GPUs: {torch.cuda.device_count()}")

这是我提交作业的 bash 文件。

(ml) [s.1915438@sl2 pytorch_gpu_check]$ cat check_gpu.sh 
#!bin/bash
#SBATCH --nodes=1
#SBATCH --time=00:00:40
#SBATCH --ntasks=1
#SBATCH --job-name=gpu
#SBATCH --output=gpu.%j.out
#SBATCH --error=gpu.%j.err
#SBATCH --mem-per-cpu=10
#SBATCH --gres=gpu:1
#SBATCH --account=scs2045
#SBATCH --partition=accel_ai

module load CUDA/11.3
module load anaconda/3
source activate
conda activate ml
python gpu.py

这就是我 运行 使用 bash 脚本提交作业时发生的情况。

(ml) [s.1915438@sl2 pytorch_gpu_check]$ bash check_gpu.sh 
1.11.0
Is available: False
Current Devices: Torch is not compiled for GPU or No GPU
No. of GPUs: 0

有一件事我想澄清一下,这个 Pytorch 版本是从 Pytorch 的网站上附带的 CUDA 11.3。

谁能告诉我,我做错了什么? 另外,这里即使我排除了这些行,输出也是一样的。

module load CUDA/11.3
module load anaconda/3
source activate
conda activate ml

根据您的 sinfo,您有单独的分区可以访问 gpu。您需要 运行 您的程序在其中之一上。作业提交脚本可以修改如下。您还需要使用 --gres.

指定 gpu 类型
...
...
#SBATCH --partition=gpu
#SBATCH --gres=<Enter gpu type>
...
...

我的方法有几个错误。在作业文件中,第一行应该是 #!/bin/bash 而不是 #!bin/bash.

此外,Slurm 有一个特殊的命令 SBATCH 来提交您的作业文件。所以为了 运行 你的工作文件,例如 check_gpu.sh,我们应该使用 sbatch check_gpu.sh 而不是 bash check_gpu.sh.

我得到以下输出的原因是 bash 认为 # 是评论。

(ml) [s.1915438@sl2 pytorch_gpu_check]$ bash check_gpu.sh 
1.11.0
Is available: False
Current Devices: Torch is not compiled for GPU or No GPU
No. of GPUs: 0

因此,只有以下几行从作业脚本中执行。

module load CUDA/11.3
module load anaconda/3
source activate
conda activate ml
python gpu.py

更正后,我 运行 作业脚本,它按预期工作。

[s.1915438@sl1 pytorch_gpu_check]$ sbatch check_gpu.sh 
Submitted batch job 7133028
[s.1915438@sl1 pytorch_gpu_check]$ cat gpu.7133029.out 
1.11.0
Is available: True
Current Devices: 0
No. of GPUs: 1
GPU Name:NVIDIA A100-PCIE-40GB
[s.1915438@sl1 pytorch_gpu_check]$ cat gpu.7133029.err