

# Nova 2.0 の CPT
<a name="nova-cpt-2"></a>

Amazon Nova Lite 2.0 は、Nova Lite 1.0 よりも大規模で多様なデータセットでトレーニングされた推論モデルです。より大きなモデルであるにもかかわらず、Nova Lite 2.0 は Nova Lite 1.0 よりも高速な推論を行うと同時に、推論機能が強化され、より長いコンテキスト長を扱え、多言語パフォーマンスが改善されています。

Nova 2.0 の CPT を使用すると、これらの高度な機能をドメイン固有のデータで拡張できるため、モデルは優れた推論と分析能力を維持しながら、専門分野に関する深い専門知識を開発できます。

## サンプル CPT レシピ
<a name="nova-cpt-2-sample-recipe"></a>

CPT のサンプルレシピは以下のとおりです。このレシピなどは [recipes](https://github.com/aws/sagemaker-hyperpod-recipes/tree/main/recipes_collection/recipes/training/nova) リポジトリにあります。

```
# Note:
# This recipe can run on p5.48xlarge
# Run config
run:
  name: "my-cpt-run"                           # A descriptive name for your training job
  model_type: "amazon.nova-2-lite-v1:0:256k"   # Model variant specification, do not change
  model_name_or_path: "nova-lite-2/prod"        # Base model path, do not change
  replicas: 8                                   # Number of compute instances for training, allowed values are 4, 8, 16, 32
  data_s3_path: ""                              # Customer data paths
  validation_data_s3_path: ""                   # Customer validation data paths
  output_s3_path: ""                            # Output artifact path,  job-specific configuration - not compatible with standard SageMaker Training Jobs
  mlflow_tracking_uri: ""                       # Required for MLFlow
  mlflow_experiment_name: "my-cpt-experiment"   # Optional for MLFlow. Note: leave this field non-empty
  mlflow_run_name: "my-cpt-run"                 # Optional for MLFlow. Note: leave this field non-empty

## Training specific configs
training_config:
  task_type: cpt
  max_length: 8192                              # Maximum context window size (tokens)
  global_batch_size: 256                        # Global batch size, allowed values are 32, 64, 128, 256.

  trainer:
    max_steps: 10                               # The number of training steps to run total
    val_check_interval: 10                      # The number of steps between running validation. Integer count or float percentage
    limit_val_batches: 2                        # Batches of the validation set to use each trigger

  model:
    hidden_dropout: 0.0                         # Dropout for hidden states, must be between 0.0 and 1.0
    attention_dropout: 0.0                      # Dropout for attention weights, must be between 0.0 and 1.0

  optim:
    optimizer: adam
    lr: 1e-5                                    # Learning rate
    name: distributed_fused_adam                # Optimizer algorithm, do not change
    adam_w_mode: true                           # Enable AdamW mode
    eps: 1e-06                                  # Epsilon for numerical stability
    weight_decay: 0.0                           # L2 regularization strength, must be between 0.0 and 1.0
    adam_beta1: 0.9                             # Beta1 for Adam optimizer
    adam_beta2: 0.95                            # Beta2 for Adam optimizer
    sched:
      warmup_steps: 10                          # Learning rate warmup steps
      constant_steps: 0                         # Steps at constant learning rate
      min_lr: 1e-6                              # Minimum learning rate, must be lower than lr
```

## 2.0 での CPT のデータ準備
<a name="nova-cpt-2-data-prep"></a>

**データ形式の要件**  
トレーニングデータセットと検証データセットは、以下に示す形式に従った JSONL ファイルである必要があります。各行には、必須フィールドと構造がある会話を表す JSON オブジェクトが含まれます。以下がその例です。

```
{"text": "AWS stands for Amazon Web Services"}
{"text": "Amazon SageMaker is a fully managed machine learning service"}
{"text": "Amazon Bedrock is a fully managed service for foundation models"}
```

テキストエントリには、ターゲットドメインを表す、自然に流れる高品質のコンテンツを含める必要があります。

データが [Arrow 形式](https://huggingface.co/docs/datasets/en/about_arrow)に変換できることをテストします。以下の Python スクリプトを参考にしてください。少なくとも `datasets==2.18.0` バージョンが使用されていることを確認します。

```
from datasets import load_dataset, load_from_disk
from pathlib import Path

input_path = Path("<Your jsonl file>")
output_path = Path("<Your output directory>")

dataset = load_dataset("json", data_files=str(input_path), split="train")
dataset.save_to_disk(str(output_path), max_shard_size="1GB")

try:
  test_dataset = datasets.load_from_disk(output_dir)
  print(f"Dataset loaded successfully ✅! Contains {len(test_dataset)} samples")
except Exception as e:
  print(e)
```

JSONL ファイルと同じ数の行を出力する必要があります。

データ混合を使用する場合は、`max_steps=2` で最初のジョブを実行します。これにより、データアクセスのための最適化をクラスターに作成し、すべてのデータミックスが利用できることを検証できます。

**CPT のデータを準備する方法**  
トレーニングデータは、継続的な事前トレーニングを成功させるための最も重要な決定要素です。CPT データは「ラベルなし」と記述されることがよくありますが、現実ははるかに微妙です。データの構造化、フォーマット、提示の方法によって、モデルがビジネスユースケースに必要な知識とスキルを習得するかどうかが決まります。

### CPT 用の構造化ビジネスデータセットの準備
<a name="nova-cpt-2-structured-data"></a>

これは、ドメインに特化した基盤モデルを構築する企業や組織にとって一般的な課題です。ほとんどの企業は、製品カタログ、ユーザープロファイル、トランザクションログ、フォーム送信、API コール、運用メタデータなど、構造化データの豊富なリポジトリを持っています。一見すると、これは標準の事前トレーニングで通常使用される非構造化ウェブテキストとは大きく異なっているように見えます。

構造化されたビジネスデータから効果的に学習するには、ダウンストリームタスクを慎重に検討し、モデルが適切な予測関係を学習するようにデータの示し方を設計します。

継続的な事前トレーニングの可能性を最大限に引き出すには、次の点を考慮してください。
+ 推論時にモデルが実行するタスク
+ 未加工データに存在する情報
+ モデルが情報を正しく抽出して操作することを学習するようにデータを構築する方法

構造化データをトレーニングにダンプするだけでは、モデルにその推論を教えることはできません。データの示し方を積極的に構想し、モデルが学習する内容を手引きします。

以下のセクションでは、データ拡張の重要性を示す文献レビューと、構造化ビジネスデータの拡張戦略の例を示します。これは、CPT のビジネスデータセットを扱い、整理する方法に関する有用なアイデアを提供します。

**文献中の CPT の構造化データ**  
CPT はドメインの事実をモデルにパックできますが、入力やタスクがシフトしたときにそれらの事実を取得および操作できるようにすることに失敗することがよくあります。制御された実験から、事前トレーニング中に多様な拡張を行わないと、モデルは後の指示調整後も抽出が難しいままの脆弱な方法で事実を記憶し、トレーニングの早い段階でシグナルのような指示を挿入することを推奨することが示されています。半構造化データの場合、ランダムなシリアル化やその他の拡張によりスキーマのオーバーフィットが軽減されるため、CPT は最初に実行し、後で IFT を実行するのではなく、指示スタイルのタスクとインターリーブする必要があります。財務に重点を置いた作業では、バッチ時に CPT と指示データを一緒に組み合わせることで一般化が向上し、シーケンシャルレシピと比べて忘れることが減ることがさらにわかります。Qwen テクニカルレポートは、高品質の命令データを事前トレーニング自体に統合することで、同じパターンに収束します。これにより、コンテキスト学習が強化され、新しいドメインの知識を取得しながら指示が維持されます。

半構造化コーパスのデータ拡張が主要なレバーです。合成グラフ対応 CPT は、小さなドメインセットをエンティティにリンクされたコーパスに拡張します。エンティティにリンクされたコーポラは、推論時に取得する関係と複合を明示的に学習します。共同 CPT と指示の混合は、財務のシーケンシャルパイプラインよりも優れており、ドメインと一般データとのバランスを取ることで、一般スキルの低下を軽減できます。非常に大規模なドメイン CPT は、幅広い能力を保持し、モデルマージによるトレードオフもできますが、それでも次のステップとして指示チューニングを指し、CPT 中に指示シグナルを導入する価値を強化します。

**ランダム化とシャッフルによる多様性の注入**  
構造化データセットと半構造化データセットからモデルを効果的に教育するのに役立つ一般的な戦略は、データセット内のフィールドの順序をシャッフルし、いくつかのキーをランダムにドロップすることです。

フィールドをシャッフルすると、モデルは各値が表示される場所ではなく意味を読み取って、すべてのフィールド間の関係を学習します。例えば、Amazon ストアに投稿されたビデオゲームの場合、「タイトル」、「プラットフォーム」、「価格」、「条件」、および「編集」が異なる順序で到着すると、モデルは「3 番目のスロットはプラットフォーム」に依拠することはできません。ラベルを値にバインドし、タイトル ⇄ プラットフォーム、プラットフォーム ⇄ 価格、条件 ⇄ 価格など、属性間の相互関係を学習する必要があります。そのため、例えば、ゲーム名と観測価格から潜在的なプラットフォームを推測したり、タイトルとプラットフォームを考慮して妥当な価格範囲を見積もったりすることができます。

シリアル化中にキーをランダムにドロップすると、特徴量のドロップアウトのように動作します。これにより、1 つのフィールドでの同時適応が防止され、モデルが残りの証拠から欠落した情報を復元するように強制されます。「プラットフォーム」がない場合、モデルはタイトル文字列または互換性テキストから取得する必要があります。「価格」が非表示の場合は、プラットフォーム、エディション、および条件の 3 つの情報から価格を推測する必要があります。これにより、対称性 (A→B および B→A)、乱雑な実世界の出品に対する堅牢性、さらにフィールドの欠落、名前の変更、または順序の変更時のスキーマの不変性が構築されます。

ショッピングスタイルの例は、具体的に説明しています。「Title: 'Elden ring' \| Platform: PlayStation 5 \| Condition: Used—Like New \| Price: $34.99」や「Price: $34.99 \| Title: 'Elden Ring' \| Condition: Used—Like New \| Platform: PlayStation 5」のような並べ替えというように、同じアイテムを複数の方法でシリアル化します。一部のパスでは、説明に「Compatible with PS5」を残したまま「Platform」がドロップします。{title, price} からのプラットフォームの予測や {title, platform} からの価格バケットの予測など、補完的な目標をトレーニングします。キーの順序や存在も異なるため、唯一の安定した戦略は、テンプレートを記憶するのではなく、属性間の真の関係を学習することです。

### データの表示方法が重要
<a name="nova-cpt-2-data-presentation"></a>

LLM は、すでに見たものから次のトークンを予測することで学習します。したがって、トレーニング中に表示されるフィールドとイベントの順序によって、モデルが学習できる内容が決まります。トレーニング形式が実際のタスクと一致する場合、損失は正確な決定トークンになります。フィールドが構造なしで一緒に投げられると、モデルはショートカットを学習するか、人気度を記憶し、オプションから選択するように求められたときに失敗します。

まず状況を示し、次にオプションを示し、そして決定を示します。モデルが結果や説明についても学習する必要がある場合は、決定の後にそれらを学習するように順序立てます。

### CPT のサンプルパッキング
<a name="nova-cpt-2-packing"></a>

**パッキングとは?**  
これは単に、トレーニングデータの各シーケンスウィンドウを複数の全体例で埋めるだけで、ウィンドウはパディングではなく実際のトークンで密集した状態になることを意味します。

**重要な理由**  
トレーニング中に、8,192 トークンなど、コンテキストの最大長が設定されます。バッチは [バッチサイズ × コンテキスト長] の形になります。トレーニング例がコンテキストの長さより短い場合、残りの位置はパディングされます。損失がマスクされている場合でも、パディング部分はアテンション層と MLP カーネルの処理対象となるため、学習信号を持たないトークンの分も計算リソースが消費されてしまいます。

**パッキングの方法**  
複数のサンプルをパッキングするには、複数のトレーニングサンプルを ` [DOC] ` 区切り文字で連結し ([DOC] の前後のスペースに注意してください)、サンプルの全長が目的のコンテキストの長さ未満になるようにします。

パッキングされたドキュメントの例は次のようになります。

```
{"text": "training sample 1 [DOC] training sample 2 [DOC] training sample 3"}
```

### CPT チューニング用パラメータ
<a name="nova-cpt-2-tuning-parameters"></a>

CPT でファインチューニングできるパラメータは次のとおりです。

**設定の実行**  

+ **name**: トレーニングジョブのわかりやすい名前。AWS マネジメントコンソールでジョブを区別しやすくなります。
+ **model\_type**: 使用する Amazon Nova モデルバリアント。`amazon.nova-2-lite-v1:0:256k` のオプションを使用できます。
+ **model\_name\_or\_path**: トレーニングに使用するベースモデルへのパス。使用可能なオプションは `nova-lite-2/prod`、またはトレーニング後のチェックポイントの S3 パス (`s3://customer-escrow-bucket-unique_id/training_run_name`) です。
+ **replicas**: 分散トレーニングに使用するコンピューティングインスタンスの数。使用可能な値は選択したモデルによって異なります。Amazon Nova Lite 2.0 では、4 個、8 個、16 個、または 32 個のレプリカをサポートしています。
+ **data\_s3\_path**: トレーニングデータセットの S3 の場所。これは JSONL ファイルです。このファイルは、クラスターと同じ AWS アカウントおよびリージョンに配置する必要があります。指定された S3 の場所は、同じアカウントとリージョンに存在している必要があります。
+ **validation\_data\_s3\_path**: (オプション) 検証データセットの S3 の場所。これは JSONL ファイルです。このファイルは、クラスターと同じアカウントおよびリージョンに配置する必要があります。指定された S3 の場所は、同じアカウントとリージョンに存在している必要があります。
+ **output\_s3\_path**: マニフェストと TensorBoard ログが保存される S3 の場所。指定された S3 の場所は、同じ AWS アカウントと AWS リージョンに存在している必要があります。
+ **mlflow\_tracking\_uri**: MLFlow ログ記録に使用する MLFlow アプリケーションの ARN
+ **mlflow\_experiment\_name**: MLFlow 実験名
+ **mlflow\_run\_name**: MLFlow 実行名

**トレーニング設定**  

+ **max\_length**: トークンの最大シーケンス長。これにより、トレーニングのコンテキストウィンドウのサイズが決まります。サポートされている最大値は、CPT で 8192 トークンです。

  シーケンスを長くすると、メモリ要件の増加を犠牲にしてトレーニング効率が向上します。max\_length パラメータをデータディストリビューションに一致させることをお勧めします。
+ **global\_batch\_size**: すべてのデバイスとワーカーで 1 回の前方パスまたは後方パスで一緒に処理されたトレーニングサンプルの合計数。

  この値は、デバイスごとのバッチサイズとデバイスの数を乗算します。これは、トレーニングとスループットの安定性に影響します。メモリ内で快適に学習するバッチサイズから始めて、そこからスケールアップすることをお勧めします。ドメイン固有のデータの場合、大きなバッチでは勾配が滑らかになりすぎる可能性があります。

**トレーナー設定**  

+ **max\_steps**: 実行するトレーニングステップの数。各ステップでは、`global_batch_size` 個の要素でモデルをトレーニングします

**モデル設定**  

+ **hidden\_dropout**: 隠れ状態の出力をドロップする確率。この値を約 0.0～0.2 ずつ増やして、小さいデータセットのオーバーフィットを減らします。有効な値は 0～1 で、その範囲に限ります。
+ **attention\_dropout**: アテンション重みをドロップする確率。このパラメータは一般化に役立ちます。有効な値は 0～1 で、その範囲に限ります。

**オプティマイザー設定**  

+ **lr**: 最適化中のステップサイズを制御する学習率。パフォーマンスを向上させるには、1e-6-1e-4 の間の値をお勧めします。有効な値は 0～1 で、その範囲に限ります。
+ **name**: オプティマイザーアルゴリズム。現在は、`distributed_fused_adam` のみがサポートされます。
+ **weight\_decay**: L2 正則化の強度。値が大きいほど (0.01～0.1) 正則化が増加します。
+ **warmup\_steps**: 学習率を徐々に増やすステップの数。これにより、トレーニングの安定性が向上します。有効な値は 1～20 で、その範囲に限ります。
+ **min\_lr**: 減衰終了時の最小学習率。有効な値は 0～1 の範囲でその範囲に限られますが、学習率より小さくする必要があります。