关于 finetuning
finetuning 是在 SageMaker 上生成模型微调代码的 Agent skill,面向已确定用例、基础模型、微调技术和数据集的用户。它按技术类型使用指定模板,并包含 RLVR、RLAIF 和许可确认等对应步骤。
主要功能
- 01按微调技术选择代码模板
- 02生成配置并保存训练笔记本
- 03为 RLVR 配置奖励函数
- 04提供 RLAIF 和许可处理流程
- 05训练运行及状态检查指导
适用场景
- 01为 SFT 或 DPO 准备训练笔记本
- 02创建 RLVR 奖励函数配置
- 03启动训练并查看作业状态
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ awslabs/ agent-plugins --skill finetuning安装后在 Claude Code 中输入/finetuning确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
code_templates/dpo.pyrlaif_builtin.pyrlaif_custom_prompt.pyrlvr.pysft.pyreferences/code_output_guide.mdcontinuous_customization.mdeula_links.mdrlaif_guide.mdrlvr_reward_function.mdscripts/mlflow_reference.pytemplates/nova_rlvr_reward_function_source_template.pyrlvr_reward_function_source_template.py详细介绍
前置条件
开始此工作流前,请确认:
-
存在
use_case_spec.md文件- 如果缺失:先启用
use-case-specification技能,然后继续 - 绝不要在未启用
use-case-specification技能的情况下,提出创建用例规范。
- 如果缺失:先启用
-
已选定微调技术(SFT、DPO、RLVR、RLAIF 或 CPT/RFT(用于 Nova))和基础模型
- 如果缺失:启用
model-selection和/或finetuning-technique技能以收集缺少的信息,然后继续 - 不要临时提出建议。必须启用相应的技能。
- 如果缺失:启用
-
已确定 SageMakerHub 上可用的基础模型名称
- 如果缺失:启用
model-selection技能来获取 - **重要:**只能使用
model-selection获取的模型名称,因为它可能与该模型的其他常用名称不同。
- 如果缺失:启用
-
已验证 SDK 环境(SDK 版本、区域、执行角色)
- 如果尚未完成:先启用
sdk-getting-started技能,然后继续
- 如果尚未完成:先启用
-
已将训练数据集上传到环境默认区域中的存储桶。
- 如果尚未满足:帮助用户将数据集上传到正确的 S3
关键规则
代码生成规则
- ✅ 使用每个代码模板中列出的准确导入语句
- ❌ 不要添加额外的导入语句,即使它们看起来有用
- ❌ 不要在相应章节需要变量之前创建变量
- 📋 严格复制代码结构,不要自行发挥
- 🎯 严格遵循最少代码原则
- ✅ 编写代码时,确保缩进和 f 字符串正确
用户沟通规则
- ❌ 训练进行期间,绝不要提出转到后续技能(逻辑上不可能)
- ❌ 未经用户在对话中明确确认,绝不要将 ACCEPT_EULA 设置为 True
- ✅ 始终同时提及所引用章节的编号和标题
- ✅ 如果用户询问如何运行(notebook):如果有
run_cell,则提出代为运行;否则告知用户逐个运行单元格(并提及 ipykernel 要求)。 - ✅ 如果用户询问如何运行(脚本):告知用户使用
python3 <script>.py运行
工作流
1. 代码生成设置
1.1 目录设置
- 根据对话上下文确定项目目录
- 如果不明确(存在多个相关目录)→ 询问用户要使用哪个文件夹
- 如果不存在项目目录 → 启用 directory-management 技能来创建目录
⏸ 等待用户。
1.2 选择代码模板
阅读 references/code_output_guide.md,了解输出格式规则,然后阅读与微调策略对应的代码模板:
- SFT →
code_templates/sft.py - DPO →
code_templates/dpo.py - RLVR →
code_templates/rlvr.py - 使用内置奖励的 RLAIF →
code_templates/rlaif_builtin.py - 使用自定义提示词的 RLAIF →
code_templates/rlaif_custom_prompt.py
模板是一个 Python 文件,其中每条 # Cell N: Label 注释都标记了新章节的开始。按这些标记拆分——从一条标记到下一条标记之间的所有内容,都作为一个输出单元。
1.3 生成代码
- 按照
code_output_guide.md中的规则编写模板代码 - 使用与模板相同的顺序、依赖项和导入语句
- 不要自行发挥或添加额外代码
- 如果模型不是 Meta/Llama 模型(模型 ID 不以
meta-开头):- 从配置单元格中省略
ACCEPT_EULA = False这一行 - 从训练器调用中省略
accept_eula=ACCEPT_EULA,这一行
- 从配置单元格中省略
- 如果模型属于 Nova 系列,则从“配置训练器”章节和“超参数覆盖”章节中省略任何包含
max_epochs或lr_warmup_steps_ratio的代码
1.4 自动生成配置值
在“Setup & Credentials”单元格中填写:
-
BASE_MODEL
- 使用上下文中的 SageMakerHub 模型名称,务必完全一致
-
MODEL_PACKAGE_GROUP_NAME
- 根据使用场景生成(如有需要,请读取
use_case_spec.md) - 格式规则:
- 仅使用小写字母、数字和连字符
- 1-63 个字符
- 模式:
[a-zA-Z0-9](-*[a-zA-Z0-9]){0,62} - 示例:“客户支持聊天机器人” →
customer-support-chatbot-v1
- 根据使用场景生成(如有需要,请读取
-
保存 Notebook
2. RLVR 奖励函数(仅适用于 RLVR;如果技术方案是 SFT 或 DPO,请跳过此部分)
2.1 检查奖励函数状态
- 询问用户是否已有奖励函数,或是否需要帮助创建。
- 如果用户表示已有 → 询问 SageMaker Hub Evaluator ARN。只有在用户提供有效的 Evaluator ARN 后,才继续第 2.3 节。如果该函数尚未注册为 SageMaker Hub Evaluator,则继续第 2.2 节。
- 如果用户表示没有 → 继续第 2.2 节
2.2 根据模板生成奖励函数
- 按照
references/rlvr_reward_function.md中“帮助用户创建自定义奖励函数”部分的工作流操作
2.3 设置 CUSTOM_REWARD_FUNCTION 值
- 在 Notebook 中,将奖励函数的 ARN 设为
CUSTOM_REWARD_FUNCTION的值(该 ARN 可以由用户直接提供,也可以通过函数生成代码中的evaluator.arn获取)。
3. RLAIF(仅适用于 RLAIF;如果技术方案不是 RLAIF,请跳过此部分)
阅读 references/rlaif_guide.md 并遵循其中的说明。
4. EULA 审核与接受
- 从
references/eula_links.md中查找所选基础模型的官方许可链接 - 按照
references/eula_links.md中的措辞向用户展示许可。对于 OSS 模型:“此模型采用 {License} 许可。请在此处查看许可条款:{URL}。”对于 Nova 模型:“此模型受 AWS 服务条款约束:{URL}。” - 检查所选基础模型是否为 Meta/Llama 模型(模型 ID 以
meta-开头)- 如果是 Meta/Llama:告知用户使用此模型前必须阅读并同意 EULA。询问:“您是否接受许可条款?(是/否)”。如果用户确认,将
ACCEPT_EULA = True,并在生成的 Notebook 中取消注释accept_eula=ACCEPT_EULA。如果用户拒绝,则保留ACCEPT_EULA = False,并警告用户:未接受许可将导致训练失败。 - 如果不是 Meta 模型:告知用户相关许可以供参考。无需在代码层面采取任何操作——Notebook 中应已省略
ACCEPT_EULA变量和accept_eula参数(参见步骤 1.3)。
- 如果是 Meta/Llama:告知用户使用此模型前必须阅读并同意 EULA。询问:“您是否接受许可条款?(是/否)”。如果用户确认,将
5. 生成后
生成代码后,询问用户是否要运行。训练可能需要数小时,具体取决于数据集和模型。
Notebook 模式: 如果有 run_cell,询问用户是否要运行这些单元格。否则,告知用户自行运行单元格。
脚本模式: 向用户提供以下选项:
“您希望我:
- 由您自行运行 — 使用
python scripts/[script_name]运行- 运行脚本并等待完成
- 启动脚本但不等待 — 我们之后可以查看状态”
- 选项 1: 完成。等待用户回来。
- 选项 2: 按原样执行脚本。
trainer.train(wait=True)会一直阻塞到训练完成。报告最终状态。 - 选项 3: 将脚本中的
wait=True改为wait=False,然后执行,并报告训练任务名称。
查看状态:
describe-training-job --training-job-name NAME→TrainingJobStatus、FailureReason、SecondaryStatusTransitions- 完成后获取模型包 ARN:
list-model-packages --model-package-group-name GROUP_NAME --sort-by CreationTime --sort-order Descending --max-results 1
完成后展示结果:
- 参考
scripts/mlflow_reference.py,查询 MLflow 指标 - 以文本表格展示每个 epoch 的损失(SFT 显示 total_loss、val_eval_total_loss;DPO 显示 rewards/margins;RLVR 显示 critic/rewards/mean)
重要:
- 训练完成前,不要建议用户进入下一步
- 除非用户特别询问,否则不要详细介绍后续步骤。
6. 持续自定义
如果用户想微调已经自定义过的模型,请遵循 references/continuous_customization.md 中的说明
参考资料
rlvr_reward_function.md- Lambda 奖励函数创建指南(仅适用于 RLVR)templates/rlvr_reward_function_source_template.py- 面向开源权重模型的 Lambda 奖励函数源码模板(仅适用于 RLVR)templates/nova_rlvr_reward_function_source_template.py- 面向 Nova 2.0 Lite 的 Lambda 奖励函数源码模板(仅适用于 RLVR)code_templates/sft.py- 监督式微调(OSS 路径)的完整 Notebook 模板code_templates/dpo.py- 直接偏好优化(OSS 路径)的完整 Notebook 模板code_templates/rlvr.py- 可验证奖励强化学习(OSS 路径)的完整 Notebook 模板references/continuous_customization.md- 微调已完成微调的模型的说明。rlaif_guide.md- RLAIF 微调选项说明rlaif_builtin.py- 使用内置裁判提示词的 RLAIF 代码模板rlaif_custom_prompt.py- 使用自定义裁判提示词的 RLAIF 代码模板