在 AWS 上部署的文件

在 Amazon SageMaker 上執行訓練

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

在 Amazon SageMaker 上執行訓練

本指南將向您展示如何使用 HuggingFace SageMaker Python SDK 訓練 🤗 Transformers 模型。您將學習如何

安裝與設定

在使用 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 方法中指定 traintest 時,環境變數會設定為 SM_CHANNEL_TRAINSM_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,並提供明確的 TrueFalse 值。

請檢視 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 訓練。您應該在評估器中定義幾個引數:

  1. entry_point 指定使用哪個微調指令碼。
  2. instance_type 指定要啟動的 Amazon 例項。請參閱此處獲取例項型別的完整列表。
  3. hyperparameters 指定訓練超引數。在 train.py 檔案中檢視更多可用的超引數。

以下程式碼示例展示瞭如何使用自定義指令碼 train.py 和三個超引數(epochsper_device_train_batch_sizemodel_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_waitmax_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 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.