博客

PyTorch,一年以来……

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

今天是 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,用于实现图像到图像的转换。

哈佛大学 NLP 实验室 (HarvardNLP)Systran 的研究人员开始开发和改进 OpenNMT in PyTorch,其起源是 Facebook 的 Adam Lerer 对 [Lua]Torch 代码的初步重构。

Twitter 的 MagicPony 团队很早就将他们的 超分辨率研究成果的实现贡献给了 PyTorch 示例

Salesforce Research 发布了多个软件包,包括他们重点发布的 PyTorch-QRNN。这是一种 RNN,比经 CuDNN 优化的标准 LSTM 快 2 到 17 倍。James Bradbury 和他的团队是 PyTorch 社区中最活跃、最积极的力量之一。

来自 Uber东北大学斯坦福大学 的研究人员联合起来,围绕他们的软件包 PyroProbTorch 形成了活跃的概率编程社区。他们正在积极开发 torch.distributions 核心软件包。这个社区非常活跃且发展迅速,我们在 NIPS 2017 大会上举办了第一次 pytorch-概率编程聚会,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 2017),并随后发布了他们的 PyTorch 实现

在可视化方面,Tzu-Wei Huang 实现了一个 TensorBoard-PyTorch 插件,而 Facebook AI Research 发布了其 visdom 可视化软件包的 PyTorch 兼容版本。

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

还有无数好的项目因为篇幅原因没能一一列举,您可以在这里找到整理好的列表。

我们还要向那些在论坛上积极帮助他人的成员表示衷心的感谢,特别是 ptrblckjpeg729QuantScientistalbanDThomas Viehmannchenyuntc。你们提供了无价的贡献,非常感谢!

指标

从纯数字来看:

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

研究指标

PyTorch 是一个以研究为核心的框架。因此,我们感兴趣的指标之一是 PyTorch 在机器学习研究论文中的使用情况。

  • 在最近的 ICLR 2018 会议投稿中,有 87 篇论文提到了 PyTorch,相比之下,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 RobertsonJustin Johnson 编写了出色的新教程——涵盖 NLP 和边做边学。 Yunjey Choi 编写了一个精美的教程,其中大多数模型都在 30 行代码以内实现。每一个新教程都帮助用户通过不同的学习方法更快地找到方向。

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

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

  • Fast.ai 的“深度学习编程者课程”(Deep Learning for Coders) 是一门受欢迎的在线课程。9 月,Jeremy 和 Rachel 宣布下一届 fast.ai 课程将几乎完全基于 PyTorch
  • 与新加坡国立大学 (NUS) 和清华大学有联系的研究人员 Ritchie Ng 发布了一门 Udemy 课程,名为“PyTorch 深度学习实战”。
  • 香港科技大学 (HKUST) 的 Sung Kim 在 Youtube 上发布了一门在线课程,面向普通大众,题为:“PyTorch Zero to All”。

工程

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

高阶梯度

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

分布式 PyTorch

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

更接近 NumPy

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

稀疏张量

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

性能

性能是一场持续的战斗,特别是对于 PyTorch 这种追求最大灵活性的动态框架而言。在过去的一年里,我们全面提升了性能,从核心张量库到神经网络算子,都进行了更快的微优化。

  • 我们为张量操作添加了专用的 AVX 和 AVX2 指令集。
  • 为频繁的工作负载(如连接和 Softmax 等)编写了更快的 GPU 内核。
  • 重写了多个神经网络算子的代码(太多无法一一列举),特别是 nn.Embedding 和分组卷积。

将框架开销全面降低了 10 倍。

由于 PyTorch 是一个动态图框架,我们在训练循环的每次迭代中都会动态创建新的图。因此,框架开销必须很低,或者工作负载必须足够大以掩盖框架开销。8 月,DyNet 的作者(Graham Neubig 及其团队)展示了在小型 NLP 模型上,DyNet 比 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 编译器的消息。

用户们很幽默 🙂

我们的用户以幽默的方式表达他们的支持,让我们开怀大笑,感谢你们 🙂

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

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