作者:PyTorch 团队

今天是 PyTorch 公开发布一周年。这是一段激动人心的旅程——我们致力于构建一个灵活的深度学习研究平台。在过去的一年里,我们看到了一个令人惊叹的社区,大家使用、贡献并推广 PyTorch——感谢你们的厚爱。

回顾过去一年,我们想总结一下 PyTorch:包括进展、新闻以及社区的亮点。

社区

我们很幸运地拥有一个强大的、自发形成的社区,由热爱 PyTorch 的研究人员和工程师组成。核心团队的工程师和研究人员来自多个国家、公司和大学,没有大家的每一份贡献,PyTorch 不可能取得今天的成就。

研究论文、软件包和 Github

发布几天内,社区用户就开始用 PyTorch 实现他们喜爱的研究论文,并将代码发布到 Github。开源代码是当今研究人员最重要且必不可少的工具。

大家齐心协力创建了 torchtexttorchvisiontorchaudio 软件包,以帮助促进和普及不同领域的研究。

第一个基于 PyTorch 的社区软件包来自 Brandon Amos,名为 Block,有助于更轻松地操作块矩阵。卡内基梅隆大学 (CMU) 的 Locus Lab 随后发布了针对其大部分研究的 PyTorch 软件包和实现。第一份研究论文代码来自 Sergey Zagoruyko,题为《更关注注意力 (Paying more attention to attention)》

来自加州大学伯克利分校 (U.C.Berkeley) 的 Jun-Yan Zhu、Taesung Park、Phillip Isola、Alyosha Efros 及其团队发布了非常受欢迎的 Cycle-GAN 和 pix2pix,用于图像到图像的转换。

HarvardNLPSystran 的研究人员开始在 PyTorch 中开发和改进 OpenNMT,这得益于 Facebook 的 Adam Lerer 最初重新实现了 [Lua]Torch 代码。

Twitter 的 MagicPony 团队早期就将他们的超分辨率工作实现贡献到了 PyTorch 的示例中。

Salesforce Research 发布了几个软件包,其中包括其重点发布的PyTorch-QRNN,这是一种 RNN 类型,比经过 CuDNN 优化的标准 LSTMs 快 2 到 17 倍。James Bradbury 及其团队是 PyTorch 社区中最活跃和最具吸引力的力量之一。

来自 UberNortheasternStanford 的研究人员齐聚一堂,围绕他们的软件包 PyroProbTorch 组建了一个活跃的概率编程社区。他们正在积极开发 torch.distributions 核心软件包。这个社区非常活跃且发展迅速,我们在 NIPS 2017 期间举办了第一次 pytorch-probabilistic-programming 见面会,Fritz Obermeyer、Noah Goodman、Jan-Willem van de Meent、Brooks Paige、Dustin Tran 和其他 22 名与会者讨论了如何让世界变得“贝叶斯化”。

NVIDIA 的研究人员发布了三个高质量的代码库,实现了 pix2pix-HDSentiment NeuronFlowNet2 论文。他们对 PyTorch 中不同数据并行模型的扩展性分析对社区很有帮助。

艾伦人工智能研究所 (Allen Institute for AI) 发布了 AllenNLP,其中包含几个最先进的自然语言处理 (NLP) 模型——为标准 NLP 任务提供参考实现和易于使用的网络演示

我们还在 7 月迎来了第一支赢得 Kaggle 比赛的团队 grt123。他们在 2017 年肺癌检测 DataScience Bowl 比赛中获胜,随后发布了他们的 PyTorch 实现代码

在可视化方面,Tzu-Wei Huang 实现了一个 TensorBoard-PyTorch 插件,Facebook 人工智能研究院 (Facebook AI Research) 为其 visdom 可视化软件包发布了 PyTorch 兼容性支持。

最后,Facebook 人工智能研究院 (Facebook AI Research) 发布了多个项目,如 ParlAI、fairseq-py、VoiceLoop 和 FaderNetworks,这些项目实现了尖端模型并对接了多个领域的数据集。

由于篇幅限制,还有无数优秀的项目我们未能重点提及,您可以在这里找到一份精选列表。

我们还要特别感谢那些在论坛上积极帮助他人的朋友们,尤其是 ptrblckjpeg729QuantScientistalbanDThomas Viehmannchenyuntc。你们提供了宝贵的帮助,非常感谢!

数据指标

