pytorch v1.0rc0发布,新发布torch.jit和C++ API以及c10d库

Song • 460 次浏览 • 0 个回复 • 2018年10月12日

一、更新重点

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新的“C10D”库

torch.distributed包和torch.nn.parallel.DistributedDataParallel模块被新的C10D库支持。新库的主要亮点是:

  • C10D是性能驱动,和所有的后端工作是完全异步的:GlooNCCL,和MPI
  • 显著的分布式数据并行性能改进,特别是对于较慢的基于网络的云主机
  • torch.distributed包中的所有分布式集合操作添加异步支持。
  • Gloo后端添加sendrecv支持

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。

二、突破性变化

  • 索引0维张量现在将抛出错误而不是警告。请改用tensor.item()
  • torch.legacy已删除。
  • 删除了torch.masked_copy_,改为使用torch.masked_scatter_
  • 导致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。

三、其他新功能

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、新发行版

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


原创文章,转载请注明 :pytorch v1.0rc0发布,新发布torch.jit和C++ API以及c10d库 - pytorch中文网
原文出处: https://ptorch.com/news/212.html
问题交流群 :168117787
提交评论
要回复文章请先登录注册
用户评论
  • 没有评论
Pytorch是什么?关于Pytorch! Pythia - FAIR A-STAR团队进行视觉问答研究的模块化框架