aws-samples/sample-nova-multi-turn-rl-infra

GitHub: aws-samples/sample-nova-multi-turn-rl-infra

该项目是一个基于 AWS CDK 的基础设施模板,用于在 SageMaker HyperPod 上自动化编排 Amazon Nova 模型的多轮强化学习训练流程。

Stars: 0 | Forks: 0

# Nova 多轮强化学习 CDK 基础设施 用于在 SageMaker HyperPod 上使用多轮强化学习进行 Amazon Nova 模型定制的 AWS 基础设施。 ## 架构 两阶段部署: 1. `cdk deploy` 配置基础基础设施(VPC、IAM、S3、EKS、HyperPod、ECS、Step Functions、Lambda、EventBridge)。 2. 将 `.jsonl` 文件上传到 S3 的 `training-data/` 前缀会通过 EventBridge 触发 Step Functions 工作流。 ``` EventBridge (S3 upload) │ ▼ S3Trigger Lambda ──▶ Step Functions pipeline │ ▼ BootstrapEcrImage (CodeBuild) → DeployRftInfra (Lambda) → StartRewardWorkers (Lambda) → ValidateUploadData (Lambda) → SubmitTraining (CodeBuild, hyperpod CLI) → Success (on failure → PipelineFailed → SNS alert) ``` 步骤 0 和 4 在 CodeBuild 中运行(需要 Docker / hyperpod CLI)。步骤 1–3 在打包为 Docker 镜像的 Lambda 中运行,并使用 Nova SDK。每一步都有幂等性检查、指数退避重试机制,以及统一路由到失败状态的兜底策略。 由 SDK 管理的资源(conversation-proxy Lambda、SQS FIFO 队列、DynamoDB 状态表、ECS Fargate reward worker)是在工作流运行时创建的,而不是由 CDK 创建的。 ## 前置条件 - Python 3.12+,AWS CDK v2 (`npm install -g aws-cdk`),AWS CLI v2 - Docker 或 [Finch](https://github.com/runfinch/finch) 用于构建 Lambda 镜像 - 拥有 `ml.p5.48xlarge` 配额的 AWS 账户 ## 快速开始 ``` pip install -r requirements.txt # 要求:编辑 cdk.json 并设置 project_tag + sdk_resource_prefix cdk deploy --require-approval never # 上传会自动触发 pipeline aws s3 cp training-data.jsonl s3://BUCKET_NAME/training-data/training-data.jsonl ``` 在部署时覆盖参数: ``` cdk deploy -c instance_count=1 -c max_steps=20 -c global_batch_size=128 ``` ## 配置 所有参数都位于 `cdk.json` 的 `context` 下。 **基础设施:** `project_tag` 和 `sdk_resource_prefix` 是必填前缀。关键默认值:`instance_type=ml.p5.48xlarge`,`instance_count=10`(`generation_replicas=4` 时至少为 10),`nova_model=NOVA_LITE_2`,`region=us-east-1`,`eks_kubernetes_version=1.32`,`vf_env_id=wordle`。 **训练覆盖参数**(贯穿整个工作流事件):`training_method`、`max_steps`、`generation_replicas`、`global_batch_size`、`max_new_tokens`、`max_length`、`training_timeout`。 **目标现有集群:** 设置 `target_cluster_name`、`target_eks_cluster_name`、`target_instance_type`、`target_instance_count` 以针对预先存在的 HyperPod 集群运行。 ### 训练数据格式 基于元数据的 JSONL,每行一条记录;`data_s3_path` 必须是一个 `.jsonl` 文件,而不是目录: ``` {"id": "wordle_train_001", "metadata": {"prompt": "Guess the 5-letter word", "answer": "crane"}} ``` ### 自定义 reward 环境 1. 创建包含 `load_environment()` 函数的 `custom-environments//` 目录(参见 `my-custom-env`)。 2. 在 `cdk.json` 中设置 `use_custom_env: "true"` 和 `custom_env_id: ""`。 3. `cdk deploy` 会将该环境打包并上传至 S3。 `client/nova_async_client.py` 提供了一个兼容 OpenAI 的异步客户端,该客户端使用 SigV4 认证,适用于需要调用 Nova 推理端点的自定义 reward 函数。 ## 监控 **工作流失败告警** — 订阅导出为 `AlertTopicArn` 的 SNS topic: ``` aws sns subscribe --topic-arn \ --protocol email --notification-endpoint you@example.com ``` **EventBridge 触发失败** — 检查导出为 `TriggerDlqUrl` 的 DLQ。 **CloudWatch Logs:** - `/aws/vendedlogs/states/nova-rl-*` — Step Functions 执行日志 - `/aws/lambda/*{DeployRftInfra,StartRewardWorkers,ValidateUploadData}*` — 步骤 1–3 - `/aws/codebuild/nova-rl-submit-training` — 步骤 4 - `/aws/sagemaker/Clusters//*` — HyperPod 容器日志 ## 清理 1. 停止正在运行的 Step Functions 执行和 ECS reward worker。 2. 删除 SDK CloudFormation 堆栈 (`-*-NovaForgeSDK`)。 3. `cdk destroy`。 由于 GuardDuty 管理的 ENI,VPC 删除可能会失败——请先删除 VPC endpoint,等待约 2 分钟,然后重试。 ## 安全 - 启用了 `cdk-nag` `AwsSolutionsChecks`,并附有已记录的豁免项 - S3 存储桶:KMS 加密、阻止公共访问、强制 SSL、已启用版本控制 - 使用 KMS CMK 并为 CloudWatch Logs、SNS、EKS secrets、CodeBuild artifacts 开启轮换 - SNS 和 SQS DLQ 强制使用 SSL - IAM 权限策略在 SDK 命名允许的范围内限定于 `sdk_resource_prefix` - Lambda 容器以非 root 用户身份运行 - 用于 ECR、EKS、STS、CloudWatch Logs、Lambda、SQS 的 VPC 接口 endpoint **EKS 公共端点:** HyperPod 需要一个 PUBLIC 端点,因为其 `/readyz` 健康检查是由客户 VPC 外部的 AWS 托管服务账号运行的。`PUBLIC_AND_PRIVATE` 和仅私有配置会导致集群创建失败。上游 CIDR 范围未公开,因此无法限制 `public_access_cidrs`。访问受到 IAM 身份验证的保护。 ## 项目结构 ``` app.py CDK app entry point cdk.json CDK config and context defaults requirements.txt training-data.jsonl Sample data (300 Wordle samples) stacks/ nova_rl_stack.py VPC, EKS, HyperPod, S3, ECS, IAM orchestration.py Step Functions, Lambdas, EventBridge iam_policies.py Shared IAM policy builders lambdas/ Dockerfile Shared image for SDK Lambdas shared/infra_utils.py RFT infrastructure kwargs builder deploy_rft_infra/ Step 1 start_reward_workers/ Step 2 validate_upload_data/ Step 3 submit_training/ Step 4 (CodeBuild) s3_trigger/ EventBridge → Step Functions helm_install_trigger/ Custom Resource for Helm install lifecycle-scripts/on_create.sh HyperPod node bootstrap client/nova_async_client.py Async client with SigV4 (BYOO) custom-environments/ Custom reward environments ``` ## 故障排除 | 问题 | 解决方案 | |-------|------------| | `cdk deploy` 因配额失败 | 通过 Service Quotas 申请 `ml.p5.48xlarge` | | 上传未触发工作流 | 验证键名是否匹配 `training-data/*.jsonl`;检查 `TriggerDlqUrl` | | `data_s3_path` 验证错误 | 路径必须以 `.jsonl` 结尾(不能是目录) | | `SubmitTraining` 失败 | 检查 CodeBuild 日志;验证 `hyperpod connect-cluster` 是否成功 | | 训练 pod 发生 crash-loop | 查看 CloudWatch 中的 `/aws/sagemaker/Clusters//*` | | Reward worker 空闲 | 检查 ECS 任务日志;确认 SQS 队列深度 | | VPC 删除失败 | 删除 VPC endpoint,等待 2 分钟以释放 GuardDuty ENI | | HyperPod 报错 `NotStabilized` | EKS 端点必须为 PUBLIC(不能是 PUBLIC_AND_PRIVATE) |
标签:AWS CDK, SageMaker HyperPod, 大模型微调, 强化学习, 机器学习工程, 自动化流水线, 请求拦截, 逆向工具