今天,我们宣布 PyTorch 1.5 正式发布,同时发布了新的和更新的库。此版本包括几个主要的 API 新增和改进。PyTorch 现在包括对 C++ 前端的重要更新,用于计算机视觉模型的“通道优先”内存格式,以及用于模型并行训练的分布式 RPC 框架的稳定版本。此版本还为 autograd 提供了新的 API,用于计算 Hessian 矩阵和 Jacobian 矩阵,以及一个受 pybind 启发、允许创建自定义 C++ 类的 API。
您可以在此处找到详细的发布说明。
C++ 前端 API(稳定版)
C++ 前端 API 现在与 Python 功能对等,并且整体功能已移至“稳定版”(以前标记为实验版)。主要亮点包括:
- 现在,C++ torch::nn 模块/函数拥有近 100% 的覆盖率和文档,用户可以轻松地将模型从 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})` 来实现相同的目的。
“通道优先”内存格式用于计算机视觉模型(实验版)
“通道优先”内存布局能够使用性能高效的卷积算法和硬件(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 字段中),用户必须在其模型的正向传递中,在 `dist_autograd.context()` 管理器下指定,以确保所有 RPC 通信都被正确记录。目前,只实现了 FAST 模式(有关 FAST 和 SMART 模式之间的区别,请参阅此处)。
分布式优化器
分布式优化器会为每个工作器上需要梯度的参数创建 RRefs 到优化器,然后使用 RPC API 远程运行优化器。用户必须收集所有远程参数并将它们包装在 `RRef` 中,因为这是分布式优化器所需的输入。用户还必须指定分布式 autograd `context_id`,以便优化器知道在哪个上下文中查找梯度。
在此处了解有关分布式 RPC 框架 API 的更多信息:此处。
新的高级自动求导 API(实验性)
PyTorch 1.5 在 `torch.autograd.functional` 子模块中新增了 jacobian、hessian、jvp、vjp、hvp 和 vhp 等函数。此功能基于现有 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 团队