AWS Builder Center
40美金复现 Karpathy 的 "AI 自动科研" —— Claude Code × Amazon Bedrock 实战

40美金复现 Karpathy 的 "AI 自动科研" —— Claude Code × Amazon Bedrock 实战

用 Claude Code(基于 Amazon Bedrock)复现 Andrej Karpathy 的 autoresearch,总成本约 $40 —— 单卡 A10G 一晚跑完 222 个实验,验证损失下降 3.4%。文章包含基于 SSM 的一键部署、Agent 完整的实验演进路径,以及 24.5 小时自主 ML 研究中的关键洞察。

摘要

我用一台 AWS g5.xlarge 实例(NVIDIA A10G 24GB)和 Claude Code(通过 Amazon Bedrock  接入),复现了 Andrej Karpathy 的 autoresearch 实验。24.5 小时内跑了 222 个实验,35 个改进被保留,验证损失(val_bpb)从 1.1498 降到 1.1107,下降了 3.4%。总成本约 $40-45(GPU + Bedrock API)。
💡 想直接上手?跳转到 快速复现:9 步开始实验

一、为什么做这个实验

2026 年 3 月 7 日,Andrej Karpathy 开源了 autoresearch ,一个让 AI Agent 在单块 GPU 上自主跑 ML 实验的框架。核心思路极其简洁:给 Agent 一个训练脚本,让它自己改代码、跑实验、只保留有效改进,循环往复。你睡一觉醒来,就能看到一份实验日志和一个更好的模型。
项目发布后迅速走红——21,000+ GitHub Stars,Fortune 杂志将其核心方法论命名为 "The Karpathy Loop"。
我想亲手验证几个问题:
  1. 在非 H100 的中端 GPU 上,autoresearch 能跑起来吗?
  2. 用 Amazon Bedrock  接入 Claude(而非直接用 Anthropic API),流程顺畅吗?
  3. 一晚上的自主实验,真的能产出有意义的改进吗?

二、autoresearch 的核心机制

三文件契约

autoresearch 的设计只有三个关键文件:
文件角色谁来修改
prepare.py数据准备 + 评估基准不可修改(中立裁判)
train.py模型架构 + 优化器 + 训练循环AI Agent
program.md研究方向和约束条件人类

棘轮循环(Ratchet Loop)

Agent 的工作流程是一个 9 步循环:
  1. 读取 program.md 理解研究方向
  2. 检查当前代码和历史结果
  3. 提出假设
  4. 修改 train.py
  5. Git commit
  6. 训练固定 5 分钟
  7. 崩溃则回滚重试
  8. 评估 val_bpb,记录结果
  9. 改进则保留 commit,否则 git reset 回滚
然后从第 1 步重新开始。永不停止。

三、基础设施搭建

硬件选择

Karpathy 的原始实验用的是 H100(80GB VRAM),默认配置的 peak VRAM 约 45GB。AWS 上对应的 p5.4xlarge 要 $7.91/hr。
我选择了更经济的方案:
项目配置
实例类型g5.xlarge
GPUNVIDIA A10G, 24 GB VRAM
价格~$1.24/hr (On-Demand)
Regionus-west-2
AMIDeep Learning OSS Nvidia Driver AMI GPU PyTorch 2.7 (Ubuntu 22.04)

连接方式:SSM Session Manager

我没有使用传统的 SSH,而是选择了 AWS Systems Manager Session Manager:
  • 零入站端口:安全组不开放任何入站规则,比 SSH 更安全
  • 无需密钥管理:不需要 .pem 文件
  • IAM 集成:通过 IAM Role 控制访问权限
连接命令:
1
aws ssm start-session --target <instance-id> --region us-west-2

AI Agent:Claude Code via Amazon Bedrock 

这是本次实验的一个特色——我没有使用 Anthropic 的直接 API,而是通过 Amazon Bedrock  接入 Claude:
模型配置:
  • 主模型:Claude Sonnet 4.6(us.anthropic.claude-sonnet-4-6)— $3/$15 per MTok
  • 高级推理模型:Claude Opus 4.6(us.anthropic.claude-opus-4-6-v1)— $5/$25 per MTok,用于复杂推理场景
优势:
  • EC2 实例通过 Instance Role 自动获取 Bedrock 凭证,无需管理 API Key
  • 计费走 AWS 统一账单
  • IAM 策略精细控制模型访问权限
