雷锋网 AI 研习社按,2017 年 1 月,Facebook 开源 PyTorch,短短一年时间,PyTorch 便发展成一线开发者争相使用的工具。这一年间,有哪些研究人员对 PyTorch 的发展做出了贡献?关于 PyTorch 的经典课程有哪些?它经历了什么样的改变?研究人员又带来了哪些创新?
在 PyTorch 开源一周年纪念日,其开发团队在官方 Blog 上发表《PyTorch, a year in....》一文,为我们解答了上述问题。雷锋网 AI 研习社将原文编译整理如下:
距离我们开源 PyTorch 已经有一年时间。在这一年时间里,我们寻求建立一个灵活的深度学习研究平台,这是一段极棒的旅程。感谢所有使用 PyTorch,为 PyTorch 的发展做出贡献,并不断传播 PyTorch 的人,是你们一步一步建立了这样一个充满惊喜的社群。
下文中,我们总结了 PyTorch 在这一年间取得的进展、相关新闻和亮点。
社群
PyTorch 社群是一个强健的有机体,感谢社群里喜爱 PyTorch 的研究人员和工程师。我们的社群构成多种多样,核心团队中有来自于多个国家、公司和大学的工程师和研究人员,如果没有他们的点滴贡献,PyTorch 不可能发展得像现在这么好。
论文、工具包和 Github
PyTorch 发布之后,一些用户很快就利用 PyTorch 实现了他们喜欢的论文,并在 Github 上发布代码。现阶段,开源代码是研究人员的重要工具。
大家在一起,创造出了 torchtext,torchvision和torchaudio工具包,帮助加快 PyTorch 在不同领域的发展。
Brandon Amos 发布了第一个基于 PyTorch 的工具包——Block,使得操作分块矩阵更加容易。随后,CMU 的 Locus Lab 实验室发布了一系列关于 PyTorch 的工具包(https://github.com/locuslab),实现了他们大部分的研究成果。首篇利用 PyTorch 实现的论文是 Sergey Zagoruyko 的 Paying more attention to attention。
Jun-Yan Zhu, Taesung Park, Phillip Isola, Alyosha Efros 和来自加州大学伯克利分校的团队发布了 Cycle-GAN and pix2pix,这个工具包极受欢迎,能实现图像转换。
HarvardNLP 和 Systran 的研究人员开始利用 PyTorch 开发和改进 OpenNMT,这最初是由 Adam Lerer 利用 [Lua]Torch 重实现的。
Twitter 的 MagicPony 团队也很早就将他们超分辨率的工作用 PyTorch 实现了。
Salesforce Research 也发布了几个工具包,其中就包括最广为人知的 PyTorch-QRNN,这比用 CuDNN 优化的标准 LSTM 的速度快了 2-17 倍。James Bradbury 和他的团队是 PyTorch 社群中最活跃、最吸引人的力量之一。
来自 Uber, Northeastern 和 Stanford 的研究人员聚于一起,围绕 Pyro和ProbTorch,组成了一个活跃的概率编程社区。他们正积极开发 torch.distributions 核心包。这个社区非常活跃,正在快速发展,在 NIPS2017 上,我们第一次开展了 PyTorch 概率编程见面会,会上,我们同 Fritz Obermeyer, Noah Goodman, Jan-Willem van de Meent, Brooks Paige, Dustin Tran 和其他 22 位与会者讨论了如何让世界变得更贝叶斯。
英伟达的研究人员发布了三个高质量的 PyTorch 库,分别实现了 pix2pix-HD、Sentiment Neuron和FlowNet2。他们基于 PyTorch 对数据并行模型的可伸缩性分析(https://github.com/NVIDIA/sentiment-discovery/blob/master/analysis/scale.md)极有帮助。
艾伦人工智能研究院发布 AllenNLP,其中包含一些针对标准 NLP 任务的最先进模型,也有参考样例和一些易于使用的web demo。
7 月,grt123 团队在 Kaggle DataScience Bowl 2017 中的肺癌预测项目上取得胜利,随后公布代码。他们是第一支利用 PyTorch 取得胜利的团队。
在可视化方面,Tzu-Wei Huang 发布 TensorBoard-PyTorch插件,Facebook 人工智能研究院也发布了能与 PyTorch 兼容的visdom可视化包。
随后,Facebook 人工智能研究院开源 ParlAI、fairseq-py、VoiceLoop 和 FaderNetworks 等工具包,能在多个领域实现先进的模型。
这里还有很多好的项目,我们就不一一说明,大家可以点击如下链接:https://github.com/soumith?tab=stars
我们也想对 Forum 上那些积极帮助他人的人,特别是 ptrblck, jpeg729, QuantScientist, albanD, tom 和 chenyuntc 表示强烈感谢,你们为他人提供的帮助是无价的。
数据对比
Github 上共有 87769 行 Python 代码引入 torch;
Github 共有 3983 个库的名称或描述中提及 PyTorch;
PyTorch 文件的下载量超过 50 万次,精确来说,数量是 651916 次;
在关于 PyTorch 的这个论坛 (http://discuss.pytorch.org/) 上,共有 5400 名用户写下 21500 篇文章,讨论了 5200 个不同主题;
在 Reddit 上的 r/machinelearning 这个版块,PyTorch 被提及 131 次,同样的时间段内,TensorFlow 被提及 255 次。
PyTorch 是一个以研究为中心的框架,因此,论文(与机器学习相关)中 PyTorch 的使用率也是我们关注的一点。
论文中被提及次数:
在 ICLR2018 提交的论文中,有 87 篇论文提及 PyTorch,对比起来,TensorFlow 被 228 篇论文提及,Keras 是 42 篇,Theano 和 Matlab 是 32 篇。
按月来看,在 arxiv 上,PyTorch 每月平均被提及 72 次,TensorFlow 平均被提及 273 次, Keras,Caffe 和 Theano 被提及的次数分别是 100 、94、53。
课程与书籍
发布 PyTorch 时,我们已经准备了优良的 API 文档,但是仅限于一些 ipython notebook 教程,虽然有用,但远远不够。
Sasank Chilamkurthy 亲自修改了这些教程,整理在 pytorch.org/tutorials/页面上,非常清楚和明晰。
Sean Robertson 和 Justin Johnson 基于 PyTorch 写了很棒的 NLP 教程,他们还举了很多例子。Yunjey Choi 的教程非常优美,大多数模型的实现只需要 30 行或更少的代码。每个教程都提供新的方法,帮助用户更快地上手。
Delip Rao 和 Goku Mohandas 修改了他们正在写的书中的代码内容——改为用 PyTorch 实现。
我们也看到,很多大学的机器学习课程中把 PyTorch 作为重要工具,比如哈佛的 CS287。另外,如下三个在线课程均使用 PyTorch 来教学:
Fast.ai 的「Deep Learning for Coders」是一门很受欢迎的在线课程。9 月,Jeremy 和 Rachel 宣布,在下一阶段,Fast.ai 的课程将几乎全都基于 PyTorch。
在新加坡国立大学和清华大学任教的 Ritchie Ng 研究员发布了名为「Practical Deep Learning with PyTorch」的 Udemy 课程。
香港科技大学的 Sung Kim 在 Youtube 上发布「PyTorch Zero to All」在线课程,旨在向大众普及 PyTorch。
工程化
过去一年间,我们完善了 PyTorch 的多项功能,改进其性能,并修复了大量 bug。大家可以在发布说明中看到我们做的所有更新和改进。以下是过去一年间一些瞩目的改进:
1、高阶梯度
随着梯度惩罚在多篇论文中的实现,以及随之而来的对二阶梯度法的研究,在 PyTorch 中实现高阶梯度必不可少。8 月,我们实现了一个通用接口,支持 n 阶导数,同时增加了支持高阶梯度函数的量。
2、分布式 PyTorch
8 月,我们发布了一个小的分布式工具包,集合了许多流行的 MPI 方法。这个工具包覆盖 TCP、MPI、Gloo 和 NCCL2 等很多后端,支持多种类型的 CPU/GPU 集合操作和用例,并集成了 Infiniband 和 RoCE 等分布式技术。想要做到分布式比较困难,在最初的迭代中我们经常碰到 bug。在随后的版本中,我们提供的包更加稳定、性能更好。
3、与 NumPy 联系更紧
用户最大的需求之一是他们熟悉的 NumPy 功能。这些功能中,Broadcasting 和 Advanced Indexing 都很方便,可以帮助用户减少冗余。PyTorch 目前支持这些特性,它的 API 逐渐向 NumPy 靠拢。
4、稀疏张量
3 月,我们发布了一个支持稀疏张量的小工具包,基于这个工具包,我们在 5 月发布了带有 CUDA 支持的工具包。这个工具包很小,功能有限,用于实现 Sparse Embedding 以及深度学习中常用的稀疏范例。目前这个工具包仍很小,需要继续扩展——如果你想贡献自己的一份力,可以与我们联系。
5、性能
性能的提升是一场持久战,对 PyTorch 这样一个动态框架来说尤甚。在过去的一年里,我们极力提升其灵活性,从核心张量库到神经网络运算,PyTorch 的性能得到了极大提升。
针对张量操作增加了 AVX 和 AVX2
针对 concatenation 和 Softmax 等较为常见的工作负荷,编写了更快的 GPU kernel
重写了若干神经网络运算的代码
将框架的开销降低十倍
由于 PyTorch 是动态图框架,训练中,每次迭代时都必须创建一个新的图表,因此,框架开销必须很低,或者工作负载必须足够大。今年 8 月,DyNet 的作者(Graham Neubig 等)展示了 DyNet 在一些小的 NLP 模型上速度比 PyTorch 快得多。
于是我们开始重写 PyTorch 的内部结构,这是一次大的调整,调整之后,每个算子的执行时间从十多微秒降低到一微秒。
ATen
当重新设计 PyTorch 内部结构时,我们构建了 ATen C++11 库,这个库现在控制所有的 PyTorch 后端。ATen 中有一个 API 能反映 PyTorch 的 Python API,这使得它非常适合用于张量计算——变得更加方便。
6、从模型输出到生产——支持 ONNX 和 JIT 编译器
大家经常对我们提出这样的请求——希望将 PyTorch 模型导出到另一个框架中。基于 PyTorch,开发者能进行快速的研究,一旦研究做完,他们想将得到的模型导入更大的项目。
考虑到用户的需求,我们在 PyTorch 中构建了一个 tracer,它能将 PyTorch 模型输出为中间表示。大家可以利用随后的 trace 高效执行当前的 PyTorch 模型,或者将其转换成 ONNX 格式,加载至 Caffe2, MXNet, TensorFlow 等框架中,还可以直接加载至 CoreML 或 TensorRT 等硬件加速库。
接下来一段时间,大家会听到更多关于 JIT 编译器的消息,它能改善 PyTorch 的性能。
via:pytorch.org
雷锋网 AI 研习社编译整理。