PyTorch发布一周年:盘点社区和工程大事件,后来者居上态势已显?
安妮 编译自 PyTorch官网
今天,PyTorch公开发布一周年了。
这个自诞生之日起就火热的深度学习框架,这一年是怎样的成长轨迹?刚刚,PyTorch团队在官网上发文,盘点了PyTorch上一年的进展、大事件和社区情况,并和其他框架进行了对比。
总体来说战绩是这样的——
- GitHub上有87769行Python代码导入了torch
- GitHub上3983个资源库在命名或描述中提到了PyTorch
- PyTorch文件的下载量超50万次,具体说达到了651916次
- 5400个用户写了21500篇帖子,在论坛上讨论过5200个话题
- 在Reedit机器学习版块被被提及达131次,而TensorFlow在这段时间仅被提及255次
PyTorch也频频出现在各种会议中——
- 在最近的ICLR2018中提交的论文中,有87篇提到PyTorch。同时有228篇提到TensorFlow,42篇提到Keras,32篇提到Theano和Matlab
- arXiv每月平均提到PyTorch 72次,TensorFlow 273次,Keras 100次,Caffe 94次,Theano 53次
这些对比数据之外,PyTorch团队还整理了这一年社区的大事件和突破性进展。量子位则其重点,编译整理如下:
社区大事件
第一个现身社区的PyTorch程序包来自CMU博士Brandon Amos,他帮助简化了矩阵块的操作。
Jun-Yan Zhu, Taesung Park, Phillip Isola, Alyosha Efros和UC伯克利的团队发布了人气很高的Cycle-GAN and pix2pix,实现了图像到图像的转换。
项目地址: https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix
哈佛大学自然语言研究组(HarvardNLP)和Systran团队构建并改善PyTorch中OpenNMT系统。
项目地址: https://github.com/OpenNMT/OpenNMT-py
推特上的MagicPony团队贡献了超分辨率工作的进展。
介绍地址: https://twitter.com/Rob_Bishop/status/821793080877588480
Salesforce 研究院发布了一些程序包,包括PyTorch-QRNN。这是一种RNN,比CuDNN优化的标准LSTM快2倍到17倍,James Bradbury和他的团队也因此成为PyTorch社区中最活跃和最引人注目的力量之一。
PyTorch-QRNN项目地址: https://twitter.com/Smerity/status/917472260851560448
Uber、美国东北大学和斯坦福的研究团队围绕Pyro和ProbTorch组了一个概率编程社区,积极开发torch分布的核心程序包。
英伟达的研究人员发布了三个高质量的库,可以实现pix2pix-HD、Sentiment Neuron和FlowNet2的相关论文,他们还分析了PyTorch中不同数据并行模型的可扩展性。
相关项目地址: https://github.com/NVIDIA/sentiment-discovery https://github.com/NVIDIA/flownet2-pytorch https://github.com/NVIDIA/sentiment-discovery/blob/master/analysis/scale.md
艾伦研究院(Allen Institute for AI)发布了AllenNLP,里面包括先进的NLP模型参考实现,易于将web demo用于标准的NLP任务。
项目地址: http://demo.allennlp.org/machine-comprehension
去年7月,Kaggle团队grt123夺冠关于肺癌检测的DataScience Bowl 2017,随后发布了他们的PyTorch实现。
项目地址: https://twitter.com/PyTorch/status/881573658166267904
在可视化方面,Tzu-Wei Huang实现了TensorBoard-PyTorch插件,Facebook的人工智能研究也为他们的visdom可视化包发布了PyTorch兼容版。
相关项目地址: https://github.com/lanpa/tensorboard-pytorch https://github.com/facebookresearch/visdom
此外,Facebook AI研究院还发布了一些其他的项目,比如ParlAI、fairseq-py、VoiceLoop and FaderNetwork等,在多个领域实现了先进的模型和接口数据集。
工程大事件
在过去一年,PyTorch团队实现了多个功能,提高了性能。我们一起回顾一下:
高阶梯度
去年8月,PyTorch实现了一个可以接收n阶导数的通用接口,并增加了支持高阶梯度函数的范围。
分布式PyTorch
还是去年8月,PyTorch发布了小型分布式软件包,它用到了流行的MPI集合(MPI-collective)方法。该软件包有多个后端,如TCP、MPI、Gloo和NCCL2等,来支持各种类型的CPU/GPU集成操作和用例,并包含Infiniband和RoCE等分布式技术。
更接近NumPy
用户最大的需求之一是他们熟悉的NumPy特性。broadcasting和高级索引等功能很方便,为用户节省了大量时间。PyTorch实现了这些特性,并让API更接近NumPy。
稀疏张量
去年三月,PyTorch发布了一个支持稀疏张量的小程序包,五月发布了CUDA支持的稀疏包。该程序包可以实现深度学习中常用的稀疏范例的稀疏嵌入。
性能
关于性能的战斗还未停止,对想将灵活性最大化的动态框架PyTorch来说更是如此。在过去的一年里,PyTorch改进了从核心的张量库到神经网络operator的性能,能在board上快速编写微优化。
PyTorch为张量操作添加了专门的AVX和AVX2内联函数
编写了更快的GPU内核,用于常用的工作负载中
重写了几个神经网络operator的代码,如nn.Embedding等
此外,PyTorch将框架的开销减小了10倍
这事源于去年8月,DyNet的作者Graham Neubig等人展示了DyNet在小型NLP模型上的速度比PyTorch要快得多。之后,PyTorch重写了内部架构,将每个operator执行框架的开销从10微秒减少到1微秒。
ATen
重新设计PyTorch内部架构时,PyTorch团队还建造了ATen C++11库,现在所有的PyTorch后端都可以使用它。
输出模型到生产——支持ONNX和JIT编译器
将PyTorch模型导出到另一个框架是我们经常收到的一个请求。用户在PyTorch完成模型后,希望将其搭载到大型项目,但有时会遇到只能使用C++的尴尬境况。
因此,PyTorch建立了一个tracer,可将PyTorch模型输出为中间表示,用户可将其转换为ONNX格式输出至Caffe2、MXNet、TensorFlow等其他框架中,或直接连接到 CoreML或TensorRT这样的硬件加速库。
祝PyTorch一周岁生日快乐。
最后,附原文链接: http://pytorch.org/2018/01/19/a-year-in.html
- Python基础知识6:格式化字符、颜色
- 给自定义控件(Web Control)添加事件的几种方法。前两种方法可以不实现IPostBackEventHandler
- 【开源】QuickPager ASP.NET2.0分页控件 v2.0.0.2版本。
- 【开源】我的分页控件正式命名为QuickPager ASP.NET2.0分页控件
- 【开源】QuickPager ASP.NET2.0分页控件V2.0.0.1——分页控件的源码 (二)
- 高级时钟约束
- 【开源】QuickPager ASP.NET2.0分页控件V2.0.0.1——分页控件的源码(一) 主体
- 【开源】QuickPager ASP.NET2.0分页控件V2.0.0.1——支持多种数据库。让分页更加简单。
- IO约束(下)
- 可以通过基类实现的几种功能。vs2008 .net 2.0
- Python基础知识2:字典
- 桶式移位器
- 【开源】QuickPager ASP.NET2.0分页控件V2.0.0.7 增加了一个js函数的分页方式。
- FireEye报告:揭露新型工控系统恶意软件TRITON
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 一文搞懂 Flink如何移动计算
- 第7章代码-真实感图形技术
- 第6章代码-三维造型
- 自定义组件使用v-model
- 金蝶K3 WISE版本过服务期后打补丁方法-完善版本
- 图像处理笔记(6)---- OpenCV waitKey函数
- SpringBoot整合Quartz作为调度中心完整实用例子
- SpringBoot整合SpringSecurity简单实现登入登出从零搭建
- SpringBoot整合SpringBatch实用简例
- 解决JPA懒加载典型的N+1问题-注解@NamedEntityGraph
- 基于Shiro,JWT实现微信小程序登录完整例子
- Spring Cloud Eureka 总结
- Spring Cloud Feign 总结
- 掘金15W沸点简单分析(一)
- SpringBoot整合Shiro实现基于角色的权限访问控制(RBAC)系统简单设计从零搭建