配置方式:
在 EC2 实例的 IAM Role 上附加 Bedrock 权限策略:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"bedrock:InvokeModel",
"bedrock:InvokeModelWithResponseStream",
"bedrock:ListInferenceProfiles",
"bedrock:GetInferenceProfile"
],
"Resource": [
"arn:aws:bedrock:*:*:inference-profile/*",
"arn:aws:bedrock:*:*:application-inference-profile/*",
"arn:aws:bedrock:*:*:foundation-model/*"
]
}
]
}
Claude Code 的环境配置(~/.claude/.env):
1
2
3
4
5
CLAUDE_CODE_USE_BEDROCK=1
AWS_REGION=us-west-2
ANTHROPIC_MODEL=us.anthropic.claude-sonnet-4-6
ANTHROPIC_DEFAULT_SONNET_MODEL=us.anthropic.claude-sonnet-4-6
ANTHROPIC_DEFAULT_OPUS_MODEL=us.anthropic.claude-opus-4-6-v1

运行环境详解

AMI 选择:Deep Learning OSS Nvidia Driver AMI GPU PyTorch 2.7 (Ubuntu 22.04)
这个 AMI(ami-0ca70308d230e8a6e,us-west-2)是 AWS 官方维护的深度学习镜像,预装了:
组件版本说明
Ubuntu22.04 LTS基础操作系统
NVIDIA Driver预装GPU 驱动,开箱即用
CUDA Toolkit12.8GPU 计算框架
PyTorch2.9.1+cu128深度学习框架(autoresearch 依赖)
Python3.10+运行环境
SSM Agent预装支持 Session Manager 连接
选择这个 AMI 的原因是省去了手动安装 NVIDIA 驱动和 CUDA 的麻烦——这两步在裸 Ubuntu 上经常出问题。
AMI 未预装但需要额外安装的组件:
组件用途安装方式
uvPython 包管理器(autoresearch 用它管理依赖)curl -LsSf https://astral.sh/uv/install.sh \| sh
Node.js 22.xClaude Code 运行时依赖curl -fsSL https://deb.nodesource.com/setup_22.x \| bash - && apt-get install -y nodejs
Claude CodeAI 编程 Agentnpm install -g @anthropic-ai/claude-code
⚠️ cloud-init 的坑:
Deep Learning AMI 首次启动时,cloud-init 的 modules:final 阶段会执行大量后台任务(编译 CUDA 内核、配置环境等),耗时可达 15-20 分钟。如果在 User Data 脚本中使用 cloud-init status --wait,整个初始化会被阻塞。
我的实际经验是:跳过 cloud-init 等待,通过 SSM 手动执行安装步骤更可靠。实例启动后 SSM Agent 通常在 30-40 秒内就绪,此时就可以连接上去手动安装。

一键部署

我编写了一个部署脚本,自动完成所有基础设施搭建:
  1. 创建 IAM Role(SSM + Bedrock 权限)
  2. 创建安全组(零入站端口)
  3. 自动检测并启动最新的 Deep Learning AMI
  4. User Data 自动安装 uv、Node.js、Claude Code、克隆 autoresearch
  5. 等待 SSM Agent 就绪
AMI 自动检测机制:
脚本不硬编码 AMI ID(因为不同 Region 的 AMI ID 不同,且 AWS 会定期发布新版本),而是通过 AWS API 自动查找目标 Region 中最新的 Deep Learning AMI:
1
2
3
4
5
6
7
AMI_ID=$(aws ec2 describe-images --region "$REGION" \
--owners amazon \
--filters \
"Name=name,Values=Deep Learning OSS Nvidia Driver AMI GPU PyTorch 2*Ubuntu 22.04*" \
"Name=state,Values=available" \
--query "sort_by(Images, &CreationDate)[-1].ImageId" \
--output text)
这段代码做了三件事:
  • 在目标 Region 中搜索 AWS 官方(--owners amazon)发布的 AMI
  • 按名称模式匹配 Deep Learning OSS Nvidia Driver AMI GPU PyTorch 2*Ubuntu 22.04*
  • 按创建日期排序,取最新的一个
在 us-west-2 中,当前匹配到的是 ami-0ca70308d230e8a6e(PyTorch 2.7, 2026-04-27 发布)。然后在 aws ec2 run-instances --image-id "$AMI_ID" 中引用该 AMI 启动实例。这样脚本在任何 Region 都能自动找到最新的 Deep Learning AMI,无需手动维护 AMI ID。
从执行脚本到 SSM 连接就绪,约 5 分钟。

快速复现:9 步开始实验

