显存还没爆,大模型先崩了?你的 KV Cache 正在悄悄杀掉你的显存预算

显存还没爆,大模型先崩了?你的 KV Cache 正在悄悄杀掉你的显存预算 同一个 Llama-3-8B(Q4_K_M),同一段 prompt。-ngl 0纯 CPU 解码,我这台机器上大约 2 tokens/s;-ngl 99全塞进一张 RTX 4090,稳定在 150 tokens/s 上下——75 倍。中间那条曲线不是直线,也不是你以为的样子。先说一个大多数教程都写错的事实:n_gpu_layers=10不是把前10 层放上 GPU,而是把最后10 个层放上去。源码里那行判据是il = i_gpu_start,i_gpu_start = n_layer_all + 1 - n_gpu_layers。方向是反的。再说一个更容易踩的:一个 32 层的模型,你以为-ngl 32就全卸载了,其实第 0 层还留在 CPU 上——因为输出层也占一个卸载名额,真正全卸载要-ngl 33(或者干脆-1)。这一层没放对,解码带宽就卡在 CPU 那条 50 GB/s 的内存总线上,而不是 4090 那条 1 TB/s 的 HBM 上。差的不是一点点,是一个数量级。这篇文章把 llama.cpp 的层卸载逻辑从源码拆到实测:一层"卸载"到底改变了什么、层怎么分到设备(src/llama-model.cpp的load_tensors)、token embedding 为什么恒在 CPU、KV cache 怎么和权重抢显存、多卡怎么按tens