在pytorch中为Module和Tensor指定GPU的例子


Posted in Python onAugust 19, 2019

pytorch指定GPU

在用pytorch写CNN的时候,发现一运行程序就卡住,然后cpu占用率100%,nvidia-smi 查看显卡发现并没有使用GPU。所以考虑将模型和输入数据及标签指定到gpu上。

pytorch中的Tensor和Module可以指定gpu运行,并且可以指定在哪一块gpu上运行,方法非常简单,就是直接调用Tensor类和Module类中的 .cuda() 方法。

import torch
from PIL import Image
import torch.nn as nn
import numpy as np
from torch.autograd import Variable

# 先看看有没有显卡
torch.cuda.is_available()
Out[16]: True
# 嗯,有显卡,可以指定,先生成一个Tensor
a = torch.Tensor(3,5)
a
Out[13]: 
.00000e-05 *
 0.0000 0.0000 2.0419 0.0000 2.0420
 0.0000 0.0000 0.0000 0.0000 0.0000
 0.0132 0.0000 0.0131 0.0000 0.0000
[torch.FloatTensor of size 3x5]
a.cuda()
Out[14]: 
.00000e-05 *
 0.0000 0.0000 2.0419 0.0000 2.0420
 0.0000 0.0000 0.0000 0.0000 0.0000
 0.0132 0.0000 0.0131 0.0000 0.0000
[torch.cuda.FloatTensor of size 3x5 (GPU 0)]
# 可以看到上面显示了(GPU 0),也就是说这个Tensor是在第一个GPU上的
a.cuda(1)
Traceback (most recent call last):

 File "<ipython-input-15-ef42531f63ca>", line 1, in <module>
  a.cuda(1)

 File "/home/chia/anaconda2/lib/python2.7/site-packages/torch/_utils.py", line 57, in _cuda
  with torch.cuda.device(device):

 File "/home/chia/anaconda2/lib/python2.7/site-packages/torch/cuda/__init__.py", line 127, in __enter__
  torch._C._cuda_setDevice(self.idx)

RuntimeError: cuda runtime error (10) : invalid device ordinal at torch/csrc/cuda/Module.cpp:84
# 这个报错了,因为只有一块GPU,所以指定cuda(1)无效。

同样滴,Variable变量和Module类型的模型也可以指定放在哪块GPU上

v = Variable(a)

v
Out[18]: 
Variable containing:
.00000e-05 *
 0.0000 0.0000 2.0419 0.0000 2.0420
 0.0000 0.0000 0.0000 0.0000 0.0000
 0.0132 0.0000 0.0131 0.0000 0.0000
[torch.FloatTensor of size 3x5]

v.cuda(0)
Out[19]: 
Variable containing:
.00000e-05 *
 0.0000 0.0000 2.0419 0.0000 2.0420
 0.0000 0.0000 0.0000 0.0000 0.0000
 0.0132 0.0000 0.0131 0.0000 0.0000
[torch.cuda.FloatTensor of size 3x5 (GPU 0)]

model = DenoiseCNN()

