跳转到主要内容
博客

PyTorch,一年以来……

作者: 2018 年 1 月 19 日2024 年 11 月 16 日暂无评论

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

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

社区

我们很幸运地拥有一个由研究人员和工程师组成的强大自发社区,他们都爱上了 PyTorch。核心团队成员来自多个国家、公司和大学,没有他们的每一份贡献,PyTorch 不会是今天的样子。

研究论文、软件包和 Github

发布几天内,社区用户就开始在 PyTorch 中实现他们最喜欢的研究论文,并将代码发布到 Github。开源代码是当今研究人员的主要和基本工具。

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

第一个基于 PyTorch 的社区软件包来自 Brandon Amos,名为 Block,它有助于更轻松地操作块矩阵。CMU 的 Locus Lab 随后 发布了 PyTorch 软件包 并实现了他们大部分的研究。第一篇研究论文代码来自 Sergey Zagoruyko,名为 Paying more attention to attention

加州大学伯克利分校的 Jun-Yan Zhu、Taesung Park、Phillip Isola、Alyosha Efros 及其团队发布了广受欢迎的 Cycle-GAN 和 pix2pix,它们实现了图像到图像的转换。

HarvardNLP 和 Systran 的研究人员开始开发和改进 PyTorch 中的 OpenNMT,其最初是基于 Facebook 的 Adam Lerer 对 [Lua]Torch 代码的重新实现。

Twitter 的 MagicPony 团队很早便将其 超分辨率工作实现贡献到 PyTorch 的示例中

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

Uber东北大学斯坦福大学的研究人员齐聚一堂,围绕他们的软件包 Pyro 和 ProbTorch 形成了一个活跃的概率编程社区。他们正在积极开发 torch.distributions 核心软件包。这个社区非常活跃且发展迅速,我们在 NIPS 2017 举办了第一次 pytorch-probabilistic-programming 聚会,Fritz Obermeyer、Noah Goodman、Jan-Willem van de Meent、Brooks Paige、Dustin Tran 和其他 22 位与会者讨论了如何使世界变得贝叶斯化。

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

艾伦人工智能研究所发布了 AllenNLP,其中包括 NLP 中的多个最先进模型——参考实现和易于使用的 web 演示,用于标准 NLP 任务。

我们还在七月迎来了第一个 Kaggle 获胜团队 grt123。他们赢得了 2017 年肺癌检测数据科学竞赛,并 随后发布了他们的 PyTorch 实现

在可视化方面,Tzu-Wei Huang 实现了一个 TensorBoard-PyTorch 插件,Facebook AI Research 发布了他们的 visdom 可视化包的 PyTorch 兼容性。

最后,Facebook AI Research 发布了多个项目,例如 ParlAI、fairseq-py、VoiceLoop 和 FaderNetworks,它们实现了尖端模型并连接了多个领域的数据集。

由于篇幅有限,我们没有重点介绍无数优秀项目,您可以在 此处 找到精选列表。

我们还要向那些在论坛上积极帮助他人的朋友们表示衷心感谢,特别是 ptrblck、 jpeg729、 QuantScientist、 albanD、 Thomas Viehmann 和 chenyuntc。你们提供了宝贵的服务,非常感谢!

指标

就纯数字而言,

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

研究指标

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 笔记本——有用,但不够好。

Sasank Chilamkurthy 亲自着手将教程改版为今天的 精美网站

Sean Robertson 和 Justin Johnson 编写了很棒的新教程——在自然语言处理领域,以及通过示例学习。 Yunjey Choi 编写了一个精美的教程,其中大多数模型都在 30 行或更少的代码中实现。每个新教程都以不同的学习方法帮助用户更快地找到学习路径。

Goku Mohandas 和 Delip Rao 将他们正在编写的书籍的代码内容切换为使用 PyTorch。

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

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

工程

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

高阶梯度

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

分布式 PyTorch

8 月,我们发布了一个小型分布式软件包,它遵循了广受欢迎的 MPI 集合通信方法。该软件包有多种后端,如 TCP、MPI、Gloo 和 NCCL2,以支持各种类型的 CPU/GPU 集合操作和用例,并集成了 Infiniband 和 RoCE 等分布式技术。分布式很难,我们在最初的迭代中遇到了一些 bug。在随后的版本中,我们使软件包更加稳定并提高了性能。

更贴近 NumPy

用户最大的需求之一是他们熟悉的 NumPy 功能。广播和高级索引等功能既方便又节省了大量代码。我们实现了这些功能,并开始将我们的 API 与 NumPy 更接近。随着时间的推移,我们期望在适当的情况下,我们的 API 会越来越接近 NumPy。

稀疏张量

三月,我们发布了一个支持稀疏张量的小型软件包;五月,我们发布了稀疏软件包的 CUDA 支持。该软件包功能有限,主要用于实现稀疏嵌入和深度学习中常用的稀疏范式。该软件包的范围仍然很小,并且有扩展它的需求——如果您有兴趣扩展稀疏软件包,请在我们的 讨论区 与我们联系。

性能

性能始终是一场持续的战斗,特别是对于 PyTorch 这种旨在最大限度提高灵活性的动态框架而言。在过去的一年里,我们全面提升了性能,从我们的核心张量库到神经网络运算符,全面编写了更快的微优化代码。

  • 我们为 Tensor 操作添加了专门的 AVX 和 AVX2 内在函数。
  • 为频繁的工作负载(如拼接和 Softmax 等)编写了更快的 GPU 内核。
  • 重写了几个神经网络操作符(数量太多,无法一一列出)的代码,特别是 nn.Embedding 和分组卷积。

框架开销整体降低 10 倍

由于 PyTorch 是一个动态图框架,我们在训练循环的每次迭代中都会动态创建一个新图。因此,框架开销必须很低,或者工作负载必须足够大,才能隐藏框架开销。八月,DyNet 的作者(Graham Neubig 及其团队)展示了它在小型 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 构建了一个跟踪器——它可以将 PyTorch 模型导出为中间表示。随后的跟踪可以用于更有效地运行当前的 PyTorch 模型(通过对其进行优化),或者转换为 ONNX 格式,以便发送到其他框架,如 Caffe2、MXNet、TensorFlow 等,或直接发送到 CoreML 或 TensorRT 等硬件加速库。在接下来的一年里,您将听到更多关于 JIT 编译器在性能改进方面的信息。

用户很有趣 🙂

我们的用户以有趣的方式表达他们的支持,这让我们开怀大笑,谢谢你们 🙂

PyTorch 给了我如此多的生命力,我的皮肤变得清澈,成绩提高了,账单付清了,庄稼也浇了水。— Adam Will ð️‍ð (@adam_will_do_it) 2017 年 5 月 26 日

我也是!而且我的头发更亮了,体重也减轻了。 @PyTorch 赢了。 https://#/qgU4oIOB4K— Mariya (@thinkmariya) 2017 年 5 月 26 日