

# 在 SageMaker HyperPod 上微调 Amazon Nova 模型
<a name="nova-hp-fine-tune"></a>

以下技术将介绍如何在 SageMaker HyperPod 上微调 Amazon Nova 2 系列模型。

**Topics**
+ [监督式微调（SFT）](nova-fine-tune.md)
+ [直接偏好优化（DPO）](nova-dpo.md)
+ [近端策略优化 (PPO)](nova-ppo.md)

# 监督式微调（SFT）
<a name="nova-fine-tune"></a>

SFT 训练流程主要包含两个阶段：
+ **数据准备**：遵循既定指南，创建、清理或重新格式化数据集，使其符合所需结构。确保输入、输出和辅助信息（例如推理轨迹或元数据）正确对齐和格式化。
+ **训练配置**：定义模型的训练方式。使用时，此配置是在 YAML 配方文件中编写的，包括：
  + 数据来源路径（训练和验证数据集）
  + 关键超参数（epoch、学习率、批次大小）
  + 可选组件（分布式训练参数等）

## Nova 模型对比与选型
<a name="nova-model-comparison"></a>

Amazon Nova 2.0 模型的训练数据集比 Nova 1.0 模型规模更大、种类更丰富。重要改进包括：
+ **增强的推理能力**，支持显式推理模式
+ **更广泛的多语言性能**，覆盖更多语种
+ 在代码生成、工具调用等**复杂任务上表现更优**
+ **扩展的上下文处理能力**，在更长上下文中实现更高的准确性和稳定性

## 何时选用 Nova 1.0 与 Nova 2.0
<a name="nova-model-selection"></a>

满足以下条件时，建议选择 Amazon Nova 1.0：
+ 使用案例只需标准语言理解，无需高级推理能力
+ 模型效果已在 Amazon Nova 1.0 上验证通过，无需额外能力扩展

# Nova 1.0 上的 SFT
<a name="nova-sft-1"></a>

监督式微调 (SFT) 是指向基础模型提供一组提示-响应对的过程，用于提高预训练基础模型在特定任务中的性能。标注示例的格式为提示-回答对，措辞为指示。这个微调过程修改模型的权重。

当您拥有需要提供特定提示-响应对来获得最佳结果的特定领域数据时，应使用 SFT。

请注意，您的训练和验证输入数据集必须位于客户拥有的存储桶中，而不是存储在托管或服务托管的 S3 存储桶中。

## 数据要求
<a name="nova-sft-1-data-requirements"></a>

