本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
PyTorch
將您自己的 PyTorch 模型帶入 SageMaker,並使用訓練編譯器執行 SageMaker 訓練工作。
PyTorch 具有 Hugging Face 變壓器的型號
PyTorch 具有 Hugging Face 變壓器PyTorch
HuggingFace
或估算器與訓練編譯器組態來啟動 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
-
確保您通過在設置變壓 SyncFree 器
adamw_torch_xla
時將optim
參數設置為來使用優化器。 TrainingArgument。另請參閱 Hugging Face 轉換器文件中的最佳化工具 。 -
確保資料處理管道的輸送量高於訓練輸送量。您可以調整變壓器的
dataloader_num_workers
和preprocessing_num_workers
參數。 TrainingArgument類來實現這一目標。通常,這些數量需要大於或等於 GPU 數量,但小於 CPU 數量。
完成訓練指令碼的調整後,請繼續前往使用 PyTorch 訓練編譯器執行 SageMaker 訓練工作。
PyTorch 直接使用的大型語言模型(無需 Hugging Face 變形金剛訓練器 API)
如果您有 PyTorch 直接使用的訓練指令碼,則需要對 PyTorch 訓練指令碼進行其他變更以實作 PyTorch /XLA。依照指示修改您的指令碼,以正確設定 PyTorch /XLA 主要動物。
適用於單一 GPU 訓練
-
匯入最佳化程式庫。
import torch_xla import torch_xla.core.xla_model as xm
-
將目標裝置變更為 XLA 而非
torch.device("cuda")
device=xm.xla_device()
-
如果您使用 PyTorch的是「自動混合精確度
」(AMP),請執行下列動作: -
將
torch.cuda.amp
換成下列項目:import torch_xla.amp
-
將
torch.optim.SGD
和torch.optim.Adam
取代為下列項目:import torch_xla.amp.syncfree.Adam as adam import torch_xla.amp.syncfree.SGD as SGD
-
將
torch.cuda.amp.GradScaler
換成下列項目:import torch_xla.amp.GradScaler as grad_scaler
-
-
如果沒有使用 AMP,則請將
optimizer.step()
取代為下列項目:xm.optimizer_step(optimizer)
-
如果您使用的是分佈式數據記錄器,請將數據記錄器包裝在 /XLA 的類中 PyTorch:
ParallelLoader
import torch_xla.distributed.parallel_loader as pl parallel_loader=pl.ParallelLoader(dataloader, [device]).per_device_loader(device)
-
若不使用
parallel_loader
時,請在訓練迴路的結尾新增mark_step
:xm.mark_step()
-
若要檢查訓練,請使用 PyTorch /XLA 的模型檢查點方法:
xm.save(model.state_dict(), path_to_save)
完成訓練指令碼的調整後,請繼續前往使用 PyTorch 訓練編譯器執行 SageMaker 訓練工作。
適用於分散式訓練
除了上個 適用於單一 GPU 訓練 章節所列的變更內容之外,請新增下列變更項目,以便在 GPU 之間妥善分配工作負載。
-
如果您使用了 AMP,請在
scaler.scale(loss).backward()
之後新增all_reduce
:gradients=xm._fetch_gradients(optimizer) xm.all_reduce('sum', gradients, scale=1.0/xm.xrt_world_size())
-
如需為
local_ranks
和world_size
設定變數,請使用與下列類似的程式碼:local_rank=xm.get_local_ordinal() world_size=xm.xrt_world_size()
-
對於任何大於
1
的world_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 )
-
進行下列變更,以確保您使用
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。
-
適用於 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 裝置
注意
本節的最佳做法假設您使用下列 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.ParallelLoader
和 xm.step_closure
為了獲得最佳性能,您應該記住可能的啟動方式,compilation-and-executions如中所述,了解 PyTorch /XLA 中的延遲模式並應盡量減少數量 compilation-and-executions。理想情況下,每 compilation-and-execution 個訓練版序只需要一個,而且由自動啟動pl.MpDeviceLoader/pl.ParallelLoader
。MpDeviceLoader
已針對 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.optim
或transformers.optimization
其中的無同步版本 (例如、、),藉此改善效能。torch_xla.amp.syncfree
torch_xla.amp.syncfree.SGD
torch_xla.amp.syncfree.Adam
torch_xla.amp.syncfree.AdamW
您不需要變更您在訓練指令碼中定義最佳化工具的程式碼行。