v2: profile-guided CPU inference optimization
Browse files
README.md
CHANGED
|
@@ -38,10 +38,40 @@
|
|
| 38 |
| 线程 | 生成速度 |
|
| 39 |
|------|---------|
|
| 40 |
| 1 | 3.5 tok/s |
|
| 41 |
-
| 2 | 5.3 tok/s |
|
| 42 |
| 4 | 5.5 tok/s |
|
| 43 |
|
| 44 |
-
运行内存占用 ≈ 1.8 GB RSS。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 45 |
|
| 46 |
## 转换脚本
|
| 47 |
|
|
|
|
| 38 |
| 线程 | 生成速度 |
|
| 39 |
|------|---------|
|
| 40 |
| 1 | 3.5 tok/s |
|
| 41 |
+
| 2 | 5.3 tok/s(v2: 亲和性绑定物理核后 5.5 tok/s,仅占一半 CPU) |
|
| 42 |
| 4 | 5.5 tok/s |
|
| 43 |
|
| 44 |
+
运行内存占用 ≈ 1.8 GB RSS(v2 锁定常驻内存,零缺页)。
|
| 45 |
+
|
| 46 |
+
## v2 优化版(server/minicpm_server_v2.c)
|
| 47 |
+
|
| 48 |
+
基于内置热点分析器(`--profile`)定位瓶颈后的优化版本,同条件 A/B 实测:
|
| 49 |
+
|
| 50 |
+
| 指标 | v1 | v2 | 提升 |
|
| 51 |
+
|------|----|----|------|
|
| 52 |
+
| prefill(16 tok 提示词) | 3.44-3.61 s | 2.71-2.76 s | **+25-30%** |
|
| 53 |
+
| decode(4 线程) | 4.8-4.9 tok/s | 5.3-5.4 tok/s | **+10%** |
|
| 54 |
+
| decode(2 线程+物理核绑定) | 4.7 tok/s | 5.5 tok/s | **+17%**(CPU 占用减半) |
|
| 55 |
+
|
| 56 |
+
v2 主要改动:
|
| 57 |
+
|
| 58 |
+
1. **prefill 隐藏路径**:提示词 token 不再逐个跑 13 万词表的 lm_head + 采样(只有最后一个 token 需要 logits),省去 15-25% 的无效读带宽;同时把真实提示词 token 加入重复惩罚窗口(v1 加入的是 prefill 期间的随机采样 token,属于行为缺陷)。
|
| 59 |
+
2. **融合 OpenMP 并行区**:q/k/v 三矩阵与 gate/up 双矩阵各自共享输入向量与量化类型,合并为单一并行区,每 token 的 OMP 屏障进入次数约减半(每 token ~210 → ~130 次)。
|
| 60 |
+
3. **热点分析结论**(--profile 实测,GB/s 为有效读带宽):
|
| 61 |
+
- `lm_head`(int8 内核):17.7 GB/s —— 接近机器流带宽极限
|
| 62 |
+
- `qkv` / `o_proj` / `gate_up` / `down`(Q4_K 内核):仅 6.4-7.8 GB/s,约 8-10 Gelem/s
|
| 63 |
+
- 结论:瓶颈**不是内存带宽而是 Q4_K 内核在 HT 争用下的访存并行度(MLP/延迟墙)**;因此把 lm_head 换成 Q4_K 反而更慢(元素数不变、计算强度翻倍),实验后弃用。
|
| 64 |
+
- 预取距离实验:pf_dist=2(原值)优于 5,内核已处于该结构的局部最优。
|
| 65 |
+
4. **权重常驻内存**:`PrefetchVirtualMemory` 预取 + `VirtualLock` 锁定 1.59 GB 权重(工作集提升至 3 GB),在内存压力下零缺页、速度恒定。
|
| 66 |
+
5. **电源计划**:Windows「高性能」计划实测比「平衡」快 ~8%(笔记本默认降频是隐形杀手)。
|
| 67 |
+
6. 新增命令行:`--profile`(逐阶段耗时/带宽表)、`--pin-memory 0/1`、`--affinity <hex>`(如 `0x5` 绑定两个物理核)。
|
| 68 |
+
|
| 69 |
+
推荐运行(2 线程绑物理核,速度不变但 CPU 占用减半,笔记本风扇更安静):
|
| 70 |
+
|
| 71 |
+
```
|
| 72 |
+
minicpm_server_v2.exe --weights minicpm_mixed.bin --tokenizer MiniCPM5-2B-cpu ^
|
| 73 |
+
--prompt-file prompt.txt --n 128 --threads 2 --affinity 0x5
|
| 74 |
+
```
|
| 75 |
|
| 76 |
## 转换脚本
|
| 77 |
|