WARNING
本文需要一块 NVIDIA GPU(已在 H100 上测试通过)才能正常运行。
想象一下:当你睡觉时,AI 自己在那里调参、训练、跑实验,早上醒来就看到一堆实验日志和更好的模型——这就是 autoresearch。它是一个极简的自主研究框架,AI Agent 会自己修改 GPT 训练脚本、跑实验、评估结果、自动迭代。你需要做的只是在旁边看着。
目标读者
- 对 AI 自主研究 Agent 感兴趣的开发
- 想从工程角度理解 LLM 训练过程的同学
- 想看 AI 如何自己进步的同学
核心依赖与环境
- Python 3.10+
- NVIDIA GPU(已在 H100 上测试)
- uv 包管理器
项目结构
autoresearch/
├── prepare.py # 固定常量、数据准备、分词器(不要修改)
├── train.py # 模型、优化器、训练循环(Agent 修改这个)
├── program.md # Agent 指令(人类修改这个)
├── pyproject.toml # 依赖
└── results.tsv # 实验记录(自动生成)
整个仓库刻意保持极简——真正重要的就三个文件。这样设计是为了让实验范围可控,diff 也方便 review。
手把手教程
步骤1:安装 uv
首先安装 uv 包管理器:
curl -LsSf https://astral.sh/uv/install.sh | sh
TIP
Windows 上可以用 winget install astral-sh.uv,或者从官网下载安装包。
步骤2:安装依赖
克隆仓库并安装依赖:
git clone https://github.com/karpathy/autoresearch.git
cd autoresearch
uv sync
这一步会装好 PyTorch 等必要包。
步骤3:准备数据和分词器
运行一次性数据准备脚本:
uv run prepare.py
这会下载训练数据并训练一个 BPE 分词器,大概需要 2 分钟。数据会保存在 ~/.cache/autoresearch/。
步骤4:跑一次 baseline 训练
我们先手动跑一次训练,建立基准:
uv run train.py
训练会跑恰好 5 分钟(不含启动和编译时间)。评估指标是 val_bpb(验证集每字节比特数)——越低越好。
跑完你会看到类似这样的输出:
---
val_bpb: 0.997900
training_seconds: 300.1
total_seconds: 325.9
peak_vram_mb: 45060.2
mfu_percent: 39.80
total_tokens_M: 499.6
num_steps: 953
num_params_M: 50.3
depth: 8
这个 baseline 就是我们的起点。现在把它交给 AI。
步骤5:接入你的 AI Agent
为实验创建一个新分支:
git checkout -b autoresearch/mar15
初始化结果文件:
echo -e "commit\tval_bpb\tmemory_gb\tstatus\tdescription" > results.tsv
现在启动你的 AI Agent(Claude、Codex 等都可以,记得关闭所有权限):
claude
然后这样告诉它:
Hi have a look at program.md and let's kick off a new experiment! let's do the setup first.
Agent 会读取 program.md,理解实验流程,然后开始自主迭代 train.py。
步骤6:理解实验循环
Agent 会一直循环以下步骤:
- 修改
train.py— 改架构、调超参数、改优化器啥的 - Git commit — 保存这次改动
- 跑实验 —
uv run train.py > run.log 2>&1 - 读取结果 —
grep "^val_bpb:\|^peak_vram_mb:" run.log - 记到
results.tsv— 记录这次实验 - 决策:
- val_bpb 降低了 → 保留这次 commit,继续
- val_bpb 变差了 → git reset,换个思路
TIP
Agent 会全自动跑,不要问"要不要继续"——让它跑就对了。每次实验大概 5 分钟,所以每小时能跑 12 次左右。
program.md 核心指令解析
program.md 就是你的 AI 研究员的大脑,关键点如下:
- 固定时间预算 —— 永远 5 分钟,保证实验可比
- 只改一个文件 —— 只有
train.py可以动 - 不能加新依赖 —— 只能用
pyproject.toml里已有的包 - 简单性原则 —— 小的提升如果带来很大复杂度,不值得做
第一次实验永远应该是跑 baseline,用来建立比较基准。
输出格式
实验结果会记录到 results.tsv,用 tab 分隔:
commit val_bpb memory_gb status description
a1b2c3d 0.997900 44.0 keep baseline
b2c3d4e 0.993200 44.2 keep increase LR to 0.04
c3d4e5f 1.005000 44.0 discard switch to GeLU activation
注意用 tab,不是逗号——逗号在描述里会出问题。
常见问题排查
1. 数据没准备好
错误: FileNotFoundError 找不到缓存文件
解决: 先跑 uv run prepare.py 下载数据和训练分词器。
2. 内存不够(OOM)
错误: CUDA out of memory
解决: Agent 应该能检测到这种情况并在 results.tsv 记为 "crash"。常见修复:
- 减小
train.py里的TOTAL_BATCH_SIZE - 减少模型层数(减小
DEPTH) - 用更短的序列长度
3. 训练超时
错误: 跑超过 10 分钟
解决: 手动 kill 进程。这次实验记为 "discard" 并回滚。
4. Agent 不干活
问题: Agent 光读取文件但不跑实验
解决: 确认在正确的目录启动了 Agent,确认 Agent 有执行 shell 命令的权限。
5. 一直比 baseline 差
问题: 所有实验结果都差不多或更差
解决:
- 尝试更激进的架构改动(注意力机制、激活函数)
- 调整学习率——默认值可能不是最优的
- 试试不同的优化器(Muon vs AdamW)
6. 平台不兼容
错误: "No CUDA GPUs available"
解决: 这个代码需要 NVIDIA GPU。其他平台可以用这些 fork:
- autoresearch-macos — MacOS
- autoresearch-mlx — MacOS Apple Silicon
- autoresearch-win-rtx — Windows
进阶方向
小显卡怎么玩
如果没有 H100,可以这样调:
- 用 TinyStories 数据集替代(领域更窄,小模型也能出效果)
- 把
vocab_size从 8192 降到 2048 甚至 256(字节级) - 把
prepare.py里的MAX_SEQ_LEN降到 256 或更低 - 把
TOTAL_BATCH_SIZE降到2**14(约 16K) - 把
WINDOW_PATTERN设为 "L",用简单的注意力
继续扩展
玩熟悉之后可以:
- 修改
program.md添加多个不同角色的 Agent - 尝试不同的数据集
- 加入更复杂的评估指标
- 实现多卡训练(需要大改 prepare.py)
相关资源
- 官方仓库
- Karpathy 公告推文
- nanochat — 父项目,支持更多平台
- 神经网络入门"Dummy's Guide"