如何告诉 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-statementtorch.cuda.is_available() 一起使用之外,您还可以像这样将设备设置为 CPU

device = torch.device("cpu")

您还可以使用device 标志在所需的设备上创建张量:

mytensor = torch.rand(5, 5, device=device)

这将直接在您之前指定的device 上创建一个张量。

我想指出,您可以使用这种语法在 CPUGPU 之间切换,也可以在不同的 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?的主要内容,如果未能解决你的问题,请参考以下文章

如何确保所有 PyTorch 代码充分利用 Google Colab 上的 GPU

pytorch 从 gpu 中删除模型

如何在pytorch中进行并行处理

如何使用 pytorch 列出所有当前可用的 GPU?

恒源云_云GPU服务器如何使用 Visdom?

4.7 PyTorch如何使用GPU