PyTorch - Amazon SageMaker

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

PyTorch

將您自己的 PyTorch 模型帶入 SageMaker,並使用訓練編譯器執行 SageMaker 訓練工作。

PyTorch 具有 Hugging Face 變壓器的型號

PyTorch 具有 Hugging Face 變壓器的型號基於 PyTorch的 Torch .NN。模塊 API。Hugging Face 部變形金剛還提供培訓師和預先訓練的模型類, PyTorch 以幫助減少配置自然語言處理(NLP)模型的工作量。準備訓練指令碼之後,您可以使用 SageMaker PyTorchHuggingFace或估算器與訓練編譯器組態來啟動 SageMaker 訓練工作,當您繼續進行的下一個主題時。啟用 SageMaker 訓練編譯器

提示

當您在訓練指令碼中使用轉換器為 NLP 模型建立權杖化工具時,請確保您透過指定 padding='max_length' 來使用靜態輸入張量形狀。請勿使用 padding='longest',因為填補至批次中最長的序列可能會變更每個訓練批次的張量形狀。動態輸入形狀可觸發模型的重新編譯,並可能會增加總訓練時間。有關轉換器權杖化工具填補選項的詳情,請參閱 Hugging Face 轉換器文件中的填補和截斷

使用 Hugging Face 轉換器 Trainer 類別的大型語言模型

如果您使用變形金剛庫的 Trainer 類,則不需要對訓練腳本進行任何其他更改。 SageMaker 如果您透過估算器類別啟用訓練模型,訓練編譯器會自動編譯您的訓練模型。下面的代碼顯示了具有 Hugging Face PyTorch 訓練 API 的培訓腳本的基本形式。

from transformers import Trainer, TrainingArguments training_args=TrainingArguments(**kwargs) trainer=Trainer(args=training_args, **kwargs)

適用於單一 GPU 訓練

當您使用 transformers.Trainer 類別時,不需變更程式碼。

適用於分散式訓練

PyTorch 第 1.11.0 版及更新版本

若要使用訓練編譯器執行分散式 SageMaker 訓練,您必須在訓練指令碼中新增下列_mp_fn()函數,並封裝main()函數。它會將_mp_fn(index)函數呼叫從 SageMaker 分散式執行階段 for PyTorch (pytorchxla) 重新導向至訓練指令碼的main()函數。

def _mp_fn(index): main()

此函式會接受 index 引數,以指出叢集中目前 GPU 的等級,藉此進行分散式訓練。若要尋找更多範例指令碼,請參閱 Hugging Face 轉換器語言模型範例指令碼

對於版本 4.17 和之前版本 1.10.2 和之前的 PyTorch 變形金剛

SageMaker 訓練編譯器會使用替代機制來啟動分散式訓練工作,而且您不需要在訓練指令碼中進行任何修改。相反地, SageMaker 訓練編譯器會要求您將 SageMaker 分散式訓練啟動器指令碼傳遞至entry_point引數,並將訓練指令碼傳遞至 SageMaker Hugging Face 孔估算器中的hyperparameters引數。

將 SageMaker 訓練編譯器搭配使用的最佳做法 Trainer

完成訓練指令碼的調整後,請繼續前往使用 PyTorch 訓練編譯器執行 SageMaker 訓練工作

PyTorch 直接使用的大型語言模型(無需 Hugging Face 變形金剛訓練器 API)

如果您有 PyTorch 直接使用的訓練指令碼,則需要對 PyTorch 訓練指令碼進行其他變更以實作 PyTorch /XLA。依照指示修改您的指令碼,以正確設定 PyTorch /XLA 主要動物。

適用於單一 GPU 訓練

  1. 匯入最佳化程式庫。

    import torch_xla import torch_xla.core.xla_model as xm
  2. 將目標裝置變更為 XLA 而非 torch.device("cuda")

    device=xm.xla_device()
  3. 如果您使用 PyTorch的是「自動混合精確度」(AMP),請執行下列動作:

    1. torch.cuda.amp 換成下列項目:

      import torch_xla.amp
    2. torch.optim.SGDtorch.optim.Adam 取代為下列項目:

      import torch_xla.amp.syncfree.Adam as adam import torch_xla.amp.syncfree.SGD as SGD
    3. torch.cuda.amp.GradScaler 換成下列項目:

      import torch_xla.amp.GradScaler as grad_scaler
  4. 如果沒有使用 AMP,則請將 optimizer.step() 取代為下列項目:

    xm.optimizer_step(optimizer)
  5. 如果您使用的是分佈式數據記錄器,請將數據記錄器包裝在 /XLA 的類中 PyTorch:ParallelLoader

    import torch_xla.distributed.parallel_loader as pl parallel_loader=pl.ParallelLoader(dataloader, [device]).per_device_loader(device)
  6. 若不使用 parallel_loader 時,請在訓練迴路的結尾新增 mark_step

    xm.mark_step()
  7. 若要檢查訓練,請使用 PyTorch /XLA 的模型檢查點方法:

    xm.save(model.state_dict(), path_to_save)

完成訓練指令碼的調整後,請繼續前往使用 PyTorch 訓練編譯器執行 SageMaker 訓練工作

適用於分散式訓練

