2019.10.10日,PyTorch 开发者大会在美国旧金山开幕,会上发布了PyTorch 1.3。这次更新最大的亮点在于对移动设备的支持(Mobile Supported)、命名张量(Named Tensors),量化(Quantization),类型提升(Type Promotion)等。另外,PyTorch 官方还开源了很多新工具和库,涉及可解释性、加密、以及关于图像语音的诸多功能。下面会逐一介绍。
PyTorch 1.3也增加了Cloud TPU和阿里云支持。
移动端支持(Mobile Support)
PyTorch 1.3 支持TorchScript直接在移动端(手机上,安卓、苹果)进行推理(inference),而不需要任何转换。当然移动端训练(train)目前还是不支持的。
另外,针对fp32和int8做了一些优化:
- 一些fp32的运算在ARM的CPU上做了特定优化(基于Caffe2Go)
- 一些int8的运算在ARM的CPU上做了特定优化(基于QNNPACK)
PyTorch移动端支持的特色在于没有为移动端建立新的框架(对比TensorFlow lite),所有TorchScript的API都可以直接在Android/iOS上运行。
但目前只是试验性质的发布,仍需要不断发展使得PyTorch对于特定的场景更小,更快。
命名张量(Named Tensor)
Named Tensor对Tensor的每一个维度指定具体的名字,这样可以使Tensor易用性更好。例如:
>>> tensor = torch.zeros(2, 3, names=('C', 'N'))
tensor([[0., 0., 0.],
[0., 0., 0.]], names=('C', 'N'))
这样就新建了一个dim=2的Tensor,两个维度分别为’C’和’N’,这样后续就可以直接使用’C’和’N’对Tensor进行操作,而不用使用以前的axis=0或者axis=1这种可读性不好的操作。
量化支持
PyTorch 1.3支持Tensor的量化操作,用户可以方便地把Tensor从float类型转换成8bit量化类型,或者转换回去。
x = torch.rand(10,1, dtype=torch.float32)
# xq 是量化后的向量,数据类型记为 quint8
xq = torch.quantize_per_tensor(x, scale = 0.5, zero_point = 8, dtype=torch.quint8)
# 再转换回浮点数
xdq = x.dequantize()
PyTorch 1.3目前支持了绝大多数CNN运算的8bit量化,包括:
另外,输入浮点数,权值是量化的动态量化运算也支持 (in torch.nn.quantized.dynamic)
量化模块也提供了下列函数,支持从Tensor搜集统计信息,用来计算量化参数:
对于训练中量化,支持伪量化运算在训练中模拟量化:
另外,在torch.quantization中支持下列几种方式:
所有的量化运算都和TorchScript兼容。
关于量化的更多细节参考: https://pytorch.org/docs/master/quantization.html
工具:Captum模型可解释性
Captum(在拉丁语中是 “comprehension” ,即可解释、可理解的意思),是一个开源的,可扩展性的PyTorch模型可解释性库。
可解释性用来解释神经网络为何能够工作,每一层能够完成什么样的功能。例如下面这个看图回答问题的例子,左边是原图,右边是特征向量的值,可以看到当大象是正确答案时,对应位置保留下来的特征较大,而一些背景树基本都没有保留下来。当然,也有一个柱子的特征保留较多,所以大象的预测概率并不高(p=0.55)。
可解释性现在研究很活跃,但是个人并不看好这一领域,主要是深度神经网络本身具有一定的不可解释性,而且即使能大概理解,也很难由解释的结果得到改进。虽然不太看好,还是要继续关注这一领域的发展。
更多关于 Captum的细节请参考:https://www.captum.ai/
工具:CrypTen 加密
CrypTen是一个基于PyTorch的保护隐私的框架。它的目标是让机器学习的实践者能够使用安全地进行计算。它目前实现了Secure Multiparty Computation作为其安全计算后端,为ML研究人员提供了三个主要好处:
举个使用crypten加密Tensor进行相加得到加密的和,再进行解密的例子:
import torch
import crypten
crypten.init()
x = torch.tensor([1.0, 2.0. 3.0])
x_enc = crypten.cryptensor(x) # 加密
x_dec = x_enc.get_plain_text() # 解密
y_enc = crypten.cryptensor([2.0, 3.0, 4.0])
sum_xy = x_enc + y_enc # 加密tensors相加
sum_xy_dec = sum_xy.get_plain_text() # 对和解密
GitHub 开源地址:https://github.com/facebookresearch/crypten
关于 Udacity Course:https://cn.udacity.com/course/secure-and-private-ai--ud185
参考
PyTorch 1.3 项目地址:
https://github.com/pytorch/pytorch/releases/tag/v1.3.0
可解释性例子:
https://pytorch.org/captum/tutorials/Multimodal_VQA_Interpret
相关文章
TensorFlow静态图和eager机制
TensorFlow 2.0
TensorFlow高阶API和低阶API
TensorFlow调试技巧
TensorFlow与PyTorch对比
CSDN排版不友好,建议到公众号查看。公众号持续更新,欢迎订阅。
AI人工智能与大数据