【强烈推荐】浅谈将Pytorch模型从CPU转换成GPU

2017 年 12 月 24 日 机器学习研究会

推荐阅读:5min~8min

主要内容:最近将Pytorch程序迁移到GPU上去的一些工作和思考 环境:Ubuntu 16.04.3 Python版本:3.5.2   Pytorch版本:0.3.0


1
序言



大家知道,在深度学习中使用GPU来对模型进行训练是可以通过并行化其计算来提高运行效率,这里就不多谈了。

最近申请到了实验室的服务器来跑程序,成功将我简陋的程序改成了“高大上”GPU版本。

看到网上没有太多这方面的介绍(TensorFlow的倒是不少~),这里决定将我的一些思考和工作记录下来。


2
 如何进行迁移



由于我使用的是Pytorch写的模型,网上给出了一个非常简单的转换方式: 对模型和相应的数据使用.cuda()处理。通过这种方式,我们就可以将内存中的数据复制到GPU的显存中去。从而可以通过GPU来进行运算了。

网上说的非常简单,但是实际使用过程中还是遇到了一些疑惑。下面分数据模型两方面的迁移来进行说明介绍。


1.1 判定使用GPU


下载了对应的GPU版本的Pytorch之后,要确保GPU是可以进行使用的,通过`torch.cuda.is_available()`的返回值来进行判断。返回`True`则具有能够使用的GPU。

通过`torch.cuda.device_count()`可以获得能够使用的GPU数量。其他就不多赘述了。

常常通过如下判定来写可以跑在GPU和CPU上的通用模型:

if torch.cuda.is_available():
    ten1 = ten1.cuda()
    MyModel = MyModel.cuda() 


3
对应数据的迁移



数据方面常用的主要是两种 —— TensorVariable。实际上这两种类型是同一个东西,因为Variable实际上只是一个容器,这里先视其不同。



2.1 将Tensor迁移到显存中去


不论是什么类型的Tensor(FloatTensor或者是LongTensor等等),一律直接使用方法.cuda()即可。

例如:

ten1 = torch.FloatTensor(2)

>>>> 6.1101e+24 4.5659e-41 [torch.FloatTensor of size 2] ten1_cuda = ten1.cuda()

>>>> 6.1101e+24 4.5659e-41[torch.cuda.FloatTensor of size 2 (GPU 0)]

其数据类型会由`torch.FloatTensor`变为`torch.cuda.FloatTensor (GPU 0)`这样代表这个数据现在存储在

`GPU 0`的显存中了。

如果要将显存中的数据复制到内存中,则对cuda数据类型使用`.cpu()`方法即可。


2.2 将Variable迁移到显存中去


在模型中,我们最常使用的是Variable这个容器来装载使用数据。主要是由于Variable可以进行反向传播来进行自动求导。

同样地,要将Variable迁移到显存中,同样只需要使用`.cuda()`即可实现。

这里笔者先前有一个小疑问,对Variable直接使用`.cuda`和对Tensor进行`.cuda`然后再放置到Variable中结果是否一致呢。答案是肯定的。

ten1 = torch.FloatTensor(2)

>>> 6.1101e+24 4.5659e-41 [torch.FloatTensor of size 2]

ten1_cuda
= ten1.cuda()

>>>> 6.1101e+24 4.5659e-41 [torch.cuda.FloatTensor of size 2 (GPU 0)]

V1_cpu
= autograd.Variable(ten1)>>>> Variable containing: 6.1101e+24 4.5659e-41 [torch.FloatTensor of size 2]

V2
= autograd.Variable(ten1_cuda)

>>>> Variable containing: 6.1101e+24 4.5659e-41 [torch.cuda.FloatTensor of size 2 (GPU 0)]

V1
= V1_cpu.cuda()>>>> Variable containing: 6.1101e+24 4.5659e-41 [torch.cuda.FloatTensor of size 2 (GPU 0)]

最终我们能发现他们都**能够达到相同的目的**,但是他们完全一样了吗?我们使用`V1 is V2`发现,结果是否定的。

对于V1,我们是直接对Variable进行操作的,这样子V1的`.grad_fn`中会记录下创建的方式。因此这二者并不是完全相同的。


转自:机器学习算法与自然语言处理


完整内容请点击“阅读原文”

登录查看更多
7

相关内容

TensorFlow Lite指南实战《TensorFlow Lite A primer》,附48页PPT
专知会员服务
69+阅读 · 2020年1月17日
一网打尽!100+深度学习模型TensorFlow与Pytorch代码实现集合
《动手学深度学习》(Dive into Deep Learning)PyTorch实现
专知会员服务
119+阅读 · 2019年12月31日
【GitHub实战】Pytorch实现的小样本逼真的视频到视频转换
专知会员服务
35+阅读 · 2019年12月15日
【书籍】深度学习框架:PyTorch入门与实践(附代码)
专知会员服务
163+阅读 · 2019年10月28日
PyTorch 官方推荐了一份 60 分钟的深度学习指南
技术最前线
20+阅读 · 2019年10月17日
基于PyTorch/TorchText的自然语言处理库
专知
28+阅读 · 2019年4月22日
PyTorch使用总览
极市平台
5+阅读 · 2019年3月25日
Github 项目推荐 | 用 PyTorch 0.4 实现的 YoloV3
AI研习社
9+阅读 · 2018年8月11日
PyTorch 到底好用在哪里?
AI研习社
3+阅读 · 2017年10月27日
手把手教你由TensorFlow上手PyTorch(附代码)
数据派THU
5+阅读 · 2017年10月1日
教程 | 如何从TensorFlow转入PyTorch
机器之心
7+阅读 · 2017年9月30日
Caffe 深度学习框架上手教程
黑龙江大学自然语言处理实验室
14+阅读 · 2016年6月12日
Arxiv
8+阅读 · 2018年11月21日
Arxiv
5+阅读 · 2018年10月23日
Arxiv
3+阅读 · 2018年6月1日
Arxiv
4+阅读 · 2018年3月14日
Arxiv
8+阅读 · 2018年1月25日
VIP会员
相关资讯
PyTorch 官方推荐了一份 60 分钟的深度学习指南
技术最前线
20+阅读 · 2019年10月17日
基于PyTorch/TorchText的自然语言处理库
专知
28+阅读 · 2019年4月22日
PyTorch使用总览
极市平台
5+阅读 · 2019年3月25日
Github 项目推荐 | 用 PyTorch 0.4 实现的 YoloV3
AI研习社
9+阅读 · 2018年8月11日
PyTorch 到底好用在哪里?
AI研习社
3+阅读 · 2017年10月27日
手把手教你由TensorFlow上手PyTorch(附代码)
数据派THU
5+阅读 · 2017年10月1日
教程 | 如何从TensorFlow转入PyTorch
机器之心
7+阅读 · 2017年9月30日
Caffe 深度学习框架上手教程
黑龙江大学自然语言处理实验室
14+阅读 · 2016年6月12日
相关论文
Arxiv
8+阅读 · 2018年11月21日
Arxiv
5+阅读 · 2018年10月23日
Arxiv
3+阅读 · 2018年6月1日
Arxiv
4+阅读 · 2018年3月14日
Arxiv
8+阅读 · 2018年1月25日
Top
微信扫码咨询专知VIP会员