

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

# Amazon Nova 蒸餾
<a name="nova-distillation"></a>

此快速入門指南可協助您在 SageMaker AI 上使用監督式微調 (SFT) 來開始使用 Amazon Nova 模型蒸餾。

模型分割是一種 SageMaker AI 方法，可將知識從大型進階模型傳輸到較小且高效率的模型。使用 Amazon Nova 模型時，較大的「教師」模型 （例如 Amazon Nova Pro 或 ) 會將其功能傳遞給較小的「學生」模型 （例如 Amazon Nova Lite 或 Amazon Nova Micro)。這會建立一個能維持高效能同時使用較少資源的自訂模型。

## 關鍵元件
<a name="nova-distillation-training-job-components"></a>

蒸餾程序主要涉及兩種類型的模型：

**教師模型**做為知識來源，包含：
+ Amazon Nova Pro (amazon.nova-pro-v1:0)
+  (amazon.nova-premier-v1：0)

**學生模型**會接收並實作知識：
+ Amazon Nova Lite (amazon.nova-lite-v1:0:300k)
+ Amazon Nova Micro (amazon.nova-micro-v1:0:128k)
+ Amazon Nova Pro (amazon.nova-pro-v1：0：300k) - 僅在以教師身分使用 時可用

## 使用案例
<a name="nova-distillation-training-job-use-case"></a>

在下列情況下，模式蒸餾特別有益：
+ 您的應用程式具有嚴格的延遲、成本和正確性需求。
+ 您需要特定任務的自訂模型，但缺少足夠的高品質標記訓練資料。
+ 您想要符合進階模型的效能，同時保持較小模型的效率。

## 先決條件
<a name="nova-distillation-training-job-prerequisites"></a>
+ AWS 帳戶 可存取 Amazon Nova 模型和適當的服務配額 （最低 6 個 P5 和 1 個 R5 執行個體）。
+ 具有 SageMaker 訓練任務許可的 IAM 角色。
+ 用來儲存訓練資料和輸出的 Amazon S3 儲存貯體。

## 設定資料增強
<a name="nova-distillation-training-job-data-augment"></a>

資料擴增階段使用 SageMaker Training Jobs 來產生使用教師模型的高品質訓練資料。本節詳細說明設定程序和需求。

### IAM 角色
<a name="nova-distillation-training-job-data-augment-iam"></a>

