python - 使用 SLURM 请求 2 个 GPU 并运行 1 个 python 脚本

标签 python cluster-computing nvidia slurm sbatch

我正在尝试分配 2 个 GPU 并在这 2 个 GPU 上运行 1 个 python 脚本。 python 脚本需要变量 $AMBERHOME(通过获取 amber.sh 脚本获取)和 $CUDA_VISIBLE_DEVICES。对于我请求的两个 GPU,$CUDA_VISIBLE_DEVICES 变量应该等于 0,1 之类的值。

目前,我一直在尝试这个基本脚本。

#!/bin/bash
#
#BATCH --job-name=test
#SBATCH --output=slurm_info
#SBATCH --nodes=2
#SBATCH --ntasks=2
#SBATCH --time=5:00:00
#SBATCH --partition=gpu-v100

## Prepare Run
source /usr/local/amber20/amber.sh
export CUDA_VISIBLE_DEVICES=0,1

## Perform Run
python calculations.py

当我运行脚本时,我可以看到请求了 2 个 GPU。

JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
11111   GPU         test   jsmith CF       0:02     2     gpu-[1-2]

当我查看输出('slurm_info')时,我发现,

cpu-bind=MASK - gpu-1, task  0  0 [10111]: mask 0x1 set

当然还有有关失败作业的信息。

通常,当我在本地工作站上运行此脚本时,我那里有 2 个 GPU,当在命令行中输入 nvidia-smi 时,我会看到...

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 460.91.03    Driver Version: 460.91.03    CUDA Version: 11.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  GeForce RTX 208...  On   | 00000000:00:1E.0 Off |                    0 |
| N/A   29C    P0    24W / 300W |      0MiB / 16160MiB |      0%   E. Process |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   1  GeForce RTX 208...  On   | 00000000:00:1E.0 Off |                    0 |
| N/A   29C    P0    24W / 300W |      0MiB / 16160MiB |      0%   E. Process |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

但是,当我在集群上将 nvidia-smi 与之前的批处理脚本一起使用时,我会看到以下内容。

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 460.91.03    Driver Version: 460.91.03    CUDA Version: 11.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  GeForce RTX 208...  On   | 00000000:00:1E.0 Off |                    0 |
| N/A   29C    P0    24W / 300W |      0MiB / 16160MiB |      0%   E. Process |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

这让我觉得当 python 脚本运行时它只能看到一个 GPU。

最佳答案

您请求的是两个节点,而不是两个GPU。请求 GPU 的正确语法取决于 Slurm 版本以及集群的设置方式。但你一般用#SBATCH -G 2请求两个 GPU。

Slurm 通常还会为您处理 CUDA_VISIBLE_DEVICES,因此无需这样做。试试这个:

#!/bin/bash
#
#BATCH --job-name=test
#SBATCH --output=slurm_info
#SBATCH --nodes=1
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=2 #change that accordingly
#SBATCH -G 2
#SBATCH --time=5:00:00
#SBATCH --partition=gpu-v100

## Prepare Run
source /usr/local/amber20/amber.sh

## Perform Run
python calculations.py

关于python - 使用 SLURM 请求 2 个 GPU 并运行 1 个 python 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70557768/

相关文章:

java - 将 Terracotta 与 Java EE 应用服务器集群结合起来有意义吗?

amazon-web-services - aws emr 上的 Spark 集群找不到 Spark-env.sh

c++ - 最佳像素回读策略

python - dask DataFrame.assign 炸毁了 dask 图

python - 使用自动调整大小的子图

cassandra - 所有尝试查询的主机均失败

c - 如何在 VS 2010 中使用 Nvidia NSight 查看 CUDA 线程值?

docker - 如何检查 nvidia-docker 版本?

python - 将 'any' 函数与列表压缩或生成器一起使用的正确语法

python + sqlite3 : using IS NOT in a join query