![](/img/trans.png)
[英]Remove downloaded tensorflow and pytorch(Hugging face) models
[英]Use PyTorch DistributedDataParallel with Hugging Face on Amazon SageMaker
即使對於單實例訓練,PyTorch DistributedDataParallel (DDP) 通常比 PyTorch DataParallel (DP) 更推薦,因為 DP 的策略性能較低,並且在默認設備上使用更多 ZCD69B4957F06CD818D7BF3D61980E2。 (根據這個 PyTorch 論壇主題)
Hugging Face 建議通過python -m torch.distributed.launch
啟動器運行分布式訓練,因為他們的 Trainer API 支持 DDP,但如果不支持,則會退回到 DP。 (根據這個 HF 論壇主題)
I recently ran in to this problem: scaling a HF training job from p3.8xlarge
to p3.16xlarge
increased memory consumption on (I think) one of the GPUs to the point where I had to significantly reduce batch size to avoid CUDA Out of Memory錯誤 - 基本上失去了所有的擴展優勢。
因此,對於 p3.16xl+ 來說,好消息是我可以啟用 SageMaker 分布式數據並行,PyToch DLC 將自動通過 torch.distributed 為我啟動。
對於具有較小工作負載或希望在擴展之前進行測試的用例來說,壞消息是 SMDistributed 不支持所有多 GPU 實例類型。 例如,沒有 p3.8xl 或 g 系列。 我確實嘗試手動設置sagemaker_distributed_dataparallel_enabled
環境變量,但沒有任何樂趣。
那么我們如何在 SageMaker 上使用 PyTorch DDP 啟動 HF Trainer 腳本呢?
好問題,感謝您的提問,PyTorch DDP 在多個進程中運行數據並行工作者。 必須由開發人員啟動和管理,DDP 應該被視為一個托管的 allreduce,而不是一個托管的數據並行庫。 因為它需要您啟動和管理工作人員,甚至為工作人員分配資源:為了在 SageMaker 培訓作業中啟動 DDP 流程,您有很多選擇:
torch.multiprocessing.spawn
,如這個官方PyTorch演示所示(順便說一下)torch.distributed.launch
,它包含在 shell 或 Python 的啟動器腳本中。 此處示例https://gitlab.aws.dev/cruchant/a2d2-segmentation/-/blob/main/3_2D-Seg-Audi-A2D2-Distributed-Training-DDP.ipynbtorch.distributed
來啟動這些流程。 不幸的是,我們沒有為此創建文檔,所以沒有人使用它,也沒有人推銷它。 但它看起來很酷,因為它允許直接在 EC2 機器中運行腳本的副本,而無需調用中間 PyTorch 啟動器。 這里的例子所以現在,我的建議是 go 路線(3),這是最接近 PyTorch 社區所做的,因此提供了更容易的開發和調試路徑。
備注:
torch.distributed
被torchrun
取代,並且正在創建一個torchX工具來...簡化事情。)。torch.distributed.launch
實用程序的參數-nnodes
和-nproc_per_node
完成。 您必須在訓練集群的每個節點上運行一次torch.distributed.lauch
。 您可以使用多種工具來實現此並行命令,例如上面提到的 MPI 或 SageMaker 訓練。 為了建立必要的握手並形成集群,您還必須在torch.distributed.launch
命令中指定-node_rank
,它必須在每台機器上采用 0 到 N-1 之間的唯一機器 ID,以及-master_addr
和-master_port
,如果您運行單機集群,則可選,所有機器必須相同。init_process_group
DDP 初始化方法中,您必須分別使用world_size
和rank
參數指定世界大小和副本 ID。 因此,您必須有辦法向每個腳本傳達一個唯一 ID,通常稱為global rank 。 全球排名可以幫助您個性化每個 GPU 所做的工作,例如僅從一張卡保存 model,或僅在一張卡中運行驗證。 在由 3 台機器組成的集群中,每台機器有 4 個 GPU,全局等級的范圍是 0 到 11。在一台機器中,為了將 DDP 數據並行副本分配給可用的 GPU,必須為每個副本中運行的腳本分配一個 GPU ID,在運行它的機器中是獨一無二的。 這稱為本地排名,可以通過 PyTorch DDP torch.distributed.launch
設置為參數。 在由 3 台機器組成的集群中,每台機器有 4 個 GPU,在每台機器上,DDP 進程的本地等級范圍為 0 到 3
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.