机器之心报道
参与:一鸣、思
本文经机器之心(微信公众号:almosthuman2014)授权转载,禁止二次转载”
今天凌晨,PyTorch 开发者大会在旧金山开幕,会上发布了最新版本 PyTorch1.3。本次更新最大的亮点在于对移动设备的支持、挑战传统张量的「命名张量」,以及更好的性能改进。
今天,PyTorch1.3 发布了。图灵奖得主,被誉为「深度学习三座山头」之一的 LeCun 发推称赞。
本次 PyTorch1.3 更新增加了很多的新特性,包括无缝移动设备部署、量化模型以加速推断、前端改进(如对张量进行命名和创建更干净的代码)。PyTorch 官方同时还开源了很多新工具和库。
在开发者大会上,PyTorch 官方表示甚至微软都将其列入了支持的深度学习框架中。
PyTorch 1.3 项目地址:https://github.com/pytorch/pytorch/releases/tag/v1.3.0
茁壮成长的 PyTorch
由于 PyTorch 一直致力于满足研究者的需求,因此它在不断地进行版本迭代,现在已经成为开源社区仅次于 TensorFlow 的深度学习框架。
据 Facebook 博客透露,仅在 2019 年,在 ArXiv 平台上引用 PyTorch 的论文数量就增长了 194%。2018 年,为整个项目贡献了代码的人数也增长了 50%,达到了 1200 人。而使用 PyTorch 进行算法开发的公司也越来越多,其中不乏 Uber 等大公司。
在 Reddit 中,研究者统计到:CVPR 2018-2019,用 PyTorch 的论文从 82 篇增长到 280 篇,TensorFlow 从 116 增长到 125;ACL 2018-2019,用 PyTorch 的论文数从 26 增长到 103,TensorFLow 从 34 到 33 反而降低了。其它机器学习顶会也有相似的趋势,所以 PyTorch 搞定研究,TensorFlow 搞定业界?
当然,随着 PyTorch 的发展,也有开发者表示他们了解的一些新型初创公司很多都将 PyTorch 作为框架。不过目前看起来,还是 TensorFlow 在模型部署等工程化操作上做得更完善一些。
PyTorch 1.3 是一个新的起点
PyTorch 1.3 的发布带来了一系列重要的新特性,包括移动设备的模型部署、Eager 模式的 8 比特整型量化和张量命名的能力。虽然它们目前都处于试验阶段,但看起来真的非常 Amazing。例如张量命名的能力,我们可以给每个张量的不同维度分别命名,例如将 BatchSize 维度命名为「B」,那么就可以直接用「B」对这个维度的数值进行各种操作。
通过这一系列新特性,我们可以预想到 PyTorch 将会变得越来越好用。
PyTorch Mobile
近来,在边缘设备上运行机器学习模型渐渐变得更重要了。此外,如联邦学习那样的模型也需要对于隐私保护的措施。为了让移动设备上的机器学习变得更高效,PyTorch1.3 做了很多改进。现在,它已经支持端到端的工作流,可以从 Python 直接部署到 ios 或安卓系统中。
主要支持的功能如下
支持在移动设备上进行完整的 TorchScript 推断;
在 JCenter/CocoaPods 上建立了 LibTorch 代码库;
对于安卓而言,PyTorch 进行了 Java 封装,涵盖了常用的推断场景;
在移动 CPU 上可以进行所有的前向计算;(反向传播还不支持)
优化了一些 float32 算子,用于 ARM CPU;(基于 Caffe2Go)
优化了一些 int8 算子,用于 ARM CPU;(基于 QNNPACK)
不专门为移动设备创建新的框架,用户可使用一样的 API;
TorchScript 格式的模型不需要任何格式转换就可以在安卓/ios 上使用。
官方提供了一个教程:https://pytorch.org/mobile/
命名张量
康奈尔大学的 Sasha Rush 认为,尽管深度学习无处不在,但传统张量的实现显著是一个缺点,例如它暴露了私有张量的维度、基于绝对位置的 Broadcasting、在文档中保存类型新型等等。他提出了一种命名张量,作为规避各种张量「陷阱」的方法。
如今在 PyTorch 1.3 中,我们可以通过命名直接访问张量维度。如下传统的张量,我们可以通过索引访问不同的维度:
# Tensor[N, C, H, W]
images = torch.randn(32, 3, 56, 56)
images.sum(dim=1)
images.select(dim=1, index=0)
但是一旦我们为张量命了名,那么就可以直接通过名称访问张量的不同维度。
NCHW = [‘N’, ‘C’, ‘H’, ‘W’]
images = torch.randn(32, 3, 56, 56, names=NCHW)
images.sum('C')
images.select('C', index=0)
量化
在构建机器学习应用时,合理利用服务端与设备端计算资源都显得极为重要。为了支持在服务器和边缘设备上更高效地部署模型,现在 PyTorch 1.3 支持使用 Eager 模式 Python API 进行 8-bit 模型量化。这种 8-bit 的整型量化方法可以在较低精度的条件下实现计算与存储占用,从而大大降低所需计算资源。
目前实验阶段的量化方法能支持后训练量化、动态量化和训练期间的量化。PyTorch 在后端会利用当前最优的量化核,即用于 x86 CPU 的 FBGEMM 和用于 ARM CPU 的 QNNPACK。重要的是,尽管后端会根据硬件选择不同的量化核,但它们共享相同的 API。
PyTorch 相关新工具
Captum
随着模型变得逐渐复杂起来,为模型交互开发相关的方法也就变得很重要了。为了解决这个问题,今天的 PyTorch 开发者大会主要发布了一个名为 Captum 的工具,用于帮助开发者理解模型生成的特定输出。
Captum 提供了 SOTA 级别的工具,用于帮助开发者理解特定的神经元和层的重要性,同时对这些层或神经元对模型的影响进行预测。这个工具的算法包括:整合梯度、传导率、SmoothGrad 和 VarGrad,以及 DeepLift。
以下为示例代码,用于展示在 ResNet 中,每个像素点的可视化属性。
noise_tunnel = NoiseTunnel(integrated_gradients)
attributions_ig_nt, delta = noise_tunnel.attribute(input, n_samples=10, nt_type='smoothgrad_sq', target=pred_label_idx)
_ = viz.visualize_image_attr_multiple(["original_image", "heat_map"],["all", "positive"],
np.transpose(attributions_ig_nt.squeeze().cpu().detach().numpy(), (1,2,0)),
np.transpose(transformed_img.squeeze().cpu().detach().numpy(), (1,2,0)),
cmap=default_cmap,
show_colorbar=True)
本图中,特征属性使用整合梯度(integrated gradient)进行计算,并通过右图展示出来。
CRYPTEM
基于云平台或 MLaaS 平台的 ML 实战应用经常面临一系列安全和隐私方面的挑战。特别是,这些平台的用户并不希望共享未加密的数据,这很可能会阻碍用户进一步获得 ML 工具带来的好处。为了解决这个问题,ML 社区正探索一系列的技术方法,它们的成熟度各不相同,其包括同态加密、安全多方计算、可信执行环境、设备端计算和差分隐私等等。
为了更好地理解这些技术如何应用到模型之上,PyTorch 团队发布了 CrypTen 工具,它是一种社区驱动的研究平台,用来解决隐私保护领域的机器学习问题。
最后除了这些重大新特性,PyTorch 还有更多提升,包括 Python 子语言 TorchScript 的完善、C++前端的优化、TensorBoard 支持的更新等等。不管怎么样,PyTorch 肯定是越来越好用的,大家也可以快快更新呀。
参考链接:
https://ai.facebook.com/blog/pytorch-13-adds-mobile-privacy-quantization-and-named-tensors/
https://www.reddit.com/r/MachineLearning/comments/dg0a5i/d_pytorch_dominates_research_tensorflow_dominates/
https://www.reddit.com/r/MachineLearning/comments/dg2lb6/n_pytorch_130_mobile_support_named_tensors/
https://app.releasly.co/releases/pytorch/pytorch/1_3_0
“哪吒头”—玩转小潮流