一、简介
CUDA_VISIBLE_DEVICES
是CUDA提供的一个环境变量,用于控制哪些GPU对当前程序可见,以及如何重新编号这些GPU。它是设置CUDA设备可见性和编号的重要工具,特别是在多GPU环境下,可以有效地管理和隔离GPU资源。
二、逻辑编号与物理编号
- 物理编号:GPU在操作系统中实际的编号。可以通过
nvidia-smi
等命令查看物理设备的编号。
- 逻辑编号:在
CUDA_VISIBLE_DEVICES
环境变量控制下的GPU设备编号。逻辑编号从0开始,表示当前程序可以访问的GPU。 CUDA_VISIBLE_DEVICES
的作用就是将系统中的物理编号映射到CUDA程序可见的逻辑编号上。通过重新设置环境变量,可以改变程序中实际使用的物理设备进行训练。
三、基本语法与使用方法
-
CUDA_VISIBLE_DEVICES
可以设置为一个逗号分隔的设备索引列表,用来指定哪些GPU对当前进程可见,并可以改变它们的顺序。设置该环境变量后,CUDA只会识别并使用这些指定的GPU,并重新编号。export CUDA_VISIBLE_DEVICES=0,1,2,3 -------------------------------------------------------------------- # "0,1":只使物理编号 GPU 0 和 GPU 1 可见。 # "0,2":使物理编号 GPU 0 和 GPU 2 可见,并将它们重新编号为 0 和 1逻辑编号(顺序从 0 开始)。 # "1":只使 GPU 1 可见,并将其重新编号为 0。
-
在CUDA驱动加载时,首先会读取
CUDA_VISIBLE_DEVICES
环境变量,如果未设置,默认所有GPU都对程序可见,且编号从0开始。设置后,只有该环境变量中指定的GPU会对程序可见,且指定的物理设备会被重新从0开始分配逻辑编号。 -
在多用户或多任务共享GPU的环境中,可以通过
CUDA_VISIBLE_DEVICES
为每个任务分配不同的 GPU设备。CUDA_VISIBLE_DEVICES=0,1 python task1.py CUDA_VISIBLE_DEVICES=2 python task2.py
-
使用指令查看指定GPU之后的设备可见情况。
torch.cuda.device_count() # torch.cuda.get_device_name(0) 返回 GPU 1 的名称
-
CUDA_VISIBLE_DEVICES
仅影响当前进程或脚本的GPU可见性,不会改变系统中其他进程的GPU编号,这种机制在多任务、多用户或多GPU共享的系统中非常有用,可以实现GPU资源的隔离和管理。
小结
通过CUDA_VISIBLE_DEVICES
,可以轻松地管理多GPU环境,并且CUDA 驱动对重新编号的GPU提供了一致的逻辑设备索引,不会影响物理设备编号。这种方法简单高效,适用于大多数场景。