Pytorch 在 Kaggle 上使用 GPU

Pytorch 在 Kaggle 上使用 GPU,第1张

Kaggle 上使用 GPU 0. 环境介绍

环境使用 Kaggle 里免费建立的 Notebook

教程使用李沐老师的 动手学深度学习 网站和 视频讲解

小技巧:当遇到函数看不懂的时候可以按 Shift+Tab 查看函数详解。

1. Kaggle 上使用 GPU

找到右边 Settings 里面的 Accelerator:

选择 GPU:

每周可以使用 36 小时:

查看显卡信息:

!nvidia-smi


可以看到显卡为 Tesla P100,拥有 16G 显存。

2. 计算设备

我们可以指定用于存储和计算的设备,如 CPU 和 GPU。 默认情况下,张量是在内存中创建的,然后使用 CPU 计算它。

在 PyTorch 中,CPU 和 GPU 可以用 torch.device('cpu')torch.device('cuda') 表示。 应该注意的是,cpu 设备意味着所有物理 CPU 和内存, 这意味着 PyTorch 的计算将尝试使用所有 CPU 核心。 然而,gpu 设备只代表一个卡和相应的显存。 如果有多个GPU,我们使用 torch.device(f'cuda:{i}') 来表示第 i i i 块 GPU(从 0 0 0 开始)。 另外,cuda:0cuda 是等价的。

import torch
from torch import nn

torch.device('cpu'), torch.device('cuda'), torch.device('cuda:1')


查询可用 gpu 的数量:

torch.cuda.device_count()


定义了两个函数, 这两个函数允许我们在不存在所需所有GPU的情况下运行代码:

def try_gpu(i=0):  #@save
    """如果存在,则返回gpu(i),否则返回cpu()"""
    if torch.cuda.device_count() >= i + 1:
        return torch.device(f'cuda:{i}')
    return torch.device('cpu')

def try_all_gpus():  #@save
    """返回所有可用的GPU,如果没有GPU,则返回[cpu(),]"""
    devices = [torch.device(f'cuda:{i}')
             for i in range(torch.cuda.device_count())]
    return devices if devices else [torch.device('cpu')]

try_gpu(), try_gpu(10), try_all_gpus()

3. 张量与 GPU

查询张量所在的设备。 默认情况下,张量是在 CPU 上创建的:

x = torch.tensor([1, 2, 3])
x.device

3.1 存储在 GPU 上
X = torch.ones(2, 3, device=try_gpu())
X


存储在另一个 GPU,实际上我是没有另外一个 GPU 的,所以会使用 CPU :

Y = torch.rand(2, 3, device=try_gpu(1))
Y

无论何时我们要对多个项进行 *** 作, 它们都必须在同一个设备上。 例如,如果我们对两个张量求和, 我们需要确保两个张量都位于同一个设备上, 否则框架将不知道在哪里存储结果,甚至不知道在哪里执行计算。

X 在 GPU 上,Y 在 CPU,我们对它们进行求和:

X + Y


可以使用 X.cpu() 或者 Y.cuda() 使它们在一个设备上进行运算:

X.cpu() + Y, X + Y.cuda() 

3.2 旁注

人们使用GPU来进行机器学习,因为单个 GPU 相对运行速度快。 但是在设备(CPU、GPU 和其他机器)之间传输数据比计算慢得多。 这也使得并行化变得更加困难,因为我们必须等待数据被发送(或者接收), 然后才能继续进行更多的 *** 作。 这就是为什么拷贝 *** 作要格外小心。 根据经验,多个小 *** 作比一个大 *** 作糟糕得多。 此外,一次执行几个 *** 作比代码中散布的许多单个 *** 作要好得多(除非你确信自己在做什么)。 如果一个设备必须等待另一个设备才能执行其他 *** 作, 那么这样的 *** 作可能会阻塞。 这有点像排队订购咖啡,而不像通过电话预先订购: 当你到店的时候,咖啡已经准备好了。
最后,当我们打印张量或将张量转换为 NumPy 格式时, 如果数据不在内存中,框架会首先将其复制到内存中, 这会导致额外的传输开销。 更糟糕的是,它现在受制于全局解释器锁,使得一切都得等待 Python 完成。

4. 神经网络和 GPU

神经网络模型可以指定设备。 下面的代码将模型参数放在 GPU 上:

net = nn.Sequential(nn.Linear(3, 1))
net = net.to(device=try_gpu())

net(X)


确认模型参数存储在同一个 GPU 上::

net[0].weight.data.device

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/713997.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-24
下一篇 2022-04-24

发表评论

登录后才能评论

评论列表(0条)

保存