作者: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支持还处于试验阶段。




pytorch能使用ckpt文件 pytorch ckpt_CUDA


[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