pytorch v1.0正式版发布,增加jit和C++ API以及全新的分布式包和Torch HUB

Song • 409 次浏览 • 0 个回复 • 2018年12月09日

pytorch v1.0正式版于2018年12月7日正式发布。
主要功能与预发布版本一样,主要新增JITC++前端,在预发布版本基础上增加了全新的分布式包Torch HUB。与以往所有的更新一样,pytorch官方又提到了突破性变化
关于新的功能,与预发布版本一样(N维空张量,新的OperatorsDistributions(分布))此次改进了稀疏APIv0.1.12埋下的坑改进以及稳定了,可以参考我们的Pytorch v0.1.12版本发布,添加CUDA的Sparse支持 ) 其实大体和预发布版本相同,说了这么久的预发布版本,在哪呢?来来来,都给你都给你pytorch v1.0rc0发布,新发布torch.jit和C++ API以及c10d库

看完上面的导读,其实各位小伙伴如果是吃瓜看更新的小伙伴可以撤了,如果你想了解更多?嘿嘿嘿

pytorch v1.0正式版发布

一、更新重点

1、JIT

JIT是一套编译器工具,用于弥合PyTorch研究 与生产之间的差距。它包含一种叫做Torch Script的语言(不要担心它是Python的一个子集, 所以你仍然会编写Python),还有两种方法可以让你的现有代码与JIT兼容。

Torch脚本代码可以进行积极优化,并且可以序列化以供以后在我们的新C ++ API中使用,而C ++ API根本不依赖于Python

# Write in Python, run anywhere!
@torch.jit.script
def RNN(x, h, W_h, U_h, b_h):
  y = []
  for t in range(x.size(0)):
    h = torch.tanh(x[t] @ W_h + h @ U_h + b_h)
    y += [h]
  return torch.stack(y), h

示例,请参阅部署seq2seq模型, 从C ++加载导出模型或浏览文档教程

2、全新的分布式包

torch.distributed包和torch.nn.parallel.DistributedDataParallel模块由一个全新的重新设计的分布式库支持。新库的主要亮点是:

  • 新torch.distributed的高性能驱动,完全异步所有的后端工作:Gloo,NCCL,和MPI。
  • 显着的分布式数据并行性能改进,尤其适用于网络较慢的主机,如基于以太网的主机
  • 为torch.distributed包中的所有分布式集合操作添加异步支持。
  • 在Gloo后端添加以下CPU操作:send,recv,reduce,all_gather,gather,scatter
  • 在NCCL后端添加障碍操作
  • 为NCCL后端添加new_group支持

3、C ++前端[API不稳定]。

C ++前端是PyTorch后端的纯C ++接口,它遵循已建立的Python前端的API和体系结构。它旨在实现高性能,低延迟和纯C++应用程序的研究。它提供了类似torch.nntorch.optimtorch.dataPython的前端的其他组件。以下是两种语言前端的最小并排比较:

Python

import torch

model = torch.nn.Linear(5, 1)
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
prediction = model.forward(torch.randn(3, 5))
loss = torch.nn.functional.mse_loss(prediction, torch.ones(3, 1))
loss.backward()
optimizer.step()

C++

#include <torch/torch.h>

torch::nn::Linear model(5, 1);
torch::optim::SGD optimizer(model->parameters(), /*lr=*/0.1);
torch::Tensor prediction = model->forward(torch::randn({3, 5}));
auto loss = torch::mse_loss(prediction, torch::ones({3, 1}));
loss.backward();
optimizer.step();

作为PyTorch 1.0的一部分,我们将发布标记为API UnstableC ++前端。这意味着它已可以用于您的研究应用,但仍有一些开放的工程将在未来一两个月内稳定下来。在此期间,API的某些部分可能会发生重大变化。

有关更高PyTorch C ++ API以及C ++前端的详细文档,请参阅https://pytorch.org/cppdocs。

4、Torch HUB

Torch Hub是一个经过预先训练的模型库,旨在促进研究的可重复性。

Torch Hub支持使用简单的hubconf.py文件将预先训练的模型(模型定义和预先训练的权重)发布到github存储库; 以pytorch/vision中的hubconf for resnet模型为例。发布后,用户可以使用torch.hub.loadAPI加载预先训练的模型。

有关更多详细信息,请参阅torch.hub文档。期待在不久的将来更详细的博客文章介绍Torch Hub

