新智元报道
来源:GitHub
编辑:大明、金磊
今天,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。示例如下:
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标准库的支持。亮点包括:
此次更新添加了一个NN Transformer模块,该模块完全基于注意力机制,反映出输入和输出的全局依赖性。新版本为nn.Transformer 模块设计了独立的组件,所以可以独自使用,比如,nn.TransformerEncoder可以独自使用,无需更大的nn.Transformer。
数据类型支持的改进与变化
比较操作返回的数据类型由 torch.uint8 变为 torch.bool
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。
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。
1>>> torch.tensor([True, False])
2tensor([1, 0], dtype=torch.uint8)
nn.BatchNorm{1,2,3}D: gamma (weight) :现在初始化至所有的1 ,不再U(0, 1)上随机初始化。
1>>> torch.nn.BatchNorm2d(5).weight
2Parameter containing:
3tensor([0.1635, 0.7512, 0.4130, 0.6875, 0.5496],
4 requires_grad=True)
移除了一些不适用的线性代数操作,具体见下表,左列为被移除的项目,右列为新增的代替项目:
稀疏张量的一些改进
稀疏张量:全面改变张量的稀疏度,不再支持.data
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.
稀疏张量:对密集张量构建器的本地修改将不再修改稀疏张量本身
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目标身份。
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 操作器现在对输出张量形态要求更高,如果输出张量被用作输入之一,则不再允许其改变大小。
1>>> x=torch.zeros(1)
2>>> torch.addcmul(x, x, torch.zeros(2,3), out=x)
3tensor([[0., 0., 0.],
4 [0., 0., 0.]])
错误检查:变量版本跟踪性能改进
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将被无视
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】面向脚本模块的优化器现在是一个背景管理器。
1@torch.jit.script(optimize=False)
2def fn(inputs):
3 ...
4
5fn(inputs)
【JIT】script::Module 现在是一种引用形式
1using torch::jit::script::Module;
2
3std::shared_ptr<Module> m = torch::jit::load("my_model.py");
4m->forward(...);
【仅C++】mean() /sum() / prod() API做出了一些轻微变动
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的支持进一步扩展
更多更详细的更新信息,请详见PyTorch官方GitHub上的更新帖。
官方更新说明:
https://github.com/pytorch/pytorch/releases