
Misc. bug: llama-server `–ctx-size` is divided by `–parallel` and cannot be increased?
快速结论:当使用llama-server时,--ctx-size指定的上下文大小会被--parallel参数平分,导致单个推理请求实际可用上下文远小于预期。若试图增大--ctx-size补偿,可能触发GGML_ASSERT断言失败。优先排查llama-server版本是否已支持--ctx-per-slot参数。
问题场景
运行llama-server(版本4621,commit 6eecde3c)加载DeepSeek-V3 Q2_K_XS GGUF模型,指定--ctx-size 0或--ctx-size 163840并设置--parallel 6时触发。
报错原文
llama_init_from_model: n_ctx_per_seq (27306) < n_ctx_train (163840) -- the full capacity of the model will not be utilized
// 增加 --ctx-size 到 327680 后:
/home/main/llama.cpp/ggml/src/ggml.c:1578: GGML_ASSERT(view_src == NULL || data_size == 0 || data_size + view_offs <= ggml_nbytes(view_src)) failed
原因分析
server.cpp第1902行存在以下代码:const int32_t n_ctx_slot = n_ctx / params_base.n_parallel;。该逻辑将总的--ctx-size按照--parallel参数平分,导致每个并行槽位(slot)只能使用总上下文的1/parallel。Issue中确认这是代码实现问题,社区在讨论后计划新增--ctx-per-slot参数来覆盖此行为。
环境排查
llama-server版本(特别是commit 6eecde3c及附近版本)- 确认使用的
--parallel参数值 - 确认模型原生训练上下文长度(n_ctx_train)
- 记录
llama_init_from_model输出的n_ctx_per_seq值
解决步骤
- 等待上游修复:该Issue已被标记为stale并关闭,但社区已确认问题并计划在后续版本中通过新增
--ctx-per-slot参数解决(参考PR #11213后的改进)。 - 临时工作绕过:若必须使用当前版本,可尝试在源码中修改
server.cpp第1902行,将n_ctx_slot = n_ctx / params_base.n_parallel改为n_ctx_slot = n_ctx,但需注意这可能与预期行为不一致(每个slot都会分配全部上下文)。 - 调整
--parallel参数:如果单个推理请求需要更多上下文,可减少--parallel值(例如设为1),使得n_ctx_per_seq = n_ctx。 - 避免补偿行为:不要通过增大
--ctx-size超过模型原生训练上下文(n_ctx_train)来补偿平分影响,否则会触发GGML_ASSERT(如报错原文所示)。
验证方法
- 运行
llama-server后检查日志中llama_init_from_model: n_ctx_per_seq的值是否等于预期的--ctx-size。 - 使用单个推理请求测试上下文占用是否达到设置值(例如长文本生成不报错)。



