我有一个带有 4 个 GPU 的一体化节点。我遇到的问题是,如果未设置 --gres=gpu:n,则所有 GPU 均可用于作业。
环境“$CUDA_VISIBLE_DEVICES”为空。这是预料之中的。
这是我的 srun 命令:
srun --mpi=none -n1 -p debug python test_gpu.py
if torch.cuda.is_available():
# Get the number of available GPUs
num_gpus = torch.cuda.device_count()
num_gpus 为 4。并且所有 GPU 都可用。
这是我的slurm.conf:
SlurmctldHost=gpu-server35
GresTypes=gpu
MpiDefault=none
ProctrackType=proctrack/cgroup
ReturnToService=1
SlurmctldPidFile=/var/run/slurmctld.pid
SlurmctldPort=6817
SlurmdPidFile=/var/run/slurmd.pid
SlurmdPort=6818
SlurmdSpoolDir=/var/spool/slurmd
#SlurmUser=slurm
SlurmdUser=root
#SrunEpilog=
#SrunProlog=
StateSaveLocation=/var/spool
SwitchType=switch/none
#TaskEpilog=
TaskPlugin=task/cgroup,task/affinity
#
# SCHEDULING
#DefMemPerCPU=0
#MaxMemPerCPU=0
#SchedulerTimeSlice=30
SchedulerType=sched/backfill
SelectType=select/cons_tres
SelectTypeParameters=CR_Core
#
#
# LOGGING AND ACCOUNTING
AccountingStorageType=accounting_storage/none
#AccountingStorageUser=
AccountingStoreJobComment=YES
ClusterName=cluster
JobCompType=jobcomp/none
#JobCompUser=
#JobContainerType=job_container/none
JobAcctGatherFrequency=30
#JobAcctGatherType=jobacct_gather/none
JobAcctGatherType=jobacct_gather/cgroup #optional for gathering metrics
PrologFlags=Contain #X11 flag is also suggested
SlurmctldDebug=info
SlurmctldLogFile=/var/log/slurmctld.log
SlurmdDebug=info
SlurmdLogFile=/var/log/slurmd.log
# COMPUTE NODES
NodeName=gpu-server35 Gres=gpu:tesla:2 CPUs=48 RealMemory=200000 Sockets=2 CoresPerSocket=12 ThreadsPerCore=2 State=UNKNOWN
PartitionName=debug Nodes=gpu-server35 Default=YES MaxTime=INFINITE State=UP
cgroup.conf
CgroupAutomount=yes
CgroupMountpoint=/sys/fs/cgroup
ConstrainCores=yes
ConstrainDevices=yes
ConstrainKmemSpace=no #avoid known Kernel issues
ConstrainRAMSpace=yes
ConstrainSwapSpace=yes
TaskAffinity=no #use task/affinity plugin instead
Slurm 限制作业中可用 GPU 的数量
首先要确保
gres.conf
文件完整,并正确指定 File=
参数。
然后,如果
cgroup
配置正确,则只有 Slurm 分配的 GPU 对作业进程可见。在 HPU 节点上的无 GPU 作业中运行 nvidia-smi
应该返回
No devices were found
如果不是这种情况,您应该仔细检查 cgroup 配置(在您的情况下看起来是正确的)并确保所有守护进程都已加载该配置(重新启动它们以确保)。
您还可以在
Slurm 任务序言中设置
export CUDA_VISIBLE_DEVICES=
,但请注意,这可能会被作业程序覆盖。