如何告诉 PyTorch 不使用 GPU?
Posted
技术标签:
【中文标题】如何告诉 PyTorch 不使用 GPU?【英文标题】:How to tell PyTorch to not use the GPU? 【发布时间】:2019-04-15 10:06:33 【问题描述】:我想在 CPU 和 GPU 之间进行一些时序比较以及一些分析,并想知道是否有办法告诉 pytorch 不使用 GPU 而只使用 CPU?我意识到我可以安装另一个仅 CPU 的 pytorch,但希望有更简单的方法。
【问题讨论】:
【参考方案1】:您可以在运行您的 Torch 代码之前通过 shell 将 CUDA_VISIBLE_DEVICES
变量设置为空。
export CUDA_VISIBLE_DEVICES=""
应该告诉torch没有GPU。
export CUDA_VISIBLE_DEVICES="0"
会告诉它只使用一个 GPU(id 为 0 的那个)等等。
【讨论】:
这似乎仍然给我一个UserWarning: CUDA initialization: Found no NVIDIA driver on your system
的错误。
@UmangGupta - 我在代码中的许多地方都调用了.cuda()
。这是否意味着代码默认配置为使用GPU?如果是,我应该做些什么改变才能让它在 GPU 上运行?
您可以将 .cuda()
替换为 .cpu()
以确保您的代码使用 CPU。这很麻烦,但我认为这是最简单的方法。对于未来,请在顶部声明 device
并使用 .to
将模型/张量移动到设备。有关如何做到这一点...请参阅 MBT 的答案或此链接***.com/a/53332659/3236925【参考方案2】:
我只是想补充一点,在 PyTorch 代码中也可以这样做:
这是取自PyTorch Migration Guide for 0.4.0的一个小例子:
# at beginning of the script
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
...
# then whenever you get a new Tensor or Module
# this won't copy if they are already on the desired device
input = data.to(device)
model = MyModule(...).to(device)
我认为这个例子很不言自明。但如果有任何问题,尽管问! 一个很大的优势是,使用上面示例中的这种语法时,如果没有可用的 GPU,您可以创建在 CPU 上运行的代码,也可以在 GPU 上运行而无需更改一行。
除了将 if-statement 与 torch.cuda.is_available()
一起使用之外,您还可以像这样将设备设置为 CPU:
device = torch.device("cpu")
您还可以使用device
标志在所需的设备上创建张量:
mytensor = torch.rand(5, 5, device=device)
这将直接在您之前指定的device
上创建一个张量。
我想指出,您可以使用这种语法在 CPU 和 GPU 之间切换,也可以在不同的 GPUs 之间切换。 p>
希望对你有帮助!
【讨论】:
【参考方案3】:使用python最简单的方法是:
os.environ["CUDA_VISIBLE_DEVICES"]=""
【讨论】:
我没有与 CUDA 兼容的 GPU,在我的情况下这个解决方案不起作用(警告仍然出现)【参考方案4】:一般
正如之前的答案所示,您可以使用以下命令让您的 pytorch 在 cpu 上运行:
device = torch.device("cpu")
比较训练的模型
我想补充一下如何在 cpu 上加载以前训练的模型(示例取自 pytorch docs)。
注意:确保输入到模型中的所有数据也在cpu上。
推荐加载
model = TheModelClass(*args, **kwargs)
model.load_state_dict(torch.load(PATH, map_location=torch.device("cpu")))
加载整个模型
model = torch.load(PATH, map_location=torch.device("cpu"))
【讨论】:
【参考方案5】:这是一个真实的例子:使用 gpu 的原始函数与使用 cpu 的新函数。
来源:https://github.com/zllrunning/face-parsing.PyTorch/blob/master/test.py
就我而言,我编辑了这 4 行代码:
#totally new line of code
device=torch.device("cpu")
#net.cuda()
net.to(device)
#net.load_state_dict(torch.load(cp))
net.load_state_dict(torch.load(cp, map_location=torch.device('cpu')))
#img = img.cuda()
img = img.to(device)
#new_function_with_cpu
def evaluate(image_path='./imgs/116.jpg', cp='cp/79999_iter.pth'):
device=torch.device("cpu")
n_classes = 19
net = BiSeNet(n_classes=n_classes)
#net.cuda()
net.to(device)
#net.load_state_dict(torch.load(cp))
net.load_state_dict(torch.load(cp, map_location=torch.device('cpu')))
net.eval()
to_tensor = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225)),])
with torch.no_grad():
img = Image.open(image_path)
image = img.resize((512, 512), Image.BILINEAR)
img = to_tensor(image)
img = torch.unsqueeze(img, 0)
#img = img.cuda()
img = img.to(device)
out = net(img)[0]
parsing = out.squeeze(0).cpu().numpy().argmax(0)
return parsing
#original_function_with_gpu
def evaluate(image_path='./imgs/116.jpg', cp='cp/79999_iter.pth'):
n_classes = 19
net = BiSeNet(n_classes=n_classes)
net.cuda()
net.load_state_dict(torch.load(cp))
net.eval()
to_tensor = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225)),])
with torch.no_grad():
img = Image.open(image_path)
image = img.resize((512, 512), Image.BILINEAR)
img = to_tensor(image)
img = torch.unsqueeze(img, 0)
img = img.cuda()
out = net(img)[0]
parsing = out.squeeze(0).cpu().numpy().argmax(0)
return parsing
【讨论】:
以上是关于如何告诉 PyTorch 不使用 GPU?的主要内容,如果未能解决你的问题,请参考以下文章