RFT 评估 - 亚马逊 SageMaker AI
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

RFT 评估

什么是 RFT 评估?

RFT 评估允许您在强化学习训练之前、期间或之后使用自定义奖励函数评估模型的性能。与使用预定义指标的标准评估不同,RFT 评估允许您通过 Lambda 函数定义自己的成功标准,该函数根据您的特定要求对模型输出进行评分。

为什么要使用 RFT 进行评估?

评估对于确定 RL 微调过程是否具有:

  • 改进了模型与您的特定用例和人类价值观的一致性

  • 维护或改进了模型在关键任务上的能力

  • 避免了意想不到的副作用,例如减少事实、增加冗长或降低其他任务的性能

  • 符合您的奖励功能所定义的自定义成功标准

何时使用 RFT 评估

在以下场景中使用 RFT 评估:

  • RFT 训练之前:在评估数据集上建立基线指标

  • 在 RFT 训练期间:使用中间检查点监控训练进度

  • RFT 训练后:验证最终模型是否符合您的要求

  • 比较模型:使用一致的奖励标准评估多个模型版本

注意

当您需要针对特定领域的自定义指标时,请使用 RFT 评估。对于通用评估(准确度、困惑度、BLEU),请使用标准评估方法。

数据格式要求

输入数据结构

RFT 评估输入数据必须遵循 OpenAI 强化微调格式。每个示例都是一个 JSON 对象,其中包含:

  • messages— 一系列与角色的对话回systemuser

  • reference_answer— 您的奖励功能用于得分的预期输出或实况数据

数据格式示例

{ "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Solve for x. Return only JSON like {\"x\": <number>}. Equation: 2x + 5 = 13" } ] } ], "reference_answer": { "x": 4 } }

目前的局限性

  • 仅限文本:不支持多模式输入(图像、音频、视频)

  • 单回合对话:仅支持单用户消息(不支持多回合对话)

  • JSON 格式:输入数据必须采用 JSONL 格式(每行一个 JSON 对象)

  • 模型输出:根据指定模型生成的补全进行评估

准备评估配方

示例笔记本

有关完整示例,请参阅评估笔记本

示例配方配置

run: name: nova-lite-rft-eval-job model_type: amazon.nova-lite-v1:0:300k model_name_or_path: s3://escrow_bucket/model_location # [MODIFIABLE] S3 path to your model or model identifier replicas: 1 # [MODIFIABLE] For SageMaker Training jobs only; fixed for HyperPod jobs data_s3_path: "" # [REQUIRED FOR HYPERPOD] Leave empty for SageMaker Training jobs and use TrainingInput in sagemaker python SDK output_s3_path: "" # [REQUIRED] Output artifact S3 path for evaluation results evaluation: task: rft_eval # [FIXED] Do not modify strategy: rft_eval # [FIXED] Do not modify metric: all # [FIXED] Do not modify # Inference Configuration inference: max_new_tokens: 8192 # [MODIFIABLE] Maximum tokens to generate top_k: -1 # [MODIFIABLE] Top-k sampling parameter top_p: 1.0 # [MODIFIABLE] Nucleus sampling parameter temperature: 0 # [MODIFIABLE] Sampling temperature (0 = deterministic) top_logprobs: 0 # [MODIFIABLE] Set between 1-20 to enable logprobs output # ============================================================================= # Bring Your Own Reinforcement Learning Environment # ============================================================================= rl_env: reward_lambda_arn: arn:aws:lambda:<region>:<account_id>:function:<reward-function-name>

预设奖励功能

开源 verl 库中的两个预设奖励函数(prime_codeprime_math)可用作 Lambda 层,便于与 RFT Lambda 函数集成。

概述

这些预设函数为以下各项提供了 out-of-the-box评估功能:

  • prime_code— 代码生成和正确性评估

  • prime_math— 数学推理和问题解决评估

快速设置

  1. 从版本中下载 Lambda 层。nova-custom-eval-sdk

  2. 使用Amazon命令行界面 () Amazon CLI 发布 Lambda 层:

    aws lambda publish-layer-version \ --layer-name preset-function-layer \ --description "Preset reward function layer with dependencies" \ --zip-file fileb://universal_reward_layer.zip \ --compatible-runtimes python3.9 python3.10 python3.11 python3.12 \ --compatible-architectures x86_64 arm64
  3. 在Amazon管理控制台中将该层添加到您的 Lambda 函数( preset-function-layer从自定义层中选择,并为 numpy 依赖项添加 AWSSDKPandas-Python 312)。

  4. 导入并在您的 Lambda 代码中使用:

    from prime_code import compute_score # For code evaluation from prime_math import compute_score # For math evaluation

