今天是 PyTorch 公开发布一周年。这是一段充满激情的旅程——我们致力于构建一个灵活的深度学习研究平台。在过去的一年里,我们见证了一个令人惊叹的社区,人们在使用、贡献和推广 PyTorch,感谢你们的喜爱。
回顾过去一年,我们想总结一下 PyTorch 的发展:进步、新闻和社区亮点。
社区
我们有幸拥有一支强大的、充满热情的研究人员和工程师团队,他们热爱 PyTorch。核心团队由来自多个国家、公司和大学的工程师和研究人员组成,没有每个人的贡献,我们无法将 PyTorch 塑造成今天的模样。
研究论文、软件包和 Github
发布后不久,社区用户开始将他们最喜欢的论文应用于 PyTorch,并在 Github 上发布代码。开源代码是研究人员今天的主要和基本工具。
人们共同创建了 torchtext、torchvision 和 torchaudio 软件包,以帮助促进和普及不同领域的科研。
第一个基于 PyTorch 的社区软件包由 Brandon Amos 创建,名为 Block,有助于更轻松地操作块矩阵。CMU 的 Locus Lab 随后继续发布 PyTorch 软件包和他们的大部分研究实现。第一个研究论文代码由 Sergey Zagoruyko 提供,标题为“更加关注注意力”。
朱骏彦、帕克泰森、菲利普·伊索拉、阿利奥斯哈·埃夫罗斯和加州大学伯克利分校的团队发布了广受欢迎的 Cycle-GAN 和 pix2pix,它们可以进行图像到图像的转换。

哈佛 NLP 和 Systran 的研究人员开始使用 PyTorch 开发和改进 OpenNMT,这一举措始于对 Facebook 的亚当·勒勒最初用 LuaTorch 代码的重新实现。
推特的 MagicPony 团队早期就将他们的超分辨率工作实现贡献到了 PyTorch 的示例中。
Salesforce Research 发布了多个包,包括他们重点推出的 PyTorch-QRNN,这是一种比标准 LSTM 优化后的 CuDNN 快 2 倍到 17 倍的 RNN。詹姆斯·布拉德伯里和他的团队是 PyTorch 社区中最活跃和最具吸引力的力量之一。
我们发布了 @PyTorch-QRNN,比 NVIDIA 的 cuDNN LSTM 快 2-17 倍。
速度得益于 50 行 CUDA 代码通过 CuPy。https://t.co/KaWhN4yDZd pic.twitter.com/yoLYj3pMI0
— Smerity (@Smerity) 2017 年 10 月 9 日
来自 Uber、东北大学和斯坦福的研究者们联合起来,围绕他们的 Pyro 和 ProbTorch 软件包建立了一个活跃的概率编程社区。他们正在积极开发 torch.distributions 核心包。这个社区非常活跃且发展迅速,我们在 2017 年 NIPS 会议上举办了第一次 pytorch-probabilistic-programming 聚会,Fritz Obermeyer、Noah Goodman、Jan-Willem van de Meent、Brooks Paige、Dustin Tran 和另外 22 位与会者讨论了如何让世界变得更加贝叶斯。

英伟达研究人员发布了三个高质量的代码库,实现了 pix2pix-HD、情感神经元和 FlowNet2 论文。他们对 PyTorch 中不同数据并行模型可扩展性的分析对社区有所帮助。

Allen Institute for AI 发布了 AllenNLP,其中包含 NLP 领域的多个最先进模型——标准 NLP 任务的参考实现和易于使用的 Web 演示。

我们在 7 月份也迎来了我们的第一个 Kaggle 获奖团队 grt123。他们在 2017 年数据科学 Bowl 比赛中赢得了肺癌检测,随后发布了他们的 PyTorch 实现。
在可视化方面,Tzu-Wei Huang 实现了 TensorBoard-PyTorch 插件,Facebook AI Research 发布了 PyTorch 兼容的 visdom 可视化包。


