1:检测是否可以使用GPU
use_gpu =torch.cuda.is_available()
> 当可以使用GPU,我们不想使用,可以直接赋值use_gpu = False。
2:使用GPU的三种方式
with torch.cuda.device(1):
# allocates a tensor on GPU 1
a = torch.tensor([1., 2.], device=cuda)
# transfers a tensor from CPU to GPU 1
b = torch.tensor([1., 2.]).cuda()
# a.device and b.device are device(type='cuda', index=1)
# You can also use ``Tensor.to`` to transfer a tensor:
b2 = torch.tensor([1., 2.]).to(device=cuda)
# b.device and b2.device are device(type='cuda', index=1)
#这三种方式没什么区别,但都需要先判断是否又GPU才能使用,个人觉得.to(device)更好用,在使用前先使用(1)中的代码判断,后面直接使用use_gpu即可。
3:哪些数据能上传到GPU运算
#(1)判断GPU是否可用
if torch.cuda.is_available():
device = torch.device('cuda')
cudnn.benchmark = True
else:
device = torch.device('cpu')
#(2)构建网络时,把网络,与损失函数转换到GPU上
model = CNN().to(device)
loss = nn.CrossEntropyLoss().to(device)
#(3)训练网络时,把数据转换到GPU上
x, y = x.to(device), y.to(device)
# 注,只有tensor类型才能上传到GPU上,故需要对numpy数据进行转换成rensor类型
# torch.tensor(x) 或 torch.from_numpy(x)
#两者的区别见 https://blog.csdn.net/github_28260175/article/details/105382060
#(4)对训练的输出结果有些需要使用np的函数进行操作,需先将输出结果转到CPU上,并转成numpy类型,再使用np的函数
output = (model(x)).cpu().numpy()
4:代码释意:cudnn.benchmark = True
通过如上设置让内置的cuDNN的auto-tuner自动寻找最适合当前配置的高效算法,来达到优化运行效率的问题。
1.网络的输入数据维度或类型上变化不大,设置为true可以增加运行效率;
2.如果网络的输入数据在每个iteration都变化的话,会导致cnDNN每次都会去寻找一遍最优配置,这样反而会降低运行效率;
cuDNN是英伟达专门为深度神经网络所开发出来的GPU加速库,针对卷积、池化等等常见操作做了非常多的底层优化,比一般的GPU程序要快很多。在使用cuDNN的时候,默认为False。
设置为True将会让程序在开始时花费一点额外时间,为整个网络的每个卷积层搜索最适合它的卷积实现算法,进而实现网络的加速。适用场景是网络结构固定,网络输入形状不变(即一般情况下都适用)。反之,如果卷积层的设置一直变化,将会导致程序不停地做优化,反而会耗费更多的时间。
原文链接: https://blog.csdn.net/qq_38101208/article/details/110481390