前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Pytorch 1.2.0 来了!

Pytorch 1.2.0 来了!

作者头像
新智元
发布2019-08-15 17:47:55
2.2K0
发布2019-08-15 17:47:55
举报
文章被收录于专栏:新智元


新智元报道

来源:GitHub

编辑:大明、金磊

【新智元导读】PyTorch 1.2.0 正式发布了!官方在GitHub上发布更新文档,详细介绍了此次升级在JIT、ONNX、分布式、性能以及前端等方面的大量改进,一起来看看吧。

今天,PyTorch官方正式发布 1.2.0 版本!

此次升级有超过1900个commit,包括在JIT、ONNX、分布式、性能以及前端等方面的大量改进。

PyTorch在GitHub中对 1.2.0 版本的详细介绍:

https://github.com/pytorch/pytorch/releases

新智元将带读者了解此次 PyTorch 1.2.0 版本具体升级、改进了哪些地方。

亮点

[JIT]新 TorchScript API

1.2.0 版本包含了一个新的API,它可以使 nn.Module 跟易于转换为 ScriptModule。示例如下:

代码语言:javascript
复制
1class MyModule(torch.nn.Module):
2    ...
3
4# Construct an nn.Module instance
5module = MyModule(args)
6
7# Pass it to `torch.jit.script` to compile it into a ScriptModule.
8my_torchscript_module = torch.jit.script(module)

[JIT]改进了TorchScript Python语言覆盖

在 1.2.0 版本中,TorchScript大大改进了对Python语言构造和Python标准库的支持。亮点包括:

  • 提前返回(return)、中断(break)以及继续(continue);
  • 基于迭代器的构造,例如 for...in 循环,zip() 和 enumerate();
  • NamedTuples;
  • 支持 math 和 string 库;
  • 支持大多数Python内置函数。

NN Transformer

此次更新添加了一个NN Transformer模块,该模块完全基于注意力机制,反映出输入和输出的全局依赖性。新版本为nn.Transformer 模块设计了独立的组件,所以可以独自使用,比如,nn.TransformerEncoder可以独自使用,无需更大的nn.Transformer。

数据类型支持的改进与变化

比较操作返回的数据类型由 torch.uint8 变为 torch.bool

代码语言:javascript
复制
1>>> torch.tensor([1, 2, 3]) < torch.tensor([3, 1, 2])
2tensor([1, 0, 0], dtype=torch.uint8)

__invert__ / ~: 现在改为调用 torch.bitwise_not ,而不是1 – tensor并支持所有整型和布尔数据类型,而不仅仅是支持 torch.uint8。

代码语言:javascript
复制
1>>> ~torch.arange(8, dtype=torch.uint8)
2tensor([ 1, 0, 255, 254, 253, 252, 251, 250], dtype=torch.uint8)

torch.tensor(bool)和torch.as_tensor(bool) :现在指的是 torch.bool数据类型,而不是torch.uint8。

代码语言:javascript
复制
1>>> torch.tensor([True, False])
2tensor([1, 0], dtype=torch.uint8)

nn.BatchNorm{1,2,3}D: gamma (weight) :现在初始化至所有的1 ,不再U(0, 1)上随机初始化。

代码语言:javascript
复制
1>>> torch.nn.BatchNorm2d(5).weight
2Parameter containing:
3tensor([0.1635, 0.7512, 0.4130, 0.6875, 0.5496], 
4       requires_grad=True)

移除了一些不适用的线性代数操作,具体见下表,左列为被移除的项目,右列为新增的代替项目:

稀疏张量的一些改进

稀疏张量:全面改变张量的稀疏度,不再支持.data

代码语言:javascript
复制
1>>> x = torch.randn(2,3)
2>>> x.data = torch.sparse_coo_tensor((2, 3))
3RuntimeError: Attempted to call `variable.set_data(tensor)`,
4but `variable` and  `tensor` have incompatible tensor type.

稀疏张量:对密集张量构建器的本地修改将不再修改稀疏张量本身

代码语言:javascript
复制
 1>>> i = torch.tensor([[0, 1]])
 2>>> v = torch.ones(2)
 3>>> s = torch.sparse_coo_tensor(i, v)
 4>>> i.resize_(1, 1)
 5>>> v.resize_(1)
 6
 7>>> s.coalesce().indices().shape
 8torch.Size([1, 1])
 9