以下是从零开始到实验运行的完整步骤。资深开发者可以直接按步骤操作,详细原理见前面各小节。
前置条件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 1. 克隆部署脚本
git clone https://github.com/hanyun2019/autoresearch-on-aws.git
cd autoresearch-on-aws

# 2. 一键部署(约 5 分钟)
chmod +x setup.sh connect.sh cleanup.sh
./setup.sh
# 脚本结束后会输出 Instance ID,请记下来

# 3. 连接到实例
./connect.sh

# 4. 等待初始化完成(cloud-init 首次启动需 15-20 分钟)
sudo -u ubuntu -i
cat ~/autoresearch/.setup-complete # 显示 "READY" 表示就绪
# 如果文件不存在,查看日志:tail -f /var/log/autoresearch-setup.log

# 5. 确认环境
nvidia-smi && which claude

# 6. 启动实验
cd ~/autoresearch
tmux new -s research
claude --dangerously-skip-permissions
# 首次启动的 Bedrock 向导:认证选 "Use credentials already in my environment",模型选 "Pin the working models"
# 重启后输入提示词:
1
2
3
Hi have a look at program.md and let's kick off a new experiment!
let's do the setup first. Note: we're on a single A10G with 24GB VRAM,
so please adjust the model size and dataset accordingly.
1
2
3
4
5
6
7
8
9
10
11
# 7. 分离 tmux,去睡觉:Ctrl+B, D

# 8. 第二天查看结果
tmux attach -t research
cat results.tsv && git log --oneline

# 9. 停止实例(~$1.24/hr)
aws ec2 stop-instances --instance-ids <instance-id> --region us-west-2

# 用完彻底清理
./cleanup.sh
完整脚本和实验数据见 GitHub 仓库:hanyun2019/autoresearch-on-aws 

四、适配 A10G 24GB

原始配置面向 H100 80GB,直接跑会 OOM。Claude Code 在读取 program.md 和 train.py 后,自主完成了以下调整:
参数原始值 (H100)调整后 (A10G)原因
DEPTH84模型维度从 512 降到 256,参数量减少约 4 倍
DEVICE_BATCH_SIZE12832减少激活内存
TOTAL_BATCH_SIZE2^19 (524K)2^17 (131K)适配更小的 batch
WINDOW_PATTERN"SSSL""L"带状注意力在 A10G 上效率低,改用全上下文
这些调整让 baseline 只使用了 3.6 GB VRAM,为后续实验留出了充足的探索空间。

五、实验过程

启动

1
2
3
4
5
6
7
8
# 以无权限确认模式启动 Claude Code(autoresearch 需要完全自主运行)
claude --dangerously-skip-permissions

# 提示词
> Hi have a look at program.md and let's kick off a new experiment!
> let'
s do the setup first. Note: we're on a single A10G with 24GB VRAM,
> so please adjust the model size and dataset accordingly.
Claude Code 的启动流程:
  1. 读取 program.md、train.py、prepare.py
  2. 检测 GPU 型号和 VRAM
  3. 创建实验分支 autoresearch/may2
  4. 调整 train.py 参数
  5. 运行 uv run prepare.py 下载数据(约 2 分钟)
  6. 提交 baseline commit
  7. 开始棘轮循环

阶段一:探索硬件边界(实验 1-6,约 1 小时)

Agent 首先探索了 A10G 的能力边界:
1
2
3
4
5
6
baseline (DEPTH=4, bs=32) → val_bpb=1.1498, 3.6 GB ✅ keep
DEPTH=12, bs=128 → OOM 22GB ❌ crash
DEPTH=8, bs=64 → OOM 20GB ❌ crash
DEPTH=8, bs=32 → val_bpb=1.2059, 11.4 GB ❌ discard(更慢)
DEPTH=4, bs=128 → val_bpb=1.1579, 14.0 GB ❌ discard
DEPTH=6, 384-dim → val_bpb=1.1749, 6.9 GB ❌ discard
关键发现:更大的模型在 5 分钟内反而更差——每步更慢,总步数更少,收敛不够。这正是 autoresearch 固定时间预算设计的精妙之处。

阶段二:发现 MLP 扩展(实验 7-18,约 2 小时)

Agent 转向结构性改进,发现了第一个突破:
1
2
3
4
MLP 4x → 8x 扩展 → val_bpb=1.1491 ✅ keep(更宽的 FFN 层)
8x MLP + batch 2^16 → val_bpb=1.1422 ✅ keep(更多步数)
GeLU 替换 ReLU² → val_bpb=1.1543 ❌ discard
SwiGLU → val_bpb=1.2289 ❌ discard(差很多)
关键发现:在这个小模型上,简单的 ReLU² 激活函数比 GeLU 和 SwiGLU 都好。

