PyTorch 1.7來了:支持Windows上的分佈式訓練,還有大波API襲來

  • 2020 年 11 月 4 日
  • AI

編譯 | 蔣寶尚
據Facebook 官方博客公告,PyTorch1.7版本已經於昨日正式發佈,相比於以往的 PyTorch 版本,此次更新除了增加了更多的API,還能夠支持 NumPy兼容下的傅里葉變換、性能分析工具,以及對基於分佈式數據並行(DDP)和遠程過程調用(RPC)的分佈式訓練。
此外,原有的一些功能也轉移到了穩定版,包括自定義C++ -> 類(Classes)、內存分析器、通過自定義張量類對象進行的擴展、RPC中的用戶異步功能以及Torch.Distributed中的許多其他功能,如Per-RPC超時、DDP動態分組(bucketing)和RRef助手。
其中一些亮點包括:
1、PyTorch.org上提供的二進制文件現在正式支持CUDA 11
2、對Autograd分析器中的RPC、TorchScript和堆棧跟蹤的分析和性能進行了更新和添加。
3、(測試版)通過torch.fft支持NumPy兼容的快速傅立葉變換(FFT)。
4、(原型)支持NVIDIA A100 GPU和本地的TF32格式。
5、(原型)支持Windows上的分佈式訓練
6、torchvision
  •     (穩定)變換現在支持張量輸入、批處理計算、GPU和TorchScript

  •     (穩定)JPEG和PNG格式的本機映像I/O

  •     (測試版)新的視頻閱讀器API

7、torchaudio
  •    (穩定)增加了對語音錄製(Wav2Letter)、文本到語音(WaveRNN)和源分離(ConvTasNet)的支持。

註:從Pytorch1.6版本開始,PyTorch 的特性將分為 Stable(穩定版)、Beta(測試版)和 Prototype(原型版)

1

前端接口

[測試版]與Numpy兼容的TORCH.FFT模塊
與FFT相關的功能通常用於各種科學領域,如信號處理。雖然PyTorch過去一直支持一些與FFT相關的函數,但1.7版本添加了一個新的torch.fft模塊,該模塊使用與NumPy相同的API實現與FFT相關的函數。此新模塊必須導入才能在1.7版本中使用,因為它的名稱與之前(現已棄用)的torch.fft函數衝突。
示例:

       
       
[測試版]對轉換器NN模塊的C++支持
從PyTorch1.5開始,就繼續保持了Python和C++前端API之間的一致性。這次更新能夠讓開發人員使用C++前端的nn.former模塊。此外,開發人員不再需要將模塊從python/JIT保存並加載到C++中,因為它現在可以在C++中直接使用。
[測試版]TORCH.SET_DESITIAL
再現性(逐位確定性)可能有助於在調試或測試程序時識別錯誤。為了便於實現重現性,PyTorch 1.7添加了torch.set_defiristic(Bool)函數,該函數可以指導PyTorch操作符選擇確定性算法(如果可用),並在操作可能導致不確定性行為時給出運行時錯誤的標識。
默認情況下,此函數控制的標誌為false,這意味着在默認情況下,PyTorch可能無法確定地實現操作。
更準確地說,當此標誌為 true時:
1、已知沒有確定性實現的操作給出運行時錯誤;
2、具有確定性變體( variants)的操作使用這些變體(與非確定性版本相比,通常會降低性能);
3、設置:torch.backends.cudnn.deterministic = True .
請注意,對於PyTorch程序的單次運行中的確定性而言,這屬於非充分必要條件。還有其他隨機性來源也可能導致不確定性行為,例如隨機數生成器、未知操作、異步或分佈式計算。

2

性能與性能分析

[測試版]在配置文件中添加了堆棧軌跡追蹤。
用戶現在不僅可以看到分析器輸出表中的操作員名稱/輸入,還可以看到操作員在代碼中的位置。在具體工作流程中,只需極少的更改即可利用此功能。
用戶像以前一樣使用自動評分檢測器,但帶有可選的新參數:WITH_STACK和GROUP_BY_STACK_n。注意:常規分析運行不應使用此功能,因為它會增加大量成本。

3

分佈式訓練和RPC

