llama2.c
纯C语言实现的Llama 2推理引擎,约700行代码零依赖,适合学习和嵌入式场景
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
纯C语言实现的Llama 2推理引擎,约700行代码零依赖,适合学习和嵌入式场景
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
2023年夏天,AI圈流传着一个令人瞠目的GitHub项目:一位知名研究者仅用一个周末,就用约700行纯C代码实现了一个可运行的Llama 2大模型推理引擎。更令人惊讶的是,这个名叫 llama2.c 的项目,竟出自AI领域备受尊敬的Andrej Karpathy之手——他是斯坦福大学CS博士、OpenAI创始成员、前特斯拉Autopilot负责人,也是全球最受欢迎的深度学习课程之一《Neural Networks: Zero to Hero》的作者。
Karpathy在项目的README中写道:"你可能认为需要数十亿参数的大模型才能做有用的事情,但事实上,非常小的LLM在足够狭窄的领域内可以展现出惊人的强大性能。"这段话直接点出了项目的核心理念——小模型也能有大作为。
llama2.c背后站着学术研究的支持。其训练数据来源是 TinyStories 数据集,这是一个由Ronen Eldan等人发表的研究成果,专门为小型语言模型设计。TinyStories的核心思想是:与其让小模型去学习互联网上海量复杂的长文本(这些内容对小模型来说太难了),不如让GPT-4等大模型生成一批专门由简单词汇和短句构成的故事,这些故事虽然简短,却包含了完整的叙事逻辑、角色互动和情节转折。
TinyStories有多小?模型参数仅需**15M(1500万)到110M(1.1亿)**就能完成训练。在llama2.c中,Karpathy用这个数据集训练了三个规模的模型:15M、42M和110M参数。即便最小的15M模型,也能在TinyStories数据集上生成流畅、连贯的英文小故事。以下是一个42M模型生成的示例:
Once upon a time, there was a little girl named Lily. She loved playing with her toys on top of her bed. One day, she decided to have a tea party with her stuffed animals. Suddenly, her little brother Max came in and wanted to join. Lily didn't want to share...但故事最终以"分享比自私更有趣"结尾,逻辑完整。用Karpathy的话说:"这比GPT-2还简单,但质量出奇地好。"
llama2.c的核心代码只有两个C文件:run.c(约973行,fp32推理)和 runq.c(约43353行,int8量化推理)。整个项目零外部依赖,只需要一个C编译器(gcc/clang)和标准数学库(-lm)。
项目完整实现了Llama 2的Transformer架构,包括:
模型权重以自定义二进制格式存储(.bin文件),头部包含配置元信息(层数、维度、头数等),之后是连续的float32(或int8量化)权重数组。这种格式简单高效,加载时直接mmap到内存,无需解析。
runq.c引入了Q8_0对称量化支持:将fp32权重压缩为int8,每个参数块(默认128或256元素)有独立的缩放因子(scale)。量化后模型体积缩小约4倍,速度也有显著提升。实测M1 MacBook Air上,15M模型可达~110 tokens/s。
| 模型规模 | 参数量 | 内存占用 | CPU推理速度(Mac M1) | 适用场景 |
|---|---|---|---|---|
| TinyStories 15M | 15M | ~60MB | ~110 tokens/s | 快速演示、教育 |
| TinyStories 42M | 42M | ~168MB | ~50 tokens/s | 交互式故事生成 |
| TinyStories 110M | 110M | ~440MB | ~20 tokens/s | 高质量短文本生成 |
| Llama 2 7B | 7B | ~26GB (fp32) | ~4 tokens/s | 生产级推理 |
# 克隆项目
git clone https://github.com/karpathy/llama2.c.git
cd llama2.c
# 下载预训练小模型(15M)
wget https://huggingface.co/karpathy/tinyllamas/resolve/main/stories15M.bin
# 编译并运行
make run
./run stories15M.bin
如需运行Meta官方的Llama 2 7B模型,需要先从Meta官网申请下载权签,再使用export.py转换格式。
优点:
局限:
llama2.c的出现有三重意义:
在llama2.c之后,社区涌现了大量类似项目(如llama3.c、minigpt4.c等),形成了一种独特的"手写AI"文化。这也印证了Karpathy在课程中的一贯主张:理解原理比调用API更重要。
项目作者:Andrej Karpathy | 协议:MIT | 语言:C, Python | Stars: 19,629