@agenticgirl: Nokia Applied Research 开源了 WiSP,这是一个 vLLM 插件,用于在完全专家池不适合时运行 MoE 模型……
摘要
Nokia Applied Research 已开源 WiSP,这是一个 vLLM 插件,用于在显存不足的 GPU 上运行 MoE 模型,通过智能地对专家进行分页并利用 KV 缓存重新分配内存,实现了高达 2.0 倍的解码吞吐量提升。
查看缓存全文
缓存时间: 2026/09/26 13:02
诺基亚应用研究部门开源了WiSP,这是一个vLLM插件,用于在专家池总量超出显存容量的情况下运行MoE模型。WiSP不会卸载整个MoE层,而是将专家视为GPU的活动工作集:将关键的路由专家保留在显存中,其余部分从主机内存按需调页,并让常规模型路由器决定所需内容。它通过MV-WSA更进一步,将专家权重与KV缓存视为同一显存预算的两个消耗者,并根据每字节的预期延迟收益动态重新分配内存。该实现不改变模型数学运算或精度,并保证输出字节级一致。arXiv论文显示,在24 GiB的RTX 3090上,在相同显存预算下,其解码吞吐量比静态卸载最高提升2.0倍。其在线专家/KV尺寸控制器相比固定分配方案最高可将端到端时间缩短1.19倍。作者还发现专家预测性预取对单流解码并无助益,因为瓶颈在于PCIe带宽而非专家预测。GitHub仓库:https://github.com/nokia-applied-research/WiSP
nokia-applied-research/WiSP
来源:https://github.com/nokia-applied-research/WiSP
WiSP — 适用于显存受限MoE服务的路由感知专家分页
WiSP像vLLM对KV分页那样对专家进行分页——然后在固定的显存预算内,决定为每部分分配多少字节。
MV-WSA 35秒演示——在固定显存预算(等效显存)下,控制器发现
KV池大多处于空闲状态,因此回收这些字节用于保留专家
(容量从32增至35,KV从2.79 GiB降至1.53 GiB),以1.19倍的速度服务同一追踪任务
(db;os为1.07倍),零中断且输出字节级一致。基于
真实24 GiB RTX 3090测量(vLLM 0.11.2)。动画循环播放;交互式
演示见demo/animate/。这是论文中报告的MV-WSA 在线双重尺寸控制器。其代码将随会议版本发布(见路线图);此v1版本
包含专家分页器+以下等效显存静态复现与字节一致性验证。
WiSP是vLLM的即插即用插件(https://github.com/vllm-project/vllm),允许在显存无法容纳全部专家权重的GPU上运行混合专家(MoE)模型。保留的专家被视作缓存,其余专家按需从固定主机内存调页,与KV缓存共享统一显存预算进行换入换出。在24 GiB的RTX 3090上,该插件可服务原本无法运行的Qwen3-30B-A3B(BF16约57 GiB),在相同显存预算下解码吞吐量比原生vLLM的静态--cpu-offload-gb最高提升2.0倍。
在温度0的未量化融合MoE路径上,解码输出与原生vLLM字节级一致:每token组合是按路由顺序对每个token的路由专家集合进行加权求和,因此与专家占用的物理缓存槽无关。WiSP仅改变权重的存储位置,不改变数学运算。可通过 scripts/check_byte_identity.py 自行验证(见下文)。
测试基于 vLLM 0.11.2。关于模型支持能力的描述均针对该版本。
本次发布内容(及非内容)
这是WiSP论文的随附成果。包含论文关键指标所依赖的部分:
- 路由感知专家分页器作为纯净的vLLM插件——基于“将保留专家视为缓存“的已知思想构建,实现即插即用且字节级精确;
- 在真实消费级显卡上的等效显存复现;
- 字节一致性验证。
不包含从零开始的研究模拟器、离线上限预言机或在线双重尺寸控制器——这些是支撑分析图表的工具,超出本v1版本范围。
安装
# 1) 安装与CUDA匹配的torch,然后安装vLLM 0.11.2
pip install torch --index-url https://download.pytorch.org/whl/cu121
pip install vllm==0.11.2
# 2) 安装WiSP(注册vLLM插件入口点)
pip install -e .
或使用固定镜像:docker build -t wisp . && docker run --gpus all -it wisp
安装后插件自动注册至vLLM。设置 WISP_PLUGIN_DISABLE=1 可使其失效(便于同一安装环境下的A/B基准测试)。
快速开始
服务模式(兼容OpenAI)
export WISP_MODE=paged
WISP_CAP_EXPERTS=8
vllm serve Qwen/Qwen3-30B-A3B --enforce-eager \
--gpu-memory-utilization 0.45 --max-model-len 4096
在24 GiB显卡上,若无插件会显存溢出;启用后模型加载约需10 GiB,并通过HTTP提供服务。
离线模式(Python)
from wisp.integrations.vllm import install_wisp_moe
install_wisp_moe() # 必须在vLLM导入模型前调用
from vllm import LLM, SamplingParams
llm = LLM("Qwen/Qwen3-30B-A3B", enforce_eager=True, gpu_memory_utilization=0.45)
print(llm.generate(["Hello, world."], SamplingParams(temperature=0))[0].outputs[0].text)
复现论文结论
reproduce.sh 可在任何显存≥16 GiB且主机内存≈80 GiB的CUDA GPU上运行两个核心结果(主专家权重常驻DRAM):
bash reproduce.sh # 字节一致性 + 等效显存帕累托扫描
STEP=identity bash reproduce.sh # 仅字节一致性
STEP=isovram bash reproduce.sh # 仅等效显存扫描
直接验证字节一致性:
# 原生参考方案从CPU流式加载权重以适应显存(相同数学运算)
python scripts/check_byte_identity.py --mode vanilla --out vanilla.json --cpu-offload-gb 48 --gpu-memory-utilization 0.90
python scripts/check_byte_identity.py --mode wisp --cap-experts 8 --out wisp.json --gpu-memory-utilization 0.45
python scripts/check_byte_identity.py --compare vanilla.json wisp.json
# -> 字节级一致
配置参数
| 环境变量 | 默认值 | 说明 |
|---|---|---|
WISP_MODE | paged | paged=LRU分页(省内存);resident=全常驻(不分页);copy=朴素全量复制(仅验证正确性)。兼容旧称day2b/day2a/day1。 |
WISP_CAP_EXPERTS | min(num_experts, 24) | paged模式下每层保留的专家槽位数(缓存容量)。 |
WISP_PLUGIN_DISABLE | 0 | 设为1时插件失效。 |
文件结构
src/wisp/integrations/vllm/ vLLM插件(install_wisp_moe)
src/wisp/oracle/cooccur.py 基于层条件的路由共现分析
scripts/ 复现与基准测试脚本
reproduce.sh 一键复现脚本
适用范围与限制
- 字节一致性仅保证按路由顺序组合的未量化融合MoE路径。量化/DeepGEMM/原子归约内核不在保证范围内。
- WiSP针对单流/低并发场景下的受限显卡解码。高批量且有重叠机会时权衡方式不同。
- 单流解码受限于PCIe带宽而非预测精度;预测性预取是显存调节手段而非延迟优化手段(详见论文)。
- 首次加载会将全部专家权重(约模型体积)锁定至主机内存,因此主机需提供相应锁定内存,且初始加载可能较慢——尤其在通过网络文件系统时(曾观察到57 GiB模型需15分钟以上)。本地NVMe加载更快,且操作系统页缓存会加速后续加载。此为一次性开销,非程序卡死。
路线图
本v1版本包含插件与两项核心复现。下一步计划:
- 将字节一致性保证与测试扩展至量化/FP8融合MoE路径。
- 在等效显存帕累托曲线上与其他专家卸载服务系统进行直接对比。
- 在线MV-WSA双重尺寸控制器(专家↔KV)集成至多进程服务循环——即演示中展示的控制器(论文报告优于最佳固定分配1.07–1.19倍)。
- 扩展模型与硬件覆盖(更多MoE架构、额外消费级/边缘GPU)。
欢迎贡献代码与提交问题报告。
许可证
Apache-2.0
引用
@misc{zhang2026wisp,
title = {WiSP: 极低资源硬件上混合专家服务的工作集视角},
author = {Jiamu Zhang and Liang Wu and Mayank Darbari and Liangjie Hong},
year = {2026},
eprint = {2606.21868},
archivePrefix = {arXiv},
primaryClass = {cs.LG},
doi = {10.48550/arXiv.2606.21868},
url = {https://arxiv.org/abs/2606.21868}
}
相似文章
在老款GTX 1080(8GB显存,128k上下文)上,约30B的MoE模型达到24+ tok/s的推理速度
一位开发者展示了如何使用llama.cpp,通过MoE卸载和TurboQuant KV缓存量化技术,在老款GTX 1080(8GB显存)上以128k上下文运行Qwen 3.6 35B-A3B和Gemma 4 26B-A4B等MoE模型,达到24+ tok/s的推理速度,并揭示了针对Gemma MTP投机解码的优化技巧。
llama.cpp 专家池分支:针对 Qwen 3.8 Flash next IQ4 + 16Gb 显存在 MI50 gfx906 上带参数测试
llama.cpp 的一个非官方分支为混合专家模型引入了持久化的专家池,优化以减少在 16GB AMD gfx906 GPU 上通过 PCIe 的专家重新拷贝,从而提升大上下文长度的解码吞吐量。
@googledevs: 扩展前沿的混合专家(MoE)模型需要的不仅仅是试错调优。探索Qwen 3.5-397B是如何…
Google Cloud 详细介绍了他们如何在 Ironwood TPU 上使用模块化、模型无关的工程手册优化 Qwen 3.5-397B MoE,实现了 3.1 倍的解码性能和 4.7 倍的预填充性能提升。
SpecPrefetch:面向稀疏MoE基础模型的参数高效专家预取
SpecPrefetch提出了一种面向稀疏MoE模型的参数高效专家预取框架,使用轻量级适配器预测下一层专家以进行异步传输,同时保留原生路由语义。在Snapdragon 8 Elite设备上,它实现了高达20%的解码吞吐量提升,展示了在内存受限部署中的实用优势。
@analogalok:我的8GB显存游戏本肯定会恨我这么做,但我还是做了。跑了一个31B稠密模型(Gemma 4…
用户在8GB显存的游戏本上,使用llama.cpp配合MTP推测解码,以约3 tokens/s的速度运行了Gemma 4 31B稠密模型,展示了在消费级硬件上运行31B稠密模型的可行性,并提出了智能体工作流程:快速MoE模型将困难任务路由给这个较慢的稠密模型。