karpathy/llm.c · 上手攻略

  • 仓库:karpathy/llm.c
  • 链接:https://github.com/karpathy/llm.c
  • 分类:AI · LLM 训练
  • 作者:Tom
  • 更新:2026-07-14

是什么

karpathy/llm.c 是由知名 AI 研究员 Andrej Karpathy 创建的一个开源项目,目标是用最简单、纯粹的 C/CUDA 代码实现大语言模型(LLM)训练,无需依赖 PyTorch 或 Python 运行时

核心思想:用原始的 C 代码(~1,000 行)+ CUDA kernel,直接从零实现 GPT-2 训练链路,去掉一切不必要的抽象层。项目同时维护一个 PyTorch 参考实现(train_gpt2.py,基于 nanoGPT),两套代码输出结果逐位对比,确保正确性。

目前进度比 PyTorch Nightly 快约 7%(Karpathy 原话),目标是能够完整复现 GPT-2(124M / 1.6B)和 GPT-3 系列模型的训练。


解决什么问题

  • 降低 LLM 训练的认知门槛:PyTorch 训练代码隐藏在层层抽象下,llm.c 用扁平、线性的代码让你看清每一个矩阵乘法、每一次前向传播的细节。
  • 加速实验迭代:纯 C 编译,无 Python 解释器开销,适合需要快速、低开销跑通训练流程的场景。
  • 学习 CUDA 编程dev/cuda/ 目录下有一系列由浅入深的 kernel 实现,从最朴素的版本到融合了 cuBLAS/cuDNN 的高性能版本,有完整的演进路径。
  • 消除依赖焦虑:不需要 245MB 的 PyTorch + 107MB 的 cPython,一块 GPU + NVCC 编译器就能跑起来。

快速安装

环境要求

  • NVIDIA GPU(单卡或多卡)
  • CUDA Toolkit(建议 12.x)
  • cuDNN(可选,用于 Flash Attention)
  • MPI + NCCL(多卡/多节点训练时需要)
  • GCC/Clang 编译器

快速上手(下载启动包)

# 克隆仓库
git clone https://github.com/karpathy/llm.c.git
cd llm.c

# 下载预置包(含 GPT-2 124M 权重、tokenizer、tinyshakespeare 数据集)
chmod u+x ./dev/download_starter_pack.sh
./dev/download_starter_pack.sh

# 编译 CPU 版本(fp32,无需 GPU)
make train_gpt2
OMP_NUM_THREADS=8 ./train_gpt2

# 编译 GPU 版本(CUDA)
make train_gpt2cu
./train_gpt2cu

手动准备数据(替代下载脚本)

pip install -r requirements.txt
python dev/data/tinyshakespeare.py     # 生成 tokenized .bin 数据
python train_gpt2.py                    # 生成 GPT-2 权重并保存为 .bin

⚠️ 注意train_gpt2.py 需要 PyTorch,仅用于生成数据/权重,不参与实际训练。训练完全在 C/CUDA 中进行。

启用 cuDNN Flash Attention(可选)

cuDNN 会让编译时间从几秒增加到约一分钟,默认关闭。

# cuDNN 安装(Ubuntu 22.04 + CUDA 12.x 示例)
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb
sudo dpkg -i cuda-keyring_1.1-1_all.deb
sudo apt-get update
sudo apt-get -y install libcudnn9-dev-cuda-12

# 编译时开启
make train_gpt2cu USE_CUDNN=1

核心用法

单 GPU 训练 GPT-2

# 默认编译(不使用 cuDNN)
make train_gpt2cu
./train_gpt2cu

多 GPU(单节点)

mpirun -np <GPU数量> ./train_gpt2cu
# 示例:4 卡机器
mpirun -np 4 ./train_gpt2cu

多节点训练(3 种方式)

# 方式 1:通过 MPI 交换 NCCL ID(推荐,适合有 MPI 环境)
./scripts/multi_node/run_gpt2_124M_mpi.sh

# 方式 2:通过共享文件系统初始化 NCCL
./scripts/multi_node/run_gpt2_124M_fs.sbatch

# 方式 3:通过 TCP sockets 初始化 NCCL
./scripts/multi_node/run_gpt2_124M_tcp.sbatch

⚠️ 如果在 Slurm 环境中运行且不支持 PMIx,使用方式 2 或方式 3。

学习率扫参示例(4 GPU)

learning_rates=(3e-5 1e-4 3e-4 1e-3)

for i in {0..3}; do
  export CUDA_VISIBLE_DEVICES=$i
  screen -dmS "tr$i" bash -c "./train_gpt2cu -i data/TinyStories -v 250 -s 250 -g 144 -l ${learning_rates[$i]} -o stories$i.log"
done

# 停止
screen -ls | grep -E "tr[0-3]" | cut -d. -f1 | xargs -I {} screen -X -S {} quit

单元测试

# CPU 版本
make test_gpt2
./test_gpt2

# GPU fp32 版本
make test_gpt2cu PRECISION=FP32 && ./test_gpt2cu

# GPU cuDNN 混合精度版本
make test_gpt2cu USE_CUDNN=1 && ./test_gpt2cu

调试提示

调试时将 Makefile 中的 -O3 替换为 -g,即可在 VSCode 等 IDE 中逐行调试: ```makefile

Makefile 中

CFLAGS = -g -O3 # 改为 -g ```


典型适用场景

  1. 学习 LLM 训练机理:想从代码层面理解 GPT-2 是如何训练的,从 embedding 到 attention 到 layer norm,每一步都有线性对应。
  2. CUDA 优化研究dev/cuda/ 目录是手工 kernel 的宝库,有朴素版到 cuBLAS 版的完整对比。
  3. 快速原型验证:不需要搭 Python 环境,直接改 C 代码,秒级重新编译,快速验证改动是否正确。
  4. 教育/教学:课堂上演示 LLM 训练流程,比 PyTorch 代码更直观,变量全在眼前。

坑与注意

说明
需要 GPU 才能走远 CPU 训练只是 Demo,M3 Max 跑一步 ~1.4 秒,真实训练几乎不可能。
cuDNN 编译慢 第一次 USE_CUDNN=1 编译可能需要 1~2 分钟,不是卡住了,耐心等。
多节点环境复杂 Slurm + PMIx 支持问题比较棘手,建议先在单节点验证。
训练数据需提前生成 train_gpt2.py 生成的 .bin 文件有特定格式,不能直接塞文本。
主分支代码在演进 这是非常活跃的项目,API 和文件结构可能在短期内变化。
非 GPU 环境只有 Demo 如果你没有 NVIDIA GPU,可以跑 train_gpt2 看个效果,但别指望训练真实模型。

与同类对比

项目 语言 依赖 定位 适合谁
karpathy/llm.c C + CUDA 极低(仅 CUDA/cuBLAS) 教育 + 高性能训练 想学底层 / 极致性能优化
llama.cpp C/C++ 极低 推理(LLM 推理,非训练) 本地部署开源 LLM
nanoGPT Python/PyTorch 高(PyTorch) 教育 + 可改实验 想快速改模型结构做实验
PyTorch 官方 Python/PyTorch 很高 通用训练框架 生产环境、大规模训练

llm.c训练工具,不是推理工具——它和 llama.cpp 的定位完全不同。


一句话推荐结论

如果你想从零理解 LLM 训练用最小依赖跑通 GPT-2 训练流程karpathy/llm.c 是目前最好的选择——Karpathy 本人维护,代码透明,配套完善,值得深度研究。