llama.cpp 批处理推理教程:多序列并发生成的实用指南
llama.cpp 批处理推理教程多序列并发生成的实用指南【免费下载链接】llama.cppLLM inference in C/C项目地址: https://gitcode.com/GitHub_Trending/ll/llama.cpp用 llama.cpp 做本地 LLM 推理时默认一次只服务一个请求多用户同时提问硬件利用率上不去排队等待也在拉长。这篇文章带你走一遍 llama.cpp 批处理推理的最小路径——用自带的llama-batched示例让多条序列共享同一份提示词并并发生成总吞吐量会有肉眼可见的提升且全程只需改几个命令行参数。为什么单序列会浪费硬件结论先行解码阶段每生成一个 token 都要过一次完整的 Transformer如果每次 decode 只喂 1 个 token矩阵运算的并行度用不满把多个序列的 token 装进同一次llama_decode相当于让同一次矩阵计算顺路处理更多请求。一个类比货车一趟只拉一单货和一趟装满货跑的距离一样但满载那趟的单位成本更低。可验证的现象是运行结束后llama_perf_context_print打印的eval time里每次 decode 处理的 token 数应等于并行序列数而不是 1。三步跑通最小批处理示例examples/batched/下就是这个主题的最小实现编译后即可使用。克隆并构建git clone https://gitcode.com/GitHub_Trending/ll/llama.cpp cmake -B build cmake --build build --config Release -j运行示例-np指定并行序列数./build/bin/llama-batched -m ./models/your-model.gguf -p Hello my name is -n 32 -np 4看两个输出确认生效一是 4 段互不相同的续写同一提示词、各自独立采样二是结尾的decoded X tokens in Y s, speed: Z t/s用它对比-np 1和-np 4的t/s即可量化批处理带来的吞吐收益官方 README 中给出的示例输出约为 30 t/s 量级你的硬件上数字会不同。 先看懂这三件事再谈调优1) llama_batch 是一摞带车道号的 token。它在 include/llama.h 中定义内容是token、pos、seq_id、logits几个平行数组——每个 token 标号属于哪条序列调度就是往这摞 token 里按车道放数据。核心初始化只有两行llama_batch batch llama_batch_init(std::max(tokens_list.size(), (size_t) n_parallel), 0, n_parallel); // 主循环中每条序列采样 1 个新 token 后 common_batch_add(batch, new_token_id, n_cur, { i }, true);2) 提示词只算一次。源文件examples/batched/batched.cpp里提示词 token 入批时同时挂上全部序列号所以 KV 缓存里这份前缀被所有序列共用不需要逐条复制生成阶段才按序列各自分头。这也是 KV 需求量的由来提示词长度 (每序列生成长度 - 提示词长度) × 并行数。3) 每条序列有独立的采样器。每个seq_id配一条llama_sampler_chain温度、top-k 各管各的所以各条输出不同是正常现象日志里也能看到stream i finished逐条结束短序列不拖长序列。n_parallel、n_ctx 怎么配置推荐起步值参数建议起点作用与判断依据-npn_parallel4再试 8并行序列数每加一档对比一次t/s不再涨就停-nn_predict32每条序列的总生成长度影响 KV 需求n_ctx按公式自动放大必须 ≥n_kv_req否则启动即报错n_batch≥ max(n_predict, n_parallel)单次提交的最大 token 数--kv-unified开启所有序列共用一块 KV 缓冲省显存原则先固定-n 32把-np从 1 逐档加到 8用结尾的speed一行做判断。延迟优先就取小值吞吐优先取大值——不要凭感觉一次拉满。⚠️ 批处理常见坑与排查n_kv_req n_ctx启动报错错误信息会直接提示二选一减-np或加大-cn_ctx。-np加大后速度不涨显存带宽或容量可能已是瓶颈回退到上一档即可不必强求大并行。各序列输出差异大预期行为各序列独立采样需要可复现结果时加--top-k 1做确定性验证。decode 失败或 OOM先降n_ctx再换量化更低的 GGUF 文件两者都比盲目调线程数有效。下一步往哪走想模拟真实请求流量读 examples/parallel/ 的说明它模拟128 个请求、8 路并发是批处理到服务端的中间形态。想直接上 HTTP 服务看 tools/server/README.md其中的连续批处理continuous batching与-np、--kv-unified参数是同一套机制的工程化版本。想读源码细节从 examples/batched/batched.cpp 的主循环入手配合 include/llama.h 中llama_batch的注释看字段含义。具体动作今天先跑-np 1和-np 4各一次记下两行的t/s再跑一次llama-parallel -np 8 -ns 128观察多请求下的分配行为之后把注意力放在eval time与prompt eval time的占比上它是判断瓶颈在提示词还是在解码的直接依据。【免费下载链接】llama.cppLLM inference in C/C项目地址: https://gitcode.com/GitHub_Trending/ll/llama.cpp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考