在 AWS 上部署的文件
在 Amazon SageMaker 上執行訓練
並獲得增強的文件體驗
開始使用
在 Amazon SageMaker 上執行訓練
本指南將向您展示如何使用 HuggingFace
SageMaker Python SDK 訓練 🤗 Transformers 模型。您將學習如何
- 安裝和設定您的訓練環境.
- 準備一個訓練指令碼.
- 建立一個 Hugging Face 評估器 (Estimator).
- 使用
fit
方法執行訓練. - 訪問您訓練好的模型.
- 執行分散式訓練.
- 建立一個 Spot 例項.
- 從 GitHub 倉庫載入訓練指令碼.
- 收集訓練指標.
安裝與設定
在使用 SageMaker 訓練 🤗 Transformers 模型之前,您需要註冊一個 AWS 賬戶。如果您還沒有 AWS 賬戶,請在此處瞭解更多資訊。
擁有 AWS 賬戶後,請使用以下方法之一開始使用
要在本地開始訓練,您需要設定適當的 IAM 角色。
升級到最新的 sagemaker
版本
pip install sagemaker --upgrade
SageMaker 環境
按如下所示設定您的 SageMaker 環境
import sagemaker
sess = sagemaker.Session()
role = sagemaker.get_execution_role()
注意:執行角色僅在 SageMaker 中執行筆記本時可用。如果您在非 SageMaker 的筆記本中執行 get_execution_role
,則會遇到 region
錯誤。
本地環境
按如下所示設定您的本地環境
import sagemaker
import boto3
iam_client = boto3.client('iam')
role = iam_client.get_role(RoleName='role-name-of-your-iam-role-with-right-permissions')['Role']['Arn']
sess = sagemaker.Session()
準備一個 🤗 Transformers 微調指令碼
我們的訓練指令碼與您可能在 SageMaker 之外執行的訓練指令碼非常相似。但是,您可以透過各種環境變數訪問有關訓練環境的有用屬性(完整列表請參閱此處),例如:
SM_MODEL_DIR
:一個字串,表示訓練作業寫入模型構件 (artifacts) 的路徑。訓練結束後,此目錄中的構件會被上傳到 S3 以用於模型託管。SM_MODEL_DIR
總是設定為/opt/ml/model
。SM_NUM_GPUS
:一個整數,表示主機可用的 GPU 數量。SM_CHANNEL_XXXX
:一個字串,表示包含指定通道輸入資料的目錄路徑。例如,當您在 Hugging Face 評估器的fit
方法中指定train
和test
時,環境變數會設定為SM_CHANNEL_TRAIN
和SM_CHANNEL_TEST
。
在 Hugging Face Estimator 中定義的 hyperparameters
會作為命名引數傳遞並由 ArgumentParser()
處理。
import transformers
import datasets
import argparse
import os
if __name__ == "__main__":
parser = argparse.ArgumentParser()
# hyperparameters sent by the client are passed as command-line arguments to the script
parser.add_argument("--epochs", type=int, default=3)
parser.add_argument("--per_device_train_batch_size", type=int, default=32)
parser.add_argument("--model_name_or_path", type=str)
# data, model, and output directories
parser.add_argument("--model-dir", type=str, default=os.environ["SM_MODEL_DIR"])
parser.add_argument("--training_dir", type=str, default=os.environ["SM_CHANNEL_TRAIN"])
parser.add_argument("--test_dir", type=str, default=os.environ["SM_CHANNEL_TEST"])
請注意,SageMaker 不支援 argparse 操作 (actions)。例如,如果您想使用布林型超引數,請在指令碼中將 type
指定為 bool
,並提供明確的 True
或 False
值。
請檢視 train.py 檔案,以獲取 🤗 Transformers 訓練指令碼的完整示例。
訓練輸出管理
如果 TrainingArguments
中的 output_dir
設定為 `/opt/ml/model`,Trainer 會儲存所有訓練構件,包括日誌、檢查點和模型。Amazon SageMaker 會將整個 `/opt/ml/model` 目錄打包為 `model.tar.gz`,並在訓練作業結束時上傳到 Amazon S3。根據您的超引數和 `TrainingArguments`,這可能導致一個很大的構件(> 5GB),這會減慢 Amazon SageMaker 推理的部署速度。您可以透過自定義 TrainingArguments 來控制檢查點、日誌和構件的儲存方式。例如,透過提供 `save_total_limit` 作為 `TrainingArgument`,您可以控制檢查點的總數限制。如果儲存了新的檢查點並且達到了最大限制,則會刪除 `output_dir` 中較舊的檢查點。
除了上述提到的選項外,還有另一種在訓練期間儲存訓練構件的選項。Amazon SageMaker 支援檢查點功能 (Checkpointing),它允許您在訓練期間將構件持續儲存到 Amazon S3,而不是在訓練結束時儲存。要啟用檢查點功能,您需要在 `HuggingFace` 評估器中提供指向 Amazon S3 位置的 `checkpoint_s3_uri` 引數,並將 `output_dir` 設定為 `/opt/ml/checkpoints`。注意:如果您將 `output_dir` 設定為 `/opt/ml/checkpoints`,請確保在訓練結束時呼叫 `trainer.save_model("/opt/ml/model")` 或 model.save_pretrained(“/opt/ml/model”)/`tokenizer.save_pretrained("/opt/ml/model")`,以便能夠無縫地將模型部署到 Amazon SageMaker 進行推理。
建立一個 Hugging Face 評估器
透過建立一個 Hugging Face 評估器 (Estimator),在 SageMaker 上執行 🤗 Transformers 訓練指令碼。評估器處理端到端的 SageMaker 訓練。您應該在評估器中定義幾個引數:
entry_point
指定使用哪個微調指令碼。instance_type
指定要啟動的 Amazon 例項。請參閱此處獲取例項型別的完整列表。hyperparameters
指定訓練超引數。在 train.py 檔案中檢視更多可用的超引數。
以下程式碼示例展示瞭如何使用自定義指令碼 train.py
和三個超引數(epochs
、per_device_train_batch_size
和 model_name_or_path
)進行訓練:
from sagemaker.huggingface import HuggingFace
# hyperparameters which are passed to the training job
hyperparameters={'epochs': 1,
'per_device_train_batch_size': 32,
'model_name_or_path': 'distilbert-base-uncased'
}
# create the Estimator
huggingface_estimator = HuggingFace(
entry_point='train.py',
source_dir='./scripts',
instance_type='ml.p3.2xlarge',
instance_count=1,
role=role,
transformers_version='4.26',
pytorch_version='1.13',
py_version='py39',
hyperparameters = hyperparameters
)
如果您在本地執行 TrainingJob
,請定義 instance_type='local'
或 instance_type='local_gpu'
以使用 GPU。請注意,這在 SageMaker Studio 中將無法工作。
執行訓練
透過在 Hugging Face 評估器上呼叫 fit
來啟動您的 TrainingJob
。在 fit
中指定您的輸入訓練資料。輸入訓練資料可以是:
- S3 URI,例如
s3://my-bucket/my-training-data
。 - 用於 Amazon Elastic File System 或 FSx for Lustre 的
FileSystemInput
。有關使用這些檔案系統作為輸入的更多詳細資訊,請參閱此處。
呼叫 fit
開始訓練:
huggingface_estimator.fit(
{'train': 's3://sagemaker-us-east-1-558105141721/samples/datasets/imdb/train',
'test': 's3://sagemaker-us-east-1-558105141721/samples/datasets/imdb/test'}
)
SageMaker 會啟動並管理所有必需的 EC2 例項,並透過執行以下命令來啟動 TrainingJob
:
/opt/conda/bin/python train.py --epochs 1 --model_name_or_path distilbert-base-uncased --per_device_train_batch_size 32
訪問訓練好的模型
訓練完成後,您可以透過 AWS 控制檯訪問您的模型,或直接從 S3 下載。
from sagemaker.s3 import S3Downloader
S3Downloader.download(
s3_uri=huggingface_estimator.model_data, # S3 URI where the trained model is located
local_path='.', # local path where *.targ.gz is saved
sagemaker_session=sess # SageMaker session used for training the model
)
分散式訓練
SageMaker 提供兩種分散式訓練策略:資料並行 (data parallelism) 和模型並行 (model parallelism)。資料並行將一個訓練集分割到多個 GPU 上,而模型並行將一個模型分割到多個 GPU 上。
資料並行
Hugging Face Trainer 支援 SageMaker 的資料並行庫。如果您的訓練指令碼使用 Trainer API,您只需在 Hugging Face 評估器中定義 `distribution` 引數即可:
# configuration for running training on smdistributed data parallel
distribution = {'smdistributed':{'dataparallel':{ 'enabled': True }}}
# create the Estimator
huggingface_estimator = HuggingFace(
entry_point='train.py',
source_dir='./scripts',
instance_type='ml.p3dn.24xlarge',
instance_count=2,
role=role,
transformers_version='4.26.0',
pytorch_version='1.13.1',
py_version='py39',
hyperparameters = hyperparameters,
distribution = distribution
)
📓 開啟 sagemaker-notebook.ipynb 筆記本,檢視如何使用 TensorFlow 執行資料並行庫的示例。
模型並行
Hugging Face [Trainer] 也支援 SageMaker 的模型並行庫。如果您的訓練指令碼使用 Trainer API,您只需在 Hugging Face 評估器中定義 `distribution` 引數即可(有關使用模型並行的更詳細資訊,請參閱此處):
# configuration for running training on smdistributed model parallel
mpi_options = {
"enabled" : True,
"processes_per_host" : 8
}
smp_options = {
"enabled":True,
"parameters": {
"microbatches": 4,
"placement_strategy": "spread",
"pipeline": "interleaved",
"optimize": "speed",
"partitions": 4,
"ddp": True,
}
}
distribution={
"smdistributed": {"modelparallel": smp_options},
"mpi": mpi_options
}
# create the Estimator
huggingface_estimator = HuggingFace(
entry_point='train.py',
source_dir='./scripts',
instance_type='ml.p3dn.24xlarge',
instance_count=2,
role=role,
transformers_version='4.26.0',
pytorch_version='1.13.1',
py_version='py39',
hyperparameters = hyperparameters,
distribution = distribution
)
📓 開啟 sagemaker-notebook.ipynb 筆記本,檢視如何執行模型並行庫的示例。
Spot 例項
用於 SageMaker Python SDK 的 Hugging Face 擴充套件意味著我們可以從完全託管的 EC2 Spot 例項中受益。這可以幫助您節省高達 90% 的訓練成本!
注意:除非您的訓練作業能很快完成,否則我們建議您在託管的 Spot 訓練中使用檢查點功能。在這種情況下,您需要定義 checkpoint_s3_uri
。
在評估器中設定 use_spot_instances=True
並定義您的 max_wait
和 max_run
時間以使用 Spot 例項:
# hyperparameters which are passed to the training job
hyperparameters={'epochs': 1,
'train_batch_size': 32,
'model_name':'distilbert-base-uncased',
'output_dir':'/opt/ml/checkpoints'
}
# create the Estimator
huggingface_estimator = HuggingFace(
entry_point='train.py',
source_dir='./scripts',
instance_type='ml.p3.2xlarge',
instance_count=1,
checkpoint_s3_uri=f's3://{sess.default_bucket()}/checkpoints'
use_spot_instances=True,
# max_wait should be equal to or greater than max_run in seconds
max_wait=3600,
max_run=1000,
role=role,
transformers_version='4.26',
pytorch_version='1.13',
py_version='py39',
hyperparameters = hyperparameters
)
# Training seconds: 874
# Billable seconds: 262
# Managed Spot Training savings: 70.0%
📓 開啟 sagemaker-notebook.ipynb 筆記本,檢視如何使用 Spot 例項的示例。
Git 倉庫
Hugging Face 評估器可以載入儲存在 GitHub 倉庫中的訓練指令碼。在 entry_point
中提供訓練指令碼的相對路徑,在 source_dir
中提供目錄的相對路徑。
如果您正在使用 git_config
執行🤗 Transformers 示例指令碼,您需要在 transformers_version
中配置正確的 'branch'
(例如,如果您使用 transformers_version='4.4.2
,則必須使用 'branch':'v4.4.2'
)。
提示:透過在訓練指令碼的超引數中設定 output_dir=/opt/ml/model
,將您的模型儲存到 S3。
# configure git settings
git_config = {'repo': 'https://github.com/huggingface/transformers.git','branch': 'v4.4.2'} # v4.4.2 refers to the transformers_version you use in the estimator
# create the Estimator
huggingface_estimator = HuggingFace(
entry_point='run_glue.py',
source_dir='./examples/pytorch/text-classification',
git_config=git_config,
instance_type='ml.p3.2xlarge',
instance_count=1,
role=role,
transformers_version='4.26',
pytorch_version='1.13',
py_version='py39',
hyperparameters=hyperparameters
)
SageMaker 指標
SageMaker 指標會自動解析訓練作業日誌中的指標,並將它們傳送到 CloudWatch。如果您希望 SageMaker 解析日誌,您必須指定指標的名稱和 SageMaker 用來查詢該指標的正則表示式。
# define metrics definitions
metric_definitions = [
{"Name": "train_runtime", "Regex": "train_runtime.*=\D*(.*?)$"},
{"Name": "eval_accuracy", "Regex": "eval_accuracy.*=\D*(.*?)$"},
{"Name": "eval_loss", "Regex": "eval_loss.*=\D*(.*?)$"},
]
# create the Estimator
huggingface_estimator = HuggingFace(
entry_point='train.py',
source_dir='./scripts',
instance_type='ml.p3.2xlarge',
instance_count=1,
role=role,
transformers_version='4.26',
pytorch_version='1.13',
py_version='py39',
metric_definitions=metric_definitions,
hyperparameters = hyperparameters)
📓 開啟筆記本,檢視如何在 SageMaker 中捕獲指標的示例。
< > 在 GitHub 上更新