阶段三:模型放大突破(实验 19-35,约 3 小时)

最大的单次跳跃出现在这个阶段:
1
2
3
ASPECT_RATIO=96 (384-dim) → val_bpb=1.1233 ✅ keep(巨大改进!)
ASPECT_RATIO=128 (512-dim) → val_bpb=1.1262 ❌ discard(太慢)
DEPTH=5, ASPECT_RATIO=76 → val_bpb=1.1233 ❌ discard(持平但更慢)
关键发现:从 256-dim 扩到 384-dim(3 个注意力头,24.4M 参数),val_bpb 从 1.1422 跳到 1.1233——这是整个实验中最大的单次改进。但继续扩到 512-dim 就太慢了。

阶段四:优化器精调(实验 36-100,约 6 小时)

在 384-dim 模型的基础上,Agent 开始系统性地微调每一个超参数:
1
2
3
4
5
6
7
WARMDOWN_RATIO=0.6 → val_bpb=1.1220 ✅ keep
MATRIX_LR=0.055 → val_bpb=1.1202 ✅ keep
WEIGHT_DECAY=0.05 → val_bpb=1.1160 ✅ keep
SCALAR_LR=1.2 → val_bpb=1.1178 ✅ keep
FINAL_LR_FRAC=0.04 → val_bpb=1.1157 ✅ keep
UNEMBEDDING_LR=0.007 → val_bpb=1.1188 ✅ keep
gradient clipping norm=1.0 → val_bpb=1.1188 ✅ keep

阶段五:精细打磨与窗口模式突破(实验 100-222,约 12 小时)

在超参数微调接近饱和后,Agent 发现了一个新的突破方向——窗口注意力模式:
1
2
3
4
5
6
7
8
9
10
QK norm 移到 RoPE 之前 → val_bpb=1.1154 ✅ keep
EMBEDDING_LR=0.9 → val_bpb=1.1175 ✅ keep
WD decay to 20% residual → val_bpb=1.1156 ✅ keep
FINAL_LR_FRAC=0.03 → val_bpb=1.1152 ✅ keep
WINDOW_PATTERN=SL → val_bpb=1.1149 ✅ keep(交替短+全注意力)
WINDOW_PATTERN=SSSL → val_bpb=1.1141 ✅ keep(3短+1全,新突破!)
SSSL short_window=512 → val_bpb=1.1122 ✅ keep(四分之一上下文,大幅改进!)
SSSL short_window=384 → val_bpb=1.1115 ✅ keep
WARMDOWN_RATIO=0.65 at SSSL → val_bpb=1.1112 ✅ keep
EMBEDDING_LR=0.85 at SSSL → val_bpb=1.1107 ✅ keep(最终最优)
关键发现:Agent 在初始配置中把 WINDOW_PATTERN 从 "SSSL" 改成了 "L"(因为担心 A10G 上效率低),但后来在模型放大到 384-dim 后重新尝试了带状注意力,发现 SSSL 模式配合更小的窗口(384 tokens)反而带来了显著改进。这说明早期被否定的方向在新的配置下可能重新变得有效。

六、实验结果总览

实验总结

经过 24.5 小时的连续自主运行,Claude Code(Sonnet 4.6 via Bedrock)在 NVIDIA A10G 24GB 上共完成了 222 个实验,其中 35 个改进被棘轮机制保留,验证损失(val_bpb)从 baseline 的 1.1498 一路降至最终最优的 1.1107,累计改进 3.4%。
整个改进路径可以概括为三次关键跳跃:
  1. MLP 8x 扩展 + 缩小 batch(实验 11-16):val_bpb 从 1.1498 降到 1.1422,Agent 发现更宽的 FFN 层配合更小的 batch(更多训练步数)是比增加模型深度更有效的策略。
  2. 模型宽度放大至 384-dim(实验 30):val_bpb 从 1.1422 跳到 1.1233,这是整个实验中最大的单次改进,Agent 找到了 A10G 上"5 分钟内最优模型大小"的甜蜜点。
  3. 窗口注意力模式 SSSL + short_window=384(实验 155-170):val_bpb 从 1.1152 降到 1.1107,Agent 在第 17 小时重新启用了早期被否定的带状注意力模式,在更大的模型上发现它反而有效——这是一个令人惊喜的"第二波"突破。
