llama.cpp - 如何在GPU上释放更多空间
摘要
一则讨论如何在llama.cpp中释放GPU内存实用技巧的帖子,例如将mmproj卸载到CPU、调整KV缓存类型,同时讨论了--cache-type-k/v和--spec-draft-n-max等参数。
在过去一两周里,llama.cpp在RAM使用方面表现好了很多。我不再看到内存泄漏,一切都能很好地适配在GPU上——我的默认设置是--n-gpu-layers 99 --no-mmap --mlock,以避免使用普通RAM,因为我用的是3090配合eGPU配置:Qwen3.6-27B-UD-Q5_K_XL-mtp, q4_0, 150k上下文。我创建这个帖子是想看看有没有更多技巧来释放更多内存,以便进一步增大上下文大小。以下是我针对某个模型(当然,这是内存占用最大的因素)整理的VRAM相关参数列表:
--no-mmproj-offload:这是最大的改进:如果你的模型支持视觉,你可以将mmproj卸载到CPU。性能会有一点下降,但你的显卡上会多出1GB的可用空间。
--cache-type-k, --cache-type-v:KV缓存(显然)——可以将内存分配减少50%、75%等,但质量也会相应下降。我的观察是,自从引入了注意力旋转(attention rotation)后,我甚至可以用q4而不会明显感觉到质量下降,因为我可以用更大的基座模型——这比因KV缓存导致质量下降更有帮助。
--cache-type-k-draft, --cache-type-v-draft:同样适用于mtp模型的KV缓存。
--spec-draft-n-max:在单次前向传递中最多猜测未来x个token。对于编码,我通常用“2”就够了。“1”会稍微少用一些内存,但TPS下降约5%。“3”对我的用例没有意义——消耗更多内存,但TPS和“1”一样。
--flash-attn on:据我所知,现在这已经是默认值了。如果关闭它,内存分配会增加,但如果你使用量化v缓存,无论如何也不能关闭。
一些我本以为会有帮助的参数,后来发现其实并没有:
--ctx-checkpoints:我听说减小这个值也能减少内存分配,但对我来说并非如此。默认值是64,我减小到一个很小的值也没变化。
--parallel:同时活跃的用户请求数。由于默认值是1,在单用户设置下你无能为力。但如果你增大它,主会话的KV缓存会相应减少(50%、66%等)。
--fit-target:设置一个严格的安全缓冲区(单位MB,默认1024),引擎必须保证GPU上完全空出这么多空间(例如,留给视频I/O)。由于我的显示器插在另一张卡上,我把它减到了64,但一点帮助也没有。据我所知,llama.cpp现在会在启动时运行内部计算循环,自动调整一些变量以防止OOM崩溃。
我已经分享了我的技巧,你有哪些?还有别的吗?你的体验和我的不同吗?谢谢!
相似文章
如何防止 llama.cpp 将数据卸载到交换空间?
用户寻求关于如何防止 llama.cpp 在 RAM 完全耗尽前将 KV 缓存卸载到交换空间的建议,并分享了他们在配备 96GB RAM 的 M2 Max 和大型 Qwen 模型上的配置。
寻找关于 llama.cpp 服务器及模型卸载工作原理的阅读资源
一位用户分享了他们使用 llama.cpp 服务器进行模型卸载的经验,指出了性能权衡和安静运行的优势,并询问了解该工具如何在 VRAM 和系统 RAM 之间管理内存的阅读资源。
也许将KV缓存卸载到RAM并不差
一位用户分享了在llama.cpp中将KV缓存卸载到RAM的经验,在释放显存以便运行更大模型和上下文窗口的同时,实现了相近的速度,表明这种权衡通常是值得的。
llama.cpp 中的流水线并行可能浪费你的显存
测试表明,llama.cpp 默认的流水线并行浪费显存且无速度提升;通过编译时设置 GGML_SCHED_MAX_COPIES=1 可节省大量显存,同时保持相同推理速度。
双GPU llama.cpp加速
llama.cpp的一个分支修复了量化KV缓存中的--split-mode tensor问题,在双GPU配置上实现高达40%的速度提升,且无质量损失。