GPU卸载与上下文扩展结果 | AI生成和翻译
综合总结
设置过程
初始状态(根据您的信息):
- llama-server 以
-ngl 20参数运行(20层GPU) - 模型:
gemma-4-E4B-it-Q5_K_M.gguf - 上下文长度:32k
- VRAM 使用量:约 2,695 MiB,空闲约 9GB 未利用
步骤 1 — 增加 GPU 层数
从 ngl 20 提升至 ngl 35(会话开始时已完成),然后推至完全卸载:
| ngl | VRAM 使用量 | GPU 层数 | CPU 层数 |
|---|---|---|---|
| 20 | ~2,695 MiB | 20 / 43 | 23 |
| 35 | ~5,030 MiB | 35 / 43 | 8 |
| 43 | ~5,182 MiB | 43 / 43 | 0 |
从 ngl 35 提升至 43(完全卸载)仅增加了 152 MiB 成本 —— 基本上是免费的。推理过程中再无 CPU↔GPU 数据传输。
步骤 2 — 上下文长度:32k → 64k
使用 -c 65536 重新启动。KV缓存翻倍,但对VRAM的影响不大:
| 上下文长度 | VRAM(空闲时) | VRAM(处理长提示后) |
|---|---|---|
| 32k | ~5,030 MiB | ~5,182 MiB |
| 64k | ~6,118 MiB | ~6,646 MiB |
上下文长度翻倍的成本:空闲时增加 936 MiB,处理 6 万 token 推理时额外增加 528 MiB。仍有 5GB+ 的剩余空间。
步骤 3 — 长提示压力测试
第一次测试(32k 上下文时期):12,020 token 提示 → 6.9 秒成功
64k 上下文测试:
| 提示 token 数 | 占 64k 上下文的百分比 | 生成长度 | 总耗时 | 生成速度 |
|---|---|---|---|---|
| 20,025 | 30% | 385 tok | 7.5s | 51.6 tok/s |
| 40,025 | 61% | 383 tok | 14.1s | 27.1 tok/s |
| 60,025 | 92% | 444 tok | 20.2s | 22.0 tok/s |
所有测试均未崩溃。
性能分析
速度与上下文深度的关系:
20k 提示 → 51.6 tok/s (基线)
40k 提示 → 27.1 tok/s (比20k下降 47%)
60k 提示 → 22.0 tok/s (比20k下降 57%)
这是预期内的 —— 注意力计算复杂度为 O(n²),因此随着 KV 缓存中的 token 增多,生成速度会变慢。不过模型质量并未下降 —— 在所有长度下回答都保持连贯。
预填充吞吐量(根据总时间粗略估算):
- 20k token 耗时约 3-4 秒 → 预填充约 5,000–6,000 tokens/s
- 60k token 耗时约 8-10 秒 → 预填充约 6,000–7,500 tokens/s
预填充很快,因为它在 GPU 上是并行化的;生成是瓶颈。
最终服务器配置
llama-server \
-m gemma-4-E4B-it-Q5_K_M.gguf \
--flash-attn off \
-ngl 43 \ # 完全 GPU 卸载
-c 65536 \ # 64k 上下文
--host 0.0.0.0 \
--port 8081
| 资源 | 使用量 | 空闲量 |
|---|---|---|
| VRAM(总量 12,282 MiB) | ~6,646 MiB | 空闲约 5,600 MiB |
| 上下文长度 | 65,536 tokens | 最多可达 131,072(模型上限) |
| GPU 层数 | 43/43 | 完全卸载 |
潜在后续步骤(如需更高速度):
- 启用
--flash-attn on(当前为关闭)—— 可能显著改善长上下文下的吞吐量 - 尝试
-c 131072(模型原生最大值)—— VRAM 增加约 1.5GB,仍能容纳 - 如服务多个用户,可增加并行槽位(
-np)