

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

# 持續預先訓練 (CPT)
持續預先訓練 (CPT)

持續訓練前 (CPT) 是一種訓練技術，透過向特定網域或企業的其他未標記文字公開基礎模型，以延伸訓練前階段。與需要標記的輸入輸出對的監督式微調不同，CPT 會在原始文件上進行訓練，以協助模型更深入了解新網域、學習特定網域的術語和撰寫模式，以及適應特定內容類型或主題領域。

當您有大量 （數十億個字符） 的網域特定文字資料，例如法律文件、醫學文獻、技術文件或專屬商業內容，而且您希望模型在該網域中開發原生流暢性時，這種方法特別有用。一般而言，在 CPT 階段之後，模型需要經過額外的指令調校階段，讓模型能夠使用新取得的知識並完成有用的任務。

**支援的模型**  
CPT 適用於下列 Amazon Nova 模型：
+ Nova 1.0 (Micro、Lite、Pro)
+ Nova 2.0 （精簡型）

**何時使用 Nova 1.0 與 Nova 2.0**  
Amazon Nova 系列模型提供多個價格效能操作點，可在準確度、速度和成本之間進行最佳化。

當您需要下列項目時，請選擇 Nova 2.0：
+ 複雜分析任務的進階推理功能
+ 編碼、數學和科學問題解決的卓越效能
+ 更長的內容長度支援
+ 更好的多語言效能

**注意**  
較大的模型不一定會更好。在 Nova 1.0 和 Nova 2.0 模型之間進行選取時，請考慮成本效能權衡和您的特定業務需求。

# Nova 2.0 上的 CPT


Amazon Nova Lite 2.0 是在比 Nova Lite 1.0 更大且更多樣化的資料集上訓練的推理模型。雖然是較大的模型，但 Nova Lite 2.0 提供比 Nova Lite 1.0 更快的推論，同時提供增強的推理功能、更長的內容長度和改善的多語言效能。

Nova 2.0 上的 CPT 可讓您使用網域特定資料擴充這些進階功能，讓模型能夠在專業領域開發深度專業知識，同時維持其卓越的推理和分析能力。

## 範例 CPT 配方


