

# 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>

蒸留プロセスでは主に次の 2 種類のモデルが使用されます。

**教師モデル**はナレッジソースとして機能し、以下が含まれます。
+ 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>
+ Amazon Nova モデルへのアクセス権と適切なサービスクォータ (最小 6 つの P5 インスタンスと 1 つの R5 インスタンス) がある AWS アカウント。
+ SageMaker トレーニングジョブのアクセス許可がある IAM ロール。
+ トレーニングデータと出力を格納するための Amazon S3 バケット。

## データ補強の設定
<a name="nova-distillation-training-job-data-augment"></a>

データ補強フェーズでは、SageMaker トレーニングジョブを使用して、教師モデルで高品質のトレーニングデータを生成します。このセクションでは、セットアッププロセスと要件について詳しく説明します。

### 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 デベロッパーガイド*の「[How to use SageMaker AI execution roles](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>

AWS マネジメントコンソール を使用して SageMaker トレーニングジョブ用の Amazon VPC 設定を作成するには、「[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 バッチ推論ジョブでは、保管時にデータを確実に保護するために、入力と出力の Amazon S3 バケットを AWS KMS キーで暗号化する必要があります。

次のコマンドで 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"
    }
}
```

**注記**  
次のセクションで Amazon S3 バケットの作成に必要になるため、出力から KMS キー ARN を保存します。

### Amazon S3 バケット
<a name="nova-distillation-training-job-data-augment-s3"></a>

2 種類の Amazon S3 ストレージが必要です。カスタマー管理の Amazon S3 バケットには、入力データと出力 `manifest.json` ファイルが格納されます。このバケットを作成および管理し、入力と出力の両方に 1 つのバケットを使用できます。このバケットは、機密出力データを保存し、Amazon Bedrock バッチ推論ジョブで使用されるため、KMS 暗号化で設定する必要があります。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
+ 最大ファイルサイズ: 2 GB
+ 最大の行の長さ: 180 KB
+ ファイル形式: 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 設定ファイルによって制御されます。以下は各パラメータの詳細な説明です。すべてのフィールドが必須です。


****  

| パラメータ | 説明 | 
| --- | --- | 
| 名前 | トレーニングジョブのわかりやすい名前。AWS マネジメントコンソール でジョブを区別しやすくなります。 | 
| distillation\_data | データ蒸留ジョブを有効にします。このフィールドは変更しないでください。 | 
| maxNumberOfPrompts | データセット内のプロンプトの最大数。 | 
| maxResponseLength | プロンプトあたりの最大レスポンス長 (トークン)。 | 
| maxInputFileSizeInGB | 入力ファイルの最大サイズ (GB 単位)。 | 
| maxLineLengthInKB | 入力ファイル内の 1 行の最大サイズ (KB 単位)。 | 
| maxStudentModelFineTuningContextLengthInTokens | 生徒モデルの最大コンテキストウィンドウサイズ (トークン)。この値を生徒モデルのキャパシティより大きくすることはできません。この値は、生徒モデルのキャパシティに応じて 32,000 または 64,000 に設定できます。 | 
| teacherModelId | 教師モデル ID を設定する際は次の 2 つから選択します。[See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/nova/latest/userguide/nova-distillation.html)[See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/nova/latest/userguide/nova-distillation.html) | 
| 温度 | レスポンスのランダム性を制御します (バランスを取る場合は 0.7 を推奨)。 | 
| top\_p | トークンサンプリングの累積確率しきい値 (0.9 を推奨)。 | 
| customer\_bucket | 入力/出力データ用の Amazon S3 バケット。 | 
| kms\_key | S3 で出力を暗号化するための AWS KMS キー。これは、推論ジョブによって返された出力を Bedrock バッチ推論で格納するために必要です。 | 

**制限**

Nova Premier としての教師モデルの場合 - Amazon Bedrock バッチ推論は ARN (`eu-north-1`) リージョンで利用できないため、IAD リージョン (`us-east-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>

ログは、Amazon CloudWatch の AWS アカウントにある `/aws/sagemaker/TrainingJobs` ロググループで使用できます。トレーニングジョブに使用されるホストごとに 1 つのログファイルが表示されます。

## トレーニングの成功
<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. 品質が期待を満たしていない場合は、入力データまたは蒸留パラメータを調整し、データ補強プロセスを再実行する必要がある場合があります。

データ補強が完了したら、2 番目のフェーズでは Amazon SageMaker HyperPod を使用して生徒モデルをファインチューニングします。詳細については、「[教師ありファインチューニング (SFT)](nova-fine-tune.md)」を参照してください。

SFT トレーニングレシピでは、前のジョブから返されたデータセットパスを渡すことができます。

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

また、前のステップで生成されたトレーニング設定をオーバーライドします。

**制限事項**
+ この補強されたデータでは、SFT Nova ファインチューニング手法のみがサポートされています。
+ マルチモーダル蒸留はサポートされていません。
+ カスタム教師モデルはサポートされていません。