news 2026/10/20 2:22:38

ik_llama.cpp 混合 GPU/CPU 推理:张量后端怎么分配不踩坑

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ik_llama.cpp 混合 GPU/CPU 推理:张量后端怎么分配不踩坑

ik_llama.cpp 混合 GPU/CPU 推理:张量后端怎么分配不踩坑

【免费下载链接】ik_llama.cppllama.cpp fork with additional SOTA quants and improved performance项目地址: https://gitcode.com/GitHub_Trending/ik/ik_llama.cpp

显存装不下整个模型时,常规做法是用-ngl把部分层分给 CPU,让 ik_llama.cpp 的混合 GPU/CPU 推理调度器兜底。但默认分配并不总是最优:部分张量会被放错后端,后端间的拷贝开销会直接拖慢速度。本文从ggml_backend_sched_set_tensor_backend讲起,说明张量分配机制与参数调法。

🔌 显存不够时,张量该放哪

最典型的现象是加载模型时报显存不足,或者把-ngl调小后 prompt 处理速度骤降。本质是计算图里的每个张量(权重、中间结果、KV 缓存)都必须落在某个后端上,放错了就要在 GPU 和 CPU 之间来回拷贝。调度器默认按"哪个后端支持该算子 + 权重 buffer 在哪个后端"自动分配,这套启发式够用,但个别节点会落在增加传输的位置,手动覆盖就是为此准备的。

🧠 分配机制:自动优先,手动兜底

ggml/include/ggml-backend.h的头部注释给出了完整流程:创建调度器 → 预留计算 buffer → 手动分配(可选)→ 执行计算。核心就一个函数:

// 手动把 node 固定到指定后端(如 GPU),优先级高于自动启发式 ggml_backend_sched_set_tensor_backend(sched, node, backend_gpu);

不调用它时,权重放在标记为GGML_BACKEND_BUFFER_USAGE_WEIGHTSbuffer 上的算子,会优先在同后端执行,否则触发跨后端拷贝。两个细节值得注意:ggml_backend_sched_reset的注释明确要求,改节点后端前必须先调用它,否则新分配不生效;ggml_backend_sched_get_tensor_backend可查询张量最终落在哪个后端,方便验证调优结果。

⚙️ 实操:混合推理的三个参数

最常动的旋钮是层数,主推理二进制为llama-cli:

# 24 层放到 GPU 0 上跑;-ngl 上限为模型总层数 ./llama-cli -m model.gguf -ngl 24 -mg 0

另外三个参数分工不同:

参数作用调法提示
-ngl / --gpu-layers放到 GPU 的层数0 为纯 CPU,尽量往上调
-mg / --main-gpu优先使用的 GPU多卡环境必配
-nkvo / --no-kv-offloadKV 缓存固定在 CPU省显存,但 PP 会变慢
-fa / --flash-attnFlash Attention,默认 on可选 auto/on/off

🧩 常见坑与对应解法

一是忘记 reset:如上一节所说,改节点后端前必须调ggml_backend_sched_reset,否则旧分配继续生效,改动看起来"没反应"。二是-nkvo滥用:docs/parameters.md 明确它"provided for flexibility",实际会降低 prompt 处理速度,不建议长期开启。三是 norm 节点放错后端:这个问题在 llama 层已经处理,src/llama-build-context.cpp 中会把 norm 手动分配到该层权重所在的后端,避免调度器自动放置带来的额外后端间传输。四是排查思路:参数调完出现乱码或崩溃,先把-fa置为 off 排除 attention 路径的影响,再逐项检查层分配。

📊 效果验证:看 splits 与后端分布

判断混合推理是否按预期工作,看两个数:

// 最近一次图被分成多少段后端执行,split 越多切换越多 int splits = ggml_backend_sched_get_n_splits(sched); // 张量最终分配到的后端 ggml_backend_t be = ggml_backend_sched_get_tensor_backend(sched, tensor);

实际跑起来直接用 llama-bench 对比:

# 对比不同 -ngl 的生成速度,TG 是核心指标 ./llama-bench -m model.gguf -ngl 24 -r 1

splits 明显增加而 TG 没有同步提升,说明后端间拷贝在吃收益:要么加大-ngl把更多算子压到 GPU,要么检查关键中间张量的落点。

调优就一句话:以 llama-bench 的 TG 为准绳,先调-ngl,启发式分配不够时再手动覆盖后端;全部参数说明见仓库内的 docs/parameters.md。

【免费下载链接】ik_llama.cppllama.cpp fork with additional SOTA quants and improved performance项目地址: https://gitcode.com/GitHub_Trending/ik/ik_llama.cpp

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/20 2:22:26

MAS 激活脚本完整指南:4 种方法免费激活 Windows 与 Office

MAS 激活脚本完整指南:4 种方法免费激活 Windows 与 Office 【免费下载链接】Microsoft-Activation-Scripts Open-source Windows and Office activator featuring HWID, Ohook, TSforge, and Online KMS activation methods, along with advanced troubleshooting.…

作者头像 李华
网站建设 2026/10/20 2:22:14

Redis灵魂拷问:聊一聊zset使用?

本文介绍一下redis中zset的使用。首先说一下我本地的实验环境&#xff1a;redis版本:6.0.7springboot-redis版本&#xff1a;<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>…

作者头像 李华
网站建设 2026/10/20 2:21:59

拼手速不如拼时间:biliTickerBuy 自动化抢票 B 站会员购实战拆解

拼手速不如拼时间&#xff1a;biliTickerBuy 自动化抢票 B 站会员购实战拆解 【免费下载链接】biliTickerBuy b站会员购购票辅助工具 项目地址: https://gitcode.com/GitHub_Trending/bi/biliTickerBuy BW 开票那一秒&#xff0c;你的手指和几百个人同时点下"立即购…

作者头像 李华
网站建设 2026/10/20 2:19:44

PyTorch 高配CPU跑深度学习反而更慢(线程爆炸)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华