[穩定]TORCHELASTIC現在綁定到PYTORCH DOCKER鏡像
Torchelastic提供了一個當前Torch.Distributed的嚴格superset,啟動CLI時增加了容錯和彈性功能。如果用戶對容錯不感興趣,可以通過設置max_restarts=0獲得更加精確的指定。另外,還增加了自動分配RANK和MASTER_ADDR|PORT的便利性。
通過將Torchelastic捆綁在與PyTorch相同的鏡像中,用戶可以立即開始嘗試使用TorchElastic,而不必單獨安裝Torchelastic。除了方便之外,當在現有Kubeflow的分佈式PyTorch操作符中添加對彈性參數的支持時,這項工作也是非常有用的。
[測試版]支持DDP中不均勻的數據集輸入
PyTorch1.7引入了一個新的上下文管理器,該管理器將與使用torch.nn.parallel.DistributedDataParallel 訓練的模型結合使用,以支持跨進程使用不均勻的數據集進行訓練。
此功能在使用DDP時提供了更大的靈活性,用戶不用「手動」,就能保證數據集大小相同。使用此上下文管理器,DDP將自動處理不均勻的數據集大小,這可以防止訓練結束時出現錯誤。
[測試版]NCCL可靠性-ASYNC錯誤/超時處理
在過去,NCCL的訓練運行會因為集體卡住而無限期地掛起(hang),使得用戶體驗非常糟糕。如果檢測到潛在的掛起(hang),此功能會給出異常/使進程崩潰的警告。當與torchelastic(它可以恢復「最近」的訓練過程)之類的東西一起使用時,分佈式訓練將更加可靠。
此功能並不強制,屬於可選性操作,並且位於需要顯式設置才能啟用此功能。
[測試版]TORCHSCRIPT RPC_REMOTE和RPC_SYNC
在早期版本中,Torch.Distributed.rpc.rpc_async已在TorchScript中提供。對於PyTorch1.7,此功能將擴展到剩下的兩個核心RPCAPI:torch.Distributed.rpc.rpc_sync和torch.Distributed.rpc.remote。
這將完成計劃在TorchScript中支持的主要RPC API,它允許用戶在TorchScript中使用現有的python RPC API,並可能提高多線程環境中的應用程序性能。
[測試版]支持TORCHSCRIPT的分佈式優化器
PyTorch提供了一系列用於訓練算法的優化器,這些優化器已作為python API的一部分。
然而,用戶通常希望使用多線程訓練而不是多進程訓練,因為多線程訓練在大規模分佈式訓練中提供了更好的資源利用率和效率。
以前的分佈式優化器沒有此效率,因為需要擺脫python全局解釋器鎖(GIL)的限制才能實現這一點。在PyTorch1.7中,啟用了分佈式優化器中的TorchScript支持來刪除GIL,並使優化器能夠在多線程應用程序中運行。
新的分佈式優化器具有與以前完全相同的接口,但是它會自動將每個Worker中的優化器轉換為TorchScript,從而使每個GIL空閑。
示例:
[測試版]對基於RPC的評測的增強
PyTorch 1.6首次引入了對結合使用PyTorch分析器和RPC框架的支持。在PyTorch 1.7中,進行了以下增強:
1、』實現了對通過RPC分析TorchScript函數的更好支持。
2、在使用RPC的分析器功能方面實現了奇偶校驗。
3、增加了對服務器端異步RPC函數的支持(使用rpc.functions.async_Execution)。
用戶現在可以使用熟悉的性能分析工具,比如torch.autograd.profiler.profile()和torch.autograd.profiler.record_function,這可以與RPC框架配合使用,這些RPC框架具有:全功能支持、配置文件異步函數和TorchScript函數。
[原型]Windows對分佈式訓練的支持
PyTorch1.7為Windows平台上的DistributedDataParallel和集合通信提供了原型支持。在此版本中,僅支持基於Gloo的ProcessGroup和FileStore。
如果要跨多台計算機使用此功能,可以在init_process_group中提供來自共享文件系統的文件。
示例:
     

4

Mobile