三次跳跃之间是大量的优化器微调(学习率、weight decay、warmdown ratio、gradient clipping 等),每次改进幅度很小但稳步累积。最终最优配置的关键参数为:DEPTH=4、ASPECT_RATIO=96(384-dim)、MLP 8x、WINDOW_PATTERN=SSSL、short_window=384、EMBEDDING_LR=0.85、WARMDOWN_RATIO=0.65、MATRIX_LR=0.06、WEIGHT_DECAY=0.05。

数据统计

指标数值
总运行时间~24.5 小时
总实验数222
保留改进35 (15.8%)
丢弃184 (82.9%)
崩溃4 (1.8%)
初始 val_bpb1.1498
最终 val_bpb1.1107
总改进-3.4%
GPU 显存使用3.6 GB → 6.4 GB

收益递减曲线

阶段时间段val_bpb 改进实验数每实验平均改进
探索期0-6h-2.3%~30-0.077%
优化期6-12h-0.6%~60-0.010%
精调期12-17h-0.07%~60-0.001%
窗口突破17-20h-0.4%~40-0.010%
收敛期20-24.5h-0.04%~30-0.001%
有趣的是,在 17 小时左右出现了一次"第二波"改进——Agent 重新发现了窗口注意力模式的价值,带来了 0.4% 的额外改进。这说明棘轮循环偶尔能跳出局部最优。

完整实验数据

全部 222 个实验的原始数据(包括每个实验的 commit hash、val_bpb、显存使用、状态和描述)已公开在 GitHub 仓库中:

Agent 发现的关键洞察

  1. 模型宽度比深度更重要(在 5 分钟预算内):DEPTH=4 + 384-dim 比 DEPTH=8 + 256-dim 好得多
  2. MLP 8x 扩展有效:更宽的 FFN 层在小模型上收益显著
  3. 简单激活函数更优:ReLU² > GeLU > SwiGLU(在这个规模上)
  4. QK norm 放在 RoPE 之前比之后好
  5. Weight decay 的最优值取决于模型大小:小模型 WD=0 最好,放大后 WD=0.05 更优
  6. 窗口注意力模式在放大后重新有效:初始被否定的 SSSL 模式在 384-dim 模型上带来了显著改进
  7. 很多"常识"在小模型上不成立:更大 batch、更深模型、更花哨的激活函数都不如简单配置

七、成本核算

项目费用
EC2 g5.xlarge(~24.5h × $1.24/hr)~$30
Bedrock API(Claude Sonnet 4.6,222 个实验)~$10-15
总计~$40-45
对比 Karpathy 在 H100 上的实验(p5.4xlarge ~$7.91/hr × 8h = ~$63),我们用相近的成本跑了更多实验(222 vs 83),虽然模型规模更小。

八、经验总结

什么做得好

  1. SSM + Bedrock 的组合很顺畅:零密钥管理,IAM 统一控制,部署脚本一键搞定
  2. Claude Code 的自主能力令人印象深刻:它自己完成了 A10G 适配、硬件边界探索、系统性超参数搜索
  3. 棘轮机制确实有效:222 个实验,35 个改进,代码库只能前进不能后退
  4. --dangerously-skip-permissions 是必须的:autoresearch 需要完全自主运行,每次确认权限会打断循环

什么可以改进

  1. Deep Learning AMI 的 cloud-init 很慢:首次启动要等很久,User Data 中的 cloud-init status --wait 会卡住。建议手动执行安装步骤
  2. 收益递减来得很快:前 6 小时贡献了大部分改进,但 17 小时左右出现了窗口注意力的"第二波"突破。建议至少跑 20 小时以捕获这类延迟发现
  3. 创造力天花板是真实的:Agent 没有发明任何新的架构创意,所有改进都是人类研究者最终会想到的

对 autoresearch 的思考

Karpathy 说得对——autoresearch 自动化的是 ML 研究中方法性迭代的部分。它不会替代创造性思考,但它能在你睡觉的时候把 100 个"这个参数调大一点会怎样"的实验全跑完。
最值得深思的是一句话:
"如果下一代工程师因为 Agent 能处理执行工作就跳过了基础研究训练,这个领域将拥有充足的算力,却没有人有经验来指明方向。"
写好 program.md 需要你自己先做过研究。Agent 处理执行,但研究方向的判断仍然是人类的工作。


参考资料

Any opinions in this article are those of the individual author and may not reflect the opinions of AWS.
Enjoyed reading this content? Let the author know!

Your likes, comments, shares, and saves help creators reach more builders.

Loading recommendations

Loading article