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,向量化相关推荐

  1. pytorch 实现张量tensor,图片,CPU,GPU,数组等的转换

    pytorch 实现张量tensor,图片,CPU,GPU,数组等的转换 1, 创建pytorch 的Tensor张量: torch.rand((3,224,224)) #创建随机值的三维张量,大小为 ...

  2. tensor转换为图片_pytorch 实现张量tensor,图片,CPU,GPU,数组等的转换

    1, 创建pytorch 的Tensor张量: torch.rand((3,224,224)) #创建随机值的三维张量,大小为(3,224,224) torch.Tensor([3,2]) #创建张量 ...

  3. Pytorch框架之tensor的gpu状态查看以及设备号

    tensor的gpu相关的属性 is_cuda device QQ:3020889729 小蔡 is_cuda 查看当前数据(tensor)是否存放在GPU上 '''当前tensor未放在gpu上存放 ...

  4. 实践教程 | 浅谈 PyTorch 中的 tensor 及使用

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者 | xiaopl@知乎(已授权) 来源 | https://z ...

  5. 【深度学习理论】一文搞透pytorch中的tensor、autograd、反向传播和计算图

    转载:https://zhuanlan.zhihu.com/p/145353262 前言 本文的主要目标: 一遍搞懂反向传播的底层原理,以及其在深度学习框架pytorch中的实现机制.当然一遍搞不定两 ...

  6. 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数据 ...

  7. Python数据类型、Numpy数据类型和Pytorch中的tensor类型间的相互转化

    数据类型包括Python数据类型.Numpy数据类型和Pytorch中的tensor,Pytorch中的tensor又包括CPU上的数据类型和GPU上的数据类型. 一.Python数据类型 Pytho ...

  8. 重磅!Facebook更新PyTorch 1.1,打算跨GPU分割神经网络

    时隔半年不到,PyTorch 已经从之前的 1.0 升级到 1.1 版本了.刚刚,Facebook 在年度开发者大会 F8 上宣布正式发布 PyTorch 1.1 版本,这是对 PyTorch 1.0 ...

  9. 重磅!Facebook 更新 PyTorch 1.1,打算跨 GPU 分割神经网络 | 技术头条

    作者 | 琥珀 出品 | AI科技大本营(ID:rgznai100) 责编 | 胡巍巍 时隔半年不到,PyTorch 已经从之前的 1.0 升级到 1.1 版本了.刚刚,Facebook 在年度开发者 ...

最新文章

  1. 2021年大数据基础(三):​​​​​​​​​​​​​​​​​​​​​大数据应用场景
  2. 快速创建Angular组件并定义传参、绑定自定义事件的方法
  3. 如果对GIF进行模糊化加边扩增
  4. Ubuntu 14.04安装mysql
  5. 计算机用户删除 cmd,用命令行删XP中的用户。除administrator外
  6. linux 查看 pppoe dns,Ubuntu 7.04中ADSL拨号上网及DNS设置
  7. 怎么把video文件改成mp4_GiliSoft Video Converter将MP4视频转换成M4V格式教程
  8. JEPLUS之APP自定义插件——JEPLUS软件快速开发平台
  9. mysql数据库导入导出sql文件
  10. vim 插件配置与安装
  11. 【MFC】多国语言工具栏
  12. c语言列出最简真分数序列,C语言实例 列出真分数序列
  13. Android逆向之分析某锁机恶意软件
  14. vue + elment ui打印表格数据
  15. 【翻译】Visual Place Recognition_ A Survey视觉场景识别综述【一】
  16. 11.Blinn-Phong高光
  17. Xsolla与GPay合作,全面开通土耳其市场
  18. 大环套小环、小环围着大环转!
  19. SQL入门:第三天 -->leetCode1527:患某种疾病的患者
  20. html如何同时选择多个选择器,JS中如何使用选择器选择多个元素

热门文章

  1. JavaScript基础(二)-类
  2. 淘宝MySQL十大经典案例pdf
  3. JDK8时间与java.util.Date,java.sql.Date,Timestamp等的相互转换(时间转换)
  4. 接口对前后端和测试的意义
  5. 软件测试人员的三重境界
  6. 数据库-Linux系统下的命令
  7. c#12星座速配代码_原来12星座的软件工程师是这样的
  8. python 数据格式转换_python常用数据格式转换
  9. 前端开发经验:当初我是如何学习JavaScript
  10. 我是小白0基础,现在我想学习前端开发,该如何系统的学习?