llama.cpp
Meta的LLaMA模型(及其他模型)的纯C/C++推理
[!重要] [2024年6月12日] 二进制文件已重命名,带有
llama-
前缀。main
现在是llama-cli
,server
是llama-server
等 (https://github.com/ggerganov/llama.cpp/pull/7809)
最近的API更改
- [2024年6月26日] 源代码和CMake构建脚本已重新结构化 https://github.com/ggerganov/llama.cpp/pull/8006
- [2024年4月21日]
llama_token_to_piece
现在可以选择性地呈现特殊标记 https://github.com/ggerganov/llama.cpp/pull/6807 - [2024年4月4日] 状态和会话文件函数重组为
llama_state_*
https://github.com/ggerganov/llama.cpp/pull/6341 - [2024年3月26日] 为了紧凑性更新了Logits和embeddings API https://github.com/ggerganov/llama.cpp/pull/6122
- [2024年3月13日] 添加
llama_synchronize()
+llama_context_params.n_ubatch
https://github.com/ggerganov/llama.cpp/pull/6017 - [2024年3月8日]
llama_kv_cache_seq_rm()
返回一个bool
而不是void
,新的llama_n_seq_max()
返回批处理中可接受的seq_id
上限(在处理多个序列时相关)https://github.com/ggerganov/llama.cpp/pull/5328 - [2024年3月4日] Embeddings API更新 https://github.com/ggerganov/llama.cpp/pull/5796
- [2024年3月3日]
struct llama_context_params
https://github.com/ggerganov/llama.cpp/pull/5849
热点话题
convert.py
已被弃用并移至examples/convert_legacy_llama.py
,请使用convert_hf_to_gguf.py
https://github.com/ggerganov/llama.cpp/pull/7430- 初始Flash-Attention支持:https://github.com/ggerganov/llama.cpp/pull/5021
- 已添加BPE预标记支持:https://github.com/ggerganov/llama.cpp/pull/6920
- MoE内存布局已更新——重新转换模型以支持
mmap
并重新生成imatrix
https://github.com/ggerganov/llama.cpp/pull/6387 - 使用
gguf-split
的模型分片说明 https://github.com/ggerganov/llama.cpp/discussions/6404 - 修复Metal批量推理中的重大错误 https://github.com/ggerganov/llama.cpp/pull/6225
- 多GPU流水线并行支持 https://github.com/ggerganov/llama.cpp/pull/6017
- 寻求对Deepseek支持的贡献:https://github.com/ggerganov/llama.cpp/issues/5981
- 量化盲测:https://github.com/ggerganov/llama.cpp/discussions/5962
- 已添加初始Mamba支持:https://github.com/ggerganov/llama.cpp/pull/5328
描述
llama.cpp
的主要目标是使LLM推理能够以最小的设置和先进的性能在各种硬件上运行——无论是本地还是云端。
- 纯C/C++实现,无任何依赖
- Apple Silicon为一等公民——通过ARM NEON、Accelerate和Metal框架进行优化
- 支持x86架构的AVX、AVX2和AVX512
- 1.5位、2位、3位、4位、5位、6位和8位整数量化,用于更快的推理和减少内存使用
- 自定义CUDA内核,用于在NVIDIA GPU上运行LLM(通过HIP支持AMD GPU)
- Vulkan和SYCL后端支持
- CPU+GPU混合推理,用于部分加速大于VRAM总容量的模型
自从创立以来,该项目在众多贡献下得到了显著改进。它是开发ggml库新功能的主要平台。
支持的模型:
通常也支持以下基础模型的微调模型。
- LLaMA 🦙
- LLaMA 2 🦙🦙
- LLaMA 3 🦙🦙🦙
- Mistral 7B
- Mixtral MoE
- DBRX
- Falcon
- 中文 LLaMA / Alpaca 和 中文 LLaMA-2 / Alpaca-2
- Vigogne (法语)
- BERT
- Koala
- Baichuan 1 & 2 + 衍生模型
- Aquila 1 & 2
- Starcoder 模型
- Refact
- MPT
- Bloom
- Yi 模型
- StableLM 模型
- Deepseek 模型
- Qwen 模型
- PLaMo-13B
- Phi 模型
- GPT-2
- Orion 14B
- InternLM2
- CodeShell
- [Gemma
- MindWorkAI/AI-Studio (FSL-1.1-MIT)
- iohub/collama
- janhq/jan (AGPL)
- nat/openplayground
- Faraday (专有)
- LMStudio (专有)
- Layla (专有)
- ramalama (MIT)
- LocalAI (MIT)
- LostRuins/koboldcpp (AGPL)
- Mozilla-Ocho/llamafile
- nomic-ai/gpt4all
- ollama/ollama
- oobabooga/text-generation-webui (AGPL)
- psugihara/FreeChat
- cztomsik/ava (MIT)
- ptsochantaris/emeltal
- pythops/tenere (AGPL)
- RAGNA Desktop (专有)
- RecurseChat (专有)
- semperai/amica
- withcatai/catai
- Mobile-Artificial-Intelligence/maid (MIT)
- Msty (专有)
- LLMFarm (MIT)
- KanTV(Apachev2.0或更新)
- Dot (GPL)
- MindMac (专有)
- KodiBot (GPL)
- eva (MIT)
- AI Sublime Text 插件 (MIT)
- AIKit (MIT)
- LARS - The LLM & Advanced Referencing Solution (AGPL)
(要将项目列在此处,必须明确声明它依赖于 llama.cpp
)
工具:
- akx/ggify – 从 HuggingFace Hub 下载 PyTorch 模型并将其转换为 GGML
- crashr/gppm – 启动利用 NVIDIA Tesla P40 或 P100 GPU 的 llama.cpp 实例,减少空闲功耗
- gpustack/gguf-parser - 审查/检查 GGUF 文件并估算内存使用量
基础设施:
游戏:
- Lucy 的迷宫 - 一个简单的迷宫游戏,AI 模型控制的代理将尝试迷惑你。
演示
使用 LLaMA v2 13B 在 M2 Ultra 上的典型运行
$ make -j && ./llama-cli -m models/llama-13b-v2/ggml-model-q4_0.gguf -p "创建一个网站可以通过 10 个简单步骤完成:\n第 1 步:" -n 400 -e
I llama.cpp 构建信息:
I UNAME_S: Darwin
I UNAME_P: arm
I UNAME_M: arm64
I CFLAGS: -I. -O3 -std=c11 -fPIC -DNDEBUG -Wall -Wextra -Wpedantic -Wcast-qual -Wdouble-promotion -Wshadow -Wstrict-prototypes -Wpointer-arith -Wmissing-prototypes -pthread -DGGML_USE_K_QUANTS -DGGML_USE_ACCELERATE
I CXXFLAGS: -I. -I./common -O3 -std=c++11 -fPIC -DNDEBUG -Wall -Wextra -Wpedantic -Wcast-qual -Wno-unused-function -Wno-multichar -pthread -DGGML_USE_K_QUANTS
I LDFLAGS: -framework Accelerate
I CC: Apple clang version 14.0.3 (clang-1403.0.22.14.1)
I CXX: Apple clang version 14.0.3 (clang-1403.0.22.14.1)
make: `default` 无需执行任何操作。
main: 构建 = 1041 (cf658ad)
main: 种子 = 1692823051
llama_model_loader: 从 models/llama-13b-v2/ggml-model-q4_0.gguf (版本 GGUF V1 (最新)) 加载了包含 16 个键值对和 363 个张量的元数据
llama_model_loader: - 类型 f32: 81 个张量
llama_model_loader: - 类型 q4_0: 281 个张量
llama_model_loader: - 类型 q6_K: 1 个张量
llm_load_print_meta: 格式 = GGUF V1 (最新)
llm_load_print_meta: 架构 = llama
llm_load_print_meta: 词汇表类型 = SPM
llm_load_print_meta: 词汇量 = 32000
llm_load_print_meta: 合并数量 = 0
llm_load_print_meta: 训练时的上下文数量 = 4096
llm_load_print_meta: 上下文数量 = 512
llm_load_print_meta: 嵌入维度 = 5120
llm_load_print_meta: 头数 = 40
llm_load_print_meta: kv 头数 = 40
llm_load_print_meta: 层数 = 40
llm_load_print_meta: 旋转 = 128
llm_load_print_meta: gqa 数量 = 1
llm_load_print_meta: 归一化 eps = 1.0e-05
llm_load_print_meta: 归一化 rms eps = 1.0e-05
llm_load_print_meta: 前馈神经网络 = 13824
llm_load_print_meta: 频率基数 = 10000.0
llm_load_print_meta: 频率比例 = 1
llm_load_print_meta: 模型类型 = 13B
llm_load_print_meta: 模型文件类型 = mostly Q4_0
llm_load_print_meta: 模型大小 = 13.02 B
llm_load_print_meta: 一般名称 = LLaMA v2
llm_load_print_meta: BOS 标记 = 1 '<s>'
llm_load_print_meta: EOS 标记 = 2 '</s>'
llm_load_print_meta: UNK 标记 = 0 '<unk>'
llm_load_print_meta: LF 标记 = 13 '<0x0A>'
llm_load_tensors: ggml ctx 大小 = 0.11 MB
llm_load_tensors: 需要内存 = 7024.01 MB (+ 400.00 MB 每状态)
...................................................................................................
llama_new_context_with_model: kv self 大小 = 400.00 MB
llama_new_context_with_model: 计算缓冲区总大小 = 75.41 MB
system_info: 线程数 = 16 / 24 | AVX = 0 | AVX2 = 0 | AVX512 = 0 | AVX512_VBMI = 0 | AVX512_VNNI = 0
提示、用户输入和模型生成可以通过利用 `--prompt-cache` 和 `--prompt-cache-all` 在多次调用 `./llama-cli` 时保存和恢复。`./examples/chat-persistent.sh` 脚本演示了这一点,支持长时间运行的可恢复聊天会话。要使用此示例,您必须提供一个文件来缓存初始聊天提示,并提供一个目录来保存聊天会话,也可以选择提供与 `chat-13B.sh` 相同的变量。相同的提示缓存可以在新的聊天会话中重复使用。请注意,提示缓存和聊天目录都与初始提示(`PROMPT_TEMPLATE`)和模型文件相关联。
```bash
# 开始一个新的聊天
PROMPT_CACHE_FILE=chat.prompt.bin CHAT_SAVE_DIR=./chat/default ./examples/chat-persistent.sh
# 恢复该聊天
PROMPT_CACHE_FILE=chat.prompt.bin CHAT_SAVE_DIR=./chat/default ./examples/chat-persistent.sh
# 使用相同的提示/模型开始一个不同的聊天
PROMPT_CACHE_FILE=chat.prompt.bin CHAT_SAVE_DIR=./chat/another ./examples/chat-persistent.sh
# 使用不同的提示缓存进行不同的提示/模型
PROMPT_TEMPLATE=./prompts/chat-with-bob.txt PROMPT_CACHE_FILE=bob.prompt.bin \
CHAT_SAVE_DIR=./chat/bob ./examples/chat-persistent.sh
使用语法约束输出
llama.cpp
支持语法来约束模型输出。例如,您可以强制模型只输出 JSON:
./llama-cli -m ./models/13B/ggml-model-q4_0.gguf -n 256 --grammar-file grammars/json.gbnf -p 'Request: schedule a call at 8pm; Command:'
grammars/
文件夹包含一些示例语法。要编写自己的语法,请查看 GBNF 指南。
要编写更复杂的 JSON 语法,您还可以访问 https://grammar.intrinsiclabs.ai/,这是一款浏览器应用程序,允许您编写 TypeScript 接口,并将其编译为 GBNF 语法,供本地使用。请注意,该应用程序由社区成员构建和维护,请在 其仓库 上报告任何问题或功能请求,而不是在此处。
构建
请参阅 本地构建 llama.cpp
支持的后端
后端 | 目标设备 |
---|---|
Metal | Apple Silicon |
BLAS | 所有设备 |
BLIS | 所有设备 |
SYCL | Intel 和 Nvidia GPU |
MUSA | Moore Threads GPU |
CUDA | Nvidia GPU |
hipBLAS | AMD GPU |
Vulkan | GPU |
工具
准备和量化
[!注意] 您可以使用 Hugging Face 上的 GGUF-my-repo 空间在无需任何设置的情况下量化模型权重。该空间每 6 小时与
llama.cpp
主分支同步。
要获取官方的 LLaMA 2 权重,请参见 获取并使用 Facebook LLaMA 2 模型 部分。Hugging Face 上也有大量预量化的 gguf
模型可供选择。
注意:convert.py
已移动到 examples/convert_legacy_llama.py
,不应用于 Llama/Llama2/Mistral
模型及其衍生产品以外的任何用途。它不支持 LLaMA 3,您可以使用 convert_hf_to_gguf.py
对从 Hugging Face 下载的 LLaMA 3 进行转换。
要了解有关量化模型的更多信息,阅读此文档
困惑度(衡量模型质量)
您可以使用 perplexity
示例在给定提示上测量困惑度(较低的困惑度更好)。
有关更多信息,请参见 https://huggingface.co/docs/transformers/perplexity。
要了解如何使用 llama.cpp 测量困惑度,阅读此文档
贡献
- 贡献者可以提交 PR
- 协作者可以推送到
llama.cpp
仓库中的分支并将 PR 合并到master
分支 - 协作者将根据贡献邀请
- 任何帮助管理问题和 PR 的工作都非常感谢!
- 参见 good first issues 以获取适合首次贡献的任务
- 阅读 CONTRIBUTING.md 了解更多信息
- 请务必阅读: 边缘推理
- 对于感兴趣的人来说,这里有一些背景故事:Changelog 播客
其他文档
开发文档
开创性论文和模型背景
如果您的问题是与模型生成质量相关的,那么请至少浏览以下链接和论文,以了解 LLaMA 模型的局限性。这在选择合适的模型大小并理解 LLaMA 模型和 ChatGPT 之间的显著和微妙差异时尤其重要:
- LLaMA:
- GPT-3:
- GPT-3.5 / InstructGPT / ChatGPT: