Appearance
llama2.c 閱讀摘要
專案概覽
llama2.c 是由 Andrej Karpathy 開發的專案,旨在用純 C 語言實現 Llama 2 大型語言模型的推理(inference)功能。核心程式碼僅有約 700 行 C 程式碼(run.c),無需任何外部依賴即可編譯執行。
核心架構
PyTorch 訓練 → 權重匯出 (.bin) → C 推理引擎 (run.c)- 訓練端:使用 PyTorch 實作的 Llama 2 架構(
model.py、train.py) - 匯出層:
export.py將 PyTorch 權重轉換為二進位格式 - 推理端:
run.c讀取 .bin 檔執行 token 生成
檔案結構
| 檔案 | 說明 |
|---|---|
run.c | 核心 C 推理引擎(973 行),包含 Transformer 前向傳播、BPE Tokenizer、Sampler |
runq.c | int8 量化版本的推理引擎 |
model.py | PyTorch Llama 2 模型定義(RMSNorm、RoPE、Attention、FFN) |
train.py | 分散式訓練腳本(支援 DDP) |
tokenizer.py | SentencePiece tokenizer 匯出工具 |
export.py | 模型權重匯出至 .bin 格式 |
tinystories.py | TinyStories 資料集下載與前處理 |
支援的模型
- 自訓練小型模型(15M / 42M / 110M 參數)
- Meta Llama 2 7B(需手動轉換)
- Hugging Face Llama 2 架構模型
關鍵技術
- RMSNorm:取代 LayerNorm,計算更高效
- RoPE(Rotary Position Embedding):相對位置編碼
- GQA(Grouped Query Attention):KV 頭數可少於 Query 頭數
- SwiGLU:MLP 中的非線性激活函數
- KV Cache:快取歷史 Key/Value 避免重複計算
- BPE Tokenizer:Byte Pair Encoding 分詞器
- Top-p (nucleus) sampling:核心採樣策略
效能參考
| 模型 | 設備 | 速度 |
|---|---|---|
| stories15M | M1 MacBook Air | ~110 tok/s |
| stories42M | M1 MacBook Air | 互動速度 |
| Llama 2 7B (fp32) | 96 執行緒 Linux | ~4 tok/s |
| Llama 2 7B (int8) | 64 執行緒 Linux | ~14 tok/s |
專案定位
「最簡單、最小、最易於修改的參考實作」 — Karpathy
相較於功能完整的 llama.cpp,llama2.c 更側重於教育性與可讀性,適合學習者理解 LLM 推理的底層原理。