最近将Pytorch程序迁移到GPU上去的一些工作和思考 环境:Ubuntu 16.04.3 Python版本:3.5.2 Pytorch版本:0.4.0 0. 序言 大家知道,在深度学习中使用GPU来对模型进行训练是可以通过并行化其计算来提高运行效率,这里就不多谈了。 最近申请到了实验室的服务器
最近将Pytorch程序迁移到GPU上去的一些工作和思考
2. 对应数据的迁移
其数据类型会由torch.FloatTensor变为torch.cuda.FloatTensor (GPU 0)这样代表这个数据现在存储在 GPU 0的显存中了。 如果要将显存中的数据复制到内存中,则对cuda数据类型使用.cpu()方法即可。 2.2 将Variable迁移到显存中去 在模型中,我们最常使用的是Variable这个容器来装载使用数据。主要是由于Variable可以进行反向传播来进行自动求导。 同样地,要将Variable迁移到显存中,同样只需要使用.cuda()即可实现。 这里有一个小疑问,对Variable直接使用.cuda和对Tensor进行.cuda然后再放置到Variable中结果是否一致呢。答案是肯定的。
最终我们能发现他们都能够达到相同的目的,但是他们完全一样了吗?我们使用V1 is V2发现,结果是否定的。 对于V1,我们是直接对Variable进行操作的,这样子V1的.grad_fn中会记录下创建的方式。因此这二者并不是完全相同的。 2.3 数据迁移小结 .cuda()操作默认使用GPU 0也就是第一张显卡来进行操作。当我们想要存储在其他显卡中时可以使用.cuda(<显卡号数>)来将数据存储在指定的显卡中。还有很多种方式,具体参考官方文档。 对于不同存储位置的变量,我们是不可以对他们直接进行计算的。存储在不同位置中的数据是不可以直接进行交互计算的。 换句话说也就是上面例子中的torch.FloatTensor是不可以直接与torch.cuda.FloatTensor进行基本运算的。位于不同GPU显存上的数据也是不能直接进行计算的。 对于Variable,其实就仅仅是一种能够记录操作信息并且能够自动求导的容器,实际上的关键信息并不在Variable本身,而更应该侧重于Variable中存储的data。 3. 模型迁移 模型的迁移这里指的是torch.nn下面的一些网络模型以及自己创建的模型迁移到GPU上去。 上面讲了使用.cuda()即可将数据从内存中移植到显存中去。 对于模型来说,也是同样的方式,我们使用.cuda来将网络放到显存上去。 3.1 torch.nn下的基本模型迁移 这里使用基本的单层感知机来进行举例(线性模型)。
我们很惊奇地发现对于模型来说,不像数据那样使用了.cuda()之后会改变其的数据类型。模型看起来没有任何的变化。 但是他真的没有改变吗。 我们将data1投入linear_cuda中去可以发现,系统会报错,而将.cuda之后的data2投入linear_cuda才能正常工作。并且输出的也是具有cuda的数据类型。 那是怎么一回事呢? 这是因为这些所谓的模型,其实也就是对输入参数做了一些基本的矩阵运算。所以我们对模型.cuda()实际上也相当于将模型使用到的参数存储到了显存上去。 对于上面的例子,我们可以通过观察参数来发现区别所在。
3.2 自己模型的迁移 对于自己创建的模型类,由于继承了torch.nn.Module,则可同样使用.cuda()来将模型中用到的所有参数都存储到显存中去。 这里笔者曾经有一个疑问:当我们对模型存储到显存中去之后,那么这个模型中的方法后面所创建出来的Tensor是不是都会默认变成cuda的数据类型。答案是否定的。具体操作留给读者自己去实现。 3.3 模型小结 对于模型而言,我们可以将其看做是一种类似于Variable的容器。我们对它进行.cuda()处理,是将其中的参数放到显存上去(因为实际使用的时候也是通过这些参数做运算)。 4. 总结 Pytorch使用起来直接简单,GPU的使用也是简单明了。然而对于多GPU和CPU的协同使用则还是有待提高。 |
2019-06-18
2019-07-04
2021-05-23
2021-05-27
2021-05-27