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