PyTorch - 34 - 在GPU上进行PyTorch - 使用CUDA训练神经网络
- Using A GPU For Deep Learning
- PyTorch GPU Example
- General Idea Of Using A GPU
- PyTorch Tensor Computations On A GPU
- PyTorch nn.Module Computations On A GPU
- Passing A Sample To The Network
- Writing Device Agnostic PyTorch Code
- PyTorch GPU Training Performance Test
- Refactoring The RunManager Class
- Refactoring The Training Loop
Using A GPU For Deep Learning
如果您还没有看到有关为什么深度学习和神经网络使用GPU的那一集,请确保在这一集的旁边进行回顾,以最好地理解这些概念。
现在,我们将以PyTorch GPU示例为基础。
PyTorch GPU Example
我们也可以使用to()方法。要进入GPU,我们要写入(‘cuda’),要进入CPU,我们要写入(‘cpu’)。 to()方法是首选方法,主要是因为它更灵活。我们将使用前两个示例来说明一个示例,然后默认将始终使用to()变体。
CPU | GPU |
---|---|
cpu() | cuda() |
to(‘cpu’) | to(‘cuda’) |
要在培训过程中使用我们的GPU,有两个基本要求。这些要求如下,必须将数据移至GPU,将网络移至GPU。
- GPU上的数据
- GPU上的网络
默认情况下,创建PyTorch张量或PyTorch神经网络模块时,将在CPU上初始化相应的数据。具体来说,数据存在于CPU的内存中。
现在,让我们创建一个张量和一个网络,并看看如何进行从CPU到GPU的迁移。
在这里,我们创建一个张量和一个网络:
t = torch.ones(1,1,28,28)
network = Network()
现在,我们调用cuda()方法并将张量和网络重新分配给已复制到GPU的返回值:
t = t.cuda()
network = network.cuda()
接下来,我们可以从网络获取预测,并查看预测张量的device属性确认数据在cuda(即GPU)上:
> gpu_pred = network(t)
> gpu_pred.device
device(type='cuda', index=0)
同样,我们可以采取相反的方式:
> t = t.cpu()
> network = network.cpu()
> cpu_pred = network(t)
> cpu_pred.device
device(type='cpu')
简而言之,这就是我们如何利用PyTorch的GPU功能。现在,我们要讨论的是一些重要的细节,这些细节潜伏在我们刚刚看到的代码的表面之下。
例如,尽管我们使用了cuda()和cpu()方法,但实际上它们并不是我们的最佳选择。此外,网络实例和张量实例之间的方法有什么区别?这些毕竟是不同的对象类型,这意味着这两种方法是不同的。最后,我们希望将此代码集成到一个有效的示例中并进行性能测试。
General Idea Of Using A GPU
此时的主要结论是,我们的网络和数据都必须同时存在于GPU上,才能使用GPU进行计算,这适用于任何编程语言或框架。
正如我们将在下一个演示中看到的那样,对于CPU也是这样。 GPU和CPU是基于数据进行计算的计算设备,因此在计算中彼此直接使用的任何两个值必须存在于同一设备上。
PyTorch Tensor Computations On A GPU
让我们通过演示一些张量计算来更深入地研究。
我们将从创建两个张量开始:
t1 = torch.tensor([
[1,2],
[3,4]
])
t2 = torch.tensor([
[5,6],
[7,8]
])
现在,我们将通过检查device属性来检查这些张量在哪个设备上初始化:
> t1.device, t2.device
(device(type='cpu'), device(type='cpu'