由 PyTorch 团队

今天,我们宣布 PyTorch 1.5 的可用性,以及新的和更新的库。这次发布包括几个重要的新 API 添加和改进。PyTorch 现在包括对 C++前端的重要更新,计算机视觉模型的“通道最后”内存格式,以及用于模型并行训练的分布式 RPC 框架的稳定发布。该版本还包括用于 hessians 和 jacobians 的 autograd 的新 API,以及受 pybind 启发的创建自定义 C++类的 API。

您可以在此处找到详细的发布说明。

C++前端 API(稳定版)

C++前端 API 现在与 Python 保持一致,整体功能已移至“稳定”(之前标记为实验性)。一些主要亮点包括:

  • 现在支持高达 100%的覆盖率,并提供了 C++ torch::nn 模块/函数的文档,用户可以轻松地将模型从 Python API 转换为 C++ API,使模型编写体验更加流畅。
  • C++中的优化器与 Python 中的等效优化器存在偏差:C++优化器不能接受参数组作为输入,而 Python 优化器可以。此外,步进函数的实现也不完全相同。在 1.5 版本中,C++优化器将始终与 Python 等效优化器表现一致。
  • C++中缺少张量多维度索引 API 是一个已知问题,并在 PyTorch 的 GitHub 问题跟踪器和论坛中引发了众多帖子。之前的解决方案是使用 narrow / select / index_select / masked_select 的组合,与 Python API 的优雅 tensor[:, 0, ..., mask] 语法相比,这种方法既笨拙又容易出错。在 1.5 版本中,用户可以使用 tensor.index({Slice(), 0, "...", mask}) 达到相同的目的。

计算机视觉模型的“通道最后”内存格式(实验性)

‘Channels last’内存布局解锁了使用性能高效的卷积算法和硬件(NVIDIA 的 Tensor Cores、FBGEMM、QNNPACK)的能力。此外,它还设计为能够自动传播到算子中,这使得在内存布局之间轻松切换变得容易。

在这里了解更多如何编写内存格式感知算子。

自定义 C++类(实验性)

本版本添加了一个新的 API, torch::class_ ,用于将自定义 C++类绑定到 TorchScript 和 Python 中。这个 API 的语法几乎与 pybind11 相同。它允许用户将他们的 C++类及其方法暴露给 TorchScript 类型系统和运行时系统,从而可以从 TorchScript 和 Python 中实例化和操作任意 C++对象。以下是一个 C++绑定的示例:

template <class T>
struct MyStackClass : torch::CustomClassHolder {
  std::vector<T> stack_;
  MyStackClass(std::vector<T> init) : stack_(std::move(init)) {}

  void push(T x) {
    stack_.push_back(x);
  }
  T pop() {
    auto val = stack_.back();
    stack_.pop_back();
    return val;
  }
};

static auto testStack =
  torch::class_<MyStackClass<std::string>>("myclasses", "MyStackClass")
      .def(torch::init<std::vector<std::string>>())
      .def("push", &MyStackClass<std::string>::push)
      .def("pop", &MyStackClass<std::string>::pop)
      .def("size", [](const c10::intrusive_ptr<MyStackClass>& self) {
        return self->stack_.size();
      });

这暴露了一个你可以这样在 Python 和 TorchScript 中使用的类:

@torch.jit.script
def do_stacks(s : torch.classes.myclasses.MyStackClass):
    s2 = torch.classes.myclasses.MyStackClass(["hi", "mom"])
    print(s2.pop()) # "mom"
    s2.push("foobar")
    return s2 # ["hi", "foobar"]

你可以在下面的教程中尝试使用。

分布式 RPC 框架 API(现已稳定)

分布式 RPC 框架在 1.4 版本中作为实验性功能发布,现在提议将分布式 RPC 框架标记为稳定,不再实验。这项工作涉及大量增强和错误修复,以提高分布式 RPC 框架的整体可靠性和健壮性,以及添加了一些新功能,包括性能分析支持、在 RPC 中使用 TorchScript 函数以及一些便于使用的增强。以下是框架中各种 API 的概述:

RPC API

RPC API 允许用户指定在远程节点上运行的函数和要实例化的对象。这些函数被透明地记录,以便使用分布式 Autograd 在远程节点上反向传播梯度。

分布式 Autograd

分布式 Autograd 连接多个节点上的 autograd 图,允许在反向传播过程中梯度流动。梯度累积到上下文中(与 Autograd 中的 .grad 字段不同),用户必须在 with dist_autograd.context() 管理器下指定其模型的正向传递,以确保所有 RPC 通信都得到正确记录。目前,仅实现了 FAST 模式(有关 FAST 和 SMART 模式的区别,请参阅此处)。

分布式优化器

分布式优化器为每个工作节点上的需要梯度的参数创建 RRefs,然后使用 RPC API 远程运行优化器。用户必须收集所有远程参数,并将它们包装在 RRef 中,因为这是分布式优化器所需的输入。用户还必须指定分布式自动微分 context_id ,以便优化器知道在哪个上下文中查找梯度。

在此处了解有关分布式 RPC 框架 API 的更多信息。

新的高级别自动微分 API(实验性)

PyTorch 1.5 引入包括 jacobian、hessian、jvp、vjp、hvp 和 vhp 等新功能到 torch.autograd.functional 子模块中。该功能基于当前 API,使用户能够轻松执行这些功能。

在 GitHub 上可以找到详细的设计讨论。

Python 2 不再受支持

从 PyTorch 1.5.0 版本开始,我们将不再支持 Python 2,特别是版本 2.7。未来对 Python 的支持将仅限于 Python 3,具体为 Python 3.5、3.6、3.7 和 3.8(首次在 PyTorch 1.4.0 中启用)。

我们想感谢整个 PyTorch 团队和社区对这项工作的所有贡献。

喝彩!

PyTorch 团队