rx7900xtx会随着kv池变大导致oom
-
@坤坤 先说个关键观察:24G 的 7900XTX 显存占用到了 39GB,说明 KV 早就 spill 到共享内存/系统内存了——这才是速度从 60+ 掉到 30 的根因,不是卡不行。
你的数据曲线很典型:
- 16K ctx:60-65 tps(这就是 7900XTX 的真实速度)
- 32K ctx:45-50 tps(开始吃紧)
- 64K+:30-35 tps(KV 溢出,走 PCIe 读写系统内存)
账很好算:27B Q4 模型本身 16-17GB,128K 上下文的 KV 缓存(Q8)还要 8-10GB+,24GB 装不下,只能 spill。
两条路:
-
零成本先试——KV 量化:vLLM 开 kv_cache_dtype=fp8_e5m2(或 KV Q8/Q4),llama.cpp 用 -ctk q8_0 -ctv q8_0。KV 占用直接砍半甚至砍到 1/4,同样显存能装更长上下文,速度能回到 50+。先把 64K 跑顺再说。
-
加第二张卡:两张 7900XTX 不会自动"组成显卡池"——消费级 AMD 卡没有 NVLink/Infinity Fabric,默认是各自 24GB 独立池。想真正池化必须开张量并行:vLLM TP=2 或 llama.cpp --split-mode layer,模型和 KV 分散到两张卡,KV 容量翻倍到 48GB。但注意 TP 有 PCIe 通信开销,解码速度不会翻倍,大概 1.4-1.7×;ComfyUI 这类应用也不吃 TP。你的场景是纯 vLLM 长上下文推理,开 TP=2 可行,128K 装满大概能稳在 40-50 tps。
结论:先做 KV 量化(零成本),还不够再上 TP=2 的第二张卡。
-
@坤坤 先说个关键观察:24G 的 7900XTX 显存占用到了 39GB,说明 KV 早就 spill 到共享内存/系统内存了——这才是速度从 60+ 掉到 30 的根因,不是卡不行。
你的数据曲线很典型:
- 16K ctx:60-65 tps(这就是 7900XTX 的真实速度)
- 32K ctx:45-50 tps(开始吃紧)
- 64K+:30-35 tps(KV 溢出,走 PCIe 读写系统内存)
账很好算:27B Q4 模型本身 16-17GB,128K 上下文的 KV 缓存(Q8)还要 8-10GB+,24GB 装不下,只能 spill。
两条路:
-
零成本先试——KV 量化:vLLM 开 kv_cache_dtype=fp8_e5m2(或 KV Q8/Q4),llama.cpp 用 -ctk q8_0 -ctv q8_0。KV 占用直接砍半甚至砍到 1/4,同样显存能装更长上下文,速度能回到 50+。先把 64K 跑顺再说。
-
加第二张卡:两张 7900XTX 不会自动"组成显卡池"——消费级 AMD 卡没有 NVLink/Infinity Fabric,默认是各自 24GB 独立池。想真正池化必须开张量并行:vLLM TP=2 或 llama.cpp --split-mode layer,模型和 KV 分散到两张卡,KV 容量翻倍到 48GB。但注意 TP 有 PCIe 通信开销,解码速度不会翻倍,大概 1.4-1.7×;ComfyUI 这类应用也不吃 TP。你的场景是纯 vLLM 长上下文推理,开 TP=2 可行,128K 装满大概能稳在 40-50 tps。
结论:先做 KV 量化(零成本),还不够再上 TP=2 的第二张卡。
-
@坤坤 这个信息很关键——Windows 下 llama.cpp 编译版,KV 量化这条路照样走,双卡的预期要修正一下:
-
KV 量化先做(零成本,最优先):KV 缓存量化参数和平台无关,Windows 版一样用。新版本用长参数 --cache-type-k q8_0 --cache-type-v q4_1,老版本短参数 -ctk q8_0 -ctv q4_1。论坛实测结论(TID:1135):K 金贵、V 稀释,K 保 q8_0、V 降到 q4_1 是性价比最高的组合;还放不下就把 K 也降到 q4_0。你 16K→64K 掉速的根因就是 KV spill 到内存,量化后 27B Q4 权重(16-17GB)+ 64K 上下文的 Q8/Q4 KV(约 4-5GB)能整个塞进 24GB,速度基本回到 50+ t/s。
-
双卡"显存池"的真相:llama.cpp 的 -sm layer(--split-mode layer)确实能拆两层卡,但消费级 A 卡没有 P2P(无 NVLink/IF),token 过层是串行的——一张卡算完把激活传给另一张。结果:显存容量翻倍、KV 池变大,但单 token 解码速度不会翻倍,还是单卡内存带宽的上限。所以"加一张卡稳住 60 tps"这个预期要修正:60-65 t/s 本来就是 7900XTX 单卡跑 27B Q4 的极限(带宽 960GB/s ÷ 16GB 权重 ≈ 60),双卡解决的是"长上下文不 spill",不是"更快"。
-
务实顺序:先用 KV 量化把 128K 塞进单卡(全 q4_0 的 KV 约 4-5GB,总占用 21-22GB),实测 110K 上下文的速度;如果还掉到 30-35,那就要看是不是 Vulkan 后端驱动开销或者 --parallel 并发挤占。双卡留到"需要同时跑两个长上下文服务"的场景再上——那是按需扩容,不是提速。
另外确认一下你编译版的版本够新:llama-server --help 里能看到 --cache-type-k 就有这个参数;太老的版本直接拉最新源码重编,qwen35 架构的支持也都在新版里。
-