
Feature Request: Two-tier GPU+RAM expert cache for MoE offload (pluggable eviction policy)
快速结论:该功能请求针对 MoE(混合专家)模型在 GPU 显存不足时的性能瓶颈。当显存不足以容纳所有专家权重(如 8GB 显存运行 57GB 专家权重的模型)时,每步解码都会将相同的热点专家权重从 CPU 复制到 GPU,造成大量 PCIe 传输。提出的解决方案是通过两级缓存(GPU 显存槽位 + CPU 固定内存)并配合可插拔的驱逐策略来减少数据拷贝。目前 Issue 仍为功能提议状态,尚无可直接使用的代码。
问题场景
该功能请求针对 llama.cpp 工具链。用户在运行 GPT-OSS-120B(128 专家/层,36 层,约 57GB 专家权重)等大规模 MoE 模型时,如果 GPU 显存不足(如 8GB VRAM),需使用 --cpu-moe 将 MoE 专家权重放在 CPU RAM 中。现有的 llama.cpp 虽然已经支持 CPU offload(--cpu-moe 和 --n-cpu-moe 参数),并且 ggml_backend_sched_compute_splits() 能按需拷贝专家子行到 GPU,但 GPU 侧的专家数据在每次前向传播后会被丢弃,导致热点专家反复 PCIe 拷贝。
报错原文
This is a Feature Request, not a bug report. No error message is involved.
Problem statement from the issue:
"The bottleneck: every decode step copies the same ~4 hot experts per layer from RAM to GPU, uses them, and discards the GPU copy. For a 36-layer model with top-4 routing that's 144 RAM→GPU copies per token — most of them identical to the previous token."
原因分析
可能原因:当前 ggml_backend_sched_compute_splits() 中,GPU 侧的专家分配(input_cpy)镜像了完整的 CPU 张量形状——即使只使用 top_k 个专家,也分配了 n_expert 个槽位。每步前向传播中,选中的专家被写入其原始偏移位置,然后在该传播结束时丢弃。由于 MoE 路由存在偏斜(约 15–20% 的专家处理约 80% 的 token),热点专家无法在 GPU 上持久保留,导致大量不必要的 PCIe 数据传输。
环境排查
- 硬件环境:确认 GPU 显存大小(如 RTX PRO 2000 8GB 等低显存显卡)。
- 模型配置:确认模型是否为 MoE 架构(如 GPT-OSS-120B 等拥有大量专家权重的模型)。
- llama.cpp 版本:确认是否使用最新代码(Prerequisites 要求 “running the latest code”)。
- 命令行参数:确认是否使用了
--cpu-moe或--n-cpu-moe进行专家 offload。
解决步骤
- 理解已有机制:当前
llama.cpp已支持通过--cpu-moe将 MoE 专家权重放在 CPU RAM,以及ggml_backend_sched_compute_splits()的按需拷贝(ggml-backend.cpp:1445–1564)。这是实现两级缓存的接口点。 - 实现设计方案(需自行开发):该 Issue 提出的两级缓存架构包含:
- 第一层(Tier 1):GPU VRAM 持久槽位缓冲,使用 SLRU 驱逐策略(可插拔)。
- 第二层(Tier 2):CPU RAM(固定内存),作为所有本地专家的后备存储。
- 第三层(Tier 3):SSD 或 mmap 文件,由操作系统按需分页。
- 热专家预分配(可优先尝试,方案来自评论区建议):作为 SLRU 全缓存的简化替代,可在模型加载时解析 imatrix 文件(GGUF 格式)中的
.counts张量,获取每个专家的激活频率。按使用频率排序后将前 K(如 80%)的热点专家固定放置在 GPU 上,冷专家放在 CPU 上。然后让现有调度器处理其余情况:热点专家已在 GPU 上无需传输,冷专家被使用时才从 CPU 复制到 GPU(根据ggml-backend.cpp第 1480-1564 行,调度器已支持此动态拷贝)。 - 配置建议:对于多 GPU 场景,可设置
--tensor-split按频率分配专家权重到不同 GPU。
验证方法
该功能尚未实现,验证方法如下:
- 性能对比:使用
llama-bench或llama-cli对比启用电专家缓存前后的解码速度(tok/s)。 - 监控 PCIe 流量(可优先尝试):使用 NVIDIA 的
nvidia-smi dmon观察 PCIe 传输速率是否下降。 - 缓存命中率:PoC 实现的预期稳态缓存命中率约为 98–100%,可通过日志或自定义回调监控。



