PyTorch磚——引入火花PyTorch分銷商
2023年4月20日 在工程的博客
背景和動機
深入學習算法是複雜的,耗時的訓練,但很快就從實驗室到生產,因為這些算法幫助實現的價值。是否使用pre-trained模型微調,從頭建立一個網絡或者介於兩者之間的任何東西,內存和計算負荷的訓練很快就會成為一個瓶頸。作為一個手段打擊這些限製,一個常見的第一道防線是利用分布式訓練。同時tensorflow一直spark-tensorflow-distributor,還沒有PyTorch等價。
我們很高興最後宣布TorchDistributor庫來簡化分布式PyTorch培訓Apache火花集群。在本文中,我們將通過新圖書館和如何使用它。磚也自豪地貢獻這個開源社區。
從曆史上看,在處理火花時,Horovod是主要的分配機製和首選的方法特別是在早期,形成天PyTorch當分布相當原始的api。然而,這種機製要求重新格式化代碼以及額外的調優和優化,以充分利用Horovod提供的特性。
當分布深度學習算法,有兩種方法,數據並行計算和並行模型。模型並行訓練仍然是一個學術研究領域和大型工業研究實驗室數據並行性是最常見的方法擴大培訓。
數據並行性的早期以來進步很多火炬數據並行實現(dp)。Horovod,然而,隻有解決了基本的數據並行的場景。那是足夠的曆史,但大型語言模型(llm)的崛起意味著GPU內存現在是一個常見的瓶頸和更新更高效的數據並行方法是必需的。
這些新的本地PyTorch數據並行實現包括分布式數據並行,“ddp”和充分共享數據並行“fsdp”。看到在這裏看為什麼ddp遺留dp和更喜歡在這裏了解fsdp。簡而言之,ddp不傳輸盡可能多的gpu之間數據的一部分,每個訓練迭代parallelises也更有效率,減少開銷。Fsdp分解模型在不同的gpu為了節省內存,這樣就可以增加批量大小和允許更大的模型訓練,而無需切換到模式並行技術。
在更廣泛的開源社區,圖書館“deepspeed”和“巨大的”顯示承諾確保稀缺GPU資源有效使用。利用ddp、fsdp deepspeed和巨大的其他需要Horovod的重大返工或一個新的分配機製。
記住這些進步,TorchDistributor發達。我們將能夠更好地支持這些新的分銷技術並能夠容易OSS支持新的創新社區。
架構方法
Horovod,控製分配機製和節點間通信,任何新的發展“fsdp”需要重新實現回Horovod過程。
相比之下,TorchDistributor,基於Spark-Tensorflow-Distributor庫,提供了一種機製,利用本地分布式PyTorch和PyTorch閃電api直接在一個Apache火花集群。執行模式引發的障礙為了執行使用本機PyTorch torch.distributed.run API是什麼torchrunCLI命令還與bash腳本執行。
TorchDistributor PyTorch流程和樹葉開始它PyTorch工作分配機製采取行動隻是為了確保流程協調。
這個新的模塊不需要代碼重構,並允許來自開源社區的教程直接插到火花和主要訓練循環。Torchrun PyTorch的方向是向所有分布式訓練程序,利用它幫助我們不會過時的方法。
使用TorchDistributor
注意運行時13毫升。x和上麵的要求
TorchDistributor簡單使用一些主要設置需要考慮。
的一般結構是:
從pyspark.ml.torch.distributor進口TorchDistributor結果= TorchDistributor (num_processes =2,local_mode =真正的,use_gpu =真正的).run (< function_or_script >,<參數>)
TorchDistributor有三個主要配置
- num_processes指火花運行任務的數量。
- local_mode是指培訓司機節點和培訓工人節點。當訓練在一個節點集local_mode = True
- use_gpu決定我們是否將培訓使用gpu。
當訓練GPU, TorchDistributor配置分配1 GPU /火花的任務。所以num_processes = 2將與1 GPU創建兩個火星任務。做筆記訓練多節點設置時,local_mode = False,司機節點將不會用於培訓成本節約措施是將其設置為一個小GPU節點。這可以從配置集群創建頁麵。
在運行命令中,<function_or_script>可以是一個python函數在筆記本或一個培訓腳本的路徑在對象存儲。<arg遊戲>是一個逗號分隔的參數列表輸入<function_or_script>
TorchDistributor,當它運行一個函數,將輸出返回值。當它被設置為運行一個腳本文件,它將返回腳本的輸出。
作為一個例子就是我們如何在一個節點上運行TorchDistributor通過訓練函數,它接受兩個gpu的論點__arg1磚的筆記本:
結果=TorchDistributor (num_processes=2,local_mode=真正的,use_gpu=真正的).run (train_func __arg1)
運行相同的功能在TorchDistributor多節點集群利用8 GPU默認1 GPU /火花任務設置:
結果=TorchDistributor (num_processes=8,local_mode=假,use_gpu=真正的).run (train_func __arg1)
火車的結構功能,看到這個pytorch ddp的例子。必須進行些許改變。“等級”,“local_rank”和“world_size”將計算TorchDistributor和環境變量中設置等級,world_size local_rank和應該讀通過os.environ []而不是手工管理和設置。
PyTorch閃電,PyTorch Keras, TorchDistributor也可以使用。在這裏看到的詳細介紹到PyTorch閃電。與TorchDistributor使用鏈接的代碼,我們可以簡單地將培訓循環部分Python函數並將到運行命令以及任何必要的參數。
正如上麵提到的,運行命令也可以使用Python CLI培訓腳本簡化遷移。例如:
結果=TorchDistributor (num_processes=2,local_mode=真正的,use_gpu=真正的).run (“/道路/ / train.py”,“——lr = 0.01”)
將執行該文件“/道路/ / train.py”
在單個節點上用2 gpu和飼料的參數——lr = 0.01的任何參數解析器在該腳本。
任何腳本設計torchrun和協會torch.distributed.run將與TorchDistributor。一個關鍵的設計目標是能夠支持一個完整的交互式筆記本體驗以及允許兼容現有的代碼庫旨在通過CLI被觸發。與CLI的解決方案,我們可以依靠火花和TorchDistributor觸發在每個節點上執行的代碼,並確保有完整的網絡連接,而不必手動檢查和設置這些。
擴展和性能
引入新方法時出現的一個常見問題是為現有的解決方案相比,它的表現如何。
為了測試這個,我們訓練有素的15世紀imagenette數據集和一個resnet50模型進行分類的任務。這是運行在g4dn節點與PyTorch閃電1.7.7 AWS。看到這些筆記本電腦在這裏為基準回購在您自己的環境中繁殖。
單節點培訓以下性能實現:
培訓兩個節點,以下性能觀察。
我們可以看到添加gpu確實有助於減少培訓時間雖然規模收益遞減。
與TorchDistributor我們很自豪地把本地Apache火花支持PyTorch和相關的生態係統,已經在這個框架。完整的代碼示例請按照筆記本在這裏。