Misc. bug: [Fix provided] –fit on + –sleep-idle-seconds: failed to fit params to free device memory: model_params::tensor_buft_overrides a

该报错发生在 llama.cpp 服务器同时启用 --fit on 与 --sleep-idle-seconds 时,模型每次从休眠唤醒都会重新执行显存拟合逻辑,但 tensor buffer 覆盖参数已在首次加载时被写入,导致重复设置冲突。优先排查方法是暂时关闭 --fit 并固定 --ctx-s

快速结论:该报错发生在 llama.cpp 服务器同时启用 --fit on--sleep-idle-seconds 时,模型每次从休眠唤醒都会重新执行显存拟合逻辑,但 tensor buffer 覆盖参数已在首次加载时被写入,导致重复设置冲突。优先排查方法是暂时关闭 --fit 并固定 --ctx-size,或改用 PR #27807 中提供的补丁。

适用环境:llama.cpp 构建版本 9611(02182fc5b)及后续包含 --fit 特性的主分支版本;Linux x86_64;GNU 12.2.0 编译器;使用 llama-server 并配合 --no-mmap;模型需大到 --fit 会实际压缩上下文(例如 27B 模型配 24GB 显存)。

最快修复方案:Issue 作者验证有效的临时规避方法是固定上下文大小并禁用 --fit 功能(--ctx-size 合理值,去掉 --fit on)。该方案可阻止唤醒时触发拟合逻辑,但会牺牲动态显存利用能力。

注意事项:该问题已在 PR #27807 中提交修复补丁,但截至 Issue 关闭时 llama.cpp 维护者尚未合入(因行为变更提案被拒绝)。如果使用当前 master 版本,问题仍然存在,且每次唤醒后可能出现层放置偏移(如 65/66 → 64/66),导致约 20% 的静默吞吐量下降。

问题场景

用户运行 llama-server 时,同时指定了 --fit on(自动调整上下文以最大化 GPU 利用率)和 --sleep-idle-seconds 60(空闲休眠)。在服务器休眠后的首次请求唤醒模型时,common_fit_params() 会尝试重新应用张量缓冲区覆盖设置,但由于这些设置已在初始加载时写入 common_params 对象,触发“already set by user”保护逻辑并中止拟合过程。此问题会在每次休眠/唤醒周期中重复出现,无论上下文大小是否实际变化。

报错原文

W common_fit_params: failed to fit params to free device memory: model_params::tensor_buft_overrides already set by user, abort

原因分析

该缺陷由提交 b1f3a6e5dllama: automatically set parameters not set by the user in such a way that maximizes GPU utilization (#16653),2025-12-15)引入。该提交在 src/llama.cpp(重构后迁移至 common/fit.cpp 第 373 行)中添加了保护逻辑:

if (mparams->tensor_buft_overrides && (mparams->tensor_buft_overrides->pattern || mparams->tensor_buft_overrides->buft)) {
    throw common_params_fit_exception("model_params::tensor_buft_overrides already set by user, abort");
}

问题在于:首次加载时 common_fit_params() 会填充 params_base.tensor_buft_overrides;当服务器从休眠唤醒并重新调用 load_model(params_base)common_init_from_params(params_base)common_fit_params() 时,发现复用的 common_params 对象中已存在覆盖设置,于是抛出异常。该保护机制本意是防止覆盖用户手动设置的参数,但无法区分两种场景:用户显式设置了覆盖参数(应抛错),还是 --fit 在上一加载周期中自行写入了覆盖参数(应清除后重试)。

环境排查

  • 确认 llama.cpp 版本是否包含 --fit 特性(构建号 ≥ 9611,或包含提交 b1f3a6e5d 的任意版本)。
  • 确认 --fit 确实会改变上下文大小——若模型足够小、显存充足,拟合逻辑无需调整任何参数,则缺陷不会显现。
  • 检查是否同时启用了 --sleep-idle-seconds(缺陷触发前提条件)。
  • 建议在测试环境中确认显存规格与模型大小匹配,以便复现层放置偏移现象。

解决步骤

  1. 临时规避(已验证):移除命令行中的 --fit on,并手动指定一个合理的 --ctx-size 值。例如:--ctx-size 131072 --sleep-idle-seconds 60。此方法可完全阻止唤醒时触发拟合逻辑。
  2. 应用社区补丁(可优先尝试):拉取 PR #27807 中的修改,或手动应用 Issue 作者在 tools/server/server-context.cpp 中提供的补丁。核心思路是在首次加载后保存拟合得到的 ctx-size(新增 uint32_t fitted_n_ctx = 0; 成员变量),唤醒时直接复用该值并跳过拟合过程。Issue 作者表示已在多个构建版本上验证此补丁稳定有效(”works 100%”)。
  3. 关注上游进展:Issue 因长时间无维护者响应而被标记为 stale 并关闭。若希望官方合入修复,可关注相关 PR 或重新开启 Issue 讨论。注意 llama.cpp 的 AI 使用政策禁止使用 AI 生成帖子内容。

验证方法

按照以下步骤确认问题是否已解决:

  • 使用复现命令启动服务器(保留 --fit on--sleep-idle-seconds 60)。
  • 发送一次请求加载模型,等待超过空闲休眠时间(60 秒),再次发送请求触发唤醒。
  • 检查服务器日志:不再出现 failed to fit params to free device memory 警告即表示修复生效。
  • 多次重复休眠/唤醒周期,确认警告不会周期性出现。
  • 若应用了 PR #27807 补丁,额外监控吞吐量:修复前唤醒后可能出现层放置偏移(如 65/66 → 64/66),导致约 20% 的静默性能下降;修复后层放置应保持稳定。

参考来源

ggml-org/llama.cpp #24684
ggml-org/llama.cpp #27807(社区修复 PR,未合入)

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 22082

发表回复

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