最后,Facebook AI Research 发布了多个项目,如 ParlAI、fairseq-py、VoiceLoop 和 FaderNetworks,这些项目实现了前沿模型并界面对多个领域的数据集。
由于篇幅限制,我们未能突出展示众多优秀项目,您可以在此找到精选列表。
我们还要向在论坛上积极帮助他人的朋友们表示衷心的感谢,特别是 ptrblck、jpeg729、QuantScientist、albanD、Thomas Viehmann 和 chenyuntc。你们提供了无价的服务,非常感谢!
指标
从 sheer numbers 来说,
- 在 github 上有 87,769 行 Python 代码导入 torch
- 在 Github 上有 3,983 个仓库在名称或描述中提及 PyTorch
- PyTorch 二进制文件的下载量超过五十万次。确切数字为 651,916。
- 5,400 名用户在我们的论坛 discuss.pytorch.org(http://discuss.pytorch.org/)上讨论了 21,500 个帖子,涉及 5,200 个主题。
- 自 PyTorch 发布以来,Reddit 的/r/machinelearning 板块提到了 PyTorch 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 笔记本——有帮助,但还不够好。
沙桑克·奇拉穆图里亲自将教程改版成今天这个美丽的网站。

塞恩·罗伯逊和贾斯汀·约翰逊编写了新的优秀教程——关于自然语言处理,以及通过实例学习。尹哲·崔编写了一个美丽的教程,其中大多数模型都在 30 行或更少的代码中实现。每个新的教程都帮助用户更快地找到自己的学习路径,提供了不同的学习方法。
古库·莫哈达斯和德利普·劳将他们正在编写的书籍中的代码内容切换到使用 PyTorch。
我们已经看到很多大学将机器学习课程以 PyTorch 作为主要工具进行教学,例如哈佛大学的 CS287。更进一步,为了普及学习,出现了三个使用 PyTorch 的在线课程。
- Fast.ai 的“深度学习入门”是一门受欢迎的在线课程。9 月份,Jeremy 和 Rachel 宣布,下一阶段的 fast.ai 课程将几乎全部基于 PyTorch。
- 与新加坡国立大学和清华大学有联系的 Ritchie Ng 发布了一门名为《PyTorch 实用深度学习》的 Udemy 课程。
- 香港科技大学的 Sung Kim 发布了一门面向普通观众的在线课程,标题为:“PyTorch 从零到精通”。
工程学
过去一年,我们实现了多个功能,全面提升了性能,并修复了大量 bug。我们完成的工作的完整列表可以在我们的发布说明中找到。以下是过去一年我们工作的亮点:
高阶梯度
随着多个实现梯度惩罚和持续进行二阶梯度方法研究的论文的发布,这个功能是必需的,也是大家所期待的。在八月,我们实现了一个通用接口,可以接受 n 阶导数,并随着时间的推移增加了支持高阶梯度的函数覆盖率,以至于在撰写本文时,几乎所有的操作都支持这一功能。
分布式 PyTorch
八月份,我们发布了一个遵循高度流行的 MPI-collective 方法的分布式小包。该包具有 TCP、MPI、Gloo 和 NCCL2 等多个后端,以支持各种类型的 CPU/GPU 集体操作和使用场景,并集成了 Infiniband 和 RoCE 等分布式技术。分布式很困难,我们在初始迭代中遇到了 bug。在随后的版本中,我们使该包更加稳定并提高了性能。
接近 NumPy
用户最大的需求之一是他们熟悉的 NumPy 功能。例如广播和高级索引等功能方便且节省用户大量冗余。我们实现了这些功能,并开始使我们的 API 更接近 NumPy。随着时间的推移,我们期望在适当的地方越来越接近 NumPy 的 API。
稀疏张量
三月份,我们发布了一个支持稀疏张量的小型包,五月份我们又发布了稀疏包的 CUDA 支持。这个包体积小,功能有限,用于实现稀疏嵌入和深度学习中常用的稀疏范式。这个包在范围上仍然很小,有扩展它的需求——如果您有兴趣参与扩展稀疏包的工作,请在我们的讨论板上联系我们。
性能
性能始终是一场持续的战斗,尤其是对于 PyTorch 这样的动态框架来说,它希望最大化灵活性。在过去的一年里,我们从核心张量库到神经网络算子,全面提升了性能,编写了更快的微优化代码。
- 我们为张量操作添加了专门的 AVX 和 AVX2 内嵌指令。
- 为频繁的工作负载(如连接和 Softmax 等)编写了更快的 GPU 内核
- 重写了多个神经网络操作符的代码(太多,无法一一列举),但特别值得注意的是 nn.Embedding 和分组卷积。
在整个框架中减少了 10 倍的框架开销
由于 PyTorch 是一个动态图框架,我们在训练循环的每次迭代中都会实时创建一个新的图。因此,框架开销必须很低,或者工作负载必须足够大,以至于框架开销被隐藏。在 8 月份,DyNet(Graham Neubig 及其团队)展示了它在小型 NLP 模型上比 PyTorch 快得多。这是一个有趣的挑战,我们没有意识到那些大小的模型正在被训练。在持续数月(并仍在进行中)的努力中,我们着手对 PyTorch 内部进行了重大重写,将每个操作符执行时的框架开销从超过 10 微秒减少到仅 1 微秒。
ATen
在我们对 PyTorch 内部进行重新设计时,构建了 ATen C++11 库,该库现在为所有 PyTorch 后端提供动力。ATen 的 API 与 PyTorch 的 Python API 相匹配,使其成为 Tensor 计算的便捷 C++库。ATen 可以独立于 PyTorch 构建和使用。
导出模型到生产环境 — ONNX 支持以及 JIT 编译器
我们收到的常见请求之一是将 PyTorch 模型导出到另一个框架。用户在 PyTorch 中进行快速研究周期,完成后,他们希望将其部署到只有 C++要求的更大项目中。
考虑到这一点,我们为 PyTorch 开发了一个追踪器——可以将 PyTorch 模型导出为中间表示形式。后续的追踪可以用来更高效地运行当前的 PyTorch 模型(通过对其运行优化过程),或者将其转换为 ONNX 格式,以便发送到其他框架,如 Caffe2、MXNet、TensorFlow 等,或者直接发送到硬件加速库,如 CoreML 或 TensorRT。在未来一年内,您将听到更多关于 JIT 编译器性能提升的消息。
用户们真是有趣呢 :)
用户们用有趣的方式表达他们的支持,让我们忍俊不禁,谢谢你们呢 :)
我已经使用 PyTorch 几个月了,感觉从未如此好过。我更有活力了。我的皮肤更清晰了。我的视力也有所提高。
— Andrej Karpathy (@karpathy) 2017 年 5 月 26 日
与您的医生交谈,了解 PyTorch 是否适合您。
— Sean Robertson (@sprobertson) 2017 年 5 月 26 日
PyTorch 给我带来了如此多的活力,我的皮肤变好了,成绩提高了,账单都付清了,庄稼也浇了水。
— 亚当·威尔 ð️ð (@adam_will_do_it) 2017 年 5 月 26 日
我也是!但我的头发也更亮了,我还瘦了。@PyTorch 赢了。https://t.co/qgU4oIOB4K
— 玛丽亚 (@thinkmariya) 2017 年 5 月 26 日