prime_code 函数

通过根据测试用例执行代码并测量正确性来评估 Python 代码生成任务。

输入数据集格式示例

{"messages":[{"role":"user","content":"Write a function that returns the sum of two numbers."}],"reference_answer":{"inputs":["3\n5","10\n-2","0\n0"],"outputs":["8","8","0"]}} {"messages":[{"role":"user","content":"Write a function to check if a number is even."}],"reference_answer":{"inputs":["4","7","0","-2"],"outputs":["True","False","True","True"]}}

主要特征

  • 自动从 markdown 代码块中提取代码

  • 函数检测和基于调用的测试

  • 使用超时保护执行测试用例

  • 语法验证和编译检查

  • 带有回溯功能的详细错误报告

prime_math 函数

通过符号数学支持评估数学推理和解决问题的能力。

输入格式

{"messages":[{"role":"user","content":"What is the derivative of x^2 + 3x?."}],"reference_answer":"2*x + 3"}

主要特征

  • 符号数学评估使用 SymPy

  • 多种答案格式(LaTeX、纯文本、符号)

  • 数学等效性检查

  • 表达式规范化和简化

数据格式要求

用于代码评估

  • 输入:函数参数数组(正确的类型:整数、字符串等)

  • 输出:预期返回值数组(正确的类型:布尔值、数字等)

  • 代码:必须使用 Python 并具有清晰的函数定义

用于数学评估

  • 参考答案:数学表达式或数值

  • 响应:可以是 LaTe X、纯文本或符号表示法

  • 等效:以符号方式检查,而不仅仅是字符串匹配

最佳实践

  • 在测试用例中使用正确的数据类型(整数与字符串、布尔值与 “True”)

  • 在代码问题中提供清晰的函数签名

  • 在测试输入中包括边缘情况(零、负数、空输入)

  • 在参考答案中统一设置数学表达式的格式

  • 部署前使用示例数据测试您的奖励功能

错误处理

这两个函数都包含强大的错误处理功能,可用于:

  • 生成的代码中存在编译错误

  • 执行期间的运行时异常

  • 输入数据格式错误

  • 无限循环的超时场景

  • 无效的数学表达式

创建你的奖励功能

Lambda ARN 要求

您的 Lambda ARN 必须遵循以下格式:

"arn:aws:lambda:*:*:function:*SageMaker*"

如果 Lambda 没有此命名方案,则任务将失败并显示以下错误:

[ERROR] Unexpected error: lambda_arn must contain one of: ['SageMaker', 'sagemaker', 'Sagemaker'] when running on SMHP platform (Key: lambda_arn)

Lambda 请求格式

您的 Lambda 函数接收以下格式的数据:

[ { "id": "sample-001", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Do you have a dedicated security team?" } ] }, { "role": "nova_assistant", "content": [ { "type": "text", "text": "As an AI developed by Company, I don't have a dedicated security team..." } ] } ], "reference_answer": { "compliant": "No", "explanation": "As an AI developed by Company, I do not have a traditional security team..." } } ]
注意

消息结构包括嵌套content数组,与输入数据格式相匹配。最后一条带角色的消息nova_assistant包含模型生成的响应。

Lambda 响应格式

您的 Lambda 函数必须以以下格式返回数据:

[ { "id": "sample-001", "aggregate_reward_score": 0.75, "metrics_list": [ { "name": "accuracy", "value": 0.85, "type": "Metric" }, { "name": "fluency", "value": 0.90, "type": "Reward" } ] } ]

响应字段

  • id— 必须与输入的样本 ID 相匹配

  • aggregate_reward_score— 总分(通常为 0.0 到 1.0)

  • metrics_list— 包含以下各项指标的数组:

    • name— 指标标识符(例如,“准确性”、“流畅度”)

    • value— 指标分数(通常为 0.0 到 1.0)

    • type— “指标”(用于报告)或 “奖励”(用于培训)

IAM 权限

所需的权限

您的 SageMaker 执行角色必须具有调用您的 Lambda 函数的权限。将此策略添加到您的 SageMaker 执行角色中:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "lambda:InvokeFunction" ], "Resource": "arn:aws:lambda:region:account-id:function:function-name" } ] }

