今天,我们宣布 PyTorch 1.5 正式可用,并同步发布了新增和更新的库。此版本包含多项重要的 API 新增和改进。PyTorch 现在包含了对 C++ 前端的重要更新、用于计算机视觉模型的“channels last”内存格式,以及用于模型并行训练的分布式 RPC 框架的稳定版本。此版本还为自动梯度(autograd)添加了用于 hessians 和 jacobians 的新 API,以及一个受 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++ 中缺少 tensor 多维索引 API 是一个已知问题,并导致 PyTorch Github issue 跟踪器和论坛上出现许多帖子。之前的变通方法是组合使用
narrow
/select
/index_select
/masked_select
,这与 Python API 优雅的tensor[:, 0, ..., mask]
语法相比显得笨拙且容易出错。在 1.5 版本中,用户可以使用tensor.index({Slice(), 0, "...", mask})
来达到同样的目的。
用于计算机视觉模型的“channels last”内存格式(实验性)
“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 中使用 TorchScript 函数以及多项易用性增强。以下是该框架内各种 API 的概述
RPC API
RPC API 允许用户指定要在远程节点上运行的函数和实例化的对象。这些函数会被透明地记录下来,以便梯度可以使用分布式自动梯度(Distributed Autograd)在远程节点间反向传播。
分布式自动梯度(Distributed Autograd)
分布式自动梯度(Distributed Autograd)连接跨多个节点的自动梯度图,并允许梯度在反向传播期间流过。梯度被累积到一个上下文(context)中(而不是像标准自动梯度那样累积到 .grad 字段中),用户必须在 dist_autograd.context()
管理器下指定模型的正向传递,以确保所有 RPC 通信都被正确记录。目前,仅实现了 FAST 模式(有关 FAST 和 SMART 模式的区别,请参见此处)。
分布式优化器
分布式优化器为每个工作节点上需要梯度的参数创建指向优化器的 RRef,然后使用 RPC API 在远程运行优化器。用户必须收集所有远程参数并将其封装在 RRef
中,因为这是分布式优化器的必需输入。用户还必须指定分布式自动梯度的 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 团队