Router (server) stops forwarding parent CLI flags (`–parallel`, `–cache-type-*`, `–flash-attn`, `-ngl`) to spawned child instances — regr

用户在使用 llama.cpp 路由器模式(通过 `--models-preset` 和 `--models-max` 参数)运行 `llama-server` 时,父进程的 CLI 标志(如 `--parallel 1`、`--cache-type-k q8_0`、`--flash-attn on

Router (server) stops forwarding parent CLI flags (`--parallel`, `--cache-type-*`, `--flash-attn`, `-ngl`) to spawned child instances — regr

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)。

解决步骤

  1. 临时工作区:将缺失的 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
  2. 降级版本(可优先尝试):回退到 b9641 或更早版本,例如使用 Docker 镜像 `ghcr.io/ggml-org/llama.cpp:server-cuda-b9641`。
  3. 安装修复版本:如果存在包含修复的版本(如 PR #24763 被接受后),升级到该版本。
  4. 手动应用修复:如果熟悉源码,可以手动恢复 `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 错误,则说明问题已解决。

参考来源

ggml-org/llama.cpp #24762

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

celebrityanime
celebrityanime
文章: 8652

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注