機器之心報導
參與:一鳴、思
今天凌晨,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、在文檔中保存類型新型等等。他提出了一種命名張量,作為規避各種張量「陷阱」的方法。
深度學習框架中的「張量」不好用?也許我們需要重新定義 Tensor 了
如今在 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