Feature Request: Two-tier GPU+RAM expert cache for MoE offload (pluggable eviction policy)

“Feature Request: Two-tier GPU+RAM expert cache for MoE offload (pluggable eviction policy)” 不是运行报错,而是针对 `--cpu-moe` 场景下每个 token 重复从 RAM 向 GPU 拷贝热点专家的

快速结论:“Feature Request: Two-tier GPU+RAM expert cache for MoE offload (pluggable eviction policy)” 不是运行报错,而是针对 `–cpu-moe` 场景下每个 token 重复从 RAM 向 GPU 拷贝热点专家的功能建议。当前 llama.cpp 没有内置专家缓存;优先确认 `–cpu-moe` / `–n-cpu-moe` 的 offload 行为,并关注后续是否合入 imatrix 或运行时缓存方案。

适用环境:Issue 提到的硬件为 8 GB 显存的 RTX PRO 2000(GPT-OSS-120B,128 experts/层,36 层,约 57 GB 专家权重)和 AMD RX 9070 XT 16 GB(Vulkan,Gemma 4 26B-A4B,128 experts,8 selected,30 层);工具为 llama.cpp,`–cpu-moe` / `–n-cpu-moe` 及环境变量 `LLAMA_ARG_CPU_MOE` / `LLAMA_ARG_N_CPU_MOE` 已在讨论中出现。Issue 未给出确认可用的 Python、CUDA、PyTorch 或具体 commit 版本。

最快修复方案:暂无确认的一步修复方案。该 Issue 是功能请求而非缺陷修复;如需绕过,可优先尝试升级到包含相关实现的版本并重新测试专家 offload,或在支持的时候用 imatrix 辅助判断热点专家(尚未验证能直接减少拷贝)。

注意事项:讨论中的两级缓存、SLRU 驱逐策略、imatrix 热度排序和 Vulkan 原型都未在 Issue 中确认合入主线,不能当作现成开关使用;强制 `GGML_OP_OFFLOAD_MIN_BATCH=1` 或修改后端缓冲属于实验性做法,可能带来显存占用上升或调度行为变化。

问题场景

用户在显存小于 MoE 专家权重总量的机器上运行 llama.cpp,使用 `–cpu-moe` 或 `–n-cpu-moe` 把专家张量放在 CPU RAM,仅让 dense/attention 层留在 GPU。GPT-OSS-120B 这类 top-k 路由 MoE 在 decode 阶段会反复命中少数热点专家,但现有调度器每次 forward 都通过 ggml_backend_sched_compute_splits() 把选中的专家从 RAM 复制到 GPU,pass 结束后丢弃 GPU 副本,导致 PCIe 传输重复发生、生成速度被拖慢。该 Issue 提议增加持久化 GPU 专家槽位缓存,并允许可插拔驱逐策略。

报错原文

Feature Request: Two-tier GPU+RAM expert cache for MoE offload (pluggable eviction policy)

The bottleneck: every decode step copies the same ~4 hot experts per layer from RAM to GPU, uses them, and discards the GPU copy.
The GPU-side expert data is thrown away between passes even though the same experts will be needed again immediately.

原因分析

可能原因不是代码崩溃,而是 MoE offload 的数据路径设计限制:GPU 侧专家缓冲 input_cpy 按完整专家张量布局分配,选中专家按原始 byte offset 写入,每次计算后不保留。于是热点专家即使被连续使用,也要重复从 CPU RAM 拷贝到 GPU。讨论中提出的两种改进方向是:在 GPU 上维护固定地址槽位并按 LRU/SLRU 缓存;或使用 imatrix 中的专家激活频率,把热点专家预先放到 GPU,其余留给现有调度器动态拷贝。两种方案都需要修改后端/调度器,而非用户侧配置能直接解决。

环境排查

  • 确认 llama.cpp 的构建版本和提交,判断是否已包含相关 MoE 缓存实现;Issue 未给出可验证的 release 名称。
  • 确认启动参数中是否使用 --cpu-moe、--n-cpu-moe,或环境变量 LLAMA_ARG_CPU_MOE / LLAMA_ARG_N_CPU_MOE。
  • 记录模型结构:专家数量、每层 top-k、层数、专家权重总大小,以及实际 offload 到 CPU 的层数。
  • 确认后端类型(CUDA、Vulkan 或其他)及驱动版本;Issue 中 Vulkan 原型仅针对 AMD RX 9070 XT 做过讨论,未给出通用兼容性结论。
  • 如果参考 imatrix 方案,确认所用 GGUF 仓库是否附有 imatrix 文件,以及文件是否包含 .counts / .in_sum2 张量。
  • Issue 中没有确认的 Python、CUDA、PyTorch 版本要求,不要据此补写版本号。

解决步骤

  1. 先复现基线:使用当前 `–cpu-moe` 配置运行同一模型和 prompt,记录 decode 阶段的 tok/s 以及每次 token 的 RAM→GPU 拷贝量,确认瓶颈确实在专家重复搬运。
  2. 检查 llama.cpp 是否已合入该功能请求对应的实现;如果只是看到 Issue 标题,不要把“two-tier expert cache”当作已有命令行选项。
  3. 若目标版本已支持 imatrix 驱动的专家放置,可优先尝试按 imatrix 热点信息决定哪些专家常驻 GPU;这一步在 Issue 中只是提议,需以实际合入文档为准。
  4. 若使用第三方或自行编译的实验补丁,保留原始启动参数和日志,分别测试冷启动、预热和稳定阶段的 tok/s,避免把缓存预热效果误判为稳定提升。
  5. 在 Vulkan 等后端上做实验时,注意 Issue 讨论提到图分配器会复用缓冲区地址,缓存不能简单放在 input_cpy 内;需要独立缓冲区并处理 cache hit/miss 路径。
  6. 如果实验失败,回退到标准 `–cpu-moe` 配置,并提交包含模型结构、后端、驱动、启动参数和性能日志的复现信息。

验证方法

在同一硬件、同一模型、同一 prompt 和相同生成长度下对比启用前后的 decode tok/s,并确认稳定阶段不再出现每 token 重复的热点专家 RAM→GPU 拷贝。还应观察显存占用是否因缓存槽位增加而上升,以及冷启动阶段是否变慢。若只是看到 Issue 被关闭,不代表功能已可用;应以实际构建中的命令行帮助、日志或合入提交为准。

参考来源

ggml-org/llama.cpp #20757

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 29668

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注