新智元报道
[新智元导读] 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. 示例如下:
- class MyModule(torch.nn.Module):
- ...
- # Construct an nn.Module instance
- module = MyModule(args)
- # Pass it to `torch.jit.script` to compile it into a ScriptModule.
- my_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
- >>> torch.tensor([1, 2, 3]) <torch.tensor([3, 1, 2])
- tensor([1, 0, 0], dtype=torch.uint8)
__invert__ / ~: 现在改为调用 torch.bitwise_not , 而不是 1 - tensor 并支持所有整型和布尔数据类型, 而不仅仅是支持 torch.uint8.
- >>> ~torch.arange(8, dtype=torch.uint8)
- tensor([ 1, 0, 255, 254, 253, 252, 251, 250], dtype=torch.uint8)
torch.tensor(bool)和 torch.as_tensor(bool) : 现在指的是 torch.bool 数据类型, 而不是 torch.uint8.
- >>> torch.tensor([True, False])
- tensor([1, 0], dtype=torch.uint8)
nn.BatchNorm{1,2,3}D: gamma (weight) : 现在初始化至所有的 1 , 不再 U(0, 1)上随机初始化.
- >>> torch.nn.BatchNorm2d(5).weight
- Parameter containing:
- tensor([0.1635, 0.7512, 0.4130, 0.6875, 0.5496],
- requires_grad=True)
移除了一些不适用的线性代数操作, 具体见下表, 左列为被移除的项目, 右列为新增的代替项目:
稀疏张量的一些改进
稀疏张量: 全面改变张量的稀疏度, 不再支持. data
- >>> x = torch.randn(2,3)
- >>> x.data = torch.sparse_coo_tensor((2, 3))
- RuntimeError: Attempted to call `variable.set_data(tensor)`,
- but `variable` and `tensor` have incompatible tensor type.
稀疏张量: 对密集张量构建器的本地修改将不再修改稀疏张量本身
- >>> i = torch.tensor([[0, 1]])
- >>> v = torch.ones(2)
- >>> s = torch.sparse_coo_tensor(i, v)
- >>> i.resize_(1, 1)
- >>> v.resize_(1)
- >>> s.coalesce().indices().shape
- torch.Size([1, 1])
- >>> s.coalesce().values().shape
- torch.Size([1])
稀疏张量: 向稀疏. grad 累加密集梯度将不再保留 Python 目标身份.
- >>> i = torch.tensor([[0, 1]])
- >>> v = torch.ones(2)
- >>> s = torch.sparse_coo_tensor(i, v)
- >>> i.resize_(1, 1)
- >>> v.resize_(1)
- >>> s.coalesce().indices().shape
- torch.Size([1, 2])
- >>> s.coalesce().values().shape
- torch.Size([2])
nn.utils.convert_sync_batchnorm 被替换为
nn.SyncBatchNorm.convert_sync_batchnorm (18787)
错误检查
错误检查: torch.addcmul 和 torch.lerp 操作器现在对输出张量形态要求更高, 如果输出张量被用作输入之一, 则不再允许其改变大小.
- >>> x=torch.zeros(1)
- >>> torch.addcmul(x, x, torch.zeros(2,3), out=x)
- tensor([[0., 0., 0.],
- [0., 0., 0.]])
错误检查: 变量版本跟踪性能改进
- >>> x = torch.ones(1, requires_grad=True)+1
- >>> y = x*x
- # do an in-place update through Variable constructor
- >>> torch.autograd.Variable(x).add_(1)
- >>> y.backward()
- RuntimeError: one of the variables needed for gradient computation has been modified
- by an inplace operation: [torch.FloatTensor [1]] is at version 1; expected version 0
- instead.
[JIT] 从脚本模块调用的 Python 将被无视
- def my_unscriptable_python_fn():
- # weird stuff
- @torch.jit.script
- def fn():
- # This gets inserted as a Python call, and only errors on `save()`.
- my_unscriptable_python_fn()
[JIT] 面向脚本模块的优化器现在是一个背景管理器.
- @torch.jit.script(optimize=False)
- def fn(inputs):
- ...
- fn(inputs)
[JIT] script::Module 现在是一种引用形式
- using torch::jit::script::Module;
- std::shared_ptr<Module> m = torch::jit::load("my_model.py");
- m->forward(...);
[仅 C++] mean() /sum() / prod() API 做出了一些轻微变动
- Tensor sum(IntArrayRef dim, bool keepdim=false) const;
- Tensor 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
来源: https://www.qcloud.com/developer/article/1487800