引言
随着深度学习在各领域的广泛应用,GPU计算已经成为了许多研究者和工程师的必备工具。特别是在使用诸如TensorFlow、PyTorch等深度学习框架时,我们经常需要指定特定的GPU设备来进行计算。然而,有时尽管已经设置了CUDA_VISIBLE_DEVICES
环境变量,程序仍然会默认使用GPU设备“0”。本文将深入探讨这个问题,并提供相应的解决方案。
问题背景
CUDA_VISIBLE_DEVICES
是一个环境变量,用于指定哪些GPU设备对CUDA可见。通过设置这个环境变量,我们可以控制程序使用哪些GPU进行计算。例如,如果我们想把程序限制在只使用第2块GPU(索引为1),我们可以设置CUDA_VISIBLE_DEVICES=1
。
然而,有时即使我们设置了CUDA_VISIBLE_DEVICES
,程序仍然会默认使用GPU设备“0”。这可能是由于多种原因,如环境变量设置不正确、程序配置问题等。
错误原因分析
- 环境变量设置不正确:可能是由于在设置环境变量时出现了错误,导致指定的GPU设备不可见。
- 程序配置问题:某些深度学习框架或库在初始化时会默认使用GPU设备“0”。即使设置了
CUDA_VISIBLE_DEVICES
,这些框架的内部逻辑可能仍会绕过这个设置。 - 其他软件干扰:某些其他运行中的软件可能会影响GPU的使用,导致设置的环境变量不起作用。
可能的解决方案
- 检查环境变量设置:确保在设置
CUDA_VISIBLE_DEVICES
时使用了正确的GPU索引。注意,索引是从0开始的。 - 重新启动程序:有时候,简单地重新启动程序可以解决这个问题。因为某些框架或库在初始化后会缓存GPU设备的设置。
- 检查代码:对于特定的项目代码,即使设置了
CUDA_VISIBLE_DEVICES
,这些代码的内部逻辑可能仍会绕过这个设置。
实战举例
报错背景
实验室服务器有多张显卡,但今天“0”卡显存已被占满,因此在代码中添加os.environ['CUDA_VISIBLE_DEVICES']=“2”
指定使用编号为"2"的显卡(显存够的前提下)。但跑VGG16的时候却报错:
经过调试发现os.environ['CUDA_VISIBLE_DEVICES']
想要生效,import torch
的位置需要放在指令os.environ['CUDA_VISIBLE_DEVICES']
后面才行。
验证方案
利用torch.cuda.device_count()
协助判断指令os.environ['CUDA_VISIBLE_DEVICES']="x"
是否生效
# 实验室服务器有8台GPU
# 选择调用其中三台
# torch.cuda.device_count(): 查看可用的GPU数量
# 实验1. 将import torch放在指令os.environ['CUDA_VISIBLE_DEVICES']="x"前面
import os
import torch
os.environ['CUDA_VISIBLE_DEVICES']='0, 1, 2' # 程序可见的GPU
print(torch.cuda.device_count()) # 8 说明指令没生效
# 实验2. 将import torch放在指令os.environ['CUDA_VISIBLE_DEVICES']="x"后面
import os
os.environ['CUDA_VISIBLE_DEVICES']='0, 1, 2' # 程序可见的GPU
import torch
print(torch.cuda.device_count()) # 3 说明指令生效
小结
上述验证实验表明,如果想要os.environ['CUDA_VISIBLE_DEVICES']
起作用,需将import torch
放在指令os.environ['CUDA_VISIBLE_DEVICES']="x"
后面。
结尾
亲爱的读者,首先感谢您抽出宝贵的时间来阅读我们的博客。我们真诚地欢迎您留下评论和意见,因为这对我们来说意义非凡。
俗话说,当局者迷,旁观者清。您的客观视角对于我们发现博文的不足、提升内容质量起着不可替代的作用。
如果您觉得我们的博文给您带来了启发,那么,希望您能为我们点个免费的赞/关注,您的支持和鼓励是我们持续创作的动力。
请放心,我们会持续努力创作,并不断优化博文质量,只为给您带来更佳的阅读体验。
再次感谢您的阅读,愿我们共同成长,共享智慧的果实!