如何告诉PyTorch不要使用GPU?

时间:2018-11-12 16:30:00

标签: pytorch

我想在CPU和GPU之间进行一些时序比较,并进行一些性能分析,并且想知道是否有一种方法可以告诉PyTorch不使用GPU而仅使用CPU?我意识到我可以安装另一个仅CPU的PyTorch,但希望有一个更简单的方法。

5 个答案:

答案 0 :(得分:3)

使用python的最简单方法是:

  os.environ["CUDA_VISIBLE_DEVICES"]=""

答案 1 :(得分:2)

您可以在运行割炬代码之前通过外壳将CUDA_VISIBLE_DEVICES变量设置为空。

export CUDA_VISIBLE_DEVICES=""

应该告诉火炬没有GPU。

export CUDA_VISIBLE_DEVICES="0"将告诉它仅使用一个GPU(ID为0的GPU),依此类推。

答案 2 :(得分:1)

我只是想补充一点,在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上运行。

除了将{em> if语句与torch.cuda.is_available()一起使用之外,您还可以像下面这样将设备设置为 CPU

device = torch.device("cpu")

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

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

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

我想指出的是,您可以使用此语法在 CPU GPU 之间切换,也可以在不同的 GPU 之间切换。

>

我希望这会有所帮助!

答案 3 :(得分:0)

常规

如先前的答案所示,您可以使用以下方法使pytorch在cpu上运行:

device = torch.device("cpu")

比较训练有素的模型

我想补充一点,可以将先前训练过的模型保存在GPU上。以下示例显示了如何从pytorch docs提取模型到cpu上。

确保输入到模型的所有数据也都在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"))

答案 4 :(得分:0)

这是一个真实世界的例子:原始函数使用 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