若要建立 IAM 角色和連接政策，請參閱[建立角色和連接政策 (主控台)](https://docs.aws.amazon.com//IAM/latest/UserGuide/access_policies_job-functions_create-policies.html)。如果您使用 AWS CLI，請依照 [create-role](https://docs.aws.amazon.com//cli/latest/reference/iam/create-role.html) 和 [attach-role-policy](https://docs.aws.amazon.com//cli/latest/reference/iam/attach-role-policy.html) 中的指示。如需詳細資訊，請參閱《SageMaker AI 開發人員指南》**中的[如何使用 SageMaker AI 執行角色](https://docs.aws.amazon.com//sagemaker/latest/dg/sagemaker-roles.html)。

以下的範例命令供您參考。

**建立一個 SageMaker AI 執行角色**

此角色是透過信任關係建立的，允許 SageMaker AI、Amazon Bedrock 擔任此角色 這讓這些服務在執行批次推論任務時代表您執行。

```
aws iam create-role \
 --role-name NovaCustomizationRole \
 --assume-role-policy-document '{
 "Version": "2012-10-17",		 	 	 
 "Statement": [
 {
 "Effect": "Allow",
 "Principal": {
 "Service": ["sagemaker.amazonaws.com",
            "bedrock.amazonaws.com"]
 },
 "Action": "sts:AssumeRole"
 }
 ]
}'
```

**連接必要的政策**

```
# Attach AmazonSageMakerFullAccess
 aws iam attach-role-policy \
 --role-name NovaCustomizationRole \
 --policy-arn arn:aws:iam::aws:policy/AmazonSageMakerFullAccess

# Attach AmazonBedrockFullAccess
 aws iam attach-role-policy \
 --role-name NovaCustomizationRole \
 --policy-arn arn:aws:iam::aws:policy/AmazonBedrockFullAccess

 # Attach S3 access policy
 aws iam attach-role-policy \
 --role-name NovaCustomizationRole \
 --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess
 
# Attach AmazonEC2FullAccess
 aws iam attach-role-policy \
 --role-name NovaCustomizationRole \
 --policy-arn arn:aws:iam::aws:policy/AmazonEC2FullAccess
 
# Attach AmazonEC2ContainerRegistryFullAccess
 aws iam attach-role-policy \
 --role-name NovaCustomizationRole \
 --policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryFullAccess
 
# Attach AmazonEC2ContainerRegistryFullAccess
 aws iam attach-role-policy \
 --role-name NovaCustomizationRole \
 --policy-arn arn:aws:iam::aws:policy/CloudWatchLogsFullAccess
```

將下列內嵌政策連接至蒸餾容器所需的客戶執行角色。
+ AWS KMS 許可：允許角色與 AWS Key Management Service 互動，這是存取加密資源或管理加密金鑰的必要條件。
+ `IAM:PassRole`：當一個服務需要將此角色傳遞給另一個服務時，通常需要此許可，這是 AWS 服務整合中的常見模式。

```
aws iam put-role-policy \
 --role-name NovaCustomizationRole \
 --policy-name Distillation-Additional-Permissions\
 --policy-document '{
 "Version": "2012-10-17",		 	 	 
 "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kms:*"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:PassRole"
            ],
            "Resource": "*"
        }
    ]
}
```

### Amazon VPC 組態
<a name="nova-distillation-training-job-data-augment-vpc"></a>

若要使用 為 SageMaker 訓練任務建立 Amazon VPC 組態 AWS 管理主控台，請遵循[設定 SageMaker AI 訓練的私有 VPC （主控台）](https://docs.aws.amazon.com//sagemaker/latest/dg/train-vpc.html) 中的指示。

**建立新的 Amazon VPC**

```
Name: Distillation-VPC
IPv4 CIDR: 10.0.0.0/16 (or your preferred range)
Availability Zones: 2
Public Subnets: 2
Private Subnets: 2
NAT Gateways: 1 (in one AZ)
```

**建立安全群組**

```
Name: Distillation-SG
Description: Security group for data distillation jobs
Inbound Rules: Allow all traffic from self
Outbound Rules: Allow all traffic (0.0.0.0/0)
```

**針對下列服務建立 VPC 端點**

```
com.amazonaws.[region].s3
com.amazonaws.[region].sagemaker.api
com.amazonaws.[region].sagemaker.runtime
com.amazonaws.[region].bedrock.api
com.amazonaws.[region].bedrock.runtime
com.amazonaws.[region].sts
com.amazonaws.[region].logs
com.amazonaws.[region].ecr.api
com.amazonaws.[region].ecr.dkr
```

對於每個端點:
+ 選取您的 Distillation-VPC
+ 選擇私有子網路
+ 選取 Distillation-SG 安全群組

### AWS KMS 金鑰
<a name="nova-distillation-training-job-data-augment-kms"></a>

使用 Amazon Bedrock 批次推論時，資料安全和合規需要 AWS KMS 金鑰。Amazon Bedrock 批次推論任務需要使用 AWS KMS 金鑰加密 Amazon S3 儲存貯體的輸入和輸出，以確保靜態資料保護。

使用此命令 AWS CLI 搭配 建立 KMS 金鑰：

```
# Create KMS key
aws kms create-key \
  --description "KMS key for Nova distillation"
```

此命令會輸出金鑰資訊，包括 ARN。輸出範例：

```
{
    "KeyMetadata": {
        "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
        "Arn": "arn:aws:kms:{{us-east-1}}:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
    }
}
```

**注意**  
儲存輸出中的 KMS 金鑰 ARN，因為您在下一節建立 Amazon S3 儲存貯體時需要它。

### Amazon S3 儲存貯體
<a name="nova-distillation-training-job-data-augment-s3"></a>

您需要兩種類型的 Amazon S3 儲存體。由客戶管理的 Amazon S3 儲存貯體會存放您的輸入資料和輸出 `manifest.json` 檔案。您可以建立和管理此儲存貯體，並且可將單一儲存貯體用於輸入與輸出。此儲存貯體必須使用 KMS 加密設定，因為它會儲存敏感的輸出資料，並由 Amazon Bedrock 批次推論任務使用 - Amazon Bedrock 需要 KMS 加密的儲存貯體來處理批次推論任務。

服務受管 Amazon S3 儲存貯體會存放模型權重。服務受管 Amazon S3 儲存貯體會在您的第一個訓練任務期間自動建立。它具有受限制的存取控制，其中的特定路徑只能透過資訊清單檔案存取。

若要在特定 中建立儲存貯體 AWS 區域，請使用 [create-bucket](https://docs.aws.amazon.com//cli/latest/reference/s3api/create-bucket.html) CLI 命令。

使用 AWS KMS 加密建立 Amazon S3 儲存貯體的範例命令。`{kms_key_arn}` 將 取代為您的 AWS KMS 金鑰 ARN。如果您尚未建立 AWS KMS 金鑰，則必須先建立金鑰。

```
aws s3api create-bucket \
    "Rules": [
        {
            "ApplyServerSideEncryptionByDefault": {
                "SSEAlgorithm": "aws:kms",
                "KMSMasterKeyID": "{kms_key_arn}"
            },
            "BucketKeyEnabled": true
        }
    ]
}'
```

## 啟動 SageMaker 訓練任務
<a name="nova-distillation-training-job-start"></a>

開始訓練任務之前，請先準備您的資料。

**資料格式需求 -** 您的輸入資料集必須採用 JSONL 格式，其中每一行都包含反向格式的範例，詳細資訊請參閱[準備資料以蒸餾理解模型](https://docs.aws.amazon.com//nova/latest/userguide/custom-distill-prepare.html)。

**資料集限制條件**
+ 提示數下限：100
+ 檔案大小上限：2GB
+ 一行長度上限：180KB
+ 檔案格式：僅限 JSONL

若要上傳輸入資料，請執行下列命令。

```
aws s3 cp /path/to/input-data/ s3://customer-input-data-bucket/ —recursive
```

**資料增強配方**

您可以從配方儲存庫取得分割[配方](https://github.com/aws/sagemaker-hyperpod-recipes/tree/main/recipes_collection/recipes)。蒸餾配方位於目錄 `recipes-collection/recipes/fine-tuning/nova` 之下。資料增強程序由 YAML 組態檔案控制。以下是每個參數的詳細說明。全部都是必要欄位。


****  

| 參數 | Description | 
| --- | --- | 
| name | 訓練任務的描述性名稱。這有助於在 中識別您的任務 AWS 管理主控台。 | 
| distillation\_data | 啟用資料蒸餾任務，請勿修改此欄位。 | 
| maxNumberOfPrompts | 資料集中提示數目的上限。 | 
| maxResponseLength | 每個提示的回應長度上限 (記號)。 | 
| maxInputFileSizeInGB | 輸入檔案的大小上限 (以 GB 為單位)。 | 
| maxLineLengthInKB | 輸入檔案中單一行的大小上限 (以 KB 為單位)。 | 
| maxStudentModelFineTuningContextLengthInTokens | 學生模型的內容視窗大小上限 (記號)。此值不得超過學生模型容量。您可以根據學生模型容量，將此值設定為 32k 或 64k。 | 
| teacherModelId | 當您設定教師模型 ID 時，有兩種選擇：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/nova/latest/userguide/nova-distillation.html)[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/nova/latest/userguide/nova-distillation.html) | 
| 溫度 | 控制回應隨機性 (建議使用 0.7 以取得平衡)。 | 
| top\_p | 用於記號抽樣的累積機率閾值 (建議使用 0.9)。 | 
| customer\_bucket | 輸入/輸出資料的 Amazon S3 儲存貯體。 | 
| kms\_key | AWS KMS 在 S3 中加密輸出的金鑰。Bedrock 批次推論需要此金鑰來存放推論任務傳回的輸出。 | 

**限制**

對於做為 Nova Premier 的教師模型 - 僅 IAD 區域 (`us-east-1`) 中支援，因為 Amazon Bedrock 批次推論不適用於 ARN (`eu-north-1`) 區域中。

**最佳實務**

資料準備
+ 包含 100 個高品質標籤範例來引導教師模型
+ 在提交之前移除品質不佳的標籤
+ 依照文字理解提示最佳實務
+ 開始蒸餾之前，先使用教師模型測試提示

模型選擇
+ 使用 Nova Pro 做為一般使用案例的教師
+ 考慮使用 Nova Premier 以取得專業領域知識
+ 根據延遲和成本需求選擇學生模型

效能最佳化
+ 從建議的溫度 (0.7) 和 top\_p (0.9) 開始
+ 在微調之前先驗證增強的資料品質
+ 依照[選取超參數](https://docs.aws.amazon.com//nova/latest/userguide/customize-fine-tune-hyperparameters.html)中的指導方針調整超參數

**使用 PySDK 啟動任務**

下列範例筆記本示範如何執行 SageMaker 訓練任務以進行蒸餾。如需詳細資訊，請參閱[使用 SageMaker AI 估算器執行訓練任務](https://docs.aws.amazon.com//sagemaker/latest/dg/docker-containers-adapt-your-own-private-registry-estimator.html)。

```
import os
import sagemaker,boto3
from sagemaker.pytorch import PyTorch
from sagemaker.inputs import TrainingInput

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

# SETUP
job_name = <Your_job_name> # Must be unique for every run

input_s3_uri = <S3 URI to your input dataset> # Must end in .jsonl file
output_s3_uri = <S3 URI to your output bucket> + job_name

image_uri = "708977205387.dkr.ecr.us-east-1.amazonaws.com/nova-distillation-repo:SM-TJ-DISTILL-LATEST" # Do not change
instance_type = "ml.r5.4xlarge" # Recommedation is to use cpu instances 
instance_count = 1 # Must be 1, do not change 
role_arn = <IAM role to execute the job with>
recipe_path = <Local path to your recipe>

# Execution

estimator = PyTorch(
    output_path=output_s3_uri,
    base_job_name=job_name,
    role=role_arn,
    instance_count=instance_count,
    instance_type=instance_type,
    training_recipe=recipe_path,
    max_run=432000,
    sagemaker_session=sagemaker_session,
    image_uri=image_uri,
    subnets= ['subnet-xxxxxxxxxxxxxxxxx','subnet-xxxxxxxxxxxxxxxxx'], # Add subnet groups created in previous steps
    security_group_ids= ['sg-xxxxxxxxxxxxxxxxx'], # Add security group created in previous steps
    disable_profiler=True,
    debugger_hook_config=False
)

trainingInput = TrainingInput(
    s3_data=input_s3_uri,
    distribution='FullyReplicated',
    s3_data_type='Converse'
)

# The keys must be "train".
estimator.fit(inputs={"train": trainingInput})
```

## CloudWatch 日誌
<a name="nova-distillation-logs"></a>

日誌可在您 AWS 帳戶中 `/aws/sagemaker/TrainingJobs` 日誌群組下的 Amazon CloudWatch 中取得。您會看到每個主機會有一個日誌檔案用於訓練任務。

## 成功的訓練
<a name="nova-distillation-successful-training"></a>

對於成功的訓練任務，您會在日誌結尾處看到日誌訊息「訓練完成」。

輸出儲存貯體包含下列檔案：
+ `distillation_data/manifest.json`：包含已增強資料的位置。您可以使用此資料集來啟動 Amazon Nova 微調任務。此資料集僅支援 SFT 訓練。

  ```
  {
    "distillation_data": "s3://{{customer_escrow_bucket}}/{{job_id}}/distillation_data/"
  }
  ```
+ `distillation_data/sample_training_data.jsonl`：此 JSONL 檔案包含 50 個用於預覽的增強資料範例，可協助您判斷資料品質。
+ `distillation_data/training_config.json`：此檔案包含適用於 Amazon Nova 微調任務的建議超參數。以下是範例 檔案：

  ```
  {
      "epochCount": 5, 
      "learningRate": 1e-05, 
      "batchSize": 1, 
      "learningRateWarmupSteps": 1
  }
  ```

## 驗證增強資料品質
<a name="nova-distillation-training-job-validate"></a>

在繼續進行微調之前，請務必驗證增強資料的品質：

1. 檢閱輸出儲存貯體中的 `sample_training_data.jsonl` 檔案。此檔案包含增強資料集中的 50 個隨機樣本。

1. 手動檢查這些樣本與您使用案例之間的相關性、一貫性和一致性。

1. 如果品質不符合您的期望，您可能需要調整輸入資料或蒸餾參數，並重新執行資料增強程序。

資料擴增完成後，第二個階段涉及使用 微調學生模型。如需詳細資訊，請參閱[監督式微調 (SFT)](nova-fine-tune.md)。

在 SFT 訓練配方中，您可以傳遞先前任務傳回的資料集路徑。

```
data_s3_path: "s3://[escrow-bucket]/[job-name]/distillation_data/training_data.jsonl"
```

此外亦覆寫從上一個步驟產生的建議訓練組態。

**限制**
+ 僅支援此增強資料上的 SFT Nova 微調技術。
+ 不支援多模態蒸餾。
+ 不支援自訂教師模型。