pytorch - 未设置 --gpus 时防止在 SLURM 中使用 GPU

标签 pytorch slurm

我们使用 SLURM 来管理一个小型本地集群。我们管理的一个关键资源是 GPU。当用户通过 --gpus=2 请求 GPU 时CUDA_VISIBLE_DEVICES使用 SLURM 分配给用户的 GPU 设置环境变量。

$ srun --gpus=2 bash -c 'echo $CUDA_VISIBLE_DEVICES'
0,1

我们有一个小团队,可以相信我们的用户不会滥用系统(他们很容易覆盖环境变量),所以这很好用。但是,意外绕过它有点太容易了,因为当 --gpus未指定 $CUDA_VISIBLE_DEVICES未设置,因此用户可以使用任何 GPU(我们通常使用 PyTorch)。

换句话说,以下命令可以正常工作(只要它位于 GPU 节点上),但我希望它失败(因为没有请求 GPU)。
srun sudo docker run -e CUDA_VISIBLE_DEVICES --runtime=nvidia pytorch/pytorch:1.1.0-cuda10.0-cudnn7.5-runtime python -c 'import torch; print(torch.tensor([1., 2.], device=torch.device("cuda:0")))'

如果 $CUDA_VISIBLE_DEVICES 会失败被设置为 -1 .
$ CUDA_VISIBLE_DEVICES=-1 sudo docker run -e CUDA_VISIBLE_DEVICES --runtime=nvidia pytorch/pytorch:1.1.0-cuda10.0-cudnn7.5-runtime python -c 'import torch; print(torch.tensor([1., 2.], device=torch.device("cuda:0")))'
THCudaCheck FAIL file=/opt/conda/conda-bld/pytorch_1556653099582/work/aten/src/THC/THCGeneral.cpp line=51 error=38 : no CUDA-capable device is detected
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/opt/conda/lib/python3.6/site-packages/torch/cuda/__init__.py", line 163, in _lazy_init
    torch._C._cuda_init()
RuntimeError: cuda runtime error (38) : no CUDA-capable device is detected at /opt/conda/conda-bld/pytorch_1556653099582/work/aten/src/THC/THCGeneral.cpp:51

如何配置 SLURM 以设置 CUDA_VISIBLE_DEVICES-1--gpus没有指定?

最佳答案

您可以使用 TaskProlog设置 $CUDA_VISIBLE_DEVICES 的脚本可变为 -1如果它不是由 Slurm 设置的。

slurm.conf , 配置TaskProlog=/path/to/prolog.sh并为 prolog.sh 设置以下内容.

#! /bin/bash

if [[ -z $CUDA_VISIBLE_DEVICES]]; then
echo export CUDA_VISIBLE_DEVICES=-1
fi
echo export ...部分将注入(inject) CUDA_VISIBLE_DEVICES=-1在工作环境中。

确保 /path/to从所有计算节点可见。
但这不会阻止用户玩系统并从 Python 脚本中重新定义变量。真正阻止访问需要配置 cgroups .

关于pytorch - 未设置 --gpus 时防止在 SLURM 中使用 GPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57615258/

相关文章:

deep-learning - 是否可以从神经网络模型中断的地方开始执行?

python - 设置卷积神经网络中层的维度

python - 是否可以自动调整 PyTorch 中 torch.nn.Sequential 中 torch.nn.Flatten 之后的层的后续输入?

partition - 有没有办法将 SLURM 分区中的某些节点设置为优先于其他节点?

运行py文件时windowsspyder无效语法错误

python - 在 PyTorch 中使用 strict=False 加载修改后的预训练模型

memory-management - 作业分配的核心数量是我在 SLURM 上请求的两倍

SLURM 无法识别 prolog 脚本中的命令

gpu - 从多个 SLURM GPU 资源中进行选择

parallel-processing - slurm Job Array 和 Job Step 性能的差异