为何实际使用的GPU设备与TensorFlow日志输出信息不一致
问题1:日志显示GPU编号和实际物理编号不一致的原因
这是CUDA的可见设备重映射规则导致的正常表现:
当你设置os.environ["CUDA_VISIBLE_DEVICES"] = "1"时,CUDA会对当前运行的进程做两个处理:
- 隐藏所有不在配置列表里的GPU(也就是物理0、2、3号卡,进程完全看不到这几张卡的存在)
- 把列表里的GPU按顺序重新编号,从0开始计数,所以你指定的物理1号卡,在当前进程里的逻辑编号就是0
你可以核对日志里打印的pci总线ID 0000:00:0d.0,和nvidia-smi输出里物理1号卡的pci ID完全一致,TensorFlow日志里输出的是进程内的逻辑GPU编号,不是系统层面的物理编号,所以不存在日志和实际使用设备不匹配的问题。
问题2:不指定可见设备时TensorFlow报错OOM的原因
TensorFlow 2的GPU选择逻辑默认没有自动检索空闲GPU的能力,规则是按物理编号从小到大优先尝试:
你不设置CUDA_VISIBLE_DEVICES时,进程可以看到所有4张物理GPU,TensorFlow会首先尝试占用物理0号卡的显存,而这张卡已经被其他进程占满,自然就抛出内存不足的错误,不会自动跳过占用的卡去用后面空闲的1号卡,所以必须你主动指定要使用的GPU编号。
内容的提问来源于stack exchange,提问作者marlon
相关产品推荐
相关产品推荐