除了上個 適用於單一 GPU 訓練 章節所列的變更內容之外,請新增下列變更項目,以便在 GPU 之間妥善分配工作負載。

  1. 如果您使用了 AMP,請在 scaler.scale(loss).backward() 之後新增 all_reduce

    gradients=xm._fetch_gradients(optimizer) xm.all_reduce('sum', gradients, scale=1.0/xm.xrt_world_size())
  2. 如需為 local_ranksworld_size 設定變數,請使用與下列類似的程式碼:

    local_rank=xm.get_local_ordinal() world_size=xm.xrt_world_size()
  3. 對於任何大於 1world_size (num_gpus_per_node*num_nodes),您必須定義一個訓練取樣器,該取樣器看起來應該類似於以下內容:

    import torch_xla.core.xla_model as xm if xm.xrt_world_size() > 1: train_sampler=torch.utils.data.distributed.DistributedSampler( train_dataset, num_replicas=xm.xrt_world_size(), rank=xm.get_ordinal(), shuffle=True ) train_loader=torch.utils.data.DataLoader( train_dataset, batch_size=args.batch_size, sampler=train_sampler, drop_last=args.drop_last, shuffle=False if train_sampler else True, num_workers=args.num_workers )
  4. 進行下列變更,以確保您使用 torch_xla distributed 模組提供的 parallel_loader

    import torch_xla.distributed.parallel_loader as pl train_device_loader=pl.MpDeviceLoader(train_loader, device)

    像常規 PyTorch加載器一樣的train_device_loader功能如下:

    for step, (data, target) in enumerate(train_device_loader): optimizer.zero_grad() output=model(data) loss=torch.nn.NLLLoss(output, target) loss.backward()

    透過所有這些變更,您應該能夠在不使用變壓器訓練程式 API 的情況下,使用任何 PyTorch 模型啟動分散式訓練。請注意,這些指示可用於單一節點多重 GPU 和多節點多重 GPU。

  5. 適用於 PyTorch 版本 1.11.0 及更新版本

    若要使用訓練編譯器執行分散式 SageMaker 訓練,您必須在訓練指令碼中新增下列_mp_fn()函數,並封裝main()函數。它會將_mp_fn(index)函數呼叫從 SageMaker 分散式執行階段 for PyTorch (pytorchxla) 重新導向至訓練指令碼的main()函數。

    def _mp_fn(index): main()

    此函式會接受 index 引數,以指出叢集中目前 GPU 的等級,藉此進行分散式訓練。若要尋找更多範例指令碼,請參閱 Hugging Face 轉換器語言模型範例指令碼

    對於版本 4.17 和之前版本 1.10.2 和之前的 PyTorch變形金剛

    SageMaker 訓練編譯器使用替代機制來啟動分散式訓練工作,並要求您將 SageMaker 分散式訓練啟動器指令碼傳遞至entry_point引數,並將訓練指令碼傳遞至 SageMaker Hugging Face 估算器中的hyperparameters引數。

完成訓練指令碼的調整後,請繼續前往使用 PyTorch 訓練編譯器執行 SageMaker 訓練工作

搭配 PyTorch /XLA 使用 SageMaker 訓練編譯器的最佳作法

如果您想要在原生 SageMaker 訓練指令碼上運用 PyTorch 訓練編譯器,您可能需要先熟悉 PyTorch XLA 裝置。下列各節列出啟用 XLA 的一些最佳作法。 PyTorch

注意

本節的最佳做法假設您使用下列 PyTorch /XLA 模組:

import torch_xla.core.xla_model as xm import torch_xla.distributed.parallel_loader as pl
了解 PyTorch /XLA 中的延遲模式

PyTorch/XLA 和原生之間的一個顯著差異在 PyTorch 於 PyTorch /XLA 系統以懶惰模式運行,而本機在急切模式下 PyTorch 運行。寬鬆模式中的張量會用來建置運算圖的預留位置,直到編譯和評估完成後其具體化為止。當您呼叫 PyTorch API 以使用張量和運算子建置運算時, PyTorch/XLA 系統會即時建置運算圖形。當 pl.MpDeviceLoader/pl.ParallelLoader 明確或隱含地呼叫 xm.mark_step(),或者當您明確請求張量值 (例如透過呼叫 loss.item()print(loss)) 時,運算圖會進行編譯並執行。

最大限度地減少compilation-and-executions使用pl.MpDeviceLoader/pl.ParallelLoaderxm.step_closure

為了獲得最佳性能,您應該記住可能的啟動方式,compilation-and-executions如中所述,了解 PyTorch /XLA 中的延遲模式並應盡量減少數量 compilation-and-executions。理想情況下,每 compilation-and-execution 個訓練版序只需要一個,而且由自動啟動pl.MpDeviceLoader/pl.ParallelLoaderMpDeviceLoader 已針對 XLA 進行最佳化,若可能的話,應時時使用以獲得最佳效能。在訓練期間,您可能需要檢查一些中繼結果,例如損失值。在這種情況下,應使用xm.add_step_closure()包裝懶惰張量的打印以避免不必要 compilation-and-executions的。

使用 AMP 和 syncfree 最佳化工具

在自動混合精準度 (AMP) 模式下進行訓練,運用 NVIDIA GPU 的 Tensor 核心,大幅加快您的訓練速度。 SageMaker 訓練編譯器提供syncfree針對 XLA 進行最佳化,以提高 AMP 效能的最佳化工具。目前,以下三個 syncfree 最佳化工具可以使用,如果可能的話,應使用這些工具以獲得最佳效能。

torch_xla.amp.syncfree.SGD torch_xla.amp.syncfree.Adam torch_xla.amp.syncfree.AdamW

這些 syncfree 最佳化工具應與漸層擴展/取消擴展搭配 torch_xla.amp.GradScaler 使用。

提示

從 PyTorch 1.13.1 開始, SageMaker 訓練編譯器可讓 PyTorch /XLA 自動覆寫最佳化程式 (例如 SGD、Adam、AdamW) torch.optimtransformers.optimization其中的無同步版本 (例如、、),藉此改善效能。torch_xla.amp.syncfree torch_xla.amp.syncfree.SGD torch_xla.amp.syncfree.Adam torch_xla.amp.syncfree.AdamW您不需要變更您在訓練指令碼中定義最佳化工具的程式碼行。