在GPU上训练PyTorch代码

文章目录

PyTorch操作

Py Torch允许我们在程序内部进行计算时,无缝地将数据移动到GPU。当我们使用GPU时,我们可以使用.cuda()方法,当我们使用CPU时,我们可以使用.CPU()方法。
我们也可以使用.to()方法,如果要进入GPU,我们要写入to.(‘cuda’),要进入CPU,我们要写入to.(‘CPU’).我们将看到一个使用前两个的示例,然后我们将默认始终使用to()变量。

在GPU上训练PyTorch代码
要在培训过程中使用GPU,有两个基本要求。
  • 数据必须在GPU
  • 网络必须在GPU。
    默认情况下,当创建PyTorch张量或Py Torch神经网络模块时,相应的数据在CPU上初始化。具体来说,数据存在于CPU的内存中。
    现在,让我们创建一个张量和一个网络,看看我们如何从CPU转移到GPU。
t = torch.ones(1,1,28,28)
network = Network()

现在,我们调用cuda()方法,

t = t.cuda()
network = network.cuda()

查看是否在GPU上:

gpu_pred = network(t)
gpu_pred.device

同样,也可以将在GPU上的数据重新放到CPU上面

t = t.cpu()
network = network.cpu()
cpu_pred = network(t)
cpu_pred.device

tensor在不同设备上的操作

GPU和CPU是基于数据进行计算的计算设备,因此在计算中直接相互使用的任何两个值都必须存在于同一设备上。
以下代码验证如果操作不在同一设备上,则会发生错误。

[En]

The following code verifies that an error will occur if the operation is not on the same device.

t1 = torch.tensor([
    [1,2],
    [3,4]
])

t2 = torch.tensor([
    [5,6],
    [7,8]
])
t1.device, t2.device

t1 = t1.to('cuda')
t1.device

try:
    t1 + t2
except Exception as e:
    print(e)

try:
    t2 + t1
except Exception as e:
    print(e)

从上面的代码可以看到,运算符前后的数据在不同的设备上,错误信息也不同。二进制加运算期望第二个参数与第一个参数具有相同的器件。了解此错误的含义有助于调试这些类型的设备不匹配。

[En]

As you can see from the above code, the data before and after the operator is on different devices, and the error information is also different. The binary plus operation expects the second parameter to have the same device as the first parameter. Understanding the meaning of this error is helpful to debug these types of device mismatches.

将两个tensor都放在同一个设备上:

t2 = t2.to('cuda')
t1 + t2

网络的不同设备上

在上面的实例中
网络也可以放到GPU上,具体的实质是什么呢?

network = network.cuda()

通过上一篇文章中使用的网络

[En]

Through the network used in the previous article

network = Network()
for name, param in network.named_parameters():
    print(name, '\t\t', param.shape)

for n, p in network.named_parameters():
    print(p.device, '', n)

在这里,我们创建了一个PyTorch网络,并迭代了该网络的参数。正如我们所见,网络的参数是网络内部的权重和偏差。换句话说,这些只是我们已经看到的存在于设备上的张量。让我们通过检查每个参数的设备来验证这一点。所有的权重和偏差张量都在CPU上。
这向我们表明,默认情况下,网络中的所有参数都在CPU上初始化。
这也就解释了网络也可以放到GPU上的实质:网络等模块实例实际上没有设备,不是存在于设备上的网络,而是存在于设备上的网络中的张量。(网络在某个设备上也就是说是网络上的参数张量存在某个设备上)

network.to('cuda')
for n, p in network.named_parameters():
    print(p.device, '', n)

总结:一般使用to()方法进行设备的转换,用该方法可以编写设备无关的代码,将设备device作为参数传递,增加代码的效率。

Original: https://blog.csdn.net/weixin_43328816/article/details/124169917
Author: love the future
Title: 在GPU上训练PyTorch代码

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/497127/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球