

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

# SageMaker 訓練任務預先訓練教學課程 (GPU)
<a name="sagemaker-hyperpod-gpu-sagemaker-training-jobs-pretrain-tutorial"></a>

本教學課程會逐步引導您使用 SageMaker 訓練任務搭配 GPU 執行個體，來設定和執行預先訓練任務。
+ 設定您的環境
+ 使用 SageMaker HyperPod 配方啟動訓練任務

在開始前，請確定您具有以下先決條件。

**先決條件**  
開始設定環境之前，請確定您具有下列先決條件：  
Amazon FSx 檔案系統或 Amazon S3 儲存貯體，您可以在其中載入資料並輸出訓練成品。
在 Amazon SageMaker AI 上請求了 1x ml.p4d.24xlarge 和 1x ml.p5.48xlarge 的服務配額。若要請求增加服務配額，請執行下列動作：  
在 AWS Service Quotas 主控台上，導覽至 AWS 服務、
選擇 **Amazon SageMaker AI**。
選擇一個 ml.p4d.24xlarge 和一個 ml.p5.48xlarge 執行個體。
使用下列受管政策建立 AWS Identity and Access Management(IAM) 角色，以授予 SageMaker AI 執行範例的許可。  
AmazonSageMakerFullAccess
AmazonEC2FullAccess
採用下列其中一種格式的資料：  
JSON
JSONGZ (壓縮 JSON)
ARROW
(選用) 如果您要使用來自 HuggingFace 的模型權重進行預先訓練或微調，則必須取得 HuggingFace 權杖。如需取得權杖的詳細資訊，請參閱[使用者存取權杖](https://huggingface.co/docs/hub/en/security-tokens)。

## GPU SageMaker 訓練任務環境設定
<a name="sagemaker-hyperpod-gpu-sagemaker-training-jobs-environment-setup"></a>

執行 SageMaker 訓練任務之前，請先執行 `aws configure`命令來設定您的 AWS 登入資料和偏好的區域。除了 configure 命令之外，您也可以透過 `AWS_ACCESS_KEY_ID`、`AWS_SECRET_ACCESS_KEY` 和 `AWS_SESSION_TOKEN.` 等環境變數提供憑證。如需詳細資訊，請參閱 [SageMaker AI Python SDK](https://github.com/aws/sagemaker-python-sdk)。

我們強烈建議在 SageMaker AI JupyterLab 中使用 SageMaker AI Jupyter 筆記本，來啟動 SageMaker 訓練任務。如需詳細資訊，請參閱[SageMaker JupyterLab](studio-updated-jl.md)。
+ (選用) 設定虛擬環境和相依性。如果您是在 Amazon SageMaker Studio 中使用 Jupyter 筆記本，您可以略過此步驟。請確定您使用的是 Python 3.9 或更新版本。

  ```
  # set up a virtual environment
  python3 -m venv ${PWD}/venv
  source venv/bin/activate
  # install dependencies after git clone.
  
  git clone --recursive git@github.com:aws/sagemaker-hyperpod-recipes.git
  cd sagemaker-hyperpod-recipes
  pip3 install -r requirements.txt
  # Set the aws region.
  
  aws configure set <your_region>
  ```
+ 安裝 SageMaker AI Python SDK

  ```
  pip3 install --upgrade sagemaker
  ```
+ `Container`：GPU 容器是由 SageMaker AI Python SDK 自動設定的。您也可以提供自己的容器。
**注意**  
如果您正在執行 Llama 3.2 多模態訓練任務，則 `transformers` 版本必須為 `4.45.2 ` 或更新版本。

  只有在您使用 SageMaker AI Python SDK 時，才會在 `source_dir` 中將 `transformers==4.45.2` 附加至 `requirements.txt`。例如，如果您要在 SageMaker AI JupyterLab 的筆記本中使用它，請附加它。

  如果您使用要使用叢集類型 `sm_jobs` 啟動的 HyperPod 配方，這將會自動完成。

## 使用 Jupyter 筆記本啟動訓練任務
<a name="sagemaker-hyperpod-gpu-sagemaker-training-jobs-launch-training-job-notebook"></a>

您可以使用下列 Python 程式碼，搭配您的配方執行 SageMaker 訓練任務。它利用來自 [SageMaker AI Python SDK](https://sagemaker.readthedocs.io/en/stable/) 的 PyTorch 估算器來提交配方。下列範例會在 SageMaker AI 訓練平台上啟動 llama3-8b 配方。

```
import os
import sagemaker,boto3
from sagemaker.debugger import TensorBoardOutputConfig

from sagemaker.pytorch import PyTorch

sagemaker_session = sagemaker.Session()
role = sagemaker.get_execution_role()

bucket = sagemaker_session.default_bucket() 
output = os.path.join(f"s3://{bucket}", "output")
output_path = "<s3-URI>"

overrides = {
    "run": {
        "results_dir": "/opt/ml/model",
    },
    "exp_manager": {
        "exp_dir": "",
        "explicit_log_dir": "/opt/ml/output/tensorboard",
        "checkpoint_dir": "/opt/ml/checkpoints",
    },   
    "model": {
        "data": {
            "train_dir": "/opt/ml/input/data/train",
            "val_dir": "/opt/ml/input/data/val",
        },
    },
}

tensorboard_output_config = TensorBoardOutputConfig(
    s3_output_path=os.path.join(output, 'tensorboard'),
    container_local_output_path=overrides["exp_manager"]["explicit_log_dir"]
)

estimator = PyTorch(
    output_path=output_path,
    base_job_name=f"llama-recipe",
    role=role,
    instance_type="ml.p5.48xlarge",
    training_recipe="training/llama/hf_llama3_8b_seq8k_gpu_p5x16_pretrain",
    recipe_overrides=recipe_overrides,
    sagemaker_session=sagemaker_session,
    tensorboard_output_config=tensorboard_output_config,
)

estimator.fit(inputs={"train": "s3 or fsx input", "val": "s3 or fsx input"}, wait=True)
```

上述程式碼會使用訓練配方建立 PyTorch 估算器物件，然後使用 `fit()` 方法符合模型。使用 training\$1recipe 參數來指定您要用於訓練的配方。

**注意**  
如果您正在執行 Llama 3.2 多模態訓練任務，則 transformers 版本必須為 4.45.2 或更新版本。

只有在您直接使用 SageMaker AI Python SDK 時，才會在 `source_dir` 中將 `transformers==4.45.2` 附加至 `requirements.txt`。例如，當您使用 Jupyter 筆記本時，必須將版本附加至文字檔案。

部署 SageMaker 訓練任務的端點時，您必須指定正在使用的映像 URI。如果未提供映像 URI，估算器會使用訓練映像做為用於部署的映像。SageMaker HyperPod 提供的訓練映像不包含推論和部署所需的相依性。以下是如何使用推論映像進行部署的範例：

```
from sagemaker import image_uris
container=image_uris.retrieve(framework='pytorch',region='us-west-2',version='2.0',py_version='py310',image_scope='inference', instance_type='ml.p4d.24xlarge')
predictor = estimator.deploy(initial_instance_count=1,instance_type='ml.p4d.24xlarge',image_uri=container)
```

**注意**  
在 Sagemaker 筆記本執行個體上執行上述程式碼可能需要超過 SageMaker AI JupyterLab 提供的預設 5GB 儲存空間。如果您遇到空間無法使用的問題，請建立新的筆記本執行個體，您可以在其中使用不同的筆記本執行個體，並增加筆記本的儲存空間。

## 使用配方啟動器啟動訓練任務
<a name="sagemaker-hyperpod-gpu-sagemaker-training-jobs-launch-training-job-recipes"></a>

更新 `./recipes_collection/cluster/sm_jobs.yaml` 檔案以看起來如下所示：

```
sm_jobs_config:
  output_path: <s3_output_path>
  tensorboard_config:
    output_path: <s3_output_path>
    container_logs_path: /opt/ml/output/tensorboard  # Path to logs on the container
  wait: True  # Whether to wait for training job to finish
  inputs:  # Inputs to call fit with. Set either s3 or file_system, not both.
    s3:  # Dictionary of channel names and s3 URIs. For GPUs, use channels for train and validation.
      train: <s3_train_data_path>
      val: null
  additional_estimator_kwargs:  # All other additional args to pass to estimator. Must be int, float or string.
    max_run: 180000
    enable_remote_debug: True
  recipe_overrides:
    exp_manager:
      explicit_log_dir: /opt/ml/output/tensorboard
    data:
      train_dir: /opt/ml/input/data/train
    model:
      model_config: /opt/ml/input/data/train/config.json
    compiler_cache_url: "<compiler_cache_url>"
```

更新 `./recipes_collection/config.yaml` 以在 `cluster` 和 `cluster_type` 中指定 `sm_jobs`。

```
defaults:
  - _self_
  - cluster: sm_jobs  # set to `slurm`, `k8s` or `sm_jobs`, depending on the desired cluster
  - recipes: training/llama/hf_llama3_8b_seq8k_trn1x4_pretrain
cluster_type: sm_jobs  # bcm, bcp, k8s or sm_jobs. If bcm, k8s or sm_jobs, it must match - cluster above.
```

使用以下命令啟動任務。

```
python3 main.py --config-path recipes_collection --config-name config
```

如需設定 SageMaker 訓練任務的詳細資訊，請參閱「在 SageMaker 訓練任務上執行訓練任務」。