model
Out[22]: 
DenoiseCNN (
 (hid_layer): Sequential (
  (0): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True)
  (2): LeakyReLU (0.2)
 )
 (first_layer): Sequential (
  (0): Conv2d(1, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (1): LeakyReLU (0.2)
 )
 (last_layer): Sequential (
  (0): Conv2d(32, 1, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
 )
)

model.cuda(0)
Out[23]: 
DenoiseCNN (
 (hid_layer): Sequential (
  (0): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True)
  (2): LeakyReLU (0.2)
 )
 (first_layer): Sequential (
  (0): Conv2d(1, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (1): LeakyReLU (0.2)
 )
 (last_layer): Sequential (
  (0): Conv2d(32, 1, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
 )
)

这样看不出来Module的变化,考虑看一下Module中的参数在哪里

for i, para in enumerate(model.parameters()):
  if i < 2:
    print para

Parameter containing:
(0 ,0 ,.,.) = 
 -3.1792e-02 -4.6396e-02 -4.3472e-02
 3.4903e-02 1.8558e-02 5.3955e-03
 2.4986e-02 3.8061e-02 -1.6658e-02

(0 ,1 ,.,.) = 
 -3.5041e-02 -3.6286e-02 -3.0819e-02
 1.0683e-02 9.0773e-03 -2.5379e-02
 2.9508e-03 2.8774e-02 7.4632e-04

(0 ,2 ,.,.) = 
 -4.6986e-02 -5.1183e-02 8.4346e-04
 -6.6864e-03 -2.8816e-02 1.2566e-02
 2.1682e-02 2.5485e-02 -7.2600e-03
  ...

(0 ,29,.,.) = 
 -5.5289e-03 -2.6012e-02 -2.7771e-02
 2.7528e-02 3.0460e-02 -1.2829e-02
 7.3387e-03 5.2633e-02 5.0601e-02

(0 ,30,.,.) = 
 -3.5881e-02 9.7000e-03 -3.3692e-02
 1.6257e-03 -4.0113e-02 3.5300e-02
 -2.1399e-03 3.0934e-02 -2.7513e-02

(0 ,31,.,.) = 
 -2.7492e-02 2.5803e-02 5.2171e-02
 -2.4082e-02 3.1887e-02 1.1292e-02
 5.8893e-02 -3.5452e-02 -1.2115e-02
   ⋮ 

(1 ,0 ,.,.) = 
 5.0664e-02 -4.1085e-02 2.9089e-02
 2.1555e-02 5.7176e-02 -7.5013e-03
 3.5075e-02 -1.6610e-02 3.4904e-02

(1 ,1 ,.,.) = 
 4.6716e-02 -1.2552e-02 -3.8132e-02
 -2.9573e-02 -3.5008e-02 -4.2891e-02
 9.5230e-03 -4.8599e-02 2.5357e-02

(1 ,2 ,.,.) = 
 -1.7859e-02 1.3442e-02 1.9493e-02
 1.8434e-02 1.4884e-03 8.6479e-03
 -7.1610e-03 3.5724e-02 6.2249e-03
  ...

(1 ,29,.,.) = 
 -3.3194e-02 1.6803e-05 2.3405e-02
 -5.2223e-02 6.5680e-03 -1.8427e-02
 -1.4476e-02 -1.5434e-02 -2.3108e-02

(1 ,30,.,.) = 
 2.3479e-02 1.2840e-02 4.5949e-02
 4.4833e-02 4.9272e-02 -3.7634e-02
 4.2787e-02 8.5841e-04 1.2332e-02

(1 ,31,.,.) = 
 4.1723e-02 -2.5295e-02 1.1326e-02
 -5.1707e-02 5.3201e-02 4.8928e-02
 -1.6735e-02 -8.7450e-03 -4.9530e-02
   ⋮ 

(2 ,0 ,.,.) = 
 -3.1728e-02 -3.9757e-02 6.5561e-03
 -1.7731e-02 2.8615e-02 2.7457e-02
 -2.1817e-03 -4.2405e-02 -3.6126e-03

(2 ,1 ,.,.) = 
 3.2434e-02 -1.1574e-03 1.3353e-02
 -2.3069e-02 4.9532e-02 1.6768e-02
 -3.5563e-02 -4.4264e-02 -2.0571e-02

(2 ,2 ,.,.) = 
 7.4980e-03 -5.7412e-03 -3.0638e-03
 1.1812e-02 -1.7851e-02 4.2195e-04
 3.9753e-02 3.8771e-02 4.3166e-03
  ...

(2 ,29,.,.) = 
 -5.0798e-02 4.3651e-02 -2.3798e-02
 -6.0957e-03 -5.6953e-02 1.2583e-02
 -2.3450e-02 -4.7136e-02 5.2458e-02

(2 ,30,.,.) = 
 1.5088e-02 2.6097e-02 4.9392e-03
 -9.0372e-03 -5.3276e-02 -1.7824e-02
 3.2060e-03 5.8820e-02 1.3459e-02

(2 ,31,.,.) = 
 -5.2557e-03 -4.9638e-02 -7.5522e-03
 2.8668e-02 -3.9617e-02 -1.8111e-02
 -4.0412e-02 1.1320e-02 -2.4005e-02

   ⋮ 

(29,0 ,.,.) = 
 -1.4393e-02 2.1343e-02 5.1940e-02
 5.7449e-02 3.1327e-02 -1.0721e-02
 -1.0184e-02 -6.2289e-03 3.9823e-02

(29,1 ,.,.) = 
 -4.2240e-03 5.8135e-02 5.2816e-02
 -4.9888e-02 3.3972e-02 4.3127e-02
 -2.3355e-02 -5.5401e-02 3.4952e-02

(29,2 ,.,.) = 
 4.0336e-02 7.6532e-03 5.4083e-02
 -2.7456e-02 3.9090e-02 4.4008e-02
 -2.0424e-02 -5.8922e-02 -4.4759e-03
  ...

(29,29,.,.) = 
 8.8037e-03 1.0347e-02 -2.2285e-02
 -1.0538e-02 -3.2981e-02 2.2300e-02
 -2.7337e-02 5.3113e-02 5.4608e-02

(29,30,.,.) = 
 3.1429e-02 5.2024e-03 -1.3882e-02
 -3.3123e-02 -2.7633e-03 1.9007e-02
 -2.9795e-02 3.7551e-02 5.6486e-02

(29,31,.,.) = 
 2.0140e-02 1.8530e-02 7.4208e-03
 2.7311e-02 5.3581e-02 -2.5553e-02
 -1.7285e-02 1.8722e-02 4.0104e-02
   ⋮ 

(30,0 ,.,.) = 
 5.2750e-02 4.5757e-03 -5.3894e-02
 -3.9297e-02 3.2918e-02 2.3571e-02
 -1.1806e-02 1.6091e-02 3.3755e-04

(30,1 ,.,.) = 
 4.2858e-02 -5.2211e-02 -3.5660e-02
 1.4807e-02 -5.8873e-02 5.5535e-02
 4.9854e-02 2.2946e-02 4.0968e-03

(30,2 ,.,.) = 
 3.0378e-02 2.1315e-02 9.1700e-03
 3.6277e-02 -4.0734e-02 4.8175e-02
 3.0748e-02 -2.7425e-02 -1.7741e-02
  ...

(30,29,.,.) = 
 3.1883e-02 2.5012e-02 2.8504e-02
 -1.3538e-02 3.5570e-02 -2.0261e-02
 -1.5959e-02 3.3373e-02 8.3261e-03

(30,30,.,.) = 
 2.7152e-02 -5.6752e-02 2.2697e-02
 1.2614e-02 -2.4174e-02 -2.5058e-02
 1.8737e-02 -1.3581e-03 -3.7116e-02

(30,31,.,.) = 
 -4.3278e-02 2.5873e-02 -1.6677e-02
 3.9483e-02 5.7898e-02 -4.1450e-02
 -5.8218e-02 -3.0660e-02 -4.2161e-02
   ⋮ 

(31,0 ,.,.) = 
 1.3370e-02 -1.4191e-02 -2.2524e-02
 2.1772e-02 -2.2440e-02 -3.0512e-03
 3.4139e-02 -1.9043e-02 1.1289e-02

(31,1 ,.,.) = 
 -5.1293e-02 -5.2802e-02 1.7022e-02
 5.1031e-02 -1.0345e-02 -4.4780e-02
 -4.9422e-02 4.7709e-02 -2.1215e-02

(31,2 ,.,.) = 
 2.2289e-02 -2.1746e-02 -5.3192e-02
 2.6651e-02 -1.6531e-02 2.2640e-02
 1.4012e-02 1.1405e-02 -1.4809e-02
  ...

(31,29,.,.) = 
 2.5505e-03 2.4052e-02 -4.7662e-02
 1.6068e-02 -4.2278e-02 -2.4670e-02
 -1.4684e-02 -3.8222e-02 -5.0006e-02

(31,30,.,.) = 
 -4.9350e-02 4.7564e-02 -7.3479e-03
 2.6490e-02 -1.1745e-02 3.4324e-02
 4.2650e-02 -5.4633e-02 9.4581e-03

(31,31,.,.) = 
 -3.2695e-02 -2.8899e-02 1.5543e-02
 -5.3662e-02 5.0727e-02 3.5950e-02
 4.6130e-02 -4.4754e-02 -4.5647e-02
[torch.cuda.FloatTensor of size 32x32x3x3 (GPU 0)]

Parameter containing:
.00000e-02 *
 -1.2723
 -5.2970
 -3.4638
 -1.5302
 0.7641
 5.7516
 -4.8427
 -0.7230
 4.5940
 -4.1709
 4.8093
 -4.7249
 -2.2756
 -5.5165
 5.1259
 -2.4693
 1.8527
 -0.4210
 -2.0518
 -3.8124
 -4.6195
 -4.3019
 -0.8631
 -0.4400
 5.4604
 -5.5597
 1.5557
 4.2336
 3.9482
 -1.4457
 2.6124
 -1.8218
[torch.cuda.FloatTensor of size 32 (GPU 0)]

可以看出,模型的参变量是放在GPU上的。

通过指定了gpu后,就可以使用gpu来训练模型了~美滋滋

以上这篇在pytorch中为Module和Tensor指定GPU的例子就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python学习笔记_数据排序方法
May 22 Python
Python3计算三角形的面积代码
Dec 18 Python
Python动刷新抢12306火车票的代码(附源码)
Jan 24 Python
python中实现数组和列表读取一列的方法
Apr 03 Python
Python中循环引用(import)失败的解决方法
Apr 22 Python
Django实战之用户认证(用户登录与注销)
Jul 16 Python
python爬虫自动创建文件夹的功能
Aug 01 Python
Python 实现「食行生鲜」签到领积分功能
Sep 26 Python
Python实现的对本地host127.0.0.1主机进行扫描端口功能示例
Feb 15 Python
Python标准库itertools的使用方法
Jan 17 Python
Python selenium模拟手动操作实现无人值守刷积分功能
May 13 Python
Django filter动态过滤与排序实现过程解析
Nov 26 Python
pytorch使用指定GPU训练的实例
Aug 19 #Python
关于pytorch多GPU训练实例与性能对比分析
Aug 19 #Python
pytorch 更改预训练模型网络结构的方法
Aug 19 #Python
pytorch打印网络结构的实例
Aug 19 #Python
pytorch索引查找 index_select的例子
Aug 18 #Python
浅谈Pytorch中的torch.gather函数的含义
Aug 18 #Python
PyTorch中Tensor的维度变换实现
Aug 18 #Python
You might like
修改php.ini以达到屏蔽错误信息并记录日志
2013/06/16 PHP
PHP中浮点数计算比较及取整不准确的解决方法
2015/01/09 PHP
PHP抽象类和接口用法实例详解
2019/07/20 PHP
javascript实现简单的Map示例介绍
2013/12/23 Javascript
Node.js的特点和应用场景介绍
2014/11/04 Javascript
JavaScript调试工具汇总
2014/12/23 Javascript
jQuery预加载图片常用方法
2015/06/15 Javascript
JavaScript SHA512&amp;SHA256加密算法详解
2015/08/11 Javascript
尝试动手制作javascript放大镜效果
2015/12/25 Javascript
Javascript必知必会(四)js类型转换
2016/06/08 Javascript
AngularJS基础 ng-href 指令用法
2016/08/01 Javascript
prototype与__proto__区别详细介绍
2017/01/09 Javascript
提高Web性能的前端优化技巧总结
2017/02/27 Javascript
详解Vue的computed(计算属性)使用实例之TodoList
2017/08/07 Javascript
node.js 发布订阅模式的实例
2017/09/10 Javascript
JS实现小球的弹性碰撞效果
2017/11/11 Javascript
微信小程序开发摇一摇功能
2019/11/22 Javascript
JavaScript中作用域链的概念及用途讲解
2020/08/06 Javascript
windows下python模拟鼠标点击和键盘输示例
2014/02/28 Python
Python yield 小结和实例
2014/04/25 Python
用matplotlib画等高线图详解
2017/12/14 Python
删除python pandas.DataFrame 的多重index实例
2018/06/08 Python
Python 找到列表中满足某些条件的元素方法
2018/06/26 Python
Python装饰器原理与基本用法分析
2020/01/07 Python
如何理解Python中包的引入
2020/05/29 Python
CSS3的transition和animation的用法实例介绍
2014/08/20 HTML / CSS
婴儿鞋,独特的婴儿服装和配件:Zutano
2018/11/03 全球购物
行政经理岗位职责
2013/11/09 职场文书
影视制作岗位职责
2013/12/04 职场文书
营销人才自我鉴定范文
2013/12/25 职场文书
担保书怎么写
2014/04/01 职场文书
个人委托书格式
2014/04/04 职场文书
2014乡镇党委副书记对照检查材料思想汇报
2014/10/09 职场文书
行政执法作风整顿剖析材料
2014/10/11 职场文书
会计试用期自我评价
2015/03/10 职场文书
灵能百分百第三季什么时候来?
2022/03/15 日漫