如果你有很多个GPU,而只让程序使用其中的几个GPU,可以使用os方式进行设置。
import os
GPU = '0,1,2' #设置GPU 0 1 2 可见
os.environ['CUDA_VISIBLE_DEVICES'] =GPU
代码 | 解释 |
---|---|
torch.cuda.is_available() | GPU是否可用(True/False) |
torch.version.cuda | 查看GPU版本(如:10.2) |
torch.cuda.get_device_capability() | 查看GPU算力,比如(7,5) |
torch.cuda.current_device() | 返回当前设备索引(默认为0) |
torch.cuda.set_device(1) | 设置默认使用的GPU编号 |
torch.cuda.get_device_name(0) | 查看GPU全名 |
torch.cuda.device_count() | 查看可用的GPU |
更多关于pytorch如何使用cuda的方法可以参考官网。
torch.cuda.is_available()通常的使用方式如下:
device = 'cuda' if torch.cuda.is_available() else 'cpu'
也可以像下列方式一样将CPU的数据挪到GPU上。
# 也可以是 device = torch.device('cuda:0')
device = torch.device('cuda')
a = torch.tensor([1,2,3])
b = a.to(device )
print(a)
print(b)
输出:
tensor([1, 2, 3])
tensor([1, 2, 3], device='cuda:0')
一般情况下默认使用的GPU是0号,如果你想要改变默认的GPU,可以使用如下方式。
# 里面输入int类型的数字
torch.cuda.set_device(1)
但是我的GPU只有一个卡,所以强制修改默认GPU编号为1,会有如下的报错
:
RuntimeError: CUDA error: invalid device ordinal
CUDA kernel errors might be asynchronously reported at some other API call,so the stacktrace below might be incorrect.
For debugging consider passing CUDA_LAUNCH_BLOCKING=1.
可以直接在cuda中创建数据,如下方法所示。
a = torch.ones(3,4,device="cuda")
b = torch.cuda.FloatTensor(3, 4)
import torch
a = torch.ones(3,4)
b = a.to("cuda")
print(a)
print(b)
输出:
tensor([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])
tensor([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]], device='cuda:0')
.to()不仅可以转移device,还可以修改数据类型,比如:a.to(torch.double)。
a = torch.tensor([1., 2.]).cuda()
dtype = torch.cuda.FloatTensor
x = torch.rand(2,2).type(dtype)
import torch
import numpy as np
b = np.ones(2)
a = torch.from_numpy(b).cuda()
print(a)
输出:
tensor([1., 1.], device='cuda:0', dtype=torch.float64)
device = torch.device("cuda")
module = module.to(device)
device = torch.device("cuda")
# training
for data in data_loader:
imgs, targets = data
imgs = imgs.to(device)
targets = target.to(device)
#....
# testing/validation
# 同上
device = torch.device("cuda")
loss_function = loss_function.to(device)