PyTorch 1.0尝鲜版,这些改进你需要注意

【导读】PyTorch官方在今年5月发布了一个博客,宣称在今年夏天发布PyTorch v1.0,届时将支持科研和工业。然而,夏天夏天悄悄过去,留下我和你,还有没有发布的v1.0。今天,在各方努力下,PyTorch发布了v1.0的尝鲜版,作为对公众的答复。虽然不是正式发行,但是更新的features已经八九不离十,下面让小编帮你梳理一下新版特性吧。



首先,这次发布,只是pre-release preview (预发布的体验版)。团队在release的主页上加粗展示了这句话。

虽然不是正式发行,但是更新的features已经八九不离十。主要更新的feature如下:

首先重磅更新:支持工业产品的JIT功能,以及基于新的C10D库的分布式训练功能torch.distributed, 还有为追求超高性能以及使用C++的同学们提供的C++前端(PyTorch C++类库)

支持工业产品的JIT功能

新增的torch.jit包,包含了一组编译器工具,用于搭建PyTorch的研究与工业生产之间的桥梁。它包括一种名为Torch Script的语言(单从语法上来看,这是Python语言的一个子集,所以我们不用再学一门新语言了),以及两种使现有代码与JIT兼容的方法。

Torch Script的代码是可以进行积极的优化(类似TensorFlow代码),可以序列化,以供以后在C++ API中使用,它完全不依赖于Python。

官方提供了一系列的教程来介绍JIT:

  • deploying a seq2seq model

    • https://shiftlab.github.io/pytorch_tutorials/beginner/deploy_seq2seq_hybrid_frontend_tutorial.html

  • loading an exported model from C++

    • https://shiftlab.github.io/pytorch_tutorials/advanced/cpp_export.html

  • browse the docs

    • https://shiftlab.github.io/pytorch_docs/jit.html


基于C10D库的分布式训练包torch.distributed

torch.distributed 和 torch.nn.parallel.DistributedDataParallel 包的后端,现在切到了新的 "C10D" 库上,这个库有各种丰富的特性:

  • C10D是性能驱动的,对所有后端(Gloo、NCCL和MPI)都完全异步操作。

  • 能够显著的提升分布式数据并行的性能,特别是对于那些以来互联网来进行分布式的情况。

  • 为torch中的所有分布式集体操作都添加异步支持。

  • 改进了Gloo后端

C++前端(C++ 版 Torch)

C++前端是到PyTorch后端的纯C++接口,遵循已建立的Python前端的API和体系结构。它旨在支持在高性能、低延迟和硬核C++应用程序中的研究。它相当于torch.nn, torch.data等PyTorch的Python前端组件。具体使用也很类似:

除了上述这些highlight的更新,还有一些breaking changes, 如果你要升级到v1.0,需要正确使用它们,否则将会报错。

  • 原有的,使用tensor的0下标返回数据的方法(如:loss[0]),彻底移除, 你需要使用loss.item()

  • 原来被归类到torch.legacy(延迟删除库)的那些算法,已经过了缓冲期,将会被彻底删除

  • torch.masked_copy_ 被删除了,你先要需要用 torch.masked_scatter_

  • 涉及到0元素的tensor,它们的shape不在坍缩成(0,),将保持原来的形状

  • torch.distributed的 TCP 后端被移除了,官方建议:CPU用Gloo或者MPI, GPU用英伟达的NCCL

  • 一些扩类型的操作,比如一个tensor乘以一个numpy array,现在以tensor为第一优先级

  • 移除了直接在CUDA上调用numpy函数的隐式类型转换,现在你需要手动把数据从CUDA先移到CPU上

  • torch.randint的默认类型改成了torch.int64

  • 给torch.tensor传一个tensor,现在,会返回一个detach的tensor

  • torch.nn.functional.multilabel_soft_margin_loss 的返回值形状,从(N,C)改成了(N,)

  • Dirichlet 和Categorical 分布,现在不接受标量参数了。

  • 废弃了写C++扩展时候用的第一个参数是type,第二个参数是size的工厂类,改成新的工厂类:第一个参数是size,最后一个参数是TensorOptions


剩余一些变更,主要是修复bug的过于细节,有兴趣的同学,可以去release文档仔细查看。


-END-

专 · 知


人工智能领域26个主题知识资料全集获取与加入专知人工智能服务群: 欢迎微信扫一扫加入专知人工智能知识星球群,获取专业知识教程视频资料和与专家交流咨询!


请PC登录www.zhuanzhi.ai或者点击阅读原文,注册登录专知,获取更多AI知识资料!


请加专知小助手微信(扫一扫如下二维码添加),加入专知主题群(请备注主题类型:AI、NLP、CV、 KG等)交流~

 AI 项目技术 & 商务合作:bd@zhuanzhi.ai, 或扫描上面二维码联系!

请关注专知公众号,获取人工智能的专业知识!

点击“阅读原文”,使用专知


展开全文
Top
微信扫码咨询专知VIP会员