在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简单判断序列是否为空的方法
Jun 30 Python
Python 统计字数的思路详解
May 08 Python
Django项目中包含多个应用时对url的配置方法
May 30 Python
Python3爬楼梯算法示例
Mar 04 Python
Django后台admin的使用详解
Jul 08 Python
Django项目中实现使用qq第三方登录功能
Aug 13 Python
python 进程 进程池 进程间通信实现解析
Aug 23 Python
opencv实现简单人脸识别
Feb 19 Python
pymysql之cur.fetchall() 和cur.fetchone()用法详解
May 15 Python
在Keras中CNN联合LSTM进行分类实例
Jun 29 Python
Pytest中skip skipif跳过用例详解
Jun 30 Python
Python Pandas 删除列操作
Mar 16 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将access数据库转换到mysql数据库的方法
2014/12/24 PHP
Yii实现Command任务处理的方法详解
2016/07/14 PHP
利用jquery包将字符串生成二维码图片
2013/09/12 Javascript
基于JS实现PHP的sprintf函数实例
2015/11/14 Javascript
js 创建对象 经典模式全面了解
2016/08/16 Javascript
easyUI实现(alert)提示框自动关闭的实例代码
2016/11/07 Javascript
浅谈react.js中实现tab吸顶效果的问题
2017/09/06 Javascript
谈谈JS中的!!
2017/12/07 Javascript
bootstrap下拉分页样式 带跳转页码
2018/12/29 Javascript
JavaScript创建防篡改对象的方法分析
2018/12/30 Javascript
jQuery内容选择器与表单选择器实例分析
2019/06/28 jQuery
javascript面向对象三大特征之继承实例详解
2019/07/24 Javascript
如何使用七牛Python SDK写一个同步脚本及使用教程
2015/08/23 Python
利用python模拟sql语句对员工表格进行增删改查
2017/07/05 Python
python enumerate函数的使用方法总结
2017/11/15 Python
Python获取CPU、内存使用率以及网络使用状态代码
2018/02/08 Python
python 实现判断ip连通性的方法总结
2018/04/22 Python
详解python里的命名规范
2018/07/16 Python
解决Python3.5+OpenCV3.2读取图像的问题
2018/12/05 Python
使用python3批量下载rbsp数据的示例代码
2019/12/20 Python
matlab中二维插值函数interp2的使用详解
2020/04/22 Python
is_file和file_exists效率比较
2021/03/14 PHP
使用css3做0.5px的细线的示例代码
2018/01/18 HTML / CSS
世界上第一个水枕头:Mediflow
2018/12/06 全球购物
化学实验员岗位职责
2013/12/28 职场文书
学生干部的自我评价分享
2014/01/18 职场文书
作文批改评语大全
2014/04/23 职场文书
副科竞争上岗演讲稿
2014/05/12 职场文书
珍惜资源保护环境的建议书
2014/05/14 职场文书
2014年党员自我评议对照检查材料
2014/09/20 职场文书
2015年度残疾人工作总结
2015/05/14 职场文书
朋友离别感言
2015/08/04 职场文书
周末问候语大全
2015/11/10 职场文书
导游词之千岛湖
2019/09/23 职场文书
用python实现监控视频人数统计
2021/05/21 Python
python周期任务调度工具Schedule使用详解
2021/11/23 Python