以下是 CPT 的範例配方。您可以在配方儲存庫中找到此[配方和其他項目](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 的資料準備


**資料格式要求**  
訓練和驗證資料集必須是符合下列格式的 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 檔案中相同的行數。

使用 datamixing 時，請使用 執行第一個任務`max_steps=2`。這將有助於在叢集中建立資料存取的最佳化，並驗證所有資料混合是否可用。

**如何準備 CPT 的資料**  
訓練資料是持續預先訓練成功最重要的決定因素。雖然 CPT 資料通常被描述為「未標記」，但事實更為細微。資料的結構、格式化和呈現方式會決定模型是否會獲得業務使用案例所需的知識和技能。

### 準備 CPT 的結構化業務資料集


這是公司和組織在領域中建立專業基礎模型的常見挑戰。大多數企業擁有結構化資料的豐富儲存庫：產品目錄、使用者設定檔、交易日誌、表單提交、API 呼叫和操作中繼資料。乍看之下，這看起來與標準預先訓練中常用的非結構化 Web 文字非常不同。

若要有效地從結構化商業資料中學習，請仔細考慮下游任務並設計資料呈現，以強制模型學習正確的預測關係。

若要釋放持續預先訓練的完整潛力，請考慮：
+ 模型在推論時間應執行的任務
+ 原始資料中存在哪些資訊
+ 如何建構該資料，讓模型學習正確擷取和操作資訊

只要將結構化資料傾印到訓練中，就不會教導模型推理它。主動調整資料呈現的形狀，以引導模型學習的內容。

在下列各節中，有文獻回顧，展示了資料增強的重要性，並為結構化業務資料提供範例增強策略，以提供有關如何處理和組織 CPT 業務資料集的有用想法。

**文獻中 CPT 的結構化資料**  
CPT 可以將網域事實封裝到模型中，但通常無法在輸入或任務轉移時擷取和操縱這些事實。受控實驗顯示，如果在預先訓練期間沒有多樣化的擴增，模型會以簡潔的方式記住事實，即使在稍後的指令調校後仍難以擷取，並且建議像訓練早期的訊號一樣注入指令。對於半結構化資料，隨機序列化和其他擴增可減少結構描述過度擬合，這就是為什麼 CPT 應與指令樣式任務交錯，而不是先執行 和稍後執行 IFT。專注於財務的工作進一步發現，與循序配方相比，在批次時間聯合混合 CPT 和指令資料可改善一般化並減少忘記。Qwen 技術報告透過將高品質指令資料整合到預先訓練本身來收斂在相同的模式，這可提升內容學習並保留後續的指示，同時獲得新的領域知識。

半結構化體的資料擴增是關鍵控制桿。合成圖形感知 CPT 會將小型網域集擴展到實體連結體庫，以明確教導推論時具有擷取的關係和化合物。Joint CPT plus 指令混合在財務和平衡網域和一般資料中優於序列管道，可降低一般技能的降級。非常大規模的網域 CPT 也可以保留廣泛的能力，甚至允許透過模型合併進行權衡，但仍指向指令調校作為必要的後續步驟，加強在 CPT 期間引入指令訊號的值。

**透過隨機化和隨機化來注入多樣性**  
有助於從結構化和半結構化資料集有效教導模型的一般策略是隨機隨機捨棄資料集中的欄位順序，甚至隨機捨棄一些索引鍵。

隨機顯示欄位會強制模型讀取每個值的意義，而不是顯示的位置，並了解所有欄位之間的關係。例如，如果視訊遊戲張貼在 amazon 商店，當 "Title"、"Platform"、"Price"、"Condition" 和 "Edition" 以不同的排列到達時，模型無法倚賴「第三個槽是平台」；它必須將標籤繫結至值，並了解屬性之間的雙邊關係：標題 ⇄ 平台、平台 ⇄ 價格、條件 ⇄ 價格。例如，它可以從遊戲名稱和觀察價格推斷可能平台，或根據標題和平台估計合理的價格範圍。

在序列化期間隨機捨棄金鑰就像功能捨棄一樣：它可防止在任何一個欄位上進行共同調整，並強制模型從剩餘的證據中復原缺少的資訊。如果沒有「平台」，模型必須從標題字串或相容性文字中挑選；如果「價格」隱藏，則必須從平台、版本和條件中三角。這會建置對稱 (A→B 和 B→A)、對雜亂真實世界清單的穩健性，以及欄位遺失、重新命名或重新排序時的結構描述變異。

購物風格範例讓它變得具體。以多種方式序列化相同的項目："Title： 'Elden Ring' \$1 Platform： PlayStation 5 \$1 Condition： Used—Like New \$1 Price： \$134.99" 和排列，例如 "Price： \$134.99 \$1 Title： 'Elden Ring' \$1 Condition： Used—Like New \$1 Platform： PlayStation 5"，並且在某些傳遞中捨棄 "Platform"，同時在描述中保留 "Compatible with PS5"。訓練互補目標，例如從 \$1title， price\$1 預測平台，以及從 \$1title， platform\$1 預測價格儲存貯體。由於索引鍵的順序和存在會有所不同，因此唯一穩定的策略是了解屬性之間的真實關係，而不是記住範本。

### 資料呈現的方式很重要


LLMs會從他們已看到的內容預測下一個字符來學習。因此，訓練期間顯示的欄位和事件順序會決定模型可以學習的內容。如果訓練格式符合實際任務，則損失會落在確切的決策權杖上。如果欄位在沒有結構的情況下拼湊在一起，模型會學習捷徑或記住熱門度，然後在要求選擇選項時失敗。

先顯示情況，再顯示選項，再顯示決策。如果模型也應該了解結果或說明，請在決策之後放置它們。

### CPT 的封裝範例


**什麼是封裝？**  
這只是表示使用多個完整範例填入訓練資料中的每個序列視窗，以便視窗以真實字符密集，而不是填補。

**為什麼它很重要**  
在訓練期間會設定最大內容長度，例如 8，192 個字符。批次的形狀為 【批次大小 × 內容長度】。如果訓練範例短於內容長度，則會填充剩餘的位置。即使已遮罩遺失，填補仍會透過注意力和 MLP 核心執行，因此會為沒有學習訊號的字符支付運算費用。

**如何進行封裝？**  
若要封裝多個範例，請在 之間使用` [DOC] `分隔符號串連多個訓練範例 （請注意 【DOC】 前後的空間），讓範例的完整長度低於所需的內容長度。

封裝的文件範例如下所示：

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

### CPT 調校參數


可使用 CPT 進行微調的參數包括：

**執行組態**  

+ **名稱**：訓練任務的描述性名稱。這有助於在 AWS 管理主控台中識別您的任務。
+ **model\$1type**：要使用的 Amazon Nova 模型變體。可用的選項為 `amazon.nova-2-lite-v1:0:256k`。
+ **model\$1name\$1or\$1path**：用於訓練的基本模型路徑。可用的選項為 `nova-lite-2/prod`，或訓練後檢查點的 S3 路徑 (`s3://customer-escrow-bucket-unique_id/training_run_name`)。
+ **複本**：用於分散式訓練的運算執行個體數量。可用的值會根據您選擇的模型而有所不同。Amazon Nova Lite 2.0 支援 4、8、16 或 32 個複本。
+ **data\$1s3\$1path**：訓練資料集的 S3 位置，這是 JSONL 檔案。此檔案必須位於與叢集相同的 AWS 帳戶和區域。提供的所有 S3 位置都必須位於相同的帳戶和區域中。
+ **validation\$1data\$1s3\$1path**：（選用） 驗證資料集的 S3 位置，這是 JSONL 檔案。此檔案必須位於與叢集相同的帳戶和區域中。提供的所有 S3 位置都必須位於相同的帳戶和區域中。
+ **output\$1s3\$1path**：儲存資訊清單和 TensorBoard 日誌的 S3 位置。提供的所有 S3 位置都必須位於相同的 AWS 帳戶和 AWS 區域。
+ **mlflow\$1tracking\$1uri**：用於 MLFlow 記錄的 MLFlow 應用程式的 ARN
+ **mlflow\$1experiment\$1name**：MLFlow 實驗名稱
+ **mlflow\$1run\$1name**：MLFlow 執行名稱

**訓練組態**  

+ **max\$1length**：字符中的序列長度上限。這會決定訓練的內容範圍大小。CPT 的最大支援值為 8192 個記號。

  序列越長，越能提高訓練效率，但代價是需要增加記憶體。我們建議您將 max\$1length 參數與資料分佈配對。
+ **global\$1batch\$1size**：跨所有裝置和工作者，一次向前或向後傳遞一起處理的訓練範例總數。

  此值會乘以每個裝置的批次大小和裝置數目。它會影響訓練和輸送量的穩定性。我們建議您從適合您記憶體的批次大小開始，並從該處向上擴展。對於特定網域的資料，批次越大可能會使梯度過度平滑。

**培訓人員設定**  

+ **max\$1steps**：要執行的訓練步驟數目。每個步驟都會訓練具有元素`global_batch_size`數目的模型

**模型設定**  

+ **hidden\$1dropout**：捨棄隱藏狀態輸出的機率。將此值增加約 0.0-0.2 可減少對較小資料集的過度擬合。有效值介於 0-1 (含) 之間。
+ **attention\$1dropout**：捨棄注意力權重的機率。此參數可協助進行一般化。有效值介於 0-1 (含) 之間。

**最佳化工具組態**  

+ **lr**：學習率，可在最佳化期間控制步驟大小。我們建議使用介於 1e-6-1e-4 之間的值，以獲得良好的效能。有效值介於 0-1 (含) 之間。
+ name****：最佳化工具演算法。目前僅支援 `distributed_fused_adam`。
+ **weight\$1decay**：L2 正規化強度。較高的值 (介於 0.01-0.1 之間) 會增加正規化。
+ **warmup\$1steps**：逐步提高學習率的步驟數。這可改善訓練穩定性。有效值介於 1-20 (含) 之間。
+ **min\$1lr**：衰減結束時的最低學習率。有效值介於 0-1 (含) 之間，但必須小於學習率。