🚀 快速安装
复制以下命令并运行,立即安装此 Skill:
npx skills add https://skills.sh/aradotso/trending-skills/nanochat-llm-training
💡 提示:需要 Node.js 和 NPM
nanochat LLM 训练
技能来自 ara.so — Daily 2026 Skills 系列。
nanochat 是 Karpathy 开发的最小化、可入侵的 LLM 训练工具集,可在单个 GPU 节点上端到端地训练大语言模型。它涵盖分词、预训练、SFT 微调、强化学习、评估(DCLM CORE 分数)、带 KV 缓存的推理以及类似 ChatGPT 的 Web 界面。一个单一的复杂度调节旋钮(--depth)会自动配置所有其他超参数(宽度、头数、学习率、训练时长、权重衰减),以实现计算最优训练。你可以在 8×H100 节点上以约 2 小时、花费约 48 美元的成本,复现 2019 年需要花费约 43,000 美元的 GPT-2 能力。
安装
nanochat 使用 uv 进行依赖管理:
git clone https://github.com/karpathy/nanochat.git
cd nanochat
# 如果需要,安装 uv
curl -LsSf https://astral.sh/uv/install.sh | sh
# 创建虚拟环境并安装依赖
uv sync
source .venv/bin/activate
关键命令
完整的 GPT-2 极速运行(8×H100 节点,约 2–3 小时,约 48 美元)
# 运行参考流程:数据下载、预训练、SFT、评估、聊天
bash runs/speedrun.sh
预训练(分布式)
OMP_NUM_THREADS=1 torchrun --standalone --nproc_per_node=8 -m scripts.base_train -- \
--depth=26 \
--run="d26_run" \
--model-tag="d26"
预训练(单 GPU)
python -m scripts.base_train -- \
--depth=26 \
--run="d26_single"
快速研究迭代(约 5 分钟,GPT-1 规模)
OMP_NUM_THREADS=1 torchrun --standalone --nproc_per_node=8 -m scripts.base_train -- \
--depth=12 \
--run="d12_exp" \
--model-tag="d12" \
--core-metric-every=999999 \
--sample-every=-1 \
--save-every=-1
CPU / Apple Silicon(小型模型,约几分钟)
bash runs/runcpu.sh
启动聊天 UI
# 训练完成后
source .venv/bin/activate
python -m scripts.chat_web
# 访问 http://<your-server-ip>:8000/
CLI 聊天
python -m scripts.chat_cli -p "hello"
缩放定律 / 迷你系列
bash runs/scaling_laws.sh # 扫描深度以获取缩放定律数据
bash runs/miniseries.sh # 训练完整的计算最优迷你系列
深度旋钮
这是最重要的参数。其他所有参数都会自动推导:
--depth |
近似模型规模 | 备注 |
|---|---|---|
| 6–8 | 极小(玩具模型) | 可在 CPU/MPS 上运行 |
| 12 | GPT-1 大小 | 在 8×H100 上约 5 分钟,适合研究迭代 |
| 16 | 中等 | 在 8×H100 上约 15 分钟 |
| 24–26 | GPT-2 大小 | 在 8×H100 上约 2 小时,约 48 美元 |
# 更小/更快的实验
python -m scripts.base_train -- --depth=12 --run="quick_test"
# 完整的 GPT-2 级别
torchrun --standalone --nproc_per_node=8 -m scripts.base_train -- --depth=26 --run="gpt2_repro"
精度 / dtype 配置
nanochat 通过 nanochat/common.py 中的 COMPUTE_DTYPE 进行显式的 dtype 管理。不使用 torch.amp.autocast。
| 硬件 | 默认值 | 覆盖方式 |
|---|---|---|
| CUDA SM 80+ (A100, H100) | bfloat16 |
NANOCHAT_DTYPE=float32 |
| CUDA SM < 80 (V100, T4) | float32 |
NANOCHAT_DTYPE=float16 |
| CPU / MPS | float32 |
— |
# 强制使用 fp32 进行推理
NANOCHAT_DTYPE=float32 python -m scripts.chat_cli -p "hello"
# 强制使用 bf16 进行训练
NANOCHAT_DTYPE=bfloat16 torchrun --nproc_per_node=8 -m scripts.base_train
# float16 训练(会自动启用 GradScaler)
NANOCHAT_DTYPE=float16 torchrun --nproc_per_node=8 -m scripts.base_train
工作原理: 权重以 fp32 存储(优化器精度),自定义的 Linear 在前向传播中转换为 COMPUTE_DTYPE,嵌入直接以 COMPUTE_DTYPE 存储以节省内存。
关键 Python 模块
nanochat/
├── gpt.py # GPT nn.Module Transformer
├── engine.py # 带 KV 缓存的推理引擎
├── dataloader.py # 分词分布式数据加载器
├── dataset.py # 预训练数据的下载/读取工具
├── optim.py # AdamW + Muon 优化器(单 GPU 和分布式)
├── core_eval.py # DCLM CORE 分数评估
├── loss_eval.py # 每字节比特数评估
├── checkpoint_manager.py # 保存/加载检查点
├── common.py # 工具函数,COMPUTE_DTYPE
├── execution.py # LLM 的 Python 代码执行工具
└── engine.py # 高效的 KV 缓存推理
scripts/
├── base_train.py # 预训练入口点
├── chat_web.py # Web 聊天 UI 服务器
└── chat_cli.py # CLI 聊天界面
runs/
├── speedrun.sh # 参考完整流程(GPT-2 极速运行)
├── scaling_laws.sh # 缩放定律扫描
├── miniseries.sh # 完整的计算最优迷你系列
└── runcpu.sh # CPU/MPS 示例
实际代码示例
加载并在已训练模型上运行推理
import torch
from nanochat.gpt import GPT
from nanochat.engine import InferenceEngine
from nanochat.checkpoint_manager import CheckpointManager
# 加载检查点
ckpt_manager = CheckpointManager("checkpoints/d26")
model, config = ckpt_manager.load()
model.eval()
# 使用 KV 缓存运行推理
engine = InferenceEngine(model)
output = engine.generate(
prompt="Once upon a time",
max_new_tokens=200,
temperature=0.8,
top_p=0.95,
)
print(output)
使用深度旋钮的自定义训练脚本
import subprocess
def train_model(depth: int, run_name: str, nproc: int = 8):
"""为给定的深度启动一个计算最优的训练运行。"""
cmd = [
"torchrun",
"--standalone",
f"--nproc_per_node={nproc}",
"-m", "scripts.base_train",
"--",
f"--depth={depth}",
f"--run={run_name}",
f"--model-tag={run_name}",
]
subprocess.run(cmd, env={"OMP_NUM_THREADS": "1", **__import__("os").environ})
# 快速研究迭代
train_model(depth=12, run_name="my_experiment_d12")
# 完整的 GPT-2 级别
train_model(depth=26, run_name="my_gpt2_repro")
为降低显存调整设备批大小
# 默认 device_batch_size=32 每 GPU 需要约 80GB 显存
# 为较小的 GPU 减小此值(梯度累积会处理其余部分)
torchrun --standalone --nproc_per_node=4 -m scripts.base_train -- \
--depth=12 \
--device_batch_size=16 \
--run="low_vram_run"
# 更小
python -m scripts.base_train -- \
--depth=8 \
--device_batch_size=4 \
--run="single_gpu_small"
在 wandb 中监控关键指标
# nanochat 会自动记录到 wandb。需要关注的关键指标:
# - val_bpb: 每字节比特数的验证损失(与词表大小无关)
# 作为步骤、总训练时间、总训练 FLOPs 的函数
# - core_metric: DCLM CORE 分数(目标 > 0.2565 以超越 GPT-2)
# - train/mfu: 模型 FLOPS 利用率
# - train/tok_per_sec: 训练吞吐量
# 训练前通过环境变量设置 wandb 项目
import os
os.environ["WANDB_PROJECT"] = "my-nanochat-runs"
用于 SFT 性格的合成数据
# dev/gen_synthetic_data.py — 生成身份/性格数据
# 然后根据指南将其混入 SFT 阶段:
# https://github.com/karpathy/nanochat/discussions/139
# 示例:生成数据并让 SFT 指向它
python dev/gen_synthetic_data.py --output data/identity_sft.jsonl
# 然后在你的 SFT 脚本配置中引用它
常见模式
研究迭代循环
# 1. 在 nanochat/ 中修改代码
# 2. 运行快速的 d12 进行验证
OMP_NUM_THREADS=1 torchrun --standalone --nproc_per_node=8 -m scripts.base_train -- \
--depth=12 --run="test_my_change" \
--core-metric-every=999999 --sample-every=-1 --save-every=-1
# 3. 检查 wandb:val_bpb vs step/time/flops
# 4. 如果有前景,在 d16 或 d26 上测试
FP8 训练(仅限 H100,用于极速运行)
# FP8 在极速运行中用于额外加速
# 具体调用方式请参阅 runs/speedrun.sh
bash runs/speedrun.sh
仅评估 CORE 分数
python -m nanochat.core_eval --checkpoint checkpoints/d26/latest
在 Lambda / 远程机器上提供服务
# 在远程机器上训练完成后:
source .venv/bin/activate
python -m scripts.chat_web
# 通过 http://<PUBLIC_IP>:8000/ 访问
# 使用 `screen` 或 `tmux` 保持运行
screen -S nanochat
python -m scripts.chat_web
# Ctrl+A, D 分离
故障排除
OOM / 显存不足
# 减小 --device_batch_size(默认 32)
# 代码使用梯度累积来保持有效批大小
--device_batch_size=16 # 尝试 16, 8, 4, 2, 1
单 GPU 速度慢 8 倍
这是预期的。省略 torchrun,直接使用 python -m scripts.base_train。梯度累积会自动启动以维持等效的总批大小。
在非 CUDA 硬件上运行
# MPS (Apple Silicon) 或 CPU — 使用 runcpu.sh 作为模板
bash runs/runcpu.sh
# 结果会较弱;这仅用于开发/调试
float16 梯度下溢
# nanochat 在 NANOCHAT_DTYPE=float16 时会自动启用 GradScaler
NANOCHAT_DTYPE=float16 torchrun --nproc_per_node=8 -m scripts.base_train -- --depth=12
# 注意:RL 脚本不支持 float16(SFT 和 base_train 支持)
V100 / T4 (SM < 80) — 无 bf16
# 默认回退到 float32;可选使用 float16
NANOCHAT_DTYPE=float16 torchrun --nproc_per_node=8 -m scripts.base_train -- --depth=12
聊天 UI 无法访问
# 确保端口(默认 8000)在云提供商防火墙/安全组中开放
# 使用公网 IP,而不是 localhost:
# http://<公网IP>:8000/
资源
- DeepWiki Q&A:https://deepwiki.com/karpathy/nanochat
- 讨论区:https://github.com/karpathy/nanochat/discussions
- Discord:Karpathy 的 Discord 上的
#nanochat频道 - 排行榜文档:
dev/LEADERBOARD.md - 超越 GPT-2 指南:https://github.com/karpathy/nanochat/discussions/481
- 迷你系列 v1:https://github.com/karpathy/nanochat/discussions/420
- 添加能力指南:https://github.com/karpathy/nanochat/discussions/164
📄 原始文档
完整文档(英文):
https://skills.sh/aradotso/trending-skills/nanochat-llm-training
💡 提示:点击上方链接查看 skills.sh 原始英文文档,方便对照翻译。

评论(0)