

# Amazon Nova Forge
<a name="nova-forge"></a>

Amazon Nova Forge 是一项首创服务，让组织能够以最简单、最具成本效益的方式使用 Nova 构建自己的前沿模型。

Amazon Nova Forge 引入了“开放训练”模型的概念，使组织能够访问各种早期模型检查点，并在模型训练的每个阶段将专有数据与 Amazon 精选的数据集相结合。这使得模型能够最大限度地从专有数据中学习，同时降低遗忘推理等基础技能的风险。

Nova Forge 提供以下关键功能：
+ 访问模型开发各个阶段的检查点，并在新的 Nova 模型广泛使用之前加以利用
+ 将专有数据与 Amazon Nova 精选的训练数据相结合
+ 在环境中使用奖励函数执行强化学习
+ 使用一键式配方，通过可视化工作流或命令行界面优化 Nova 的构建过程
+ 使用负责任的人工智能工具包，在训练过程中使模型符合 Amazon Nova 负责任的人工智能指南，并在推理过程中实施运行时控制以调节模型响应。

## 先决条件
<a name="nova-forge-prereq"></a>

**Topics**
+ [

### 订阅 Nova Forge
](#nova-forge-prereq-access)
+ [

### 其他先决条件
](#nova-forge-prereq-other)

### 订阅 Nova Forge
<a name="nova-forge-prereq-access"></a>

要请求访问 Amazon Nova Forge 服务，请将以下标签添加到控制台 IAM 角色：键为 forge-subscription，值为 true。将此标签添加到角色后，请前往 SageMaker AI 控制台 >“模型训练和自定义”，然后单击“Nova Forge”。在此页面上，您将找到有关服务、定价信息和功能的详细信息。您可以请求订阅，然后从此页面管理订阅。

1. 该角色应具有调用 api `ListAttachedRolePolicy` 的权限，并且响应应包含 `AdministratorAccess` 或 `AmazonSageMakerFullAccess` 策略。

1. 该角色应具有调用 api `ListRoleTags` 的权限，并且响应标签应包含 `tag.key=forge-subscription`。

### 其他先决条件
<a name="nova-forge-prereq-other"></a>

此外，还应确保满足以下先决条件：

1. [一般先决条件](https://docs.aws.amazon.com//nova/latest/nova2-userguide/nova-model.html#nova-model-general-prerequisites)

1. 用户已完成其他步骤：将受限实例组（RIG）添加到 SageMaker HyperPod 集群（要完成此操作，请按照[此处](https://docs.aws.amazon.com//sagemaker/latest/dg/nova-hp-cluster.html)的步骤进行操作）

# Nova Forge 访问与设置
<a name="nova-forge-access"></a>

要开始使用 Nova Forge，请遵循以下两个步骤：
+ 步骤 1：订阅 Nova Forge
+ 步骤 2：设置 HyperPod 基础设施

## 获取 Nova Forge 文档
<a name="nova-forge-get-docs"></a>

如需获取 Nova Forge 文档，请按照以下步骤操作：

```
mkdir NovaForgeHyperpodCLI
cd NovaForgeHyperpodCLI
aws s3 cp s3://nova-forge-c7363-206080352451-us-east-1/v1/ ./ --recursive
pip install -e .
```

## 步骤 1：订阅 Nova Forge
<a name="nova-forge-step1"></a>

### 快速摘要：
<a name="nova-forge-quick-summary"></a>

1. 确认您拥有 Amazon Web Services 账户的管理员访问权限。

1. 导航到 SageMaker AI 控制台并请求访问 Nova Forge。

1. 订阅请求获批后，等待 Nova 团队通过电子邮件发送确认信息。

1. 使用 `forge-subscription` 标签标记执行角色。此标签是访问 Nova Forge 功能和检查点所必需的。将以下标签添加到执行角色：
   + 键：`forge-subscription`
   + 值：`true`

### 详细指南
<a name="nova-forge-detailed-guide"></a>

要订阅 Nova Forge 并有效使用自定义服务，Amazon Web Services 客户必须拥有其 Amazon Web Services 账户的管理员访问权限，或者由其管理员授予其管理员访问权限。本文档概述了执行以下操作所需的步骤：
+ 获取管理员访问权限
+ 设置用于订阅 Nova Forge 的策略
+ 访问自定义配方
+ 配置自定义
+ 监控工作流
+ 评估自定义模型检查点

### 选项 A
<a name="nova-forge-option-a"></a>

流程 1：账户用户必须联系账户管理员以请求以下操作：
+ 通过 IAM 将 `forge-subscription` 标签添加到账户（有关步骤，请参阅附录 A）。
+ 通过 IAM 添加 `ListRoleTags` 和 `ListAttachedRolePolicies` 权限（有关步骤，请参阅附录 B）。

![\[alt text not found\]](http://docs.aws.amazon.com/zh_cn/nova/latest/nova2-userguide/images/Onboarding-option-a.png)


### 选项 B
<a name="nova-forge-option-b"></a>

流程：账户用户必须联系账户管理员以请求获得账户的管理员访问权限。
+ 获得管理员访问权限后，请按照流程 2 中的步骤进行操作。

### 流程 2：具有管理员访问权限的 Amazon Web Services 账户
<a name="nova-forge-flow2"></a>
+ 通过 IAM 将 forge-subscription 标签添加到账户。有关步骤，请参阅附录 A

### 附录 A. 将 forge-subscription 策略添加到 Amazon Web Services 账户
<a name="nova-forge-appendix-a"></a>

1. 转到 Amazon Web Services IAM 控制面板。单击左侧的“角色”。搜索管理员并单击管理员角色  
![\[alt text not found\]](http://docs.aws.amazon.com/zh_cn/nova/latest/nova2-userguide/images/add-forge-sub-policy.png)

1. 选择 <AssumedRoleToUse>（例如 libsAdminAccess）。单击“标签”选项卡。  
![\[alt text not found\]](http://docs.aws.amazon.com/zh_cn/nova/latest/nova2-userguide/images/add-forge-sub-policy-2.png)

1. 单击“管理”选项卡。添加新标签。在“键”下输入“forge-subscription”，然后单击“保存更改”  
![\[alt text not found\]](http://docs.aws.amazon.com/zh_cn/nova/latest/nova2-userguide/images/add-forge-sub-tag-policy.png)

1. 确保“标签”部分显示 forge-subscription 作为键。  
![\[alt text not found\]](http://docs.aws.amazon.com/zh_cn/nova/latest/nova2-userguide/images/forge-tag-policy-verify.png)

### 附录 B. 由管理员将 ListRoleTags 和 ListAttachedPolicies 策略添加到非管理员角色的 Amazon Web Services 账户
<a name="nova-forge-appendix-b"></a>

1. 转到 Amazon Web Services IAM 控制面板。单击左侧的“角色”。搜索 <AssumedRoleToUse>（例如 ForgeAccessRole）并单击该 <AssumedRoleToUse>（例如 ForgeAccessRole）角色。  
![\[alt text not found\]](http://docs.aws.amazon.com/zh_cn/nova/latest/nova2-userguide/images/forge-list-tags-policy.png)

1. 单击 <AssumedRoleToUse>（例如 ForgeAccessRole）角色并选择“标签”。添加类型为“forge-subscription”的新标签  
![\[alt text not found\]](http://docs.aws.amazon.com/zh_cn/nova/latest/nova2-userguide/images/forge-tag-appendix.png)

1. 在“权限”下，添加新权限：“添加权限”→“创建内联策略”→“添加以下所列策略”

   ```
   {
       "Version": "2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "VisualEditor0",
               "Effect": "Allow",
               "Action": [
                   "iam:ListRoleTags",
                   "iam:ListAttachedRolePolicies"
               ],
               "Resource": "*"
           }
       ]
   }
   ```  
![\[alt text not found\]](http://docs.aws.amazon.com/zh_cn/nova/latest/nova2-userguide/images/forge-add-tag-polices-example.png)

## 步骤 2：设置 HyperPod 基础设施
<a name="nova-forge-step2"></a>

按照[讲习会说明](https://catalog.us-east-1.prod.workshops.aws/workshops/dcac6f7a-3c61-4978-8344-7535526bf743/en-US)，设置必要的基础设施，配置启用 Forge 功能的环境。

## 内容审核设置
<a name="nova-forge-content-moderation"></a>

如果需要访问 Nova Forge，则 Amazon Nova Lite 1.0 和 Pro 1.0 模型支持可自定义的内容审核设置（CCMS）。CCMS 允许调整内容审核控制，以符合特定的业务需求，同时保持必要的负责任的人工智能保护措施。要确定业务模型是否适合使用 CCMS，请联系 AWS 客户经理。

有关使用自定义模型配置和使用 CCMS 的更多信息，请参阅[负责任的人工智能工具包和内容审核](nova-responsible-ai-toolkit.md)一节。

# 持续预训练与中期训练
<a name="nova-forge-cpt"></a>

**注意**  
订阅后将提供详细文档

Nova Forge CPT 提供了超越标准 CPT 的高级功能，包括访问中间检查点以及与 Nova 预训练语料库进行数据混合。这些功能可以实现更高效的领域适应性，并更好地保留模型的通用能力。

## 什么是中间检查点？为什么需要它们？
<a name="nova-forge-cpt-checkpoints"></a>

中间检查点是 Amazon Nova 模型在预训练的不同阶段、在模型达到最终生产就绪状态之前保存的快照。在模型开发过程中，Amazon Nova 会经历多个训练阶段：使用恒定学习率进行初始预训练、学习率衰减、上下文扩展训练，以及最后的指令遵循对齐和安全训练。对于 CPT，中间检查点通常比最终的生产检查点更可取，因为它们更具可塑性，更易于领域适应。生产检查点经过了大量的指令遵循对齐和安全训练，这优化了模型的通用对话能力，但可能使其在 CPT 期间难以学习新的领域特定模式。相比之下，部分预训练和完全预训练的纯文本检查点保留了模型的预训练特征。它们尚未被强烈引导至特定行为模式，使其成为更高效的领域适应起点。当执行大规模 CPT（>100 亿个词元）时，从中间检查点开始通常可以加快收敛速度、提高训练稳定性以及更高效地获取领域知识。然而，执行小规模 CPT（<100 亿个词元）时，或者需要保留指令遵循能力时，生产检查点可能更合适，因为它允许在保持模型对话能力的同时进行领域适应。

CPT 需要多个中间检查点，因为它们提供了不同级别的模型可塑性，这会影响模型吸收新领域知识的效率。最终的生产检查点经过了大量的指令遵循对齐和安全训练，这优化了模型的通用对话能力，但也使其难以学习新的领域特定模式。换句话说，检查点通过训练后步骤得到了强化。相比之下，早期的检查点保留了模型的预训练特征，没有被强烈引导至特定行为，因此更具可塑性，更容易接受领域适应。

为实现最佳训练效率，我们提供了多个中间检查点。

## 有哪些可用的检查点？
<a name="nova-forge-cpt-available"></a>

**Nova 2.0**  
有三个 Amazon Nova Lite 2.0 检查点。
+ PRE-TRAINED – [`nova-lite-2/pretraining-text-RD`]：这是在 Amazon Nova 预训练的恒定学习率和衰减阶段（使用数万亿个词元进行训练）之后的检查点。
+ MID-TRAINED – [`nova-lite-2/pretraining-text-CE`]：此检查点允许以比预训练更保守的学习率引入中等数量的非结构化数据，从而吸收领域特定知识，同时避免灾难性遗忘。
+ POST-TRAINED – [`nova-lite-2/prod`]：这是模型经过所有预训练和训练后步骤后完全对齐的最终检查点。

下表详细说明了预训练和中期训练的不同条件。


| 数据类型 | 执行 | 使用检查点 | 
| --- |--- |--- |
| 大规模的非结构化原始领域数据（文档、日志、文章、代码等） | 持续预训练 | 预训练 | 
| 大规模的非结构化原始领域数据（文档、日志、文章、代码等） | 中期训练 | 预训练 | 
| 小规模的非结构化原始数据；结构化推理轨迹/CoT 数据 | 中期训练 | 中期训练 | 
| 结构化演示（高质量输入-输出对、精选任务指令、多回合对话） | 全面微调 | 中期训练 | 
| 结构化演示（高质量输入-输出对、精选任务指令、多回合对话） | 参数高效微调 | 训练后 | 

## 应该使用哪个检查点？
<a name="nova-forge-cpt-which"></a>

部分预训练的纯文本检查点和完全预训练的纯文本检查点通常收敛更快，并且领域适应所需的训练步骤更少。然而，它们没有经过指令调整，需要经过训练后的步骤才能执行有用的任务并遵循指令。GA 检查点可能需要更多步骤来适应，但为小规模实验提供了更安全的起点，即使在 CPT 训练后也能保持其部分训练后能力。

通常，对于大型训练数据集（>100 亿个词元），从部分预训练的纯文本检查点或完全预训练的纯文本检查点开始，可以提高训练的效率和稳定性，因为模型的知识库将大幅修改。对于小型数据集（<100 亿个词元），使用 GA 检查点可以在适应领域的同时保留指令遵循能力。

## 如何为 Nova 2.0 使用数据混合？
<a name="nova-forge-cpt-mixing"></a>

使用新的领域数据执行 CPT 时，将新数据与模型在预训练阶段之前使用过的部分数据混合非常有益。将旧数据与新的领域数据混合可以解决两个问题：
+ 遗忘控制：通过保留模型现有的技能和知识来防止灾难性遗忘。如果不进行数据混合，仅在狭窄领域数据上进行训练会导致模型覆盖其通用能力。例如，仅使用法律文件训练的模型可能会失去编码或进行数学运算的能力。混合通用领域数据集可以在获取新域知识的同时保留这些通用技能。
+ 优化稳定性：通过锚定模型的内部表示来保持训练稳定性。CPT 期间，模型已学习的特征会修改，而数据混合提供了来自不同来源的梯度，可以顺利地引导这种适应过程。如果没有数据混合，在狭窄分布上训练可能会导致梯度不稳定，即模型表示变化过于剧烈，从而导致训练发散、损失峰值或现有能力崩溃。这就是稳定性与可塑性的权衡：模型需要具备足够的可塑性来学习新的领域知识，同时也要足够稳定，不至于破坏已有的知识。

**Nova CPT 数据混合能力**  
访问 Amazon Nova 预训练数据和检查点是 Amazon Nova CPT 自定义服务的核心功能之一。Amazon Nova CPT 自定义服务可以轻松将领域数据与 Amazon Nova 的预训练语料库混合。此外，可以更改特定 Amazon Nova 数据类别（例如代码、数学、推理等）的采样比率，并控制其比例以补充领域数据。这可以在使模型适应特定领域的同时，强化与使用案例相符的能力。

**寻找最佳混合比率**  
Amazon Nova 数据与领域数据的最佳比率取决于数据集的领域、复杂性、规模、质量以及保持通用能力的重要性。这个比率需要通过实验来发现。以下是决定混合多少 Amazon Nova 数据的实验框架。

选择具有代表性的领域数据子集（例如 50 亿个词元），并在所有实验运行中保持此数量不变。

运行小规模 CPT 实验，仅改变混合的 Amazon Nova 数据量：
+ 不混合：100% 领域数据 → 仅 50 亿领域数据（总计 50 亿）
+ 轻度混合：90% 领域数据 → 50 亿领域数据 \$1 约 5.6 亿 Amazon Nova 数据（总计约 55.6 亿）
+ 中等混合：70% 领域数据 → 50 亿领域数据 \$1 约 21.4 亿 Amazon Nova 数据（总计约 71.4 亿）
+ 高度混合：50% 领域数据 → 50 亿领域数据 \$1 50 亿 Amazon Nova 数据（总计 100 亿）

在领域内基准测试和通用领域基准测试上评估每个检查点。同时评估起始检查点（任何训练开始前的 Amazon Nova 检查点）。
+ 客户领域性能在不同运行中是否大致保持不变？ 通常应该如此，因为每次运行都会显示相同数量的领域词元。如果领域性能随着混合量的增加而改善，说明 Amazon Nova 数据提供了有益的正则化。
+ 随着混合量的增加，通用基准测试分数是否会提高？
  + 预期行为是，随着添加更多 Amazon Nova 数据，通用能力应单调提升。
  + 衡量多个通用基准测试：MMLU（常识）、HumanEval（编码）、GSM8K（数学）或感兴趣的特定基准测试。
+ 选择能够在保持领域性能的同时，为使用案例提供可接受的通用能力的混合比率。同时要考虑使用更多数据混合进行训练的额外成本。

确定最佳混合比率后，使用具有所选混合比率的完整领域数据集运行全面的 CPT。

## 剖析数据混合类别
<a name="nova-forge-cpt-data-mixing-categories"></a>

下面，我们将剖析数据混合中的每个可用类别，以帮助您就哪些数据类别最适合纳入整体数据混合做出最佳决策。

### 如何启用数据混合
<a name="nova-forge-cpt-enable-mixing"></a>

将 `data_mixing` 部分添加到配方，并在数据集类别中设置相应的百分比分布。`nova_data` 百分比总和必须为 100。

#### 包含数据混合的 Nova 2.0 配置
<a name="nova-forge-cpt-nova2-config"></a>

```
# Note:
# This recipe can run on p5.48xlarge

# Run config
display_name: "Nova Lite Pretrain on P5 GPU"
versions: ["2.0"]
instance_types: ["ml.p5.48xlarge"]

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, SageMaker HyperPod job-specific configuration - not compatible with standard SageMaker Training jobs

## Training specific configs
training_config:
  task_type: cpt
  max_length: 8192              # Maximum context window size (tokens)
  global_batch_size: 64        # 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
    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

data_mixing:
  dataset_catalog: cpt_text_lite
  sources:
    nova_data:   # percent inputs for Nova data must sum to 100%; use 0% if you want to exclude a data grouping
      agents: 20
      business-and-finance: 4
      scientific: 10
      code: 5
      factual-and-news: 5
      longform-text: 6
      health-and-medicine: 1
      humanities-and-education: 1
      legal: 1
      math: 9
      additional-languages: 15
      social-and-personal-interest: 11
      entertainment: 0.5
      reasoning: 10
      other: 0.5
      tables: 1
    customer_data: # percent input of customer data. 100 = use only customer data, 0 = use only the nova_data mix above
      percent: 25
```

**这些类别的含义**

**注意**：Nova 2.0 包含了 Nova 1.0 中没有的、专门针对推理的类别（例如 `reasoning-code`、`reasoning-math`、`reasoning-instruction-following`）。

类别与信息标签摘要：


| 类别名称 | 详细信息 | 
| --- | --- | 
| agents | 侧重于人工智能系统中自主决策、任务完成和以目标为导向的行为的训练数据 | 
| baseline | 侧重于一般理解、基本沟通和核心语言能力的基础语言数据 | 
| chat | 展示自然对话流程、上下文维护和恰当社交互动的对话交流 | 
| code | 来自各种编程语言和平台的编程源代码、文档和技术讨论。 | 
| factuality | 侧重于准确性、来源验证和真实性评测的参考资料和经过验证的信息 | 
| identity | 侧重于一致的角色特征、价值观和互动风格的人格框架和行为模式 | 
| long-context | 侧重于在长篇幅交流中保持连贯性和相关性的长文本和复杂叙述 | 
| math | 数学内容，包括教科书、问题、解决方案和数学讨论。 | 
| rai | 强调伦理人工智能原则、安全考虑和负责任技术部署的案例和场景 | 
| instruction-following | 基于不同级别的用户提示和指令精确执行任务的示例 | 
| stem | 涵盖科学、技术、工程和数学的技术内容，包括问题解决和理论概念 | 
| planning | 展示战略思维、逐步任务细分和高效资源分配的序列 | 
| reasoning-chat | 侧重于逻辑讨论和结构化对话流程的分析性对话场景 | 
| reasoning-code | 侧重于系统性解决方案开发的编程挑战和算法问题 | 
| reasoning-factuality | 侧重于关键评估和验证过程的信息评估场景 | 
| reasoning-instruction-following | 侧重于系统解释和有条不紊执行的复杂任务分析 | 
| reasoning-math | 侧重于逻辑进程和解决策略的数学问题解决场景 | 
| reasoning-planning | 侧重于实现目标的系统性方法的战略决策场景 | 
| reasoning-rag | 侧重于上下文理解和相关应用的信息检索和综合场景 | 
| reasoning-rai | 侧重于系统评估人工智能安全性和公平性的道德决策场景 | 
| reasoning-stem | 侧重于系统性分析和解决方案开发的科学问题解决场景 | 
| rag | 将检索到的外部知识与生成的响应有效结合，以提供准确上下文信息的示例 | 
| translation | 多语言内容对，在保留上下文、语气和文化细微差别的同时展示准确的翻译 | 

#### 参数指南
<a name="nova-forge-cpt-param-guide"></a>
+ **dataset\$1catalog：**目前唯一的值是 cpt\$1text\$1lite，直到我们启用多模态训练。
+ **nova\$1data：**混合时，Nova 数据各个类别的百分比。它们之和应为 1.0。
+ **customer\$1data**：混合到 Nova 数据中的客户数据的百分比。

训练中使用的词元总数可以通过 `max_length` \$1 `global_batch_size` \$1 `max_steps` 计算得出

**限制**  
目前的 CPT 仅支持文本数据，不支持任何客户的多模态数据集。

# 监督式微调
<a name="nova-forge-sft"></a>

## 介绍
<a name="introduction"></a>

监督式微调使用包含目标任务输入-输出对的数据集。换句话说，您可以提供提示（问题、指令等）示例以及正确或所需响应，并基于这些示例继续训练模型。调整模型权重以最大限度地减少监督损失，通常是其预测与目标响应词元之间的交叉熵。

## 何时使用 SFT？
<a name="when-to-use-sft"></a>

当您拥有定义明确的任务且清楚预期输出时，SFT 最为适用。如果您能明确表述“给定 X 输入，正确/所需输出是 Y”，并且能收集到此类 X-Y 映射的示例，那么监督式微调是理想选择。SFT 表现出色的一些场景包括：
+ **结构化或复杂的分类任务**：例如，将内部文档或合同分为多个自定义类别。借助 SFT，模型学习这些特定类别的效果远超仅靠提示。
+ **具有已知答案的问答或转换任务**：例如，微调模型以回答公司知识库中的问题，或者在格式之间转换数据，其中每个输入都有对应的正确答案。
+ **格式和风格一致性**：如果需要模型始终以特定格式或语气做出响应，则可以根据正确格式/语气的示例进行微调。例如，在展示特定品牌语气或风格的提示-响应对上进行训练，可以使模型学会以该风格生成输出。同样，指令遵循行为通常也是通过在精选的良好助手行为示例上进行 SFT 来初步习得。

当您可以指定正确行为是什么样子时，SFT 是教授 LLM 新技能或行为最直接的方式。它利用模型现有的语言理解能力，并将其聚焦于任务上。如果差距在于知识而非行为，则不应使用 SFT；它无法让模型学习新的事实、术语或近期事件。在这种情况下，建议优先考虑对大规模领域内语料库进行持续预训练，或在推理时通过检索增强生成来引入外部知识。当您可以衡量质量但无法标记单个正确答案时，使用可验证的奖励或将 LLM 作为评判工具的强化微调可能比 SFT 更为可取。

根据任务复杂性以及未经微调的 Nova 模型性能，为每个任务规划数千到数万个演示样本，其中数据质量、一致性和多样性远比原始数量更为重要。

## 何时使用参数高效微调，何时使用全秩 SFT？
<a name="parameter-efficient-vs-full-rank"></a>

Nova 自定义配方使您能够执行参数高效微调（尤其是 LoRA）或全秩 SFT。如果您需要直接、具有成本效益的模型更新，或者数据量很少，建议选择参数高效微调方法，这样您只需训练小型适配器，而保留大部分主干网络不变（全秩 SFT 会更新所有模型参数）。

## 适用于 SFT 的数据混合
<a name="data-mixing"></a>

数据混合允许您将自定义训练数据集与 Nova 的专有训练数据相结合。此功能适用于 Nova 1.0 和 Nova 2.0 模型。

**Nova 专有数据类型**：Nova 支持文本和多模态 SFT 数据类型。它分为多个数据类别，每个类别都包含与该类别相关的多种任务。

**Nova 专有数据类别**：文本数据集包括多个类别，例如：自主决策、任务完成、以目标为导向的数据集（agents）、推理和非推理类的精确任务执行数据集（reasoning-instruction-following、instruction-following）、展示战略思维和逐步任务细分（planning）的序列、负责任的人工智能（rai）、长上下文、事实、数学、词干等等。同样，多模态数据集包括视频、屏幕截图、图表等。

数据混合功能允许您将自己的微调训练样本与用于微调 Nova 的 Nova 数据集样本进行混合。这可以防止在自定义训练上过拟合以及 Nova 能力的“灾难性遗忘”，或者在从新的预训练检查点开始训练时帮助您构建能力。

要混合 Nova 数据，只需在配方 YAML 文件的 training\$1config 部分下添加 data\$1mixing 数据块。文本数据混合块与多模态数据混合块的内容不同。请参考相应的配方。

### 支持的模型
<a name="supported-models"></a>
+ Nova 2.0 Lite

### 支持的模态
<a name="supported-modality"></a>
+ 文本
+ 多模态

## YAML 配置示例
<a name="yaml-configuration-examples"></a>

### Nova 2.0 配置示例
<a name="nova-2-configuration"></a>

```
run:
  name: my-lora-sft-run
  model_type: amazon.nova-2-lite-v1:0:256k
  model_name_or_path: nova-lite-2/prod
  data_s3_path: s3://my-bucket-name/train.jsonl
  replicas: 4
  output_s3_path: s3://my-bucket-name/outputs/
  mlflow_tracking_uri: ""
  mlflow_experiment_name: "my-lora-sft-experiment"
  mlflow_run_name: "my-lora-sft-run"
  
training_config:
  max_steps: 100
  save_steps: 10
  save_top_k: 5
  max_length: 32768
  global_batch_size: 32
  reasoning_enabled: true
  lr_scheduler:
    warmup_steps: 15
    min_lr: 1e-6
  optim_config:
    lr: 1e-5
    weight_decay: 0.0
    adam_beta1: 0.9
    adam_beta2: 0.95
  peft:
    peft_scheme: "lora"
    lora_tuning:
      alpha: 64
      lora_plus_lr_ratio: 64.0
```

### Nova 2.0 文本数据混合
<a name="nova-2-text-mixing"></a>

```
data_mixing:
  dataset_catalog: sft_1p5_text_chat
  sources:
    customer_data:
      percent: 50
    nova_data:
      agents: 1
      baseline: 10
      chat: 0.5
      code: 10
      factuality: 0.1
      identity: 1
      long-context: 1
      math: 2
      rai: 1
      instruction-following: 13
      stem: 0.5
      planning: 10
      reasoning-chat: 0.5
      reasoning-code: 0.5
      reasoning-factuality: 0.5
      reasoning-instruction-following: 45
      reasoning-math: 0.5
      reasoning-planning: 0.5
      reasoning-rag: 0.4
      reasoning-rai: 0.5
      reasoning-stem: 0.4
      rag: 1
      translation: 0.1
```

### Nova 2.0 多模态数据混合
<a name="nova-2-multimodal-mixing"></a>

```
data_mixing:
  dataset_catalog: sft_1p5_mm_chat
  sources:
    customer_data:
      percent: 50
    nova_data:
      charts: 1
      chat: 38
      code: 20
      docs: 3
      general: 2
      grounding: 1
      rag: 4
      screenshot: 4
      text: 8
      translation: 4
      video: 15
```

## 模型检查点
<a name="model-checkpoints"></a>

### Nova 2.0 检查点
<a name="nova-2-checkpoints"></a>
+ **PRE-TRAINED** [`nova-lite-2/pretraining-text-RD`]：在恒定学习率和衰减阶段（使用数万亿个词元进行训练）之后的检查点。[第 2 阶段的结果]
+ **MID-TRAINED** [`nova-lite-2/pretraining-text-CE`]：允许拥有中等数量非结构化数据的客户以比预训练更保守的学习率引入其数据，吸收领域特定知识，同时避免灾难性遗忘。[第 3 阶段的结果]
+ **FINAL** [`nova-lite-2/prod`]：完成所有预训练和训练后步骤后完全对齐的最终检查点。[第 4 阶段的结果]

**训练阶段：**
+ 第 1 阶段：PT Ckpt，使用恒定学习率进行初始预训练
+ 第 2 阶段：PT Ckpt，学习率衰减
+ 第 3 阶段：PT Ckpt，上下文扩展训练
+ 第 4 阶段：指令遵循对齐和安全训练

## 训练方法
<a name="training-approaches"></a>


**训练方法选择指南**  

| 数据类型 | 数据量 | 执行 | 使用检查点 | 
| --- | --- | --- | --- | 
| 大规模的非结构化原始领域数据（文档、日志、文章、代码等） | 1 万亿\$1 个词元 | 持续预训练 | 恒定学习率（CLR）结束时 | 
| 大规模的非结构化原始领域数据 | 1000 亿\$1 个词元 | 中期训练 | CLR 结束 | 
| 少量非结构化原始数据；结构化推理轨迹/CoT 数据 | 10 亿\$1 个词元 | 中期训练 | Nova 基础模型 | 
| 结构化演示（高质量输入-输出对、精选任务指令、多回合对话） | 1000\$1 个示例 | 监督式微调（SFT） | Nova 基础模型 | 

## 开始之前的先决条件
<a name="prerequisites"></a>
+ 我们假设您已设置 SMHP 集群，该集群包含具有活跃容量的受限实例组（RIG）。如果没有，请参阅此处完成 SMHP 集群和 RIG 设置 [[文档链接](https://docs.aws.amazon.com/sagemaker/latest/dg/nova-forge.html)、[讲习会链接](https://catalog.us-east-1.prod.workshops.aws/workshops/dcac6f7a-3c61-4978-8344-7535526bf743/en-US)]
+ 需要使用 **p5.48xlarge** EC2 实例来执行此配方。有效执行此配方所需的最小实例数量如下：
  + **Nova Lite 2.0 – 4 个 p5.48xlarge**
+ 按照[此处](https://catalog.us-east-1.prod.workshops.aws/workshops/dcac6f7a-3c61-4978-8344-7535526bf743/en-US)提供的说明，安装特定于 Forge 的 SageMaker HyperPod CLI
+ 使用 `hyperpod get-clusters` 确认您可以连接到集群
  + 请注意，此命令将列出账户中的所有 SMHP 集群。
+ 确认训练数据（以及可选的验证数据）位于 SMHP 集群的执行角色可以访问的 S3 存储桶中。有关数据准备，请参阅下一节。
+ 已完成设置。如果尚未完成设置，请按照以下[指南](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html)进行操作。
+ **验证**：完成设置后，确认您可以成功运行以下命令

  ```
  aws sagemaker describe-cluster --cluster-name <cluster-name> --region <region>
  
  hyperpod connect-cluster --cluster-name cluster-name
  ```

## 成功实现 SFT 的系统性方法
<a name="systematic-approach"></a>
+ **数据准备**：遵循既定指南，创建、清理或重新格式化数据集，使其符合所需结构。确保输入、输出和辅助信息（例如推理轨迹或元数据）正确对齐和格式化。
+ **训练配置**：定义模型的训练方式。使用 Amazon SageMaker HyperPod 时，此配置是在 YAML 配方文件中编写的，包括：
  + 数据来源路径（训练和验证数据集）
  + 关键超参数（训练步骤数、学习率、批次大小）
  + 可选组件（分布式训练参数等）
  + 数据混合设置（定义客户数据和 Nova 数据类别的比例）
+ **优化 SFT 超参数**：我们推荐的 SFT 配方参数值是一个很好的起点，也是一个稳健的选择。如果想针对使用案例进一步优化它们，请使用不同的参数组合进行多次 SFT 运行，然后选择最佳组合。您可以按照自己选择的超参数优化方法来选择参数组合。一种简单的方法是，在保持其他参数为默认值的同时，改变一个参数的值（默认值\$10.5，默认值，默认值\$12），对每个要优化的参数重复此操作，并根据需要进行迭代。LoRa 最相关的参数是学习率、alpha（缩放参数）、用于训练的 epoch 数和预热步骤数；对于全秩微调，最相关的参数则主要是学习率、用于训练的 epoch 数和预热步骤数。

## 实验排序和数据混合
<a name="experiment-sequencing"></a>
+ 如果您只有一组任务的 SFT 数据（训练/开发/测试），并且只关心这些任务的测试性能
  + 在 [FINAL] Nova 检查点上执行不启用数据混合的 SFT。使用默认的 SFT 超参数，并可选择根据使用案例进行优化。监控验证指标和/或针对较大数据集评估中间检查点。
+ 如果您只有一组任务的 SFT 数据（训练/开发/测试），并且关心这些任务的测试性能以及感兴趣领域的通用基准测试性能
  + 首先，在预训练检查点（PRE-TRAINED 或 MID-TRAINED 检查点，而非 FINAL 检查点）上，执行启用 Nova 数据混合的 SFT。使用中间检查点可以让模型更好地将自定义数据与 Nova 的专有数据整合，同时保持强大的通用能力。
  + 改变混合中 Nova 数据的比例（例如 10%、25%、50%、75%）以及选择补充使用案例的 Nova 数据类别（例如，如果您关心通用指令遵循能力，则选择 instruction following 类别），运行较短的 SFT 训练。监控验证指标，评估混合是否有助于提高通用基准测试的性能。选择能实现任务性能和通用性能最佳组合的训练混合比例和检查点。根据不同的使用案例，可以使用强化微调（RFT）进一步提升任务和通用性能。

## 为 SFT 准备数据集
<a name="dataset-preparation"></a>

**Nova 2.0**：使用 Converse API 格式 [https://docs.aws.amazon.com/bedrock/latest/userguide/conversation-inference-call.html](https://docs.aws.amazon.com/bedrock/latest/userguide/conversation-inference-call.html)。Nova 2.0 数据格式可以包含其他推理字段：[https://docs.aws.amazon.com/bedrock/latest/APIReference/API\$1runtime\$1ReasoningContentBlock.html](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_ReasoningContentBlock.html)

推理内容记录了模型在生成最终答案之前的中间思考步骤。在 `assistant` 回复中，使用 `reasoningContent` 字段以包含推理轨迹。请为推理内容使用纯文本，除非任务特别要求，否则避免使用 `<thinking>` 和 `</thinking>` 之类的标记标签。

## 评估方法
<a name="evaluation"></a>

### 先决条件
<a name="evaluation-prerequisites"></a>
+ 来自训练作业的 `manifest.json` 文件的检查点 S3 URI（适用于经过训练的模型）
+ 以正确格式上传到 S3 的评估数据集
+ 用于评估结果的输出 S3 路径

**开箱即用的基准测试**：使用开箱即用的基准测试来验证通用任务的性能。有关更多详细信息，请单击此处：[https://docs.aws.amazon.com/sagemaker/latest/dg/nova-hp-evaluate.html](https://docs.aws.amazon.com/sagemaker/latest/dg/nova-hp-evaluate.html)

### 自带数据
<a name="bring-your-own-data"></a>

您也可以通过将数据格式化为以下格式，然后使用下述容器来提供自定义数据，如果需要，还可以获取推理结果以及用于校准的对数概率。

为每个任务创建具有以下结构的 jsonl：

```
{
  "metadata": "{key:4, category:'apple'}",
  "system": "arithmetic-patterns, please answer the following with no other words: ",
  "query": "What is the next number in this series? 1, 2, 4, 8, 16, ?",
  "response": "32"
}
```

评估作业在推理阶段生成的输出将具有以下结构：

```
{
  "prompt": "[{'role': 'system', 'content': 'arithmetic-patterns, please answer the following with no other words: '}, {'role': 'user', 'content': 'What is the next number in this series? 1, 2, 4, 8, 16, ?'}]",
  "inference": "['32']",
  "gold": "32",
  "metadata": "{key:4, category:'apple'}"
}
```

**字段描述：**
+ `prompt`：发送给模型的格式化输入内容
+ `inference`：模型生成的响应
+ `gold`：输入数据集中的预期正确答案，即输入中的响应字段
+ `metadata`：从输入中传递的可选元数据

### 准备评估配置
<a name="evaluation-config"></a>

启动评估作业的命令。使用 `"--override-parameters"` 修改配方中的任何条目。

```
hyperpod start-job -n kubeflow \
  --recipe evaluation/nova/nova_micro_p5_48xl_bring_your_own_dataset_eval \
  --override-parameters '{
    "instance_type": "p5.48xlarge",
    "container": "708977205387.dkr.ecr.us-east-1.amazonaws.com/nova-evaluation-repo:SM-HP-Eval-latest",
    "recipes.run.name": "<your-eval-job-name>",
    "recipes.run.model_name_or_path": "<checkpoint-s3-uri>",
    "recipes.run.output_s3_path": "s3://<your-bucket>/eval-results/",
    "recipes.run.data_s3_path": "s3://<your-bucket>/eval-data.jsonl"
  }'
```

## 最佳实践
<a name="best-practices"></a>
+ **优先考虑数据质量而不是数量**：高质量、多样化且具有代表性的训练数据，远比大量低质量数据更具价值。
+ **包含推理型指令遵循类别**：使用数据混合时，应包含“reasoning-instruction-following”类别，以保持跨任务的强大通用性能。
+ **使用默认学习率**：从默认学习率开始（LoRA 为 1e-5，全秩 SFT 为 5e-6），仅在需要时根据验证指标进行调整。
+ **平衡 Nova 数据混合比例**：最多混合 50% 的 Nova 数据，以实现延迟和性能的最佳平衡。更高的百分比可能会提高通用能力，但也会增加训练时间。
+ **监控验证指标**：在训练期间定期评估中间检查点，以便及早发现过拟合或性能下降。
+ **在代表性数据集上测试**：确保评估数据集准确代表生产使用案例，以便进行有意义的性能评估。

## 准备训练作业配置
<a name="prepare-training-job-config"></a>

### 超参数
<a name="hyper-parameters"></a>

除数据混合外的全套超参数：

```
## Run config
run:
  name: my-lora-sft-run
  model_type: amazon.nova-2-lite-v1:0:256k
  model_name_or_path: nova-lite-2/prod
  data_s3_path: s3://my-bucket-name/train.jsonl  # SageMaker HyperPod (SMHP) only and not compatible with SageMaker Training jobs. Note replace my-bucket-name with your real bucket name for SMHP job
  replicas: 4                      # Number of compute instances for training, allowed values are 4, 8, 16, 32
  output_s3_path: s3://my-bucket-name/outputs/               # Output artifact path (Hyperpod job-specific; not compatible with standard SageMaker Training jobs). Note replace my-bucket-name with your real bucket name for SMHP job
  
  ## MLFlow configs
  mlflow_tracking_uri: "" # Required for MLFlow
  mlflow_experiment_name: "my-lora-sft-experiment" # Optional for MLFlow. Note: leave this field non-empty
  mlflow_run_name: "my-lora-sft-run" # Optional for MLFlow. Note: leave this field non-empty
  
training_config:
  max_steps: 100                   # Maximum training steps. Minimal is 4.
  save_steps: 10 # This parameter suggests after how many training steps the checkpoints will be saved. Should be less than or equal to max_steps(please override this value with a numerical value equal or less than max_steps value; min: 4)
  save_top_k: 5                    # Keep top K best checkpoints. Note supported only for SageMaker HyperPod jobs. Minimal is 1.
  max_length: 32768                # Sequence length (options: 8192, 16384, 32768 [default], 65536)
  global_batch_size: 32            # Golbal batch size (options: 32, 64, 128)
  reasoning_enabled: true          # If data has reasoningContent, set to true; otherwise False

  lr_scheduler:
    warmup_steps: 15               # Learning rate warmup steps. Recommend 15% of max_steps
    min_lr: 1e-6                   # Minimum learning rate, must be between 0.0 and 1.0

  optim_config:                    # Optimizer settings
    lr: 1e-5                       # Learning rate, must be between 0.0 and 1.0
    weight_decay: 0.0              # L2 regularization strength, must be between 0.0 and 1.0
    adam_beta1: 0.9                # Exponential decay rate for first-moment estimates, must be between 0.0 and 1.0
    adam_beta2: 0.95               # Exponential decay rate for second-moment estimates, must be between 0.0 and 1.0

  peft:                            # Parameter-efficient fine-tuning (LoRA)
    peft_scheme: "lora"            # Enable LoRA for PEFT
    lora_tuning:
      alpha: 64                    # Scaling factor for LoRA weights ( options: 32, 64, 96, 128, 160, 192),
      lora_plus_lr_ratio: 64.0     # LoRA+ learning rate scaling factor (0.0–100.0)
```

LoRa 最相关的参数是学习率、alpha（缩放参数）、用于训练的 epoch 数和预热步骤数；对于全秩微调，最相关的参数则主要是学习率、用于训练的 epoch 数和预热步骤数。配方中已预填充推荐的默认值。

## 设置数据混合块
<a name="set-up-data-mixing-block"></a>

将 data\$1mixing 部分添加到配方，并在数据集类别中设置相应的百分比分布。

下面介绍每个可用的 Nova 数据类别。

### 包含数据混合的 Nova 2.0 配置
<a name="nova-2-config-data-mixing"></a>

```
data_mixing:
  dataset_catalog: sft_1p5_text_chat       # Nova text dataset catalog
  sources:
    customer_data:
      percent: 50                 # Percent of overall mix to draw from customer data
    nova_data:                    # The remainder will be drawn from Nova data. The categories below must add to 100
      agents: 1                   # autonomous decision-making, task completion, goal-oriented behavior in AI systems
      baseline: 10                 # [New in Nova 1.5]
      chat: 0.5                    # Conversational exchanges demonstrating natural dialogue flow
      code: 10                     # Programming examples and solutions spanning multiple languages
      factuality: 0.1               # [New in Nova 1.5]
      identity: 1                 # [New in Nova 1.5]
      long-context: 1             # [New in Nova 1.5]
      math: 2                     # [New in Nova 1.5]
      rai: 1                      # ethical AI principles, safety considerations, and responsible technology deployment
      instruction-following: 13   # precise task execution based on varying levels of user prompts and directives
      stem: 0.5                     # Technical content covering science, technology, engineering, and mathematics
      planning: 10                 # Sequences demonstrating strategic thinking and step-by-step task breakdown
      reasoning-chat: 0.5
      reasoning-code: 0.5
      reasoning-factuality: 0.5
      reasoning-instruction-following: 45
      reasoning-math: 0.5
      reasoning-planning: 0.5
      reasoning-rag: 0.4
      reasoning-rai: 0.5
      reasoning-stem: 0.4
      rag: 1                      # combining retrieved external knowledge with generated responses
      translation: 0.1
```

这些类别的含义是什么？


**Nova 2.0 文本数据类别**  

| 类别名称 | 详细信息 | 
| --- | --- | 
| 代理 | 侧重于人工智能系统中自主决策、任务完成和以目标为导向的行为的训练数据 | 
| 基准 | 侧重于一般理解、基本沟通和核心语言能力的基础语言数据 | 
| 聊天 | 展示自然对话流程、上下文维护和恰当社交互动的对话交流 | 
| 代码 | 来自各种编程语言和平台的编程源代码、文档和技术讨论。 | 
| factuality | 侧重于准确性、来源验证和真实性评测的参考资料和经过验证的信息 | 
| 身份 | 侧重于一致的角色特征、价值观和互动风格的人格框架和行为模式 | 
| long-context | 侧重于在长篇幅交流中保持连贯性和相关性的长文本和复杂叙述 | 
| math | 数学内容，包括教科书、问题、解决方案和数学讨论。 | 
| rai | 强调伦理人工智能原则、安全考虑和负责任技术部署的案例和场景 | 
| 指令遵循 | 基于不同级别的用户提示和指令精确执行任务的示例 | 
| 词干 | 涵盖科学、技术、工程和数学的技术内容，包括问题解决和理论概念 | 
| 计划 | 展示战略思维、逐步任务细分和高效资源分配的序列 | 
| reasoning-chat | 侧重于逻辑讨论和结构化对话流程的分析性对话场景 | 
| reasoning-code | 侧重于系统性解决方案开发的编程挑战和算法问题 | 
| reasoning-factuality | 侧重于关键评估和验证过程的信息评估场景 | 
| reasoning-instruction-following | 侧重于系统解释和有条不紊执行的复杂任务分析 | 
| reasoning-math | 侧重于逻辑进程和解决策略的数学问题解决场景 | 
| reasoning-planning | 侧重于实现目标的系统性方法的战略决策场景 | 
| reasoning-rag | 侧重于上下文理解和相关应用的信息检索和综合场景 | 
| reasoning-rai | 侧重于系统评估人工智能安全性和公平性的道德决策场景 | 
| reasoning-stem | 侧重于系统性分析和解决方案开发的科学问题解决场景 | 
| rag | 将检索到的外部知识与生成的响应有效结合，以提供准确上下文信息的示例 | 
| 转换 | 多语言内容对，在保留上下文、语气和文化细微差别的同时展示准确的翻译 | 

### 多模态数据混合（Nova 2.0）
<a name="nova-2-mm-data-mixing"></a>

```
data_mixing:
  dataset_catalog: sft_1p5_mm_chat       # Nova text dataset catalog
  sources:
    customer_data:
      percent: 50                 # Percent of overall mix to draw from customer data
    nova_data:                    # The remainder will be drawn from Nova data. The categories below must add to 100
      charts: 1
      chat: 38
      code: 20
      docs: 3
      general: 2
      grounding: 1
      rag: 4
      screenshot: 4
      text: 8
      translation: 4
      video: 15
```

注意：Nova 2.0 包含 Nova 1.0 中不支持的视频数据类别支持。

这些类别的含义是什么？


**Nova 2.0 多模态数据类别**  

| 类别名称 | 详细信息 | 
| --- | --- | 
| 图表 | 图形、饼图、条形图、折线图和其他统计可视化的视觉表示与描述，以帮助模型有效理解和传达定量信息 | 
| 聊天 | 与视觉元素配对的对话数据，侧重于上下文对话理解和基于图像的交互 | 
| 代码 | 侧重于可视化代码解释、IDE 屏幕截图和技术图表的编程接口和开发环境 | 
| docs | 以文档为中心的数据，将文本、图像、布局和格式相结合，训练模型理解和处理各种文档类型及结构，以帮助理解 PDF 内容识别等概念 | 
| general | 侧重于对图像、图形和随附的描述性文本进行广泛理解的多样化视觉-文本内容 | 
| Grounding | 侧重于将语言概念与现实世界的视觉表示联系起来的视觉参考材料和标记图像 | 
| rag | 多模态检索示例，展示如何有效结合和引用视觉及文本外部知识，以生成准确的上下文响应 | 
| screenshot | 侧重于理解软件界面和数字交互的应用程序界面截图和数字显示图像 | 
| 文本 | 从仅文本 SFT Nova 数据集类别创建的上下文文本数据均衡池，以提供通用能力 | 
| 转换 | 侧重于图像中文本的多语言解释和文化视觉元素的跨语言视觉内容 | 
| 视频 | 侧重于时间理解和顺序视觉叙述理解的基于动作的视觉内容 | 

## 如何启动作业
<a name="how-to-launch-job"></a>

如果您只需要获取启动首次 SFT 运行的基本细节，也可以参考 README。

容器信息：


**容器信息和启动命令**  

| 模型 | 方法 | 子类别 | 映像 URI | Hyperpod 启动程序命令 | 
| --- | --- | --- | --- | --- | 
| Nova 2.0 | 微调 | SFT 文本 | 708977205387.dkr.ecr.us-east-1.amazonaws.com/nova-fine-tune-repo:SM-HP-SFT-V2-latest | hyperpod start-job \$1 -n kubeflow \$1 --recipe fine-tuning/nova/nova\$12\$10/nova\$1lite/SFT/nova\$1lite\$12\$10\$1p5\$1gpu\$1sft \$1 --override-parameters '\$1 "instance\$1type": "ml.p5.48xlarge", "container": "708977205387.dkr.ecr.us-east-1.amazonaws.com/nova-fine-tune-repo:SM-HP-SFT-V2-latest" \$1' | 
| Nova 2.0 | 微调 | SFT 文本 \$1 数据混合 | 708977205387.dkr.ecr.us-east-1.amazonaws.com/nova-fine-tune-repo:SM-HP-SFT-V2-DATAMIXING-latest | hyperpod start-job \$1 -n kubeflow \$1 --recipe fine-tuning/nova/forge/nova\$12\$10/nova\$1lite/SFT/nova\$1lite\$12\$10\$1p5\$1gpu\$1sft\$1text\$1with\$1datamix \$1 --override-parameters '\$1 "instance\$1type": "ml.p5.48xlarge", "container": "708977205387.dkr.ecr.us-east-1.amazonaws.com/nova-fine-tune-repo:SM-HP-SFT-V2-DATAMIXING-latest" \$1' | 
| Nova 2.0 | 微调 | SFT MM | 708977205387.dkr.ecr.us-east-1.amazonaws.com/nova-fine-tune-repo:SM-HP-SFT-V2-latest | hyperpod start-job \$1 -n kubeflow \$1 --recipe fine-tuning/nova/nova\$12\$10/nova\$1lite/SFT/nova\$1lite\$12\$10\$1p5\$1gpu\$1sft \$1 --override-parameters '\$1 "instance\$1type": "ml.p5.48xlarge", "container": "708977205387.dkr.ecr.us-east-1.amazonaws.com/nova-fine-tune-repo:SM-HP-SFT-V2-latest" \$1' | 
| Nova 2.0 | 微调 | SFT MM \$1 数据混合 | 708977205387.dkr.ecr.us-east-1.amazonaws.com/nova-fine-tune-repo:SM-HP-SFT-V2-DATAMIXING-latest | hyperpod start-job \$1 -n kubeflow \$1 --recipe fine-tuning/nova/forge/nova\$12\$10/nova\$1lite/SFT/nova\$1lite\$12\$10\$1p5\$1gpu\$1sft\$1mm\$1with\$1datamix \$1 --override-parameters '\$1 "instance\$1type": "ml.p5.48xlarge", "container": "708977205387.dkr.ecr.us-east-1.amazonaws.com/nova-fine-tune-repo:SM-HP-SFT-V2-DATAMIXING-latest" \$1' | 

完成所有设置后，从 sagemaker-hyperpod-cli 存储库的根目录开始，导航到默认的 nova sft 配方文件夹：
+ cd /src/hyperpod\$1cli/sagemaker\$1hyperpod\$1recipes/recipes\$1collection/recipes/training/nova/
+ 在这里，可以根据所选的基础模型，选择运行 Nova 1 还是 Nova 2 方案。

对于 Nova 2.0 SFT：
+ 如果您想使用常规的 SFT 作业，应该能在此文件夹下看到一个配方
  + cd /src/hyperpod\$1cli/sagemaker\$1hyperpod\$1recipes/recipes\$1collection/recipes/fine-tuning/nova\$12\$10/nova\$1lite/SFT，然后，您应该能在此文件夹下看到一个名为 nova\$1lite\$12\$10\$1p5x8\$1gpu\$1sft.yaml 的配方
+ 如果想使用启用数据混合的 SFT 作业，可以导航到 SFT Forge 配方文件夹
  + cd /src/hyperpod\$1cli/sagemaker\$1hyperpod\$1recipes/recipes\$1collection/recipes/fine-tuning/nova/forge/nova\$12\$10/nova\$1lite/SFT，您应该能在此文件夹下看到一个名为 nova\$1lite\$12\$10\$1p5x8\$1gpu\$1sft\$1with\$1datamix.yaml 的配方
+ 编辑配方中作业所需的部分，例如 name、data\$1s3\$1path、validation\$1s3\$1path、output\$1s3\$1path 和 max\$1steps。由于我们执行的是 SFT，epoch 的概念在此不适用。

数据混合配置看起来类似，但在底部会有一个额外的数据混合部分，类似于这样

```
data_mixing:
  dataset_catalog: sft_text_lite
  sources:
    nova_data:   # percent inputs for Nova data must sum to 100%; use 0% if you want to exclude a data grouping
      agents: 20
      business-and-finance: 20
      scientific: 20
      code: 20
      factual-and-news: 20
      longform-text: 0
      health-and-medicine: 0
      humanities-and-education: 0
      legal: 0
      math: 0
      additional-languages: 0
      social-and-personal-interest: 0
      entertainment: 0
      reasoning: 0
      other: 0
      tables: 0
    customer_data: # percent input of customer data. 100 = use only customer data, 0 = use only the nova_data mix above
      percent: 25
```

这里有两个顶级数据类别：
+ nova\$1data：这是实际的数据混合，可进一步细分为更多类别。它们的总和必须为 100%
  + 这些类别的完整细分（包括词元计数）可在下方找到
+ customer\$1data：这是您在 YAML 顶部 data\$1s3\$1path 键中引用的训练数据。此处提供的百分比决定了 nova\$1data 在最终混合中的百分比。例如，在上述百分比选择中，训练期间我们将使用 25% 的 customer\$1data 和 75% 的 nova\$1data，其中 15% 将为 agents，15% 将为 business-and-finance，15% 将为 scientific，15% 将为 code，以及 15% 将为 factual-and-news。

提示：再次运行 pip install-e.，就可以提交作业了！

我们将在此覆盖几个参数以使用数据混合：

```
hyperpod start-job \
 -n kubeflow \
 --recipe fine-tuning/nova/forge/nova_2_0/nova_lite/SFT/nova_lite_2_0_p5x8_gpu_sft_with_datamix \
 --override-parameters '{
 "instance_type": "ml.p5.48xlarge",
 "recipes.run.name": "nova-sft-datamixing",
 "container": "708977205387.dkr.ecr.us-east-1.amazonaws.com/nova-fine-tune-repo:SM-HP-SFT-V2-Datamix",
 "recipes.run.data_s3_path": "s3://sft-data/sft_train_data.jsonl",
 "recipes.run.validation_data_s3_path": "s3://sft-data/sft_val_data.jsonl",
 "recipes.run.output_s3_path": "s3://sft-data/output/
 }'
```

输出应包含作业名称，如下所示：

```
⚡ MY Desktop ⚡ % hyperpod start-job \
 -n kubeflow \
 --recipe training/nova/forge/nova_2_0/nova_lite/sft/nova_lite_2_0_p5x8_gpu_pretrain_with_datamix \
 --override-parameters '{
 "instance_type": "ml.p5.48xlarge",
 "recipes.run.name": "nova-sft-datamixing",
 "container": "708977205387.dkr.ecr.us-east-1.amazonaws.com/nova-fine-tune-repo:SM-HP-SFT-V2-Datamix",
 "recipes.run.data_s3_path": "s3://sft-data/sft_train_data.jsonl",
 "recipes.run.validation_data_s3_path": "3://sft-data/sft_val_data.jsonl",
 "recipes.run.output_s3_path": "3://sft-data/output/
 }'
```

输出将如下所示：

```
Final command: python3 /local/home/my/Downloads/sagemaker-hyperpod-cli/src/hyperpod_cli/sagemaker_hyperpod_recipes/main.py recipes=training/nova/nova_micro_p5x8_gpu_pretrain cluster_type=k8s cluster=k8s base_results_dir=/local/home/niphaded/Downloads/sagemaker-hyperpod-cli/results cluster.pullPolicy="IfNotPresent" cluster.restartPolicy="OnFailure" cluster.namespace="kubeflow" instance_type="p5d.48xlarge" container="900867814919.dkr.ecr.us-east-1.amazonaws.com/nova-fine-tune-repo:sft-datamix-rig-final"
Prepared output directory at /local/home/my/Downloads/sagemaker-hyperpod-cli/results/my-sft-run-wzdyn/k8s_templates
Found credentials in shared credentials file: ~/.aws/credentials
Helm script created at /local/home/my/Downloads/sagemaker-hyperpod-cli/results/my-sft-run-wzdyn/niphaded-sft-run-wzdyn_launch.sh
Running Helm script: /local/home/my/Downloads/sagemaker-hyperpod-cli/results/my-sft-run-wzdyn/niphaded-sft-run-wzdyn_launch.sh

NAME: my-sft-run-wzdyn
LAST DEPLOYED: Tue Aug 26 16:21:06 2025
NAMESPACE: kubeflow
STATUS: deployed
REVISION: 1
TEST SUITE: None
Launcher successfully generated: /local/home/my/Downloads/sagemaker-hyperpod-cli/src/hyperpod_cli/sagemaker_hyperpod_recipes/launcher/nova/k8s_templates/SFT

{
 "Console URL": "https://us-east-1.console.aws.amazon.com/sagemaker/home?region=us-east-1#/cluster-management/hyperpod-eks-ga-0703"
}
```

您可以使用 hyperpod list-pods -n kubeflow --job-name my-sft-run-wzdyn 查看作业状态

```
hyperpod list-pods -n kubeflow --job-name my-sft-run-wzdyn 
{
 "pods": [
  {
   "PodName": "my-sft-run-wzdyn-master-0",
   "Namespace": "kubeflow",
   "Status": "Pending",
   "CreationTime": "2025-08-26 16:21:06+00:00"
  },
  {
   "PodName": "my-sft-run-wzdyn-worker-0",
   "Namespace": "kubeflow",
   "Status": "Pending",
   "CreationTime": "2025-08-26 16:21:06+00:00"
  }
 ]
}
```

或者直接使用 kubectl 命令查找它们。

例如，

```
kubectl get pods -o wide -w -n kubeflow | (head -n1 ; grep my-sft-run)

NAME                                                         READY   STATUS      RESTARTS   AGE     IP              NODE                           NOMINATED NODE   READINESS GATES
my-sft-run-5suc8-master-0                              0/1     Completed   0          3h23m   172.31.32.132   hyperpod-i-00b3d8a1bf25714e4   <none>           <none>
my-sft-run-5suc8-worker-0                              0/1     Completed   0          3h23m   172.31.44.196   hyperpod-i-0aa7ccfc2bd26b2a0   <none>           <none>
my-sft-run-5suc8-worker-1                              0/1     Completed   0          3h23m   172.31.46.84    hyperpod-i-026df6406a7b7e55c   <none>           <none>
my-sft-run-5suc8-worker-2                              0/1     Completed   0          3h23m   172.31.28.68    hyperpod-i-0802e850f903f28f1   <none>           <none>
```

专业提示：务必始终使用 -o wide 标志，因为作业运行的 EKS 节点将帮助您在 AWS UI 中更快地找到日志

## 如何监控作业
<a name="how-to-monitor-job"></a>

您可通过以下三种方式之一查看日志：

### a) 使用 CloudWatch
<a name="using-cloudwatch"></a>

日志位于 Amazon Web Services 账户（包含 HyperPod 集群）的 CloudWatch 下。如需在浏览器中查看，请导航到账户中的 CloudWatch 主页，然后搜索集群名称。例如，如果集群名为 my-hyperpod-rig，则日志组将具有以下前缀：
+ 日志组：/aws/sagemaker/Clusters/my-hyperpod-rig/\$1UUID\$1
+ 进入日志组后，您可以使用节点实例 ID（例如 hyperpod-i-00b3d8a1bf25714e4）查找特定日志。
  + 此处的 i-00b3d8a1bf25714e4 代表运行训练作业的 hyperpod 机器友好名称。回想一下，在之前的命令 kubectl get pods -o wide -w -n kubeflow \$1 (head -n1 ; grep my-cpt-run) 输出中，我们捕获了一个名为 NODE 的列。
  + 在本例中，“主”节点在 hyperpod-i-00b3d8a1bf25714e4 上运行，因此我们将使用该字符串来选择要查看的日志组。选择名为 SagemakerHyperPodTrainingJob/rig-group/[NODE] 的日志组

日志应该如下所示：

### b) 使用 CloudWatch Insights
<a name="using-cloudwatch-insights"></a>

如果您手边有作业名称，并且不想完成上述所有步骤，则只需查询 /aws/sagemaker/Clusters/my-hyperpod-rig/\$1UUID\$1 下的所有日志，即可找到单个日志。

CPT

```
fields @timestamp, @message, @logStream, @log 
| filter @message like /(?i)Starting CPT Job/
| sort @timestamp desc 
| limit 100
```

要完成作业，请将“Starting SFT Job”替换为“SFT Job completed”

然后，您可以单击结果，并选择显示“Epoch 0”的结果，因为那将是主节点。

### C) 使用 Amazon CLI
<a name="using-aws-cli"></a>

您可以选择使用 ... 来跟踪日志。在此之前，请使用 aws --version 检查 AWS CLI 版本。建议使用提供的工具脚本，以便在终端中实时跟踪日志

V1：

```
aws logs get-log-events \
 --log-group-name /aws/sagemaker/YourLogGroupName \
 --log-stream-name YourLogStream \
 --start-from-head | jq -r '.events[].message'
```

V2：

```
aws logs tail /aws/sagemaker/YourLogGroupName \
  --log-stream-name YourLogStream \
 --since 10m \
 --follow
```

### d) 设置机器学习流程：
<a name="setup-mlflow"></a>

您可以通过 MLFlow 跟踪指标。

创建 MLFlow 应用程序

使用 Studio UI：如果您通过 Studio UI 创建训练作业，系统会自动创建默认 MLflow 应用程序，并在“高级选项”下默认选择该应用程序。

使用 CLI：如果您使用 CLI，则必须创建一个 MLflow 应用程序，并将其作为输入传递给训练作业 API 请求。

```
mlflow_app_name="<enter your MLflow app name>"  
role_arn="<enter your role ARN>"   
bucket_name="<enter your bucket name>"   
region="<enter your region>"  
  
mlflow_app_arn=$(aws sagemaker create-mlflow-app \  
  --name $mlflow_app_name \  
  --artifact-store-uri "s3://$bucket_name" \  
  --role-arn $role_arn \  
  --region $region)
```

访问 MLflow 应用程序

使用 CLI：创建预签名 URL 以访问 MLFlow 应用程序 UI：

```
aws sagemaker create-presigned-mlflow-app-url \  
  --arn $mlflow_app_arn \  
  --region $region \  
  --output text
```

机器学习流程设置完成后，您可以在配方中传递 URI，或者在开始作业时使用覆盖。有关如何执行此操作的示例，请参阅 README。

## SFT 后如何评估模型？
<a name="how-to-evaluate-after-sft"></a>

### 先决条件
<a name="eval-prerequisites"></a>
+ 来自训练作业的 manifest.json 文件的检查点 S3 URI（适用于经过训练的模型）
+ 以正确格式上传到 S3 的评估数据集
+ 用于评估结果的输出 S3 路径

开箱即用的基准测试：使用开箱即用的基准测试来验证通用任务的性能。有关更多详细信息，请单击此处。

### 自带数据：
<a name="bring-your-own-eval-data"></a>

您也可以通过将数据格式化为以下格式，然后使用下述容器来提供自定义数据，如果需要，还可以获取推理结果以及用于校准的对数概率。

为每个任务创建具有以下结构的 jsonl：

```
{
  "metadata": "{key:4, category:'apple'}",
  "system": "arithmetic-patterns, please answer the following with no other words: ",
  "query": "What is the next number in this series? 1, 2, 4, 8, 16, ?",
  "response": "32"
}
```

评估作业在推理阶段生成的输出将具有以下结构：

```
{
  "prompt": "[{'role': 'system', 'content': 'arithmetic-patterns, please answer the following with no other words: '}, {'role': 'user', 'content': 'What is the next number in this series? 1, 2, 4, 8, 16, ?'}]",
  "inference": "['32']",
  "gold": "32",
  "metadata": "{key:4, category:'apple'}"
}
```

字段描述：
+ prompt：发送给模型的格式化输入内容
+ inference：模型生成的响应
+ gold：输入数据集中的预期正确答案，即输入中的响应字段
+ metadata：从输入中传递的可选元数据

### 准备评估配置
<a name="prepare-eval-config"></a>

启动评估作业的命令。使用“--override-parameters”修改配方中的任何条目。

```
hyperpod start-job -n kubeflow \
  --recipe evaluation/nova/nova_micro_p5_48xl_bring_your_own_dataset_eval \
  --override-parameters '{
    "instance_type": "p5.48xlarge",
    "container": "708977205387.dkr.ecr.us-east-1.amazonaws.com/nova-evaluation-repo:SM-HP-Eval-latest",
    "recipes.run.name": "<your-eval-job-name>",
    "recipes.run.model_name_or_path": "<checkpoint-s3-uri>",
    "recipes.run.output_s3_path": "s3://<your-bucket>/eval-results/",
    "recipes.run.data_s3_path": "s3://<your-bucket>/eval-data.jsonl"
  }'
```

### 启动评估作业
<a name="launch-eval-job"></a>

不同配方及其对应映像的作业启动命令。


**评估作业启动命令**  

| 模型 | 方法 | 子类别 | 映像 URI | 命令 | 
| --- | --- | --- | --- | --- | 
| Nova 2.0 | 评估 | Eval | 708977205387.dkr.ecr.us-east-1.amazonaws.com/nova-evaluation-repo:SM-HP-Eval-latest | hyperpod start-job -n kubeflow \$1 --recipe evaluation/nova/nova\$12\$10/nova\$1lite/nova\$1lite\$12\$10\$1p5\$148xl\$1gpu\$1ft\$1eval \$1 --override-parameters '\$1 "instance\$1type": "ml.p5.48xlarge", "container": "708977205387.dkr.ecr.us-east-1.amazonaws.com/nova-evaluation-repo:SM-HP-Eval-latest" \$1' | 

## 经验教训和提示
<a name="lessons-learned-tips"></a>
+ SFT 数据集的质量至关重要。您应尽一切努力过滤掉低质量数据。如果您有一小部分在复杂性和准确性方面都极其高质量的数据，可以考虑将其放在训练结束时，以帮助模型更好地收敛。
+ 我们利用文本和多模态（MM）数据集进行数据混合。我们对文本数据集的实验表明，添加 Nova 专有的“reasoning-instruction-following”类别可以显著提高通用基准测试的性能。如果您关心使用数据集进行 SFT 后通用基准测试性能下降的问题，我们建议将此类别纳入数据混合策略。
+ 对于 MM 数据集，我们的实验表明，将超过 20% 的视频类别纳入混合有利于保持通用基准测试的性能。
+ 此外，启用数据混合的 SFT 对学习率非常敏感，因此，基于调查发现，建议使用默认学习率进行微调，即 LoRA 为 1e-5，FR 为 5e-6。
+ 最后，如果混合 Nova 专有数据集，则需要在延迟与性能之间进行权衡，因此，基于调查发现，建议最多混合 50% 以达到良好平衡。

# 强化学习
<a name="nova-hp-rft-forge"></a>

**注意**  
订阅后将提供详细文档

Nova Forge 提供高级强化学习能力，支持在自有环境中使用远程奖励函数。客户可选择集成自定义端点执行验证，以获取真实场景下的即时反馈，甚至可使用自定义编排工具在环境中协调代理的多轮评测。

## 使用自带编排工具进行代理多轮评测
<a name="nova-hp-rft-forge-byoo"></a>

对于需要多轮对话或奖励函运行时长超过 15 分钟超时限制的 Forge 用户，Nova Forge 提供自带编排（BYOO）功能。。您可借此在自有环境中协调代理多轮评测（例如：使用化学工具对分子设计打分，或通过机器人仿真对高效完成任务给予奖励、对碰撞行为施加惩罚）。

**Topics**
+ [

### 架构概述
](#nova-hp-rft-forge-architecture)
+ [

### 设置与执行
](#nova-hp-rft-forge-setup)

### 架构概述
<a name="nova-hp-rft-forge-architecture"></a>

BYOO 架构依托客户自主管理的基础设施，实现对推演与生成流程的完全控制。

**训练 VPC：**
+ **推演**：将推演生成任务委托给客户基础设施，以此协调训练过程
+ **训练器**：根据接收到的推演结果执行模型权重更新

**客户 VPC（如 EC2 上的 ECS）：**
+ **代理 Lambda**：接收推演请求，并与客户基础设施进行协调
+ **推演响应 SQS**：用于将完成的推演结果返回到训练基础设施的队列
+ **生成请求 SQS**：用于模型生成请求的队列
+ **生成响应 SQS**：用于模型生成响应的队列
+ **客户容器**：实现自定义编排逻辑（可使用官方提供的初始工具包）
+ **DynamoDB**：在整个编排过程中存储和检索状态

**工作流：**

1. “推演”将推演生成任务委托给“代理 Lambda”

1. “代理 Lambda”将推演 API 请求推送到“生成请求 SQS”

1. “客户容器”处理请求、管理多轮交互并调用奖励函数

1. 容器根据需要在 DynamoDB 中存储和读取状态

1. 容器将推演响应推送到“推演响应 SQS”

1. “推演”将完成的推演结果发送给“训练器”进行权重更新

### 设置与执行
<a name="nova-hp-rft-forge-setup"></a>

有关详细设置说明、配方配置、请求和响应格式以及环境示例，请参阅提供给 Nova Forge 订阅用户的保密文档。如需获取 Nova Forge 文档，请按照以下步骤操作：

```
aws s3 cp s3://nova-forge-c7363-206080352451-us-east-1/v1/ ./ --recursive
```

下载资源后，即可在 `docs` 文件夹下找到所有文档。

# 负责任的人工智能工具包和内容审核
<a name="nova-responsible-ai-toolkit"></a>

## 负责任的人工智能工具包
<a name="nova-responsible-ai-toolkit-overview"></a>

Nova Forge 提供了负责任的人工智能工具包，其中包含训练和评估数据，可在训练过程中使模型符合 Amazon Nova 负责任的人工智能指南，并在推理过程中实施运行时控制以调节模型响应。

**训练数据**：强调负责任的人工智能原则、安全考虑和负责任技术部署的案例和场景可用于数据混合，以便在持续预训练期间负责任地使模型对齐。

**评估**：用于测试模型检测和拒绝不当、有害或不正确内容能力的评估，作为一项基准测试任务提供，以确定基础模型性能与自定义模型性能之间的差异。

**运行时控制**：默认情况下，Amazon Nova 的运行时控制会在推理期间对模型响应进行审核。要修改这些运行时控制，请联系 AWS 客户经理，申请 Amazon Nova 的可自定义内容审核设置。

安全是 AWS 与用户的共同责任。更改基础模型或使用持续预训练来提高特定使用案例的性能，可能会影响新模型的安全性、公平性及其他特性。一种稳健的适应方法，可以最大限度地减少对基础模型中内置的安全性、公平性及其他保护措施的更改，同时最大限度地减少对模型未经自定义的任务的性能影响。需要对在代表使用案例的数据集上的应用程序进行端到端测试，以确定测试结果是否符合对安全性、公平性及其他属性的特定期望，以及整体有效性。有关更多信息，请参阅《Amazon Web Services 负责任的人工智能使用指南》、《Amazon Web Services 负责任的人工智能政策》、《Amazon Web Services 可接受使用政策》以及《Amazon Web Services 服务条款》。