前言
大型语言模型如 GPT-4、Llama 3 等常被视为庞然大物。许多开发者在 Hugging Face 的源码中迷失方向,渴望真正看懂大语言模型是如何运行的——不是调 API,而是从零构建它的推理逻辑。
本文介绍一个宝藏项目:llama.c。
它只有1000 行 C 代码。没有 PyTorch,没有 CUDA,没有依赖库。没有复杂的分布式训练,没有量化优化,没有 TensorRT。但它,完整实现了 Llama 2 的推理核心。
它不追求性能,只追求清晰。不为生产,只为理解。
为什么说 llama.c 是学习 LLM 的'黄金入门'?
在 AI 圈,我们总被'大模型''多卡训练''参数量万亿'这些词包围。但真相是:一个 Transformer 模型的推理,本质上是一个非常干净的数学流程。
llama.c 的诞生,就是为了撕开这层'神秘感'。
'如果你不能用 1000 行代码写出来,说明你还没真正理解它。' —— Andrej Karpathy
他用 C 语言,从头实现 Llama 2 的前向传播,包括:
- Token Embedding
- Layer Normalization
- Multi-Head Attention(含 RoPE 位置编码)
- Feed-Forward Network
- Softmax + 输出投影
所有代码,没有一行是黑箱。所有矩阵运算,手动展开。所有张量维度,清晰标注。所有注释,像老师讲课一样细致。
你不需要 GPU,不需要 Python 环境,甚至不需要编译器——用 gcc 就能跑起来。你只需要一颗愿意思考的心。
代码逻辑总览:从 Token 到 Text,1000 行走完 Llama 2 推理全流程
llama.c 的核心流程,可以概括为以下 5 步:
- 加载模型:读取从 Hugging Face 导出的二进制权重文件(.bin)
- Tokenize 输入:用内置的 Byte-Pair Encoding(BPE)词表,把文字转成数字序列
- 前向传播:逐层执行 Attention + FFN,传递隐藏状态
- 采样输出:用 Temperature + Top-p 采样,从概率分布中生成下一个 Token
- 循环生成:直到生成结束符或达到最大长度,输出完整文本
整个系统,没有框架依赖,没有动态图,没有自动微分。你看到的,就是模型在'思考'时,每一步发生了什么。
逐行解析:llama.c 核心代码拆解
下面,我们从主函数开始,一段一段带你读懂这 1000 行'神作'。
📌 1. 主函数入口:main() —— 一切从这里开始
int main(int argc, char *argv[]) {
// 1. 加载模型权重
Transformer transformer;
load_model("weights/llama-2-7b.bin", &transformer);
// 2. 初始化词表
Tokenizer tokenizer;
load_tokenizer(, &tokenizer);
*prompt = ;
*tokens = encode(tokenizer, prompt, &num_tokens);
generate(transformer, tokenizer, tokens, num_tokens, );
;
}

