总结示意图
【仓库】 RAM (内存) 【搬运】 CPU (指挥) 【车间】 VRAM (显存)
+---------------+ +---------------+ +-------------------------+
| | | 12个熟练工 | | [ 物理批次 uBatch ] |
| [ 待处理数据 ] --(1)-->| (精简核数) |--(2)-->| 2048 (宽大传送带) |
| | | (消除延迟) | | (PP: 500 t/s 冲刺) |
+---------------+ +---------------+ +------------|------------+
|
[ 核心计算 (SM) ]
|
+------------V------------+
【产出】 每秒 73 字 <-----------(4)-----------| [ KV Cache 历史记忆 ] |
| (量化压缩: 节省地皮) |
| (n_ctx: 预留地皮) |
+-------------------------+目标
- 提升pp吞入和tg吐出的速度:900+,75+,有点完美
- 提升显卡利用率:sm等cpu运送的间隔最少,sm90+
nvidia-smi dmon -s uc -i 0 日志
4096 4096的效果
# gpu sm mem enc dec jpg ofa mclk pclk
# Idx % % % % % % MHz MHz
0 15 3 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 58 19 0 0 - - 877 1530
0 59 18 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 11 0 0 0 - - 877 1530
0 58 18 0 0 - - 877 1530
0 37 6 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 65 22 0 0 - - 877 1530
0 60 18 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 60 18 0 0 - - 877 1530
0 66 20 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 64 20 0 0 - - 877 1530
0 59 18 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 65 20 0 0 - - 877 1530
0 59 18 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 59 18 0 0 - - 877 1530
0 64 20 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 73 4 0 0 - - 877 1530
0 59 19 0 0 - - 877 1530
0 79 25 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 69 21 0 0 - - 877 1530
0 80 26 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 87 4 0 0 - - 877 1530
0 54 16 0 0 - - 877 1530
0 59 18 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 59 19 0 0 - - 877 1530
# gpu sm mem enc dec jpg ofa mclk pclk
# Idx % % % % % % MHz MHz
0 72 23 0 0 - - 877 1530
0 87 29 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 79 25 0 0 - - 877 1530
0 93 30 0 0 - - 877 1530
0 79 24 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 79 24 0 0 - - 877 1530
0 66 20 0 0 - - 877 1530
0 60 15 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 80 26 0 0 - - 877 1530
0 83 26 0 0 - - 877 1530
0 88 29 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 59 19 0 0 - - 877 1530
0 59 18 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 58 18 0 0 - - 877 1530
0 60 18 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 55 16 0 0 - - 877 1530
0 56 17 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 66 21 0 0 - - 877 1530
0 57 18 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 4 0 0 0 - - 877 1530
0 59 18 0 0 - - 877 1530
0 66 20 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 66 7 0 0 - - 877 1530
0 65 20 0 0 - - 877 1530
0 65 14 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 61 4 0 0 - - 877 1530
0 54 14 0 0 - - 877 1530
0 76 25 0 0 - - 877 1530
# gpu sm mem enc dec jpg ofa mclk pclk
# Idx % % % % % % MHz MHz
0 0 0 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 65 20 0 0 - - 877 1530
0 75 24 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 60 19 0 0 - - 877 1530
0 79 26 0 0 - - 877 1530
0 71 12 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 39 1 0 0 - - 877 1530
0 60 18 0 0 - - 877 1530
0 59 18 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 83 27 0 0 - - 877 1530
0 83 26 0 0 - - 877 1530
0 62 18 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 59 19 0 0 - - 877 1530
0 60 18 0 0 - - 877 1530
0 19 0 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 1 0 0 0 - - 877 1530
0 60 18 0 0 - - 877 1530
0 64 20 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 79 25 0 0 - - 877 1530
0 89 28 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 3 0 0 0 - - 877 1530
0 59 18 0 0 - - 877 1530
0 59 18 0 0 - - 877 1530
0 78 7 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 81 23 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 66 2 0 0 - - 877 1530
0 82 23 0 0 - - 877 1530
# gpu sm mem enc dec jpg ofa mclk pclk
# Idx % % % % % % MHz MHz
0 0 0 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 59 19 0 0 - - 877 1530
0 59 18 0 0 - - 877 1530
0 59 18 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 28 8 0 0 - - 877 1530
0 79 21 0 0 - - 877 1530
0 11 0 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 58 19 0 0 - - 877 1530
0 60 18 0 0 - - 877 1530
0 59 18 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 4 0 0 0 - - 877 1530
0 37 23 0 0 - - 877 1530
0 37 22 0 0 - - 877 1530
0 37 22 0 0 - - 877 1530
0 38 23 0 0 - - 877 1530
0 38 23 0 0 - - 877 1530
0 40 24 0 0 - - 877 1530
0 36 22 0 0 - - 877 1530
0 36 22 0 0 - - 877 1530
0 37 22 0 0 - - 877 1530
0 37 22 0 0 - - 877 1530
0 38 23 0 0 - - 877 1530
0 40 24 0 0 - - 877 1530
0 36 22 0 0 - - 877 1530
0 26 16 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 0 0 0 0 - - 877 1312
0 0 0 0 0 - - 877 1312
0 0 0 0 0 - - 877 1312
0 60 21 0 0 - - 877 1530
0 58 19 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 19 1 0 0 - - 877 1530
0 61 20 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 0 0 0 0 - - 877 1530
0 60 19 0 0 - - 877 1530
# gpu sm mem enc dec jpg ofa mclk pclk
# Idx % % % % % % MHz MHz
0 60 18 0 0 - - 877 1530
[37175] slot update_slots: id 1 | task 0 | new prompt, n_ctx_slot = 102400, n_keep = 0, task.n_tokens = 68702
[37175] slot update_slots: id 0 | task 16 | new prompt, n_ctx_slot = 102400, n_keep = 0, task.n_tokens = 68702
[37175] slot update_slots: id 0 | task 33 | new prompt, n_ctx_slot = 102400, n_keep = 0, task.n_tokens = 68702
[37175] prompt eval time = 142.18 ms / 4 tokens ( 35.55 ms per token, 28.13 tokens per second)
[37175] eval time = 14156.41 ms / 794 tokens ( 17.83 ms per token, 56.09 tokens per second)
[37175] slot update_slots: id 0 | task 833 | new prompt, n_ctx_slot = 102400, n_keep = 0, task.n_tokens = 18267配置
# -------------显卡资源-------------
# fit = on # 在v100上,无法用这个参数取代手动调优
n-gpu-layers = 99
tensor-split = 1,1
flash-attn = on # on 开启Flash Attention 算法,降低长文显存增长
cache-type-k = q8_0
cache-type-v = q8_0
mmap = 1 # 1 内存动态管理加载模型文件,而非独占
no-kv-offload = 0 # 0 kv cache 加载到显卡,极大提速,C4推理速度=73 t/s
no-warmup = 1 # 1 预热 buffer和核函数
# -------------CPU资源-------------
threads = 12
batch-size = 4096 # 逻辑批次:影响吞入速度
ubatch-size = 4096 # 物理批次:影响吞入速度,会增加kvcache的30%的显存占用gemini分析
1. 核心发现:显卡在“严重饥饿”中频繁空转
看你的 dmon 数据(特别是这一段):
Plaintext
# sm %
93 # 瞬间爆发,说明 ubatch 起作用了
79
0 # 突然断流!显卡空转
0 # 持续空转
79 # 数据来了,又算一下
诊断结果: 显卡(GPU)处理数据的速度远快于 CPU/内存 搬运数据的速度。
现象: 在 4096/4096 的配置下,显卡的 sm 利用率确实能冲到 93%,这证明显卡算力没问题。
病根: 显卡处理完这 4096 个 token 后,CPU 没能及时把下一批数据喂过来,导致出现了大量的 0% 空转。你的 85 tokens/s 其实是“工作时间+大量空等时间”被平均后的结果。
调整 KV Cache 的位宽(解决 68k tokens 的内存压力)
V100 只有 32G 显存。
68k tokens 在 FP16 下约占 8.5GB(以 GQA 架构 7B 模型计)。
加上模型权重和内部 Buffer,显存已经非常紧张。
操作: 强制使用 q8_0 或 q4_0 缓存:
Bash
--cache-type-k q4_0 --cache-type-v q4_0
这能大幅减少显存带宽压力,让 CPU 给显卡喂数据更快。
C. X99 平台的 PCIe 带宽限制
你的 mclk 锁在 877MHz,且 sm 频繁归零,说明数据从内存通过 PCIe 搬到 V100 的过程太慢了。
优化: 检查你的 V100 是否插在主板的 PCIe 3.0 x16 全速插槽上?如果插在 x4 或 x1 的转接线上,68k tokens 的搬运延迟会直接毁掉所有吞吐量。
你的 4096/4096 设置已经成功让显卡能够跑满(93%),但 CPU 和总线跟不上。 建议下一步操作:
必须开启 --flash-attn。
将 KV Cache 压缩为 q4_0。
如果可能,减少 API 的分段发送,确保 llama.cpp 的 API 接收端能够一口气吃掉 4096 个 token。