10>>> s.coalesce().values().shape
11torch.Size([1])

稀疏张量:向稀疏.grad累加密集梯度将不再保留Python目标身份。

代码语言:javascript
复制
 1>>> i = torch.tensor([[0, 1]])
 2>>> v = torch.ones(2)
 3>>> s = torch.sparse_coo_tensor(i, v)
 4>>> i.resize_(1, 1)
 5>>> v.resize_(1)
 6
 7>>> s.coalesce().indices().shape
 8torch.Size([1, 2])
 9
10>>> s.coalesce().values().shape
11torch.Size([2])

nn.utils.convert_sync_batchnorm被替换为

nn.SyncBatchNorm.convert_sync_batchnorm (18787)

错误检查

错误检查:torch.addcmul 和 torch.lerp 操作器现在对输出张量形态要求更高,如果输出张量被用作输入之一,则不再允许其改变大小。

代码语言:javascript
复制
1>>> x=torch.zeros(1)
2>>> torch.addcmul(x, x, torch.zeros(2,3), out=x)
3tensor([[0., 0., 0.],
4        [0., 0., 0.]])

错误检查:变量版本跟踪性能改进

代码语言:javascript
复制
1>>> x = torch.ones(1, requires_grad=True)+1
2>>> y = x*x
3
4# do an in-place update through Variable constructor
5>>> torch.autograd.Variable(x).add_(1)
6>>> y.backward()
7RuntimeError: one of the variables needed for gradient computation has been modified
8by an inplace operation: [torch.FloatTensor [1]] is at version 1; expected version 0 
9instead.

【JIT】从脚本模块调用的Python将被无视

代码语言:javascript
复制
1def my_unscriptable_python_fn():
2    # weird stuff
3
4@torch.jit.script
5def fn():
6    # This gets inserted as a Python call, and only errors on `save()`.
7    my_unscriptable_python_fn()

【JIT】面向脚本模块的优化器现在是一个背景管理器。

代码语言:javascript
复制
1@torch.jit.script(optimize=False)
2def fn(inputs):
3    ...
4
5fn(inputs)

【JIT】script::Module 现在是一种引用形式

代码语言:javascript
复制
1using torch::jit::script::Module;
2
3std::shared_ptr<Module> m = torch::jit::load("my_model.py");
4m->forward(...);

【仅C++】mean() /sum() / prod() API做出了一些轻微变动

代码语言:javascript
复制
1Tensor sum(IntArrayRef dim, bool keepdim=false) const;    
2Tensor sum(IntArrayRef dim, ScalarType dtype) const;

新特性

包括张量类型支持、NN Package、操作器、Optim Package、分布式Package、可迭代数据集、Tensorboard Package等

性能改进

改进内容包括分布式、Tensorboard、Numpy兼容性、JIT、C++ API、MKLDNN张量等。

Bug修正:

包括torch.nn的bug修正、分布式bug修正、JIT bug修正和C++前端bug修正等。

一些不再使用的功能

torch.uint8张量掩模被移除,改为支持 torch.bool张量掩模。

之前版本遗留的autograd函数(不包括静态前向法的函数) 不再使用。

torch.gels 被重命名为torch.lstsq,torch.gels 将不再使用。

性能提升与文档更新

Torch.NN 性能提升。Torch.NN、贡献者、Build、TensorBoard和TorchHUB文档更新。

对ONNX的支持进一步扩展

  • 支持更多的ONNX 操作集
  • 对脚本模块的扩展支持
  • 支持导出更多的Torch操作器到ONNX
  • 扩展现有的导出逻辑
  • 对导出的ONNX图进行了优化
  • 其他一些bug修正和改进

更多更详细的更新信息,请详见PyTorch官方GitHub上的更新帖。

官方更新说明:

https://github.com/pytorch/pytorch/releases

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 新智元 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 【新智元导读】PyTorch 1.2.0 正式发布了!官方在GitHub上发布更新文档,详细介绍了此次升级在JIT、ONNX、分布式、性能以及前端等方面的大量改进,一起来看看吧。
  • NN Transformer
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档