PyTorch:切换到GPU

如何以及为什么在GPU上训练模型-包含代码 。与TensorFlow不同 , PyTorch没有专用于GPU用户的库 , 作为开发人员 , 您需要在此处进行一些手动操作 。 但是最后 , 它将为您节省大量时间 。
PyTorch:切换到GPU
文章图片

>PhotobyArtiomVallatonUnsplash
只是想知道 , 在计算机上安装CUDA或在Colab上切换到GPU运行时是不够的 。 不要误会我的意思 , 这仍然是必要的第一步 , 但是仅这样做将无法利用GPU的强大功能 。
在本文中 , 您将了解如何在以下情况下从CPU切换到GPU:
·训练/测试拆分方法
·数据加载器方法
第一个最常用于表格数据 , 而您每次处理图像数据时都会使用第二个(至少根据我的经验) 。
这两种方法之间有很多差异 , 因此将对每种方法进行深入说明 。 我还应该提到 , 本文将使用GoogleColab 。 如果您还没有阅读我的意见 , 请在这里阅读:
GoogleColab:与支持GPU的笔记本电脑相比 , 它有何不同?Colab , 运行时 , 性能比较…和陷阱的介绍这篇文章的结构如下:
·为什么要切换到GPU?
·训练/测试拆分方法
·DataLoader方法
·结论
因此 , 事不宜迟 , 让我们开始吧!
为什么要切换到GPU?如果您使用的是深度神经网络 , 例如使用ResNet152进行转移学习—在CPU上的培训将持续很长时间 。 如果您是个理智的人 , 则不会尝试这样做 。
线性代数运算是在GPU上并行完成的 , 因此您可以减少大约100倍的训练时间 。 不用说 , 但这也是在多个GPU上进行训练的一种选择 , 这将再次减少训练时间 。
您无需听我说 。 我决定根据此数据集创建CatvsDog分类器 。 该模型基于ResNet50架构-首先在CPU上训练 , 然后在GPU上训练 。
以下是训练时间:
PyTorch:切换到GPU
文章图片

>GPUruntime:00:11:57h;CPUruntime:06:08:40h
自行判断 , 但我会坚持使用GPU运行时 。 它在Colab上免费提供 , 因此没有理由不这样做 。 好的 , 我们现在知道应该使用GPU进行模型训练 , 现在让我们看看如何进行切换 。
训练/测试拆分方法如果您在Scikit-Learn中使用Python进行了一些机器学习 , 那么您肯定对培训/测试分裂很熟悉 。 简而言之 , 我们的想法是在一部分数据集(例如80%)上训练模型 , 并在剩余部分(例如20%)上评估模型 。
训练/测试拆分仍然是深度学习中的一种有效方法 , 尤其是对于表格数据 。 首先要做的是声明一个变量 , 该变量将容纳我们正在训练的设备(CPU或GPU):
device=torch.device('cuda'iftorch.cuda.is_available()else'cpu')
device>>>device(type='cuda')
现在 , 我将声明一些虚拟数据 , 这些数据将用作X_train张量:
X_train=torch.FloatTensor([0.,1.,2.])
X_train>>>tensor([0.,1.,2.])
酷!现在我们可以检查张量是否存储在GPU上:
X_train.is_cuda
>>>False
符合预期-默认情况下 , 数据不会存储在GPU上 , 但将其移动到GPU上相当容易:
X_train=X_train.to(device)
X_train
>>>tensor([0.,1.,2.],device='cuda:0')
整齐 。 可以再次执行相同的健全性检查 , 这一次我们知道张量已移至GPU:
X_train.is_cuda
>>>True
很好 , 但是模型声明呢?
很高兴您提出要求 。 再一次 , 这是一件非常简单的事情:
model=MyAwesomeNeuralNetwork()
model.to(device)
就是这样 , 您可以立即开始培训过程 。 回顾一下 , 这是代码结构的摘要:
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2)
X_train,X_test=X_train.to(device),X_test.to(device)
y_train,y_test=y_train.to(device),y_test.to(device)
classMyAwesomeNeuralNetwork(nn.Module):
#yourmodelheremodel=MyAwesomeNeuralNetwork()
model.to(device)
#trainingcodehere
让我们继续使用DataLoader方法 。
DataLoader方法对于CNN , DataLoader方法更为常见 , 在本节中 , 我们将介绍如何在GPU上放置数据(图像) 。 第一步保持不变 , 因此 , 您必须声明一个变量 , 该变量将保存我们在其上训练的设备(CPU或GPU):
device=torch.device('cuda'iftorch.cuda.is_available()else'cpu')
device>>>device(type='cuda')
现在 , 我们将声明模型并将其放置在GPU上:
model=MyAwesomeNeuralNetwork()
model.to(device)
您可能已经注意到我们尚未将数据放置在GPU上 。 无法直接传输数据加载程序 , 因此我们在这里必须变得更加聪明 。 我们将在训练过程中传输图像 , 如下所示:
forepochinrange(epochs):
forinputs,labelsintrain_loader:
inputs,labels=inputs.to(device),labels.to(device)
因此 , 代码的整体结构应如下所示:
classMyAwesomeNeuralNetwork(nn.Module):
#yourmodelheremodel=MyAwesomeNeuralNetwork()
model.to(device)
epochs=10
forepochinrange(epochs):
forinputs,labelsintrain_loader:
inputs,labels=inputs.to(device),labels.to(device)
#backpropagationcodehere
#evaluation
withtorch.no_grad():
forinputs,labelsintest_loader:
inputs,labels=inputs.to(device),labels.to(device)
#...
【PyTorch:切换到GPU】这就是您要做的全部–数据和模型都放置在GPU上 。
结论您已掌握了两个步骤 , 可以大大减少训练时间 。 乍一看 , 您似乎需要执行许多其他步骤 , 但是一旦您掌握了要点 , 就很简单了 。
在CPU方面的培训是我永远不会建议您做的事情 , 而且由于有了GoogleColab , 您不必这样做-因为您可以免费使用GPU运行时 。
谢谢阅读 。
(本文翻译自DarioRade?i?的文章《PyTorch:SwitchingtotheGPU》 , 参考:https://towardsdatascience.com/pytorch-switching-to-the-gpu-a7c0b21e8a99)


    推荐阅读