PyTorch Mobile支持iOS和Android,CocoaPods和JCenter,並分別提供了二進制軟件包。
[測試版]PYTORCH移動緩存分配器可提高性能
在一些移動平台上,比如Pixel,內存歸還給系統過於頻繁的時候,會導致頁面錯誤。原因是作為功能框架的PyTorch不維護操作符的狀態。
因此,對於大多數操作,每次執行操作時都會動態分配輸出。為了改善由此造成的性能損失,PyTorch1.7為CPU提供了一個簡單的緩存分配器。分配器按張量大小緩存分配,目前只能通過PyTorch C++API使用。
緩存分配器本身歸客戶端所有,客戶端擁有的緩存分配器然後可以與c10::WithCPUCachingAllocatorGuard 一起使用,以允許在該作用域內使用緩存分配。
示例用法:
注意:
緩存分配器僅在移動版本上可用,因此在移動版本之外使用緩存分配器將會失效。

5

torchvision

[穩定]TRANSFORMS現在支持張量輸入、批處理計算、GPU和TORCHSCRIPT
Torchvision transforms 現在繼承自 nn.Module,並且可以編寫TorchScript腳本並將其應用於 torch Tensor  輸入以及PIL圖像。它們還支持具有批處理維度的張量,並可在CPU/GPU設備上無縫工作:
這些改進實現了以下新功能:
1、支持GPU加速。
2、批量轉換,例如根據視頻的需要。
3、變換多波段torch張量圖像(3-4個以上通道)
TorchScript transforms  與模型一起部署時請注意:TorchScript支持的例外包括Compose、RandomChoice、RandomOrder、Lambda等等
[穩定]JPEG和PNG格式的本地圖像IO
Torchvision 0.8.0引入了JPEG和PNG格式的本地圖像讀寫操作。這些操作符支持TorchScript並以uint8格式返回CxHxW tensors,因此現在可以成為在C++環境中部署的模型的一部分。

       
       
[穩定]RETINANET檢測模型
此版本為Retinanet添加了預先訓練的模型,該模型具有ResNet50主幹,可用於物體檢測。
[測試版]新的視頻閱讀器API
此版本引入了一個新的視頻閱讀API,可以更細粒度地控制視頻的更新迭代。它支持圖像和音頻,並實現了迭代器接口,因此可以與其他python庫(如itertools)交互操作。
示例:

       

     
注意:
1、要使用Video Reader API測試版,必須使用源編譯torchvision,並在系統中安裝ffmpeg。
2、VideoReader接口目前為測試版。

6

torchaudio

通過這個版本,torchaudio正在擴展對模型和端到端應用,增加了wav2letter訓練管道和端到端文本到語音以及源分離管道
[穩定]語音識別
在上一個版本中添加了用於語音識別的Wave2Letter模型的基礎上,現在使用LibriSpeech數據集添加了一個Wave2Letter訓練管道。.
[穩定]文本到語音轉換
為了支持文本到語音的應用程序,在此存儲庫的實現的基礎上,添加了一個基於WaveRNN模型的聲碼器。
另外,還提供了一個示例:WaveRNN訓練管道,該管道使用在pytorch 1.7版本中添加到torchaudio中的LibriTTS數據集。
[穩定]源分離
隨着ConvTasNet模型的加入,基於「Conv-TasNet: Surpassing Ideal Time-Frequency Magnitude Masking for Speech Separation,」」一文,Torchaudio現在也支持源分離。WSJ-MIX數據集提供了一個示例:ConvTasNet訓練管道。

原文鏈接:
//pytorch.org/blog/pytorch-1.7-released/

[贈書福利]

AI科技評論聯合【機械工業出版社華章公司】為大家帶來15本「新版蜥蜴書」正版新書。

在10月24號頭條文章《1024快樂!最受歡迎的AI好書《蜥蜴書第2版》送給大家!留言區留言,談一談你對本書內容相關的看法和期待,或你對機器學習/深度學習的理解。

AI 科技評論將會在留言區選出 15名讀者,每人送出《機器學習實戰:基於Scikit-Learn、Keras和TensorFlow(原書第2版)》一本(在其他公號已獲贈本書者重複參加無效)。

活動規則:

1. 在留言區留言,留言點贊最高的前 15 位讀者將獲得贈書。獲得贈書的讀者請聯繫 AI 科技評論客服(aitechreview)。

2. 留言內容會有篩選,例如「選我上去」等內容將不會被篩選,亦不會中獎。

3. 本活動時間為2020年10月24日 – 2020年10月31日(23:00),活動推送內僅允許中獎一次。

點擊閱讀原文,直達NeurIPS小組~