Pytorch 其它有关Tensor的话题,GPU,向量化
3.1.4 其它有关Tensor的话题
这部分的内容不好专门划分一小节,但是笔者认为仍值得读者注意,故而将其放在这一小节。
GPU/CPU
tensor可以很随意的在gpu/cpu上传输。使用tensor.cuda(device_id)
或者tensor.cpu()
。另外一个更通用的方法是tensor.to(device)
。
In [119]:
a = t.randn(3, 4)
a.device
Out[119]:
device(type='cpu')
In [120]:
if t.cuda.is_available():a = t.randn(3,4, device=t.device('cuda:1'))# 等价于# a.t.randn(3,4).cuda(1)# 但是前者更快a.device
In [121]:
device = t.device('cpu')
a.to(device)
Out[121]:
tensor([[-1.8934, 0.8776, 2.3714, -0.0861],[-0.2218, 1.7379, 0.5166, 0.2940],[ 1.1621, 0.6702, -0.4791, -0.7298]])
注意
- 尽量使用
tensor.to(device)
, 将device
设为一个可配置的参数,这样可以很轻松的使程序同时兼容GPU和CPU - 数据在GPU之中传输的速度要远快于内存(CPU)到显存(GPU), 所以尽量避免频繁的在内存和显存中传输数据。
持久化
Tensor的保存和加载十分的简单,使用t.save和t.load即可完成相应的功能。在save/load时可指定使用的pickle
模块,在load时还可将GPU tensor映射到CPU或其它GPU上。
In [122]:
if t.cuda.is_available():a = a.cuda(1) # 把a转为GPU1上的tensor,t.save(a,'a.pth')# 加载为b, 存储于GPU1上(因为保存时tensor就在GPU1上)b = t.load('a.pth')# 加载为c, 存储于CPUc = t.load('a.pth', map_location=lambda storage, loc: storage)# 加载为d, 存储于GPU0上d = t.load('a.pth', map_location={'cuda:1':'cuda:0'})
向量化
向量化计算是一种特殊的并行计算方式,相对于一般程序在同一时间只执行一个操作的方式,它可在同一时间执行多个操作,通常是对不同的数据执行同样的一个或一批指令,或者说把指令应用于一个数组/向量上。向量化可极大提高科学运算的效率,Python本身是一门高级语言,使用很方便,但这也意味着很多操作很低效,尤其是for
循环。在科学计算程序中应当极力避免使用Python原生的for循环
。
In [123]:
def for_loop_add(x, y):result = []for i,j in zip(x, y):result.append(i + j)return t.Tensor(result)
In [124]:
x = t.zeros(100)
y = t.ones(100)
%timeit -n 10 for_loop_add(x, y)
%timeit -n 10 x + y
10 loops, best of 3: 997 µs per loop
The slowest run took 5.80 times longer than the fastest. This could mean that an intermediate result is being cached.
10 loops, best of 3: 4.91 µs per loop
可见二者有超过几十倍的速度差距,因此在实际使用中应尽量调用内建函数(buildin-function),这些函数底层由C/C++实现,能通过执行底层优化实现高效计算。因此在平时写代码时,就应养成向量化的思维习惯,千万避免对较大的tensor进行逐元素遍历。
此外还有以下几点需要注意:
- 大多数
t.function
都有一个参数out
,这时候产生的结果将保存在out指定tensor之中。 t.set_num_threads
可以设置PyTorch进行CPU多线程并行计算时候所占用的线程数,这个可以用来限制PyTorch所占用的CPU数目。t.set_printoptions
可以用来设置打印tensor时的数值精度和格式。 下面举例说明。
In [125]:
a = t.arange(0, 20000000)
print(a[-1], a[-2]) # 32bit的IntTensor精度有限导致溢出
b = t.LongTensor()
t.arange(0, 20000000, out=b) # 64bit的LongTensor不会溢出
b[-1],b[-2]
tensor(19999999) tensor(19999998)
Out[125]:
(tensor(19999999), tensor(19999998))
In [126]:
a = t.randn(2,3)
a
Out[126]:
tensor([[ 1.2645, 0.0270, -0.7174],[ 0.4271, 0.0869, 0.6367]])
In [127]:
t.set_printoptions(precision=10)
a
Out[127]:
tensor([[ 1.2645452023, 0.0270472951, -0.7174307108],[ 0.4270690084, 0.0868919790, 0.6366676688]])
Pytorch 其它有关Tensor的话题,GPU,向量化相关推荐
- pytorch 实现张量tensor,图片,CPU,GPU,数组等的转换
pytorch 实现张量tensor,图片,CPU,GPU,数组等的转换 1, 创建pytorch 的Tensor张量: torch.rand((3,224,224)) #创建随机值的三维张量,大小为 ...
- tensor转换为图片_pytorch 实现张量tensor,图片,CPU,GPU,数组等的转换
1, 创建pytorch 的Tensor张量: torch.rand((3,224,224)) #创建随机值的三维张量,大小为(3,224,224) torch.Tensor([3,2]) #创建张量 ...
- Pytorch框架之tensor的gpu状态查看以及设备号
tensor的gpu相关的属性 is_cuda device QQ:3020889729 小蔡 is_cuda 查看当前数据(tensor)是否存放在GPU上 '''当前tensor未放在gpu上存放 ...
- 实践教程 | 浅谈 PyTorch 中的 tensor 及使用
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者 | xiaopl@知乎(已授权) 来源 | https://z ...
- 【深度学习理论】一文搞透pytorch中的tensor、autograd、反向传播和计算图
转载:https://zhuanlan.zhihu.com/p/145353262 前言 本文的主要目标: 一遍搞懂反向传播的底层原理,以及其在深度学习框架pytorch中的实现机制.当然一遍搞不定两 ...
- 06_2_Pytorch的基础数据类型、CPU tensor类型和GPU tensor类型、判断数据类型、CPU或GPU张量之间的转换、数据类型转换、1-4维向量、Tensor张量、Variable等
1.6.2.Pytorch的基础数据类型 1.6.2.1.Torch定义了的七种CPU tensor类型和八种GPU tensor类型 1.6.2.2.基础数据类型 1.6.2.3.Pytorch数据 ...
- Python数据类型、Numpy数据类型和Pytorch中的tensor类型间的相互转化
数据类型包括Python数据类型.Numpy数据类型和Pytorch中的tensor,Pytorch中的tensor又包括CPU上的数据类型和GPU上的数据类型. 一.Python数据类型 Pytho ...
- 重磅!Facebook更新PyTorch 1.1,打算跨GPU分割神经网络
时隔半年不到,PyTorch 已经从之前的 1.0 升级到 1.1 版本了.刚刚,Facebook 在年度开发者大会 F8 上宣布正式发布 PyTorch 1.1 版本,这是对 PyTorch 1.0 ...
- 重磅!Facebook 更新 PyTorch 1.1,打算跨 GPU 分割神经网络 | 技术头条
作者 | 琥珀 出品 | AI科技大本营(ID:rgznai100) 责编 | 胡巍巍 时隔半年不到,PyTorch 已经从之前的 1.0 升级到 1.1 版本了.刚刚,Facebook 在年度开发者 ...
最新文章
- 2021年大数据基础(三):​​​​​​​​​​​​​​​​​​​​​大数据应用场景
- 快速创建Angular组件并定义传参、绑定自定义事件的方法
- 如果对GIF进行模糊化加边扩增
- Ubuntu 14.04安装mysql
- 计算机用户删除 cmd,用命令行删XP中的用户。除administrator外
- linux 查看 pppoe dns,Ubuntu 7.04中ADSL拨号上网及DNS设置
- 怎么把video文件改成mp4_GiliSoft Video Converter将MP4视频转换成M4V格式教程
- JEPLUS之APP自定义插件——JEPLUS软件快速开发平台
- mysql数据库导入导出sql文件
- vim 插件配置与安装
- 【MFC】多国语言工具栏
- c语言列出最简真分数序列,C语言实例 列出真分数序列
- Android逆向之分析某锁机恶意软件
- vue + elment ui打印表格数据
- 【翻译】Visual Place Recognition_ A Survey视觉场景识别综述【一】
- 11.Blinn-Phong高光
- Xsolla与GPay合作,全面开通土耳其市场
- 大环套小环、小环围着大环转!
- SQL入门:第三天 -->leetCode1527:患某种疾病的患者
- html如何同时选择多个选择器,JS中如何使用选择器选择多个元素
热门文章
- JavaScript基础(二)-类
- 淘宝MySQL十大经典案例pdf
- JDK8时间与java.util.Date,java.sql.Date,Timestamp等的相互转换(时间转换)
- 接口对前后端和测试的意义
- 软件测试人员的三重境界
- 数据库-Linux系统下的命令
- c#12星座速配代码_原来12星座的软件工程师是这样的
- python 数据格式转换_python常用数据格式转换
- 前端开发经验:当初我是如何学习JavaScript
- 我是小白0基础,现在我想学习前端开发,该如何系统的学习?