对于全秩 SFT 和低秩适应（LoRA）SFT，数据应遵循 [Amazon Bedrock Converse 操作格式](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_Converse.html)。有关此格式的示例和限制，请参阅[为微调理解模型准备数据](https://docs.aws.amazon.com/nova/latest/userguide/fine-tune-prepare-data-understanding.html)。

要在提交数据集之前验证您的数据集格式，我们建议使用 [Amazon Bedrock 示例存储库中的验证脚本](https://github.com/aws-samples/amazon-nova-samples/blob/main/customization/bedrock-finetuning/understanding/dataset_validation/nova_ft_dataset_validator.py)。此验证工具将有助于确保您的 JSONL 文件符合所需的格式规范，并在提交微调作业之前发现任何潜在的问题。

可用于 SFT 调整的 Amazon Nova 参数如下所示：
+ **运行配置**
  + `name`：训练作业的描述性名称。这有助于您在 AWS 管理控制台中识别您的作业。
  + `model_type`：要使用的 Amazon Nova 模型变体。可用选项有 `amazon.nova-micro-v1:0:128k`、`amazon.nova-lite-v1:0:300k` 或 `amazon.nova-pro-v1:0:300k`。
  + `model_name_or_path`：用于训练的基本模型的路径。从 `nova-micro/prod`、`nova-lite/prod`、`nova-pro/prod` 或训练后检查点的 S3 路径（`s3://<escrow bucket>/<job id>/outputs/checkpoints`）中选择要使用的模型。
  + `replicas`：要在分布式训练中使用的计算实例数。可用值因所选的模型而异。Amazon Nova Micro 支持 2、4 或 8 个副本。Amazon Nova Lite 支持 4、8、16 或 32 个副本。Amazon Nova Pro 支持 6、12 或 24 个副本。
  + `data_s3_path`：训练数据集的 S3 位置，是一个 JSONL 文件。此文件必须与集群位于相同的 AWS 账户和区域。所提供的 S3 路径中的所有 S3 位置都必须位于同一个账户和区域中。
  + `validation_data_s3_path`：（可选）验证数据集的 S3 位置，是一个 JSONL 文件。此文件必须与集群位于相同的账户和区域中。所提供的 S3 路径中的所有 S3 位置都必须位于同一个账户和区域中。
  + `output_s3_path`：存储清单和 TensorBoard 日志的 S3 位置。所提供的 S3 路径中的所有 S3 位置都必须位于同一个账户和区域中。
+ **训练配置**
  + `max_length`：以词元为单位的最大序列长度。这决定了训练的上下文窗口大小。SFT 支持的最大值为 65536 个词元。

    更长的序列将会提高训练效率，但会以增加内存需求为代价。我们建议您根据数据分布情况设置 `max_length` 参数。
+ **训练器设置**
  + `max_epochs`：遍历训练数据集的次数。

    通常，较大的数据集需要较少的 epoch 就能收敛，而较小的数据集则需要较多的 epoch 才能收敛。我们建议您根据数据大小调整 epoch 数。
+ **模型设置**
  + `hidden_dropout`：丢弃隐藏状态输出的概率。将该值增加约 0.0 到 0.2，以减少对较小数据集的过度拟合。有效值介于 0 到 1 之间（含两端值）。
  + `attention_dropout`：丢弃注意力权重的概率。此参数有助于泛化。有效值介于 0 到 1 之间（含两端值）。
  + `ffn_dropout`：丢弃前馈网络输出的概率。有效值介于 0 到 1 之间（含两端值）。
+ **优化器配置**
  + `lr`：学习率，控制优化期间的步长。有效值介于 1e-6 到 1e-3 之间（含两端值）。为了获得良好的性能，我们建议使用介于 1e-6 和 1e-4 之间的值。
  + `name`：优化算法。目前仅支持 `distributed_fused_adam`。
  + `weight_decay`：L2 正则化强度。值比较高（介于 0.01 到 0.1 之间）会增加正则化强度。
  + `warmup_steps`：逐步提高学习率的步数。这可以提高训练稳定性。有效值介于 1 到 20 之间（含两端值）。
  + `min_lr`：衰减结束时的最低学习率。有效值介于 0 到 1 之间（含两端值），但必须小于学习率。

## 借助全秩 SFT 配方快速启动作业
<a name="nova-sft-1-quick-start"></a>

下面是全秩 SFT 配方，旨在让您在 SageMaker HyperPod 集群上快速启动 SFT 作业。此配方还假设您已使用正确的 AWS 凭证连接到 SageMaker HyperPod 集群。

```
run:
  name: "my-sft-micro-job" # gets appended with a unique ID for HP jobs
  model_type: "amazon.nova-micro-v1:0:128k"
  model_name_or_path: "nova-micro/prod"
  replicas: 2
  data_s3_path: s3:Replace with your S3 bucket name/input.jsonl
  validation_data_s3_path: [OPTIONAL] s3:your S3 bucket name/input.jsonl
  output_s3_path: [S3_PATH_TO_STORE_MANIFEST]

## training specific configs
training_config:
  max_length: 32768
  save_steps: 100000
  replicas: ${recipes.run.replicas}
  micro_batch_size: 1
  task_type: sft
  global_batch_size: 64
  weights_only: True
  allow_percentage_invalid_samples: 10

  exp_manager:
    exp_dir: null
    create_wandb_logger: False
    create_tensorboard_logger: True
      project: null
      name: null
    checkpoint_callback_params:
      monitor: step
      save_top_k: 10
      mode: max
      every_n_train_steps: ${recipes.training_config.save_steps}
      save_last: True
    create_early_stopping_callback: True
    early_stopping_callback_params:
      min_delta: 0.001
      mode: min
      monitor: "val_loss"
      patience: 2

  trainer:
    log_every_n_steps: 1
    max_epochs: -1
    max_steps: 16
    limit_test_batches: 0
    gradient_clip_val: 1.0
    num_nodes: ${recipes.training_config.replicas}

  model:
    hidden_dropout: 0.0 # Dropout probability for hidden state transformer.
    attention_dropout: 0.0 # Dropout probability in the attention layer.
    ffn_dropout: 0.0 # Dropout probability in the feed-forward layer.
    sequence_parallel: True
    optim:
      lr: 1e-5
      name: distributed_fused_adam
      bucket_cap_mb: 10
      contiguous_grad_buffer: False
      overlap_param_sync: False
      contiguous_param_buffer: False
      overlap_grad_sync: False
      adam_w_mode: true
      eps: 1e-06
      weight_decay: 0.0
      betas:
        - 0.9
        - 0.999
      sched:
        name: CosineAnnealing
        warmup_steps: 10
        constant_steps: 0
        min_lr: 1e-6

    mm_cfg:
      llm:
        freeze: false
      image_projector:
        freeze: true
        require_newline: true
      video_projector:
        freeze: true
        require_newline: false

    peft:
      peft_scheme: null

    training_validation:
      loader:
        args:
          data_loader_workers: 1
          prefetch_factor: 2
      collator:
        args:
          force_image_at_turn_beginning: false
```

## 全秩配方示例
<a name="nova-sft-1-sample-recipe"></a>

以下是 SFT 的全秩配方示例，其中所有组件均已适当配置。

```
## Run config
run:
    name: "my-sft-run"              # A descriptive name for your training job
    model_type: "amazon.nova-lite-v1:0:300k"  # Model variant specification
    model_name_or_path: "nova-lite/prod"      # Base model path
    replicas: 4                     # Number of compute instances for training
    data_s3_path: s3:Replace with your S3 bucket name/input.jsonl
    validation_data_s3_path: [OPTIONAL] s3:your S3 bucket name/input.jsonl
    output_s3_path: [S3_PATH_TO_STORE_MANIFEST]

## Training specific configs
training_config:
    max_length: 32768               # Maximum context window size (tokens)

    trainer:
        max_epochs: 2               # Number of training epochs

    model:
        hidden_dropout: 0.0          # Dropout for hidden states
        attention_dropout: 0.0       # Dropout for attention weights
        ffn_dropout: 0.0             # Dropout for feed-forward networks

        optim:
            lr: 1e-5                 # Learning rate
            name: distributed_fused_adam  # Optimizer algorithm
            adam_w_mode: true        # Enable AdamW mode
            eps: 1e-06               # Epsilon for numerical stability
            weight_decay: 0.0        # L2 regularization strength
            betas:                   # Adam optimizer betas
                - 0.9
                - 0.999
            sched:
                warmup_steps: 10     # Learning rate warmup steps
                constant_steps: 0    # Steps at constant learning rate
                min_lr: 1e-6         # Minimum learning rate

        peft:
            peft_scheme: null        # Set to null for full-parameter fine-tuning
```

## 限制
<a name="nova-sft-1-limitations"></a>

不支持将指标发布到“权重与偏差”。

要调整超参数，请遵循[选择超参数](https://docs.aws.amazon.com/nova/latest/userguide/customize-fine-tune-hyperparameters.html)中的指导。

## 参数高效微调（PEFT）
<a name="nova-fine-tune-peft"></a>

参数高效微调（PEFT）是指重新训练少量额外的权重，以使基础模型适应新的任务或领域。具体而言就是，低秩适应（LoRA）PEFT 在特定的模型层引入可训练的低秩权重矩阵来有效微调基础模型，从而在保持模型质量的同时减少可训练参数的数量。

LoRA PEFT 适配器通过纳入轻量级适配器层来强化基础模型，这些适配器层在推理过程中修改模型的权重，同时使原模型参数保持不变。这种方法也被视为最具成本效益的微调技术之一。有关更多信息，请参阅[使用适配器推理组件微调模型](https://docs.aws.amazon.com/sagemaker/latest/dg/realtime-endpoints-adapt.html)。

您应当在以下场景中使用 LoRA PEFT：
+ 您想从快速的训练程序开始。
+ 基本模型的性能已经令人满意。在此情况下，LoRA PEFT 旨在增强其在多个相关任务中的能力，例如文本摘要或语言翻译。LoRA PEFT 的正则化特性有助于防止过度拟合，并降低模型“忘记”源领域的风险。这可以确保模型保持多功能性，并且可以适应各种应用。
+ 您希望以相对较小的数据集执行指令微调场景。LoRA PEFT 在处理特定任务的小型数据集时表现优于处理更广泛、更大的数据集。
+ 您的大型标注数据集超过了 Amazon Bedrock 自定义数据限制。在这种情况下，您可以在 SageMaker AI 上使用 LoRA PEFT 来生成更好的结果。
+ 如果已经通过 Amazon Bedrock 微调取得了预期结果，SageMaker AI 中的 LoRA PEFT 就可以帮助进一步优化模型超参数。

可用于 LoRA PEFT 的 Amazon Nova 参数包括：
+ **运行配置**
  + `name`：训练作业的描述性名称。这有助于您在 AWS 管理控制台中识别您的作业。
  + `model_type`：要使用的 Nova 模型变体。可用选项有 `amazon.nova-micro-v1:0:128k`、`amazon.nova-lite-v1:0:300k` 或 `amazon.nova-pro-v1:0:300k`。
  + `model_name_or_path`：用于训练的基本模型的路径。选择要使用的模型。可用选项有 `nova-micro/prod`、`nova-lite/prod`、`nova-pro/prod`，或训练后检查点的 S3 路径（`s3://<escrow bucket>/<job id>/outputs/checkpoints`）。
  + `replicas`：要在分布式训练中使用的计算实例数。可用值因您所用的模型而异。Amazon Nova Micro 支持 2、4 或 8 个副本。Amazon Nova Lite 支持 4、8、16 或 32 个副本。Amazon Nova Pro 支持 6、12 或 24 个副本。
  + `output_s3_path`：存储清单和 TensorBoard 日志的 S3 位置。所提供的 S3 路径中的所有 S3 位置都必须位于同一个账户和区域中。
+ **训练配置**
  + `max_length`：以词元为单位的最大序列长度。这决定了训练的上下文窗口大小。LoRA PEFT 支持的最大值为 65536 个词元。

    更长的序列将会提高训练效率，但会以增加内存需求为代价。我们建议您根据数据分布情况设置 `max_length` 参数。
+ **训练器设置**
  + `max_epochs`：遍历训练数据集的次数。您可以设置 `max_steps` 或 `max_epochs`，但我们不建议同时设置这两个参数。最大值为 5。

    通常，较大的数据集需要较少的 epoch 就能收敛，而较小的数据集则需要较多的 epoch 才能收敛。我们建议您根据数据大小调整 epoch 数。
+ **模型设置**
  + `hidden_dropout`：丢弃隐藏状态输出的概率。将该值增加约 0.0 到 0.2，以减少对较小数据集的过度拟合。有效值介于 0 到 1 之间（含两端值）。
  + `attention_dropout`：丢弃注意力权重的概率。此参数有助于泛化。有效值介于 0 到 1 之间（含两端值）。
  + `ffn_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 之间（含两端值），但必须小于学习率。
+ **LoRA 配置参数**
  + `peft_scheme`：设置为 `lora` 将启用低秩适应。
  + `alpha`：LoRA 权重的缩放系数。通常将其设置为与 `adapter_dim` 相同的值。
  + `adaptor_dropout`：LoRA 的正则化参数。

### PEFT 配方
<a name="nova-sft-1-peft-recipe"></a>

以下是 LoRA PEFT 的配方。

```
## Run config
run:
    name: "my-lora-run"             # A descriptive name for your training job
    model_type: "amazon.nova-lite-v1:0:300k"  # Model variant specification
    model_name_or_path: "nova-lite/prod"      # Base model path
    replicas: 4                     # Number of compute instances for training
    output_s3_path: [S3_PATH_TO_STORE_MANIFEST]

## Training specific configs
training_config:
    max_length: 32768               # Maximum context window size (tokens)

    trainer:
        max_epochs: 2               # Number of training epochs

    model:
        hidden_dropout: 0.0          # Dropout for hidden states
        attention_dropout: 0.0       # Dropout for attention weights
        ffn_dropout: 0.0             # Dropout for feed-forward networks

        optim:
            lr: 1e-5                 # Learning rate
            name: distributed_fused_adam  # Optimizer algorithm
            adam_w_mode: true        # Enable AdamW mode
            eps: 1e-06               # Epsilon for numerical stability
            weight_decay: 0.0        # L2 regularization strength
            betas:                   # Adam optimizer betas
                - 0.9
                - 0.999
            sched:
                warmup_steps: 10     # Learning rate warmup steps
                constant_steps: 0    # Steps at constant learning rate
                min_lr: 1e-6         # Minimum learning rate

        peft:
            peft_scheme: "lora"      # Enable LoRA for parameter-efficient fine-tuning
            lora_tuning:
                loraplus_lr_ratio: 8.0  # LoRA+ learning rate scaling factor
                alpha: 32            # Scaling factor for LoRA weights
                adapter_dropout: 0.01  # Regularization for LoRA parameters
```

### 问题排查
<a name="nova-sft-1-troubleshooting"></a>

使用以下信息可帮助您解决可能遇到的问题：
+ 训练和验证的输入数据集应位于客户拥有的存储桶中，而不是存储在托管或服务托管的 S3 存储桶中。
+ 如果您在 AWS CLI 中收到“未找到区域”错误，请重新提交作业，并在 start-job 命令前加上该区域。例如：`AWS_REGION=us-east-1 hyperpod start-job ...Job Parameters`。
+ 要调整超参数，请遵循[选择超参数](https://docs.aws.amazon.com/nova/latest/userguide/customize-fine-tune-hyperparameters.html)中的指导。

# 直接偏好优化（DPO）
<a name="nova-dpo"></a>

直接偏好优化 (DPO) 是一种高效的基础模型微调方法，它使用配对的比较数据使模型输出与人类偏好保持一致。这种方法可根据人类对哪些响应更符合预期的反馈，直接优化模型行为。

全秩 DPO 和低秩适配器 (LoRA) DPO 均可用。

**数据格式要求**  
对于全秩和 LoRA DPO，训练数据格式要求与 SFT 类似。但是，对于 DPO，最后一轮需要有偏好对。以下为 DPO 数据格式示例：

```
// N-1 turns same as SFT format
{
    "role": "assistant",
    "candidates": [
        {
            "content": [
                {
                    "text": "..."
                } // content list can contain multiple 'text' objects
            ],
            "preferenceLabel": "preferred"
        },
        {
            "content": [
                {
                    "text": "..."
                } // content list can contain multiple 'text' objects
            ],
            "preferenceLabel": "non-preferred"
        }
    ]
}
```

以下是另一个完整的 DPO 文本示例：

```
{
    "system": [
        {
            "text": "..."
        }
    ],
    "messages":[
        {
            "role": "user",
            "content": [
                {
                    "text": "..."
                }
            ]
        },
        {
            "role": "assistant",
            "content": [
                {
                    "text": "..."
                }
            ]
        },
        {
            "role": "user",
            "content": [
                {
                    "text": "..."
                }
            ]
        },
        {
            "role": "assistant",
            "candidates": [
                {
                    "content": [
                        {
                            "text": "..."
                        }
                    ],
                    "preferenceLabel": "preferred"
                },
                {
                    "content": [
                        {
                            "text": "..."
                        }
                    ],
                    "preferenceLabel": "non-preferred"
                }
            ]
        }
    ],
}
```

以下是完整的 DPO 图像示例：

```
{
    "system": [
        {
            "text": "..."
        }
    ],
    "messages":[
        {
            "role": "user",
            "content": [
                {
                    "text": "..."
                },
                {
                    "text": "..."
                },
                {
                    "image": {
                        "format": "jpeg",
                        "source": {
                            "s3Location": {
                                "uri": "s3://your-bucket/your-path/your-image.jpg",
                                "bucketOwner": "your-aws-account-id"
                            }
                        }
                    }
                } // "content" can have multiple "text" and "image" objects.
                 // max image count is 10
            ]
        },
        {
            "role": "assistant",
            "content": [
                {
                    "text": "..."
                }
            ]
        },
        {
            "role": "user",
            "content": [
                {
                    "text": "..."
                },
                {
                    "text": "..."
                },
                {
                    "image": {
                        "format": "jpeg",
                        "source": {
                            "s3Location": {
                                "uri": "s3://your-bucket/your-path/your-image.jpg",
                                "bucketOwner": "your-aws-account-id"
                            }
                        }
                    }
                } // "content" can have multiple "text" and "image" objects.
                 // max image count is 10
            ]
        },
        {
            "role": "assistant",
            "candidates": [
                {
                    "content": [
                        {
                            "text": "..."
                        }
                    ],
                    "preferenceLabel": "preferred"
                },
                {
                    "content": [
                        {
                            "text": "..."
                        }
                    ],
                    "preferenceLabel": "non-preferred"
                }
            ]
        }
    ],
}
```

对输入数据集的其他限制也适用。有关更多信息，请参阅[数据集限制](https://docs.aws.amazon.com/nova/latest/userguide/fine-tune-prepare-data-understanding.html#custom-fine-tune-constraints)。我们建议您纳入至少 1000 个偏好对，便于实现高效训练。高质量的偏好数据将带来更有效的结果。

我们建议在以下场景中使用 DPO：
+ 针对需要符合特定人类偏好的主观输出进行优化。
+ 调整模型的语气、风格或内容特征以匹配预期的响应模式。
+ 根据用户反馈和错误分析对现有模型进行针对性的改进。
+ 在不同用例中保持一致的输出质量。
+ 通过偏好的响应模式实施安全护栏。
+ 使用无奖励强化学习进行训练。
+ 仅使用偏好数据，而非已评分或标注的数据。
+ 在细致的对齐任务中改进模型，例如有用、无害或诚实。

## 全秩 DPO
<a name="customize-fine-tune-hyperpod-dpo-fr"></a>

可用于全秩 DPO 的 Amazon Nova 参数如下所示：
+ **运行配置**
  + `name`：训练作业的描述性名称。这有助于您在 AWS 管理控制台中识别您的作业。
  + `model_type`：要使用的 Nova 模型变体。可用选项有 `amazon.nova-micro-v1:0:128k`、`amazon.nova-lite-v1:0:300k` 或 `amazon.nova-pro-v1:0:300k`。
  + `model_name_or_path`：基本模型的路径。从 `nova-micro/prod`、`nova-lite/prod`、`nova-pro/prod` 或训练后检查点的 S3 路径（`s3://<escrow bucket>/<job id>/outputs/checkpoints`）中选择要使用的模型。
  + `replicas`：要在分布式训练中使用的计算实例数。可用值因所选的模型而异。Amazon Nova Micro 支持 2、4 或 8 个副本。Amazon Nova Lite 支持 4、8、16 或 32 个副本。Amazon Nova Pro 支持 6、12 或 24 个副本。
  + `data_s3_path`：训练数据集的 S3 位置，是一个 JSONL 文件。此文件必须与集群位于相同的账户和区域中。提供的所有 S3 位置必须位于同一账户和区域中。
  + `validation_data_s3_path`：验证数据集的 S3 位置，是一个 JSONL 文件。此文件必须与集群位于相同的 AWS 账户和区域。提供的所有 S3 位置必须位于同一账户和区域中。
+ **训练配置**
  + `max_length`：以词元为单位的最大序列长度。这决定了训练的上下文窗口大小。DPO 支持的最大值为 32768 个词元。

    更长的序列将会提高训练效率，但会以增加内存需求为代价。我们建议您根据数据分布情况设置 `max_length` 参数。
+ **训练器设置**
  + `max_epochs`：遍历训练数据集的次数。

    通常，较大的数据集需要较少的 epoch 就能收敛，而较小的数据集则需要较多的 epoch 才能收敛。我们建议您根据数据大小调整 epoch 数。
+ **模型设置**
  + `hidden_dropout`：丢弃隐藏状态输出的概率。将该值增加约 0.0 到 0.2，以减少对较小数据集的过度拟合。有效值介于 0 到 1 之间（含两端值）。
  + `attention_dropout`：丢弃注意力权重的概率。此参数有助于泛化。有效值介于 0 到 1 之间（含两端值）。
  + `ffn_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 之间（含两端值），但必须小于学习率。
+ **DPO 配置**
  + `beta`：确定模型应与训练数据或原始模型的拟合度。有效值介于 0.001 到 0.5 之间（含两端值）。

    指定较大的值（例如 0.5）会保留更多的参考模型行为，同时学习新偏好的速度更慢。指定较小的值（例如 0.01 到 0.05）会更快地学习新偏好，但可能会有偏离参考模型行为的风险。

**全秩 DPO 配方**  
以下是 DPO 的全秩配方

```
## Run config
run:
  name: "my-dpo-micro-job"             # A descriptive name for your training job
  model_type: "amazon.nova-micro-v1:0:128k"  # Model variant specification, do not change
  model_name_or_path: "nova-micro/prod"      # Base model path, do not change
  replicas: 2                     # Number of compute instances for training, allowed values are 2, 4, 8
  data_s3_path: s3:Replace with your S3 bucket name/input.jsonl
  validation_data_s3_path: [OPTIONAL] s3:your S3 bucket name/input.jsonl
  output_s3_path: [S3_PATH_TO_STORE_MANIFEST]

## Training specific configs
training_config:
  max_length: 32768               # Maximum context window size (tokens).
  global_batch_size: 64           # Global batch size, allowed values are 16, 32, 64.

  trainer:
    max_epochs: 2                # Number of training epochs

  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
    ffn_dropout: 0.0             # Dropout for feed-forward networks, must be between 0.0 and 1.0

    optim:
      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
      betas:                   # Adam optimizer betas, must be between 0.0 and 1.0
        - 0.9
        - 0.999
      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

    dpo_cfg:
        beta: 0.1               # Strength of preference enforcement. Limits: [0.001, 0.5]

    peft:
        peft_scheme: null        # Disable LoRA, trigger full rank fine tuning
```

## 低秩适应 DPO
<a name="customize-fine-tune-hyperpod-dpo-lora"></a>

可用于低秩适应 DPO 的 Amazon Nova 参数如下所示：
+ **运行配置**
  + `name`：训练作业的描述性名称。这有助于您在 AWS 管理控制台中识别您的作业。
  + `model_type`：要使用的 Nova 模型变体。可用选项有 `amazon.nova-micro-v1:0:128k`、`amazon.nova-lite-v1:0:300k` 或 `amazon.nova-pro-v1:0:300k`。
  + `model_name_or_path`：基本模型的路径。从 `nova-micro/prod`、`nova-lite/prod`、`nova-pro/prod` 或训练后检查点的 S3 路径（`s3://<escrow bucket>/<job id>/outputs/checkpoints`）中选择要使用的模型。
  + `replicas`：要在分布式训练中使用的计算实例数。可用值因所选的模型而异。Amazon Nova Micro 支持 2、4 或 8 个副本。Amazon Nova Lite 支持 4、8、16 或 32 个副本。Amazon Nova Pro 支持 6、12 或 24 个副本。
+ **训练配置**
  + `max_length`：以词元为单位的最大序列长度。这决定了训练的上下文窗口大小。DPO 支持的最大值为 32768 个词元。

    更长的序列将会提高训练效率，但会以增加内存需求为代价。我们建议您根据数据分布情况设置 `max_length` 参数。
+ **训练器设置**
  + `max_epochs`：遍历训练数据集的次数。

    通常，较大的数据集需要较少的 epoch 就能收敛，而较小的数据集则需要较多的 epoch 才能收敛。我们建议您根据数据大小调整 epoch 数。
+ **模型设置**
  + `hidden_dropout`：丢弃隐藏状态输出的概率。将该值增加约 0.0 到 0.2，以减少对较小数据集的过度拟合。有效值介于 0 到 1 之间（含两端值）。
  + `attention_dropout`：丢弃注意力权重的概率。此参数有助于泛化。有效值介于 0 到 1 之间（含两端值）。
  + `ffn_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 之间（含两端值），但必须小于学习率。
+ **DPO 配置**
  + `beta`：确定模型应与训练数据或原始模型的拟合度。有效值介于 0.001 到 0.5 之间（含两端值）。

    指定较大的值（例如 0.5）会保留更多的参考模型行为，同时学习新偏好的速度更慢。指定较小的值（例如 0.01 到 0.05）会更快地学习新偏好，但可能会有偏离参考模型行为的风险。
+ **LoRA 配置参数**
  + `peft_scheme`：设置为 `lora` 将启用低秩适应，从而生成效率更高、输出更小的模型。还提供以下特定于 LoRA 的属性：
    + `alpha`：LoRA 权重的缩放系数。通常将其设置为与 `adapter_dim` 相同的值。
    + `adapter_dropout`：LoRA 参数的正则化参数。

**LoRA DPO 配方**  
以下是 LoRA DPO 的配方。

```
## Run config
run:
    name: "my-lora-run"             # A descriptive name for your training job
    model_type: "amazon.nova-lite-v1:0:300k"  # Model variant specification, do not change
    model_name_or_path: "nova-lite/prod"      # Base model path, do not change
    replicas: 4                     # Number of compute instances for training. All supported values: {4, 8, 16}
    data_s3_path: s3:Replace with your S3 bucket name/input.jsonl
    validation_data_s3_path: [OPTIONAL] s3:your S3 bucket name/input.jsonl
    output_s3_path: [S3_PATH_TO_STORE_MANIFEST]

## Training specific configs
training_config:
    max_length: 16384               # Maximum context window size (tokens). Should be between [1024, 32768] and multiple of 1024.
                                    # Note: Image dataset for DPO has a limit on 20k samples and 16384 max_length
    global_batch_size: 64           # Total samples per step. Limits: {16, 32, 64, 128, 256}

    trainer:
        max_epochs: 2               # Number of training epochs

    model:
        hidden_dropout: 0.0          # Dropout for hidden states. Limits: [0.0, 1.0]
        attention_dropout: 0.0       # Dropout for attention weights. Limits: [0.0, 1.0]
        ffn_dropout: 0.0             # Dropout for feed-forward networks. Limits: [0.0, 1.0]

        optim:
            lr: 1e-5                 # Learning rate
            name: distributed_fused_adam  # Optimizer algorithm, do not change
            adam_w_mode: true        # Enable AdamW mode
            eps: 1e-08               # Epsilon for numerical stability
            weight_decay: 0.01       # L2 regularization strength
            betas:                   # Adam optimizer betas. Limits: [0.0, 1.0]
                - 0.9
                - 0.999
            sched:
                warmup_steps: 10     # Learning rate warmup steps
                constant_steps: 0    # Steps at constant learning rate
                min_lr: 1e-6         # Minimum learning rate

        dpo_cfg:
            beta: 0.01               # Strength of preference enforcement. Limits: [0.001, 0.5]

        peft:
            peft_scheme: "lora"      # Enable LoRA for parameter-efficient fine-tuning
            lora_tuning:
                loraplus_lr_ratio: 20.0  # LoRA+ learning rate scaling factor. Limits: [0.0, 100.0]
                alpha: 64            # Scaling factor for LoRA weights. [32, 64, 96, 128, 160, 192]
                adapter_dropout: 0.01  # Regularization for LoRA parameters. Limits: [0.0, 1.0]
```

**限制**  
DPO 具有以下限制：
+ 不会保存中间检查点以供评估，也无法从中间检查点恢复。仅保存最后一个检查点。
+ 要调整超参数，请遵循[选择超参数](https://docs.aws.amazon.com/nova/latest/userguide/customize-fine-tune-hyperparameters.html)中的指导。

# 近端策略优化 (PPO)
<a name="nova-ppo"></a>

近端策略优化 (PPO) 是使用多个机器学习模型对模型进行训练并评分的过程。以下模型是 PPO 流程的一部分：
+ **角色训练或策略模型**：一种监督式微调（SFT）模型，每个 epoch 都会进行微调和更新。更新是通过对提示进行采样、生成完成结果以及使用剪辑代理目标更新权重完成的。这可以限制单 Token 对数收益的变化，以使各策略步骤*接近于*上一个步骤，从而维持训练的稳定性。
+ **角色生成模型**：一种生成提示完成结果或响应的模型，通过奖励模型和评估模型进行判断。该模型的权重在每个 epoch 从角色训练或策略模型中进行更新。
+ **奖励模型**：一种具有冻结权重的模型，用于给角色生成模型打分。
+ **评估模型**：一种具有未冻结权重的模型，用于给角色生成模型打分。该分数通常被视为对角色生成剩余词元时获得的总奖励估计值。
+ **锚点模型**：一种具有冻结权重的 SFT 模型，用于计算角色训练模型和基本模型之间的 KL 散度。锚点模型可确保角色模型的更新与基础模型相比不会太剧烈。剧烈变化可能导致不稳定或性能下降。

训练数据必须采用 JSONL 格式，其中每行都包含一个代表训练示例的 JSON 对象。示例如下：

```
{
    "turns": ["string", "string", ...], // Required
    "turns_to_mask": [integer, integer, ...], // Required
    "reward_category": "string", // Required
    "meta_data": {} // Optional
}
```
+ `turns` 是代表对话序列的对话字符串数组。此行包含系统提示、用户消息和机器人回复。用户消息通常以“Bot:”结尾，指示模型输出从此处开始。例如 `[["System prompt"], ["User: Question Bot:"], ["Bot response"]]`。
+ `turns_to_mask` 是一个基于 0 的索引数组，用于标识哪些回合不应接收梯度更新。掩码回合通常是系统提示和用户回合。例如，`[0, 1, 3]` 掩蔽系统提示和用户消息（第一和第三条消息）。
+ `reward_category` 是一个字符串，用于标识要评估模型性能的哪些方面。它用于在训练期间选择适当的奖励模型类别。奖励类别适用于以下奖励类别：`default`、`math`、`coding`、`if`、`rag`、和 `rai`。
+ `meta_data` 是一个可选对象，其中包含其他上下文或真实信息。这可能包括标识符、来源信息或对话上下文。该结构能够灵活满足您的数据集需求。

以下是记录示例：

```
{
    "turns": ["You are a helpful AI assistant.",
        "User: What is ML? Bot:",
        "Machine learning is...", "User: Examples? Bot:",
        "Email spam filtering is..."
    ],
    "turns_to_mask": [0, 1, 3],
    "reward_category": "default",
    "meta_data": {
        "messages": [{
                "role": "system",
                "content": "You are a helpful AI assistant."
            },
            {
                "role": "user",
                "content": "What is ML?"
            },
            {
                "role": "assistant",
                "content": "Machine learning is..."
            },
            {
                "role": "user",
                "content": "Examples?"
            },
            {
                "role": "assistant",
                "content": "Email spam filtering is..."
            }
        ]
    }
}
```

奖励建模框架实现了跨不同类别目标的多维优化，以促进稳健的模型收敛。应根据模型必须优化的任务来选择奖励类别。

我们建议按照以下准则来为任务选择合适的框架：
+ `default`：用于标准对话任务和基本交互的通用优化器。用于一般对话和讨论、基本写作任务、简单问答和非专业知识查询。

  示例如下：

  ```
  {
      "turns": ["Write a summary of climate change"],
      "turns_to_mask": [0],
      "reward_category": "default"
  }
  ```
+ `math`：用于数学计算和数值推理任务的专业优化器。用于解决数学问题、算术计算、代数方程、几何问题和统计分析。

  示例如下：

  ```
  {
      "turns": ["Calculate the derivative of x²"],
      "turns_to_mask": [0],
      "reward_category": "math"
  }
  ```
+ `coding`：专门用于编程和软件开发相关查询的类别。用于代码实现、调试帮助、算法设计、技术文档和系统架构问题。

  示例如下：

  ```
  {
      "turns": ["Write a function to check if a string is palindrome"],
      "turns_to_mask": [0],
      "reward_category": "coding"
  }
  ```
+ `if`：针对需要精确的程序执行和分步指导的任务的类别。用于多步骤过程、顺序指令、复杂任务分解和过程文档。

  示例如下：

  ```
  {
      "turns": ["Provide steps to deploy a web application"],
      "turns_to_mask": [0],
      "reward_category": "if"
  }
  ```
+ `rag`：一种奖励类别，用于专门根据检索到的上下文信息回答查询的任务。当应直接从提供的参考材料中得出响应时使用，在不超出检索信息范围的情况下合成事实内容，确保答案基于所提供的背景而不是常识。

  示例如下：

  ```
  {
              "turns": ["The Synthesis Report integrates findings from all six IPCC assessment cycles, revealing that global surface temperature has increased 1.1°C from 1850-1900 to 2011-2020, with human activities unequivocally identified as the cause of this warming. Alarmingly, current policies put the world on track for 3.2°C warming by 2100. The document identifies 5 key climate system "tipping points" approaching and emphasizes that greenhouse gas emissions must decline 43% by 2030 (compared to 2019 levels) to limit warming to 1.5°C. Climate-related risks will escalate with every increment of warming, with loss and damage disproportionately affecting vulnerable populations. Despite some progress, climate adaptation remains uneven with significant gaps, and financial flows continue to fall below levels needed for mitigation goals.",
              "What were the key findings of the latest IPCC climate report?"],
              "turns_to_mask": [0, 0],
              "reward_category": "rag"
              }
  ```
+ `rai`：一种奖励类别，用于需要应用负责任的人工智能原则（例如公平、透明和道德）的任务。用于评估人工智能系统中的潜在偏见、确保隐私考虑、解决道德困境以及促进包容性设计原则。

  示例如下：

  ```
  {
              "turns": ["Identify potential bias concerns when developing a loan approval algorithm and suggest mitigation strategies"],
              "turns_to_mask": [0],
              "reward_category": "rai"
              }
  ```

**掩蔽回合**  
在训练数据集中，`turns_to_mask` 参数对于控制哪些对话回合在训练期间接收梯度更新至关重要。这个索引数组决定了模型应该学习生成对话的哪些部分，而哪些部分应仅被视为上下文。适当的掩蔽可确保模型学习相应的响应模式，同时避免根据系统提示或用户输入进行训练，而这可能会降低性能。

建议采取以下掩蔽指南：
+ **始终掩蔽索引 0**：系统提示绝不接收梯度更新。
+ **始终掩蔽用户回合**：防止模型学习生成用户输入。
+ **模式一致性**：对相似的对话结构使用相同的掩蔽模式，例如针对多回合对话使用 0、1、3、5。
+ **选择性训练**：掩蔽早期的机器人回复，将训练重点放在改进的最终回复上。
+ **思维链保留**：在训练推理序列时，只掩蔽系统和用户回合。
+ **质量筛选**：掩蔽低质量的助手响应以防止性能下降。
+ **情境优化**：确保掩蔽的回合不会移除后续响应所需的重要上下文。

有效掩蔽的关键是监控训练指标和验证性能，以确定您的掩蔽策略是否保留了必要的上下文，同时将梯度更新重点放在所需的模型输出上。

**启用 KL 散度损失**  
要启用 KL 散度损失，需要启用锚点服务器以计算当前策略与原始分配的差异。需要指定 KL 损失类型，并且系数必须是非零值。较高的系数值有助于模型不会与原始策略有太大偏差，从而减少总体性能的变化。较低的系数值会使与先前策略的偏差更大，从而提高目标指标的性能，但会影响总体性能。

```
ppo_anchor:
  max_length: 8192
  trainer:
    num_nodes: ${recipes.run.cm_replicas}
  model:
    global_batch_size: 32

ppo_actor_train:
  model:
    ######## Use KL in actor loss ########
    kl_loss_type: low_var_kl
    kl_loss_coeff: 0.1

    ######## Use KL in reward model ######
    kl_reward_penalty_coeff: 0.1
```

**学习率**  
评估模型和策略模型的学习率可以调整，3e-6 是默认的平衡选择。较高的学习率通常会导致训练不稳定，这可以通过 KL 散度峰值和不稳定的策略行为来识别。较低的学习率可能会导致收敛问题和学习缓慢，这表现为奖励停滞并且策略更新很少。定期监控 KL 散度、奖励分数和值损失有助于确定是否在训练期间调整学习率。

```
ppo_critic:
  model:
    optim:
      lr: 3e-6

ppo_actor_train:
  model:
    optim:
      lr: 3e-06
```

**全局批次大小**  
全局批量大小会显著影响 Amazon Nova 中的 PPO 性能，批量较大通常可以提高训练稳定性和梯度估计，同时实现更高效的并行处理。但是，批量大小过大会导致效用递减，并且可能会受到可用内存的限制，因此需要谨慎平衡学习率和其他超参数。

```
ppo_actor_train:
  model:
    global_batch_size: 160
```

可用于 PPO 调整的 Amazon Nova 参数包括：
+ **运行配置**
  + `actor_train_replicas`：用于角色训练模型的计算实例数量。可用值因所选的模型而异。Amazon Nova Micro 支持 1 或 2 个副本。Amazon Nova Lite 支持 1、2 或 4 个副本。Amazon Nova Pro 支持 3、6 或 12 个副本。
  + `rm_replicas`：用于奖励模型的计算实例数量。建议您为任何模型大小都使用一个副本。
  + `cm_replicas`：用于评估模型的计算实例数量。建议您为任何模型大小都使用一个副本。
  + `actor_generation_replicas`：用于角色生成模型的计算实例数量。可用值因所选的模型而异。Amazon Nova Micro 支持 1 个副本。Amazon Nova Lite 支持 1 或 2 个副本。Amazon Nova Pro 支持 1 或 2 个副本。
  + `am_replicas`：用于锚点模型的计算实例数量。建议您为任何模型大小都使用一个副本。
+ **角色训练配置（策略配置）**
  + `max_steps`：微调或训练角色训练模型的最大步骤数。在此，一个步骤被定义为推出，然后使用 `global_batch_size` 数量的样本训练角色训练模型。一个 epoch 被定义为 `global_batch_size * trajectory_buffer_scale`。

    此处选择的值将因您的使用案例和数据集的复杂性而异。我们建议从 65 个 epoch 或 520 步开始，即 epoch 数乘以 `trajectory_buffer_scale` 的值。但是，有些任务需要更长的 PPO 训练时间才能达到相同的性能。

    对于 PPO，训练指标（例如来自 [ml-flow](https://docs.aws.amazon.com/sagemaker/latest/dg/mlflow-create-tracking-server.html) 控制台的饱和奖励模型分数和平均动作长度）有助于确定最佳评估点。
  + `actor_model_max_length`：发送到角色生成组件以生成最终内容的输入数据的最大长度。
  + `reward_model_max_length`：发送到奖励服务器以获得最终内容评分的输入数据的最大长度。
  + `trajectory_buffer_scale`：此缓冲区表示在更新权重和生成新推出之前，使用旧角色训练（策略）模型生成的推出数量。支持的值有 1、2、4、8 和 16。

    如果 `trajectory_buffer_scale` 为 1，则训练基于策略。这意味着推出是使用最新的模型权重生成的，但吞吐量会受到影响。如果值为 16，则模型稍微偏离策略，但吞吐量会更高。我们建议每个模型从 8 开始。
  + `kl_reward_penalty_coeff`：这是 KL 散度术语，可确保更新不会太猛烈，并且策略不会从基本模型或 SFT 模型创建草稿。
  + `kl_loss_coeff`：该值控制 KL 散度惩罚对 PPO 中总体训练目标的影响程度。
  + `kl_loss_type`：该值指定如何计算当前策略分布和参考策略分布之间的差异。可用的 `kl_loss_types` 有 `kl`（标准 KL 散度）、`mse`（均方误差）、`abs`（对数概率之间的绝对差）和`low_var_kl`（低方差 KL 近似值）。
  + `model.clip_ratio`：PPO 中的角色裁剪比（ε）是一个超参数，用于限制每次更新期间策略可以更改的程度。
  + `model.optim.lr`：角色模型中用于代理模型损失训练的学习率。
  + `model.lam`：优势估算过程的一部分。λ 越高，长期奖励权重越大，但方差也越高，而 λ 越低，则更多地关注方差较低但偏差更大的即时奖励。
  + `model.ent_coeff`：PPO 中的熵损失通过在策略变得确定性过高（即，总是充满信心地选择相同的操作）时对其进行惩罚来鼓励探索。
+ **奖励模型配置**
  + `global_batch_size`：使用奖励模型对最终内容进行评分的批量大小。如果 `ppo_actor_train.model.global_batch_size` 大于 `ppo_reward.model.global_batch_size`，则分多个批次进行处理。请注意，`ppo_actor_train.model.global_batch_size % ppo_reward.model.global_batch_size` 必须等于 0。
  + `max_length`：奖励模型的最大上下文长度。这应该与 `ppo_actor_train.model.max_length` 相同。
+ **评估模型配置**
  + `global_batch_size`：评估模型的批量大小。评估模型将为角色模型提供的响应中的每个词元提供价值估计。批量大小同时用于推理和训练。

    请注意，`ppo_actor_train.model.global_batch_size % ppo_critic.model.global_batch_size` 必须等于 0 和 `ppo_actor_train.model.global_batch_size * ppo_actor_train.model.trajectory_buffer_size % ppo_critic.model.global_batch_size == 0`。
  + `max_length`：评估模型的最大上下文长度。这应该与 `ppo_actor_train.model.max_length` 相同。
  + `model.optim.lr`：角色模型中用于代理模型损失训练的学习率。
+ **锚点模型配置**
  + `global_batch_size`：生成冻结 SFT 或锚点模型日志的批量大小。请注意，`ppo_actor_train.model.global_batch_size % ppo_anchor.model.global_batch_size` 必须等于 0。
  + `max_length`：奖励模型的最大上下文长度。这应该与 `ppo_actor_train.model.max_length` 相同。
+ **角色生成模型配置**
  + `actor_model_max_length`：角色模型生成组件的最大上下文长度。这应该与 `ppo_actor_train.model.max_length` 相同。

**PPO 配方**  
以下是 PPO 的配方。

```
## Run config
run:
  name: ndry-ppo-pro
  model_type: amazon.nova-pro-v1:0:300k
  model_name_or_path: nova-pro/prod
  data_s3_path: s3://testing/train.jsonl # Your training data S3 path

  actor_train_replicas: 6 # Actor train model replicas
  rm_replicas: 1 # Reward model replicas
  cm_replicas: 1 # Critic model replicas
  actor_generation_replicas: 2 # Actor generation model replicas
  am_replicas: 1 # Anchor model replicas

## Training config for each PPO component
ppo_reward:
  max_length: 8192 # model architecture max length
  trainer:
    num_nodes: ${recipes.run.rm_replicas}
  model:
    global_batch_size: 16

ppo_critic:
  max_length: 8192
  trainer:
    num_nodes: ${recipes.run.cm_replicas}
  model:
    global_batch_size: 16
    optim:
      lr: 3e-6
      name: distributed_fused_adam
      adam_w_mode: true
      eps: 1e-06
      weight_decay: 0.0
      betas:
        - 0.9
        - 0.999

ppo_anchor:
  max_length: 8192
  trainer:
    num_nodes: ${recipes.run.am_replicas}
  model:
    global_batch_size: 16

ppo_actor_generation:
  actor_model_max_length: 8192
  trainer:
    num_nodes: ${recipes.run.actor_generation_replicas}

ppo_actor_train:
  max_length: 8192
  max_steps: 520 # Stopping criteria Desired epoch num * trajectory_buffer_scale
  actor_model_max_length: 8192 # truncate input data to max length
  reward_model_max_length: 8192 # truncate input data to max length
  trajectory_buffer_scale: 8
  trainer:
    num_nodes: ${recipes.run.actor_train_replicas}
  model:
    global_batch_size: 160
    ent_coeff: 0
    clip_ratio: 0.2
    lam: 1
    kl_loss_coeff: 0.0
    kl_loss_type: low_var_kl
    kl_reward_penalty_coeff: 0.0
    hidden_dropout: 0.0 # Dropout probability for hidden state transformer.
    attention_dropout: 0.0 # Dropout probability in the attention layer.
    ffn_dropout: 0.0 # Dropout probability in the feed-forward layer.
    optim:
      lr: 3e-06
      name: distributed_fused_adam # only this one is available for p0.
      adam_w_mode: true
      eps: 1e-08
      weight_decay: 0.0
      betas:
        - 0.9
        - 0.999
```

**限制**  
PPO 具有以下限制：
+ 不会保存中间检查点以供评估，也无法从中间检查点恢复。仅保存最后一个检查点。
+ 不支持多模态数据集。
+ 训练作业不会自动停止。您必须使用 SageMaker HyperPod CLI 停止作业。
+ TensorBoard 不支持评估训练指标。
+ 要调整超参数，请遵循[选择超参数](https://docs.aws.amazon.com/nova/latest/userguide/customize-fine-tune-hyperparameters.html)中的指导。