从纯粹的数据来看,

  • 在 Github 上导入 torch 的 Python 代码共有 87,769 行
  • Github 上名称或描述中提及 PyTorch 的代码库共有 3,983 个
  • PyTorch 二进制文件下载量超过五十万次。确切数字是 651,916 次。
  • 在我们的论坛 discuss.pytorch.org (http://discuss.pytorch.org/) 上,有 5,400 名用户撰写了 21,500 篇帖子,讨论了 5,200 个主题
  • 自发布之日起,PyTorch 在 Reddit 的 /r/machinelearning 版块被提及 131 次。同期,TensorFlow 被提及 255 次。

研究指标

PyTorch 是一个专注于研究的框架。因此,一个值得关注的指标是 PyTorch 在机器学习研究论文中的使用情况。

  • 在最近的 ICLR2018 会议投稿中,PyTorch 在 87 篇论文中被提及,TensorFlow 在 228 篇论文中被提及,Keras 在 42 篇论文中被提及,Theano 和 Matlab 在 32 篇论文中被提及。

  • 每月 arxiv.org 对各框架的提及次数显示,PyTorch 被提及 72 次,TensorFlow 被提及 273 次,Keras 被提及 100 次,Caffe 被提及 94 次,Theano 被提及 53 次。

课程、教程和书籍

当我们发布 PyTorch 时,我们拥有良好的 API 文档,但我们的教程仅限于少数 ipython notebook——虽然有帮助,但还不够好。

Sasank Chilamkurthy 主动承担了将教程改造成如今这个漂亮网站的工作。

Sean RobertsonJustin Johnson 编写了很棒的新教程——包括 NLP 方面的教程,以及通过示例学习的方法。Yunjey Choi 编写了一个很棒的教程,其中大多数模型都在 30 行或更少的代码中实现。每个新教程都帮助用户更快地找到方向,提供了不同的学习方法。

Goku Mohandas 和 Delip Rao 将他们正在撰写的书籍的代码内容改为了使用 PyTorch。

我们看到不少大学机器学习课程以 PyTorch 作为主要工具进行教学,例如哈佛大学的 CS287 课程。更进一步,为了普及学习,我们涌现了三个使用 PyTorch 进行教学的在线课程。

  • Fast.ai 的“程序员深度学习”是一门很受欢迎的在线课程。9 月份,Jeremy 和 Rachel 宣布下一期 fast.ai 课程将几乎完全基于 PyTorch
  • 与新加坡国立大学 (NUS Singapore) 和清华大学有联系的研究员 Ritchie Ng 在 Udemy 发布了一门名为《使用 PyTorch 进行实用深度学习》的课程。
  • 香港科技大学 (HKUST) 的 Sung Kim 在 Youtube 发布了一门面向大众的在线课程,名为《PyTorch 从零到全》。

工程改进

在过去的一年里,我们实现了多项功能,全面提升了性能并修复了大量错误。您可以在我们的发布说明中找到我们工作的完整列表。以下是过去一年工作的亮点

高阶梯度

随着几篇实现梯度惩罚的论文发布以及正在进行的二阶梯度方法研究,高阶梯度成为一个必不可少且备受追捧的功能。8 月份,我们实现了一个通用的接口,可以计算 n 阶导数,并随着时间推移增加了支持高阶梯度的函数的覆盖范围,截至本文撰写时,几乎所有操作都支持此功能。

分布式 PyTorch

8 月份,我们发布了一个小型的分布式软件包,该软件包遵循了非常流行的 MPI 集体通信方法。该软件包支持 TCP、MPI、Gloo 和 NCCL2 等多种后端,以支持各种类型的 CPU/GPU 集体操作和用例,并集成了 Infiniband 和 RoCE 等分布式技术。分布式功能很难实现,我们在初始版本中也遇到了错误。在后续版本中,我们使该软件包更加稳定并提升了性能。

更接近 NumPy

用户最大的需求之一是他们熟悉的 NumPy 功能。诸如广播 (Broadcasting) 和高级索引 (Advanced Indexing) 之类的功能非常方便,可以为用户节省大量冗余代码。我们实现了这些功能,并开始调整我们的 API 使其更接近 NumPy。随着时间的推移,我们希望在适当的情况下越来越接近 NumPy 的 API。

稀疏张量

3 月份,我们发布了一个支持稀疏张量的小型软件包,5 月份我们发布了对稀疏软件包的 CUDA 支持。该软件包功能有限且范围较小,用于实现稀疏嵌入 (Sparse Embeddings) 和深度学习中常用的稀疏范式。该软件包目前范围仍然较小,并且有扩展需求——如果您有兴趣参与扩展稀疏软件包的工作,请在我们的讨论区联系我们。

性能

性能优化始终是一场持续的战斗,尤其是对于 PyTorch 这种旨在最大化灵活性的动态框架。在过去的一年里,我们全面提升了性能,从核心张量库到神经网络算子,编写了更快的微优化代码,覆盖了各个方面。

  • 我们为张量操作添加了专门的 AVX 和 AVX2 内联函数
  • 为连接 (concatenation) 和 Softmax 等频繁工作负载编写了更快的 GPU 内核(以及许多其他功能)
  • 重写了几个神经网络算子(太多无法一一列举)的代码,其中值得注意的是 nn.Embedding 和分组卷积 (group convolutions)。

全面将框架开销降低 10 倍

由于 PyTorch 是一个动态图框架,我们在训练循环的每一次迭代中都会动态创建一个新图。因此,框架开销必须很低,或者工作负载足够大,才能隐藏框架开销。8 月份,DyNet 的作者(Graham Neubig 及其团队)展示了 DyNet 在小型 NLP 模型上比 PyTorch 快得多。这是一个有趣的挑战,我们没有意识到会训练这种规模的模型。经过数月(且仍在进行中)的努力,我们着手对 PyTorch 内部进行了重大重写,将框架开销从每次操作执行超过 10 微秒降低到低至 1 微秒。

ATen

在我们着手重新设计 PyTorch 内部结构时,我们构建了ATen C++11 库,该库现在驱动着所有的 PyTorch 后端。ATen 的 API 镜像了 PyTorch 的 Python API,这使得它成为一个方便的张量计算 C++ 库。ATen 可以独立于 PyTorch 构建和使用。

将模型导出到生产环境 — ONNX 支持和 JIT 编译器

我们收到的常见请求之一是将 PyTorch 模型导出到另一个框架。用户在 PyTorch 中进行快速研究周期,完成后希望将其部署到仅要求 C++ 的大型项目中。

考虑到这一点,我们为 PyTorch 构建了一个跟踪器 (tracer)——可以将 PyTorch 模型导出为中间表示。后续的跟踪结果既可以用于更有效地运行当前的 PyTorch 模型(通过在其上运行优化过程),也可以转换为 ONNX 格式,以便部署到 Caffe2、MXNet、TensorFlow 等其他框架,或直接部署到 CoreML 或 TensorRT 等硬件加速库。在接下来的一年里,您将听到更多关于 JIT 编译器带来性能提升的消息。

用户的搞笑评论 :)

我们的用户用幽默的方式表达了支持,这让我们很开心,谢谢你们 :)