构建能够执行多步工作流的智能体时,你会发现训练这事儿和以往大不一样。这些智能体需要去查询数据库、调用API、交叉验证结果、还要能从中途的失败里恢复过来。在这样一个链条里,任何一个环节的“好”与“坏”,都得等到后面几步才能看出来。
问题在于,标准的RLHF(基于人类反馈的强化学习)只优化单次回复。这种思路在多步骤工作流面前就有点不够用了——想象一下,一个智能体在继续执行之前先验证一下数据,就能避免后续一连串的错误,这种能力靠RLHF是学不会的。这时候,多轮强化学习(Multi-turn RL)就派上了用场,它优化的是整个交互序列。你的智能体可以通过试错,学会如何编排工具、如何从错误中恢复、如何进行多步推理。监督微调(SFT)、检索增强生成(RAG)和继续预训练这些技术当然都很重要,但它们通常教不会这些循序渐进的决策能力。
针对这个痛点,亚马逊云科技提供了两种方案。其一是Amazon SageMaker AI,它把多轮强化学习做成了一个全托管的无服务器能力,你可以直接在SageMaker的训练作业里用上,完全不用操心基础设施。另一种是当你对训练栈有完全控制权时——比如要用自己的智能体环境、自定义编排逻辑,或者特定的实例配置,那就得靠Amazon Nova on Amazon SageMaker HyperPod这套基础设施了。它提供了计算层、编排层和奖励路由层,让你能上手训练这些处理复杂工作流的智能体。顺便提一句,Amazon Nova本身就拥有顶尖的智能和业界领先的性价比,而Amazon Nova Forge则更进一步,开放了多轮强化学习的训练能力。
下面这篇文章,我们会带你一步一步部署一个两阶段的基础设施,使用 Amazon Nova Forge on Amazon SageMaker HyperPod 来实践多轮强化学习。最终,你会拥有一个事件驱动的训练流水线:当数据上传到S3,训练就自动开始了。在这个例子里,训练任务是教会模型玩Wordle这个猜词游戏——你可以把它理解成某个你真正关心的RL任务的占位符。
解决方案概览
整个方案的核心是一个事件驱动型的流水线:你把数据集往S3里一丢,剩下的基础设施自动做——算力分配、奖励路由、多轮强化学习训练,一气呵成。这里面主要有三层在干活。
一个SageMaker HyperPod集群负责生成回复并执行GRPO(组相对策略优化)权重更新。运行在AWS Fargate上的Amazon ECS负责跑你的奖励环境(比如Wordle,或者你自定义的“自带编排器”环境)。Nova Forge SDK则像个路由器,在模型和奖励环境之间传递消息,同时追踪多轮对话的状态。最后,整个运行流程由AWS Step Functions来编排,一旦EventBridge检测到S3里有新数据进来,就立刻触发。
架构分两阶段部署:一次性通过AWS CDK部署,建立长期运行的基础设施(VPC、EKS/HyperPod、ECS、S3、IAM和流水线);每次训练运行时,再创建自己的临时资源。这样设计的好处是,GPU算力在日常期间不会闲置,你也能在不重新部署的情况下快速迭代。
下面这张图展示了训练运行时各个组件是如何交互的。
多轮RL on Amazon SageMaker HyperPod 基础设施架构图
这个流水线实质上是在三个计算平面上协调一个多轮对话循环:
- Amazon SageMaker HyperPod (EKS):训练主节点、工作节点和vLLM生成副本都跑在P5实例上。模型在这里生成回复,训练节点则根据奖励信号进行GRPO权重更新。
- ECS on Fargate:这里运行你的奖励环境(比如Wordle或自定义BYOO环境)。它们通过SQS队列接收模型回复,根据你设定的评分标准打分,再返回奖励信号。
- Amazon Nova Forge:SDK的袋里层在模型和奖励环境之间路由消息,并跨多轮对话追踪状态。
前置条件
动手部署之前,请确保你准备好了这些东西:
- Amazon Nova Forge 订阅:这是访问Nova Forge SDK和模型训练API的前提。
- SageMaker HyperPod 实例配额:最低需要10个
ml.p5.48xlarge(对应generation_replicas: 4)。生产环境建议申请12到14个。ml.p5en.48xlarge也是支持的。 - 已经引导(Bootstrap)的CDK环境:首次部署前务必运行
cdk bootstrap。 - Python 3.12+:CDK应用和Lambda运行时需要这个版本。
- AWS CDK v2:通过
npm install -g aws-cdk安装,用于合成和部署CloudFormation堆栈。 - AWS CLI v2:配置好凭证,需要有创建VPC、EKS集群、SageMaker HyperPod集群、IAM角色和Step Functions的权限。
- Docker:用于构建包含Nova Forge SDK的Lambda容器镜像。
重要提醒:这套基础设施在运行时,成本大约是每小时786到1180美元(使用10到12个
ml.p5.48xlarge实例)。请务必参考后面的成本分析章节,并在不训练时销毁堆栈。
部署基础设施
克隆与安装
先从克隆示例仓库开始,然后为CDK应用安装Python依赖。在你的本地机器或开发环境中运行以下命令:
git clone https://github.com/aws-samples/nova-multi-turn-rl-infra.git
cd nova-multi-turn-rl-infra
pip install -r requirements.txt
配置
所有参数都设置在 cdk.json 文件中的 context 键下。在首次部署前,有两个参数是**必填的**:
| 参数 | 描述 |
|---|---|
project_tag |
所有资源名称的唯一前缀(例如 my-nova-rl)。它将成为EKS集群名、HyperPod集群名和S3存储桶标签的一部分。 |
sdk_resource_prefix |
SDK创建资源的前缀(例如 nrl-myproject)。Nova Forge SDK会用这个前缀来命名它的CloudFormation堆栈、Lambda函数和SQS队列。 |
关键基础设施参数如下:
| 参数 | 默认值 | 描述 |
|---|---|---|
instance_type |
ml.p5.48xlarge |
HyperPod实例类型 |
instance_count |
10 |
受限实例组中的实例数量 |
nova_model |
NOVA_LITE_2 |
待训练的模型:NOVA_MICRO, NOVA_LITE, NOVA_LITE_2 或 NOVA_PRO |
vf_env_id |
wordle |
内置奖励环境,用于验证 |
use_custom_env / custom_env_id |
— | 想用BYOO时,将 use_custom_env 设为 true,并指定 custom-environments/ 下的目录名 |
reward_cpu / reward_memory |
2048 CPU, 4096 MiB | Fargate任务大小 |
eks_kubernetes_version |
1.32 | EKS集群版本 |
训练参数。它们会通过流水线事件传递到训练作业中:
| 参数 | 默认值 | 描述 |
|---|---|---|
training_method |
— | RFT_MULTITURN_FULL 或 RFT_MULTITURN_LORA |
max_steps |
10 |
训练步数 |
generation_replicas |
4 |
vLLM生成副本数 |
global_batch_size |
64 |
每步训练的样本数 |
你可以在部署时覆盖任何参数:
cdk deploy -c instance_count=1 -c max_steps=20
部署
cdk deploy --require-approval never
两阶段部署模型
这套基础设施采用两阶段部署模型,将长期运行的底层资源与每次训练运行的临时资源分开。这样做的好处很明显:只在需要时才创建昂贵的计算资源,从而降低成本;每次训练只需创建临时资源,无需全量重部署,加快迭代速度;每个生命周期彼此独立,简化管理。
第一阶段:CDK部署(一次性):运行 cdk deploy,你将会创建以下基础资源:
- 一个附带私有子网和VPC端点的Amazon VPC。
- 一个带有HyperPod受限实例组的Amazon EKS集群。
- 一个运行在Fargate上的Amazon ECS集群,用于奖励工人。
- 一个用于存储训练数据和检查点的S3存储桶。
- 所需的IAM角色。
- 一个Step Functions流水线。
- Amazon EventBridge规则。
部署过程大约需要30-40分钟。其中大部分时间花在EKS集群创建(约15分钟)、通过CodeBuild安装SageMaker HyperPod Helm chart(约5分钟)、SageMaker HyperPod集群部署(约15-25分钟,取决于P5容量)以及Lambda容器镜像构建(约5分钟)上。
第二阶段:运行时(每次训练运行):当你将一个 .jsonl 文件上传到S3存储桶的 training-data/ 前缀下时,EventBridge会触发一个Step Functions流水线,后者为这次训练运行创建临时资源。Nova Forge SDK会部署它自己的CloudFormation堆栈,其中包含Lambda函数(会话袋里)、SQS FIFO队列(模型和环境之间的消息路由)、DynamoDB表(对话状态追踪)以及ECS Fargate任务(奖励工人)。这些资源的生命周期都由SDK管理。
触发一次训练运行
基础设施部署完成后,启动训练运行就简单了——只需往S3里上传一个文件。EventBridge会监控S3存储桶的 training-data/ 前缀,一旦有新文件,就自动启动Step Functions流水线。
如果训练成功,你会在CloudWatch指标中看到,奖励分数随着训练步数稳步提升。以Wordle环境为例,模型通常能在50到100步内收敛,平均奖励从接近0逐步提高到0.6到0.8,这表明模型学会了根据反馈来缩小猜测范围。
准备训练数据
训练数据文件是 .jsonl 格式,采用基于元数据的方式:每一行都包含一个提示(prompt)和奖励环境用来打分的标准答案(answer)。
{"id": "wordle_train_001", "metadata": {"prompt": "Guess the 5-letter word", "answer": "crane"}}
{"id": "wordle_train_002", "metadata": {"prompt": "Guess the 5-letter word", "answer": "slate"}}
{"id": "wordle_train_003", "metadata": {"prompt": "Guess the 5-letter word", "answer": "plumb"}}
id 字段在所有记录中必须唯一。在每次对话开始时,模型会看到 metadata.prompt,而奖励环境则使用 metadata.answer 来跨多轮评分模型的回复。每个训练样本都会演变成一个多轮对话:模型先生成一个猜测,从奖励环境收到反馈,然后继续迭代,直到猜出答案或用完所有机会。
上传并自动触发
# 从CDK输出中获取存储桶名称
BUCKET=$(aws cloudformation describe-stacks --stack-name NovaMultiTurnRlStack --query "Stacks[0].Outputs[?OutputKey=='TrainingBucketName'].OutputValue" --output text)
# 上传:流水线自动启动
aws s3 cp training-data.jsonl s3://$BUCKET/training-data/training-data.jsonl
当一个文件落到 training-data/ 前缀下时,EventBridge会检测到PutObject事件,并调用 S3TriggerFn Lambda函数。这个函数会提取文件路径,将其与 cdk.json 中的训练参数合并,并将生成的事件数据传递给Step Functions。然后Step Functions会分五个阶段执行流水线。你可以在Step Functions控制台中查看进度,每个步骤都清晰地展示了输入、输出、耗时和重试次数。
手动触发,用于临时测试
如果想在不重新上传数据的情况下快速迭代参数,可以使用提供的脚本绕过EventBridge,直接调用流水线:
# 为快速测试覆盖训练参数
./scripts/setup.sh --data-path s3://$BUCKET/training-data/training-data.jsonl --max-steps 5 --global-batch-size 32 --training-method RFT_MULTITURN_LORA
这在开发阶段特别有用:可以指向一个已有的数据集,然后尝试不同的步数、批次大小或训练方法(全量微调 vs LoRA),而无需修改 cdk.json 或重新部署。
监控与调试
这套多阶段流水线涉及的每一层——SageMaker HyperPod、ECS、Lambda、SQS——都提供了清晰的观测性手段,让你能快速定位问题。
流水线监控
Step Functions控制台就是你的主仪表盘。每次执行都会分步骤展示进度,包括耗时、输入/输出数据和重试历史。每个步骤都向自己的CloudWatch日志组写入日志。
正常运行情况下,每个Step Functions步骤都会在预期时间内完成:基础设施搭建2-3分钟,奖励工人部署1-2分钟,数据验证不到1分钟,训练提交3-5分钟。SQS队列中的消息应该平稳流动,没有持续堆积。
失败告警
一个由AWS KMS加密的Amazon SNS主题,会在Step Functions执行失败时发布通知。你可以订阅这个主题,通过邮件、Slack或PagerDuty接收告警:
# 从CDK输出中获取主题ARN
TOPIC_ARN=$(aws cloudformation describe-stacks --stack-name NovaMultiTurnRlStack --query "Stacks[0].Outputs[?OutputKey=='AlertTopicArn'].OutputValue" --output text)
# 订阅并通过邮件确认
aws sns subscribe --topic-arn $TOPIC_ARN --protocol email --notification-endpoint your-team@example.com
触发失败排查
如果S3上传后没有启动流水线,先去检查死信队列。EventBridge到Lambda调用失败的事件会存储在这里,里面包含了原始S3事件数据和错误详情:
DLQ_URL=$(aws cloudformation describe-stacks --stack-name NovaMultiTurnRlStack --query "Stacks[0].Outputs[?OutputKey=='TriggerDlqUrl'].OutputValue" --output text)
aws sqs receive-message --queue-url $DLQ_URL --max-number-of-messages 5
常见的原因包括:文件名格式错误(触发器只认 .jsonl 扩展名)、IAM权限被误改、Lambda并发限制。
训练卡住问题排查
如果流水线启动了但训练卡住,问题十有八九出在模型和奖励环境之间的消息路由层。可以用SDK内置的诊断工具检查SQS队列的健康状态:
from rft_infra import check_all_queues
# 返回所有FIFO队列的消息计数(处理中、可用、延迟)
check_all_queues()
如果请求队列不断堆积,而响应队列为空,说明奖励工人没有在处理消息。反之,如果响应队列堆积,说明模型没有消费奖励。这两种模式会清晰地告诉你应该去调查哪个组件。
HyperPod健康检查
确认SageMaker HyperPod集群上的所有训练和生成Pod都在运行:
kubectl get pods -n kubeflow
所有Pod的状态应该是 Running 或 Completed。如果Pod卡在 Pending 状态,说明受限实例组的容量不足。如果处于 CrashLoopBackOff 状态,说明是容器级别的错误。可以用 kubectl logs 查看Pod日志来获取详细信息。
清理与管理成本
清理脚本会按顺序停止活跃资源:Step Functions执行、ECS任务、SDK的CloudFormation堆栈,最后是CDK堆栈。
要避免产生费用,请运行以下命令销毁整个堆栈:
./cleanup.sh
如果想保留S3中的训练数据(存储费用仍会产生),可以这样操作:
./cleanup.sh --retain-data
重要提醒: 在不训练的时候,务必销毁堆栈。SageMaker HyperPod实例和NAT网关的空闲成本积少成多,这可不是个小数目。
成本分析
| 资源 | 每小时成本 | 备注 |
|---|---|---|
| SageMaker HyperPod 8 × ml.p5.48xlarge | ~$786/hr | 最低配置(10个实例,8个用于计算) |
| SageMaker HyperPod 12 × ml.p5.48xlarge | ~$1,180/hr | 生产配置(12个实例,有冗余) |
| EKS 控制面 | $0.10/hr | |
| NAT Gateway | ~$0.045/hr | |
| ECS Fargate 奖励工人 | ~$0.15-0.30/hr | + 数据传输费用 |
| S3, Lambda, CodeBuild, SQS, DynamoDB | 可忽略不计 |
关于Amazon Nova Forge的最新定价,请参阅Amazon Nova产品定价页面。
成本优化
你可以通过两种策略来降低空闲成本:
- 缩容至零: 配置一个单实例集群,并设置自动扩缩策略,在非活跃期间缩容至零,从而完全消除空闲计算成本。
- 实例类型调度: 在环境搭建和非峰值期间使用成本更低的实例类型,等到训练负载开始时再切换至更高性能的实例。
总结
至此,你已经拥有了一套可用于生产环境的、事件驱动的基础设施,能够在Amazon SageMaker HyperPod上使用Amazon Nova Forge进行多轮强化学习。只需向S3上传一个数据集,整个流水线就会自动处理资源调配、训练编排和奖励路由。如果想把它应用到自己的业务场景中,只需替换掉Wordle环境,换成你自己的API调用智能体或企业工作流即可。
接下来可以做什么:
- 克隆示例仓库:aws-samples/nova-multi-turn-rl-infra。
- 阅读Amazon SageMaker HyperPod文档。
- 了解Amazon Nova的能力和定价。
- 根据AWS Step Functions开发者指南,自定义你的流水线。
