作者:Facebook
编译:ronghuaiyang
导读
Facebook刚刚发布了PyTorch的最新版本,PyTorch1.1.0,这是自从发布PyTorch1.0以来的又一个重大的更新。
Facebook刚刚发布了PyTorch的最新版本,PyTorch1.1.0,这是自从发布PyTorch1.0以来的又一个重大的更新,在这个版本中,最最显眼的一个更新就是官方支持TensorBoard了,之前大家都是用的TensorBoardX,这次,终于可以光明正大的使用TensorBoard了,顺便吐槽一下visdom,确实不如TensorBoard好用。
除了TensorBoard之外,其实还有不少重要的更新,下面给大家提供一些摘要,给大家先过目一遍,我列出了一些要点,更多的内容大家可以去看看原文。
注意:不再支持CUDA 8.0
重点
TensorBoard (试验)
使用TensorBoard对可视化和模型调试提供一流的本地支持,这是一个用于检查和理解训练运行、张量和图的web应用程序套件。PyTorch现在支持TensorBoard通过一个简单的 fromtorch.utils.tensorboardimportSummaryWriter命令来写入日志。直方图、嵌入、标量、图像、文本、图形,以及更多东西都可以在训练过程中进行可视化。目前,TensorBoard支持还处于试验阶段。
[JIT] ScriptModules中的属性
可以在 ScriptModule上分配属性,方法是用torch.jit.Attribute指定类型。属性类似于参数或缓冲区,但可以是任何类型。当你调用torch.jit.save时,它们将与任何参数/缓冲区一起被序列化,因此它们是在模型中存储任意状态的好方法。
例子:
class Foo(torch.jit.ScriptModule): def __init__(self, a_dict): super(Foo, self).__init__(False) self.words = torch.jit.Attribute([], List[str]) self.some_dict = torch.jit.Attribute(a_dict, Dict[str, int]) @torch.jit.script_method def forward(self, input: str) -> int: self.words.append(input) return self.some_dict[input]
[JIT] 在TorchScript中支持字典和列表
TorchScript现在对列表和字典类型提供了健壮的支持。它们的行为很像Python列表和字典,支持大多数内置方法,包括简单的包含操作和 for…in的构造方式。
[JIT] 在TorchScript中用户自己定义类 (试验)
对于更复杂的有状态操作,TorchScript现在支持用 @torch.jit.script标注类。使用这种方法的类可以像其他TorchScript模块一样在c++中jit编译和加载。
@torch.jit.scriptclass Pair: def __init__(self, first, second) self.first = first self.second = second def sum(self): return self.first + self.second
DistributedDataParallel新功能和指南
nn.parallel.DistributedDataParallel:现在可以封装multi-GPU模块,可以在一台服务器上使用模型并行,以及多台服务器上使用数据并行。
突破性的改进
- Tensor.set_: Tensor中的device不再可以通过Tensor.set_来改变了. 这通常发生在使用默认CUDA设备设置Tensor,然后在另一个CUDA设备的Storage中交换Tensor时。相反,需要从一开始就在正确的设备上建立Tensor。
- 注意 lr_scheduler.step的顺序更改了。
- torch.unique: 把sorted的默认值改成了True.
- [JIT]重命名isTensor接口为isCompleteTensor.
- [JIT]去掉了GraphExecutor的python绑定.
- [C++]: many methods on 在Type上的许多方面现在不再退出了,可以使用函数或者Tensor的方法来起到同样的效果.
- [C++]:TensorOptions的Backend构造器不存在了. (18137).
- [C++, Distributed]: 去掉了c10dProcessGroup::getGroupRank也去掉了.
Tensors / dtypes
- torch.bool: 增加了对torch.bool类型以及该类型张量 (存储为1-byte)的支持. 支持NumPy的转化,但是操作现在是有限制的.
优化器
- optim.lr_scheduler.CyclicLR: 支持循环学习率和动量.
- optim.lr_scheduler.CosineAnnealingWarmRestarts: 新的学习率策略:带热身重启的随机梯度下降.
- 支持多个同步的学习率策略.
分布式
- torch.distributions: 现在支持多重继承.
采样
- quasirandom.SobolEngine: 新采样器.
DistributedDataParallel
- nn.parallel.DistributedDataParallel: 现在支持带无用参数的模型(例如控制流,比如adaptive softmax等等).
提升
- torch.min,torch.max,torch.median,torch.mode,torch.kthvalue,torch.symeig,torch.eig,torch.pstrf,torch.qr,torch.geqrf,torch.solve,torch.slogdet,torch.sort,torch.topk,torch.gels,torch.triangular_solve现在返回一个名称元组来描述输出.
- torch.empty(还有其他的构造函数): 现在可以接受pin_memory参数; 现在不用torch.Storage也可以就那些pin了.. .
- torch.histc: 现在支持CUDA了.
- torch.unique: 增加了return_counts.
- torch.logspace: 增加了指定对数底的功能.
- torch.set_printoptions: 增加对科学计数的支持 .
- torch.btrifact现在可以操作超过3维的tensor.
- torch.kthvalue: 支持CUDA.
- torch.abs: 支持uint8和int8类型.
- torch.stack,torch.cat: 支持CPU半精度tensors.
- torch.cross: 支持负维度.
- torch.lerp: 增加像支持Tensor一样支持weight.
- torch.transpose: 和NumPy变得一样了: 1-d和0-d数组都可以接受,返回原来一样的数组.
- torch.linspace,torch.logspace现在可以使用steps=1和start!=end
- torch.cholesky: 把导数从三角形矩阵变成对称矩阵.
- torch.lerp: 提升了数值稳定性.
- torch.logdet,torch.slogdet: 提升了数值精度.
- Tensor.__contains__现在支持了.
- Tensor.fill_和torch.zeros在CPU上支持半精度.
- Tensor.resize_as_,Tensor.view: 在CPU上支持半精度.
- Tensorindexing: 允许通过NumPy布尔值来进行索引.
- nn.EmbeddingBag: 支持半精度密集后端.
- nn.Embedding: 修改了密集嵌入来和双后端一起使用.
- nn.MaxPool1d: 允许列表和元组作为output_size输入.
- nn.CTCLoss: 通过zero_infinity参数可以支持对无限的损失置零.
- nn.Dropout: 支持在eval时使能.
- nn.MSELoss: 对不合法的广播进行告警.
- nn.Module.load_state_dict: 增加两个返回值missing_keys和unexpected_keys.
- nn.parallel.data_parallel: 强制设备匹配device_ids.
- torch.device: 过去只接受设备好的地方,现在都可以用这个了.
- dtype.int8这个类型的tensors现在可以转换为NumPy数组了.
- nn.functional.gumbel_softmax: 使用dim参数运行多个维度的输入.
- nn.functional.cosine_similarity: 提高了精度.
- torch.autograd: 不再保存不需要的输入,提高了内存效率.
- torch.autograd.profiler: 增加了自身的CPU时间,总的CPU时间.
- DataLoader: 支持接受一个用户自定义的内存pinning函数.
- DataLoader: 在EINTR重试libshm .
- DataLoader: 修改了使用pin_memory和PackedSequence的一个问题.
- data.utils.collate,data.utils.pin_memory: 现在可以保存名字元组.
- 在许多的索引错误情况下,使用 IndexError代替RuntimeError.
- 在CPU上支持索引 torch.float16tensor.
- 在inplace操作上增加(有限的)错误检测.
- utils.checkpoint.checkpoint: 支持None作为参数 .
- torch.autograd:为one of the variables neededforgradient computation has been modifiedbyan inplace operation异常增加更多的信息.
- cuda.synchronize: 增加一个设备参数.
- cuda.reset_max_memory_*: 现在支持了.
- distributions.Independent: 现在可以计算KL散度了.
- torch.distributed.new_group: 现在支持覆盖默认的backend.
性能
重点
- nn.BatchNormCPU推理速度提升了最高19倍.
- nn.AdaptiveAvgPool: size=1时通常可以加速30倍.
- nn.EmbeddingBagCPU性能提升了4倍.
- Tensor.copy_: 对于大的tensor拷贝加速了2~3倍.
- torch.nonzero: 在CPU上现在比numpy块2倍.
- 改进用于为Pascal架构和更新的GPU提升了缓存分配器的性能,Mask-RCNN的内存利用率提高了10-20%。
- reduction functions: 对于某些大Tensor的情况下,加速了50-80%.
- [JIT]Graph fuser: 在广播的存在下,更好地融合向后图.
- [JIT]Graph fuser:batch_norm推理时的融合.
- [JIT]Graph fuser:layer_norm推理时的融合.
英文原文:https://github.com/pytorch/pytorch/releases