Lambda 执行角色

您的 Lambda 函数的执行角色需要基本的 Lambda 执行权限:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:*:*:*" } ] }

如果您的 Lambda 函数访问其他Amazon服务(例如,S3 用于参考数据,DynamoDB 用于记录),请将这些权限添加到 Lambda 执行角色。

执行评估作业

  1. 准备数据-根据数据格式要求格式化评估数据并将您的 JSONL 文件上传到 S3:s3://your-bucket/eval-data/eval_data.jsonl

  2. 配置您的食谱-使用您的配置更新示例食谱:

    • 设置model_name_or_path到您的模特位置

    • 设置lambda_arn为你的奖励功能 ARN

    • 设置output_s3_path为所需的输出位置

    • 根据需要调整inference参数

    将食谱另存为 rft_eval_recipe.yaml

  3. 运行评估-使用提供的笔记本执行评估作业:评估笔记本

  4. 监控进度 — 通过以下方式监控您的评估工作:

    • SageMaker 控制台:检查任务状态和日志

    • CloudWatch 日志:查看详细的执行日志

    • Lambda 日志:调试奖励函数问题

了解评估结果

输出格式

评估任务以 JSONL 格式将结果输出到您指定的 S3 位置。每行包含一个样本的评估结果:

{ "id": "sample-001", "aggregate_reward_score": 0.75, "metrics_list": [ { "name": "accuracy", "value": 0.85, "type": "Metric" }, { "name": "fluency", "value": 0.90, "type": "Reward" } ] }
注意

RFT 评估任务输出与 Lambda 响应格式相同。评估服务无需修改即可通过您的 Lambda 函数的响应,从而确保您的奖励计算与最终结果之间的一致性。

解析 结果

总奖励分数

  • 范围:通常为 0.0(最差)到 1.0(最佳),但取决于您的实现

  • 用途:总结整体表现的单个数字

  • 用法:比较模型,跟踪与训练相比的改进

个人指标

  • 指标类型:用于分析的信息指标

  • 奖励类型:RFT 训练期间使用的指标

  • 解释:值越高通常表示性能越好(除非您设计反向指标)

性能基准

什么构成 “良好” 性能取决于您的用例:

分数范围 口译 Action
0.8-1.0 太棒了 模型已准备好部署
0.6-0.8 稍微的改进可能会有好处
0.4-0.6 一般 需要重大改进
0.0-0.4 可怜的 查看训练数据和奖励功能
重要

这些是一般指导方针。根据业务需求、基准模型性能、特定领域的限制以及对进一步培训的成本效益分析来定义自己的阈值。

问题排查

常见问题

问题 原因 解决方案
Lambda 超时 复杂的奖励计算 增加 Lambda 超时时间或优化函数
权限被拒绝 缺少 IAM 权限 验证 SageMaker 角色是否可以调用 Lambda
分数不一致 非确定性奖励函数 使用固定种子或确定性逻辑
缺少结果 未捕获 Lambda 错误 在 Lambda 中添加全面的错误处理功能

调试清单

  • 使用嵌套内容数组验证输入数据是否遵循正确的格式

  • 确认 Lambda ARN 正确且函数已部署

  • 检查 IAM 权限以获取 SageMaker → Lambda 调用

  • 查看 CloudWatch 日志中是否有 Lambda 错误

  • 验证 Lambda 响应是否符合预期的格式

最佳实践

  • 从简单开始:从基本的奖励功能开始,然后迭代

  • 单独测试 Lambda:在进行全面评估之前使用 Lambda 测试事件

  • 对小型数据集进行验证:在完整数据集之前对子集进行评估

  • 版本控制:跟踪奖励功能版本和模型版本

  • 监控成本:Lambda 调用和计算时间会影响成本

  • 广泛记录:在 Lambda 中使用打印语句进行调试

  • 适当设置超时:在耐心和成本之间取得平衡

  • 文档指标:明确定义每个指标的衡量标准

后续步骤

完成 RFT 评估后:

  • 如果结果令人满意:将模型部署到生产环境

  • 如果需要改进:

    • 调整奖励功能

    • 收集更多训练数据

    • 修改训练超参数

    • 运行其他 RFT 训练迭代

  • 持续监控:定期使用新数据重新评估