
Router (server) stops forwarding parent CLI flags (`–parallel`, `–cache-type-*`, `–flash-attn`, `-ngl`) to spawned child instances — regr
快速结论:此问题发生在 llama.cpp 路由器模式下,父进程 `llama-server` 不再将 `–parallel`、`–cache-type-k/v`、`–flash-attn`、`–n-gpu-layers` 等 CLI 标志传递给子实例,导致子实例回退到默认值(如 `n_parallel = 4`)并因 KV 缓存溢出(OOM)而崩溃。优先检查你使用的版本是否在 b9641 到 b9692 之间,或尝试将相关标志移至预设配置文件的 `[*]` 部分。
问题场景
用户在使用 llama.cpp 路由器模式(通过 `–models-preset` 和 `–models-max` 参数)运行 `llama-server` 时,父进程的 CLI 标志(如 `–parallel 1`、`–cache-type-k q8_0`、`–flash-attn on`、`–n-gpu-layers 999`)未能传递给子实例,导致子实例使用默认值并 OOM。
报错原文
E ggml_backend_cuda_buffer_type_alloc_buffer: allocating 10296.00 MiB on device 0: cudaMalloc failed: out of memory
E llama_init_from_model: failed to initialize the context: failed to allocate buffer for kv cache
子实例日志中的关键信息:
I srv llama_server: n_parallel is set to auto, using n_parallel = 4 and kv_unified = true
原因分析
根本原因是路由器重写(PR #23976)中删除了 `server_models::load_models()` 内的 `final_presets[*].merge(base_preset)` 逻辑,该逻辑确保父进程的 CLI 标志具有最高优先级并传递给子实例。在 b9641 版本中此逻辑存在,但在 b9692 版本中被移除。
注意:原始 Issue 中提交的修复 PR #24763 因被怀疑为 AI 生成代码而被拒绝,尽管作者声称代码是从仓库中恢复的原始代码。因此,此问题可能尚未完全修复。
另外,此问题可能与其他问题(如 #24735 中报告的 `–ctx-size` 被忽略)有相同根本原因,均在 b9688 到 b9692 版本范围内出现。
环境排查
- 确认 llama.cpp 版本是否在 b9641 到 b9692 之间(具体为 b9692 及更新版本受影响)。
- 检查 Docker 镜像标签:例如 `ghcr.io/ggml-org/llama.cpp:server-cuda-b9692` 受影响,而 `server-cuda-b9641` 正常。
- 确认是否启用路由器模式(使用 `–models-preset` 和 `–models-max`)。
- 检查父进程 CLI 中是否显式设置了 `–parallel`、`–cache-type-k/v`、`–flash-attn`、`–n-gpu-layers` 等标志。
- 如果使用多 GPU 环境,确认显卡型号和显存容量(例如 2× NVIDIA Quadro P5000)。
解决步骤
- 临时工作区:将缺失的 CLI 标志(如 `–parallel`、`–cache-type-k/v`、`–flash-attn`、`–n-gpu-layers`)添加到预设配置文件的 `[*]` 部分,使用 INI 格式。例如:
parallel = 1
cache-type-k = q8_0
cache-type-v = q8_0
flash-attn = on
n-gpu-layers = 999 - 降级版本(可优先尝试):回退到 b9641 或更早版本,例如使用 Docker 镜像 `ghcr.io/ggml-org/llama.cpp:server-cuda-b9641`。
- 安装修复版本:如果存在包含修复的版本(如 PR #24763 被接受后),升级到该版本。
- 手动应用修复:如果熟悉源码,可以手动恢复 `server_models::load_models()` 中的 `final_presets[*].merge(base_preset)` 逻辑(参考 b9641 版本的实现)。
验证方法
启动路由器模式下的 `llama-server` 后,检查子实例的 spawn 参数日志。如果看到 `–parallel 1`、`–cache-type-k q8_0` 等标志出现在子实例的 `spawning server instance with args:` 列表中,且未出现“n_parallel is set to auto”日志和 CUDA OOM 错误,则说明问题已解决。



