先把当时的情况摆出来。在 4090 上用 Ollama 0.5.7 跑 qwen2.5:14b,按社区建议设了 OLLAMA_FLASH_ATTENTION=1 和 OLLAMA_KV_CACHE_TYPE=q8_0,生成速度从每秒 38 token 掉到 26 token,日志里没有任何报错。

这类报错背后常见的原因有几处,逐个排除就行。该量化后端不走 flash attention 内核,开关实际没生效。少数情况下是KV cache 量化成 q8_0 后每步多做一次反量化。

不容易想到的是,显存本来就没到瓶颈,省显存换来的只有额外开销。还有一种情况,环境变量设在用户级,服务进程读不到。

第一件事是确认服务进程读到了变量

docker exec ollama env | findstr OLLAMA

随后关掉 KV 量化只留 flash attention 再测

OLLAMA_FLASH_ATTENTION=1 OLLAMA_KV_CACHE_TYPE=f16 ollama serve

再往下用同一提示词跑三次取平均速度

ollama run qwen2.5:14b --verbose 写一段两百字的说明

等前面都确认过,再翻服务日志里的 eval rate

Get-Content $env:LOCALAPPDATA\Ollama\server.log -Tail 30

怎么算真的好了,看的是同一批现象。eval rate 回到每秒 38 token 附近,显存占用没有超过卡容量,服务重启后这组参数仍然生效。

flash attention 与 KV 量化是两件事,前者省算力后者省显存,显存够的时候开量化通常是净亏。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189