二、突破性变化

  • 现在0维张量的索引将抛出错误而不是警告。请改用tensor.item()代替。
  • torch.legacy已删除。
  • 删除了torch.masked_copy _,改为使用torch.maskedscatter
  • 导致0个元素张量的操作可能会返回更改的形状。
    • 之前:所有0个元素张量都会折叠成形(0,)。例如,torch.nonzero被记录为返回一个形状(n,z)的张量,其中n =非零元素的数量,z =输入的维度,但是当没有时,它总是返回形状张量_(0,)存在非零元素。
    • 现在:操作返回其记录的形状。
# Previously: all 0-element tensors are collapsed to shape (0,)
>>> torch.nonzero(torch.zeros(2, 3))
tensor([], dtype=torch.int64)

# Now, proper shape is returned
>>> torch.nonzero(torch.zeros(2, 3))
tensor([], size=(0, 2), dtype=torch.int64)
  • 0元素张量的情况下,稀疏张量指数和值形状不变量被更改为更一致。请参阅链接了解更多详情。
  • torch.distributedTCP后端被删除,我们建议为GPU集合使用GlooMPI后端,为GPU集合使用NCCL后端。
  • NumPy阵列之间的一些类型间操作(例如*)torch.Tensors现在将支持调度到torch变量。可能会导致返回不同的类型。
  • 隐式numpy转换不再隐式地将张量移动到CPU。因此,您必须在隐式转换之前所以tensor.to('cpu')CUDA张量显式移动到CPU()
  • torch.randint现在默认使用dtype torch.int64而不是默认的浮点dtype
  • torch.tensor具有函数Tensor参数现在返回一个detached张量(即,其中张量grad_fnNone)。这更符合函数的意图,即返回带有复制数据且没有历史记录的Tensor
  • torch.nn.functional.multilabel_soft_margin_loss现在返回形状的张量(N,)而不是(N,C)匹配torch.nn.MultiMarginLoss的行为。此外,它在数值上更稳定。
  • torch.float16 0维张量和整数的结果类型现在为torch.float16(取决于整数的dtype,为torch.float32torch.float64)。
  • DirichletCategorical分布不再接受标量参数。。
  • CPP扩展:已删除已弃用的工厂函数,这些函数接受类型作为第一个参数,大小作为第二个参数参数。相反,使用接受大小作为第一个参数和TensorOptions最后一个参数的新式工厂函数。例如,将您的来电at::ones(torch::CPU(at::kFloat)), {2, 3})与torch::ones({2, 3}, at::kCPU)。这适用于以下功能:

    • arange,empty,eye,full,linspace,logspace,ones,rand,randint,randn,randperm,range,zeros。
  • torch.potrf改名为torch.cholesky。它有一个新的默认值(upper = False)。

  • elementwise_mean改名为mean减少损失的功能

三、其他新功能

1、N维空张量

具有0个元素的张量现在可以具有任意数量的尺寸并支持索引和其他Torch操作; 以前,0元素张量限制为形状(0,)。示例:

>>> torch.empty((0, 2, 4, 0), dtype=torch.float64)
tensor([], size=(0, 2, 4, 0), dtype=torch.float64)

2、新的Operators

3、新的Distributions(分布)

4、稀疏API改进

  • 实现了一些现有函数的稀疏梯度版本,详见sparse.mmsparse.sumsparse.addmm
  • Tensor.to_sparse()允许从密集张量转换为稀疏张量。
  • torch.cat现在支持稀疏张量。
  • torch.unsqueeze现在可以使用稀疏向量(这也使得torch.stack开箱即用)。
  • 现在values()torch.sparse_coo_tensor(带索引和值张量)支持Autograd。例如,torch.sparse_coo_tensor(i, v).values().sum()是区分w.r.t.v。有关详细信息,请参阅更新的torch.sparse文档。

5、对现有Operators和Distributions的补充:


原创文章,转载请注明 :pytorch v1.0正式版发布,增加jit和C++ API以及全新的分布式包和Torch HUB - pytorch中文网
原文出处: https://ptorch.com/news/222.html
问题交流群 :168117787
提交评论
要回复文章请先登录注册
用户评论
  • 没有评论
Pytorch是什么?关于Pytorch! 仅采用densenet识别图中文字(ocr_densenet)