English | 中文文档
本文档介绍如何将 MooncakeStore 作为 FastDeploy 的 KV Cache 存储后端,实现多推理实例间的全局缓存池化。
全局缓存池化允许多个 FastDeploy 实例通过分布式存储层共享 KV Cache,具有以下优势:
- 跨实例缓存复用:一个实例计算的 KV Cache 可被其他实例复用
- PD 分离架构优化:Prefill 和 Decode 实例可无缝共享缓存
- 减少重复计算:避免跨请求的重复前缀计算
┌─────────────────────────────────────────────────────────────────┐
│ Mooncake Master 服务 │
│ (元数据与协调服务) │
└────────────────────────────┬────────────────────────────────────┘
│
┌───────────────────┼───────────────────┐
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ FastDeploy │ │ FastDeploy │ │ FastDeploy │
│ Instance P │ │ Instance D │ │ Instance X │
│ (Prefill) │ │ (Decode) │ │ (Standalone) │
└────────┬────────┘ └────────┬────────┘ └────────┬────────┘
│ │ │
└───────────────────┼───────────────────┘
│
┌────────▼────────┐
│ MooncakeStore │
│ (共享 KV │
│ Cache 池) │
└─────────────────┘
开箱即用的示例脚本位于 examples/cache_storage/。
| 脚本 | 场景 | 说明 |
|---|---|---|
run.sh |
多实例缓存共享 | 两个独立实例共享缓存 |
run_03b_pd_storage.sh |
PD 分离 | P+D 实例配合全局缓存池 |
- 支持 CUDA 的 NVIDIA GPU
- RDMA 网络(生产环境推荐)或 TCP 网络
- Python 3.8+
- CUDA 11.8+
- FastDeploy(见下方安装说明)
参考 NVIDIA CUDA GPU 安装指南 安装 FastDeploy。
# 方式一:从 PyPI 安装
pip install fastdeploy-gpu
# 方式二:从源码编译
bash build.sh
pip install ./dist/fastdeploy*.whl安装FastDeploy后自动安装了MooncakeStore。
我们支持两种方式配置MooncakeStore,一是通过配置文件mooncake_config.json,二是通过环境变量进行配置。
创建 mooncake_config.json 配置文件:
{
"metadata_server": "http://0.0.0.0:15002/metadata",
"master_server_addr": "0.0.0.0:15001",
"global_segment_size": 1000000000,
"local_buffer_size": 134217728,
"protocol": "rdma",
"rdma_devices": ""
}设置MOONCAKE_CONFIG_PATH环境变量后,配置文件生效:
export MOONCAKE_CONFIG_PATH=path/to/mooncake_config.json配置参数说明:
| 参数 | 说明 | 默认值 |
|---|---|---|
metadata_server |
HTTP 元数据服务地址 | 必填 |
master_server_addr |
Master 服务地址 | 必填 |
global_segment_size |
每个TP进程给全局共享内存共享的内存空间(字节) | 1GB |
local_buffer_size |
数据传输本地缓冲区大小(字节) | 128MB |
protocol |
传输协议:rdma 或 tcp |
rdma |
rdma_devices |
RDMA 设备名称(逗号分隔) | 自动检测 |
Mooncake 也支持通过环境变量进行配置:
| 环境变量 | 说明 |
|---|---|
MOONCAKE_MASTER_SERVER_ADDR |
Master 服务地址(如 10.0.0.1:15001) |
MOONCAKE_METADATA_SERVER |
元数据服务 URL |
MOONCAKE_GLOBAL_SEGMENT_SIZE |
每个TP进程给全局共享内存共享的内存空间(字节) |
MOONCAKE_LOCAL_BUFFER_SIZE |
本地缓冲区大小(字节) |
MOONCAKE_PROTOCOL |
传输协议(rdma 或 tcp) |
MOONCAKE_RDMA_DEVICES |
RDMA 设备名称 |
运行多个 FastDeploy 实例,共享全局 KV Cache 池。
步骤 1:启动 Mooncake Master
mooncake_master \
--port=15001 \
--enable_http_metadata_server=true \
--http_metadata_server_host=0.0.0.0 \
--http_metadata_server_port=15002 \
--metrics_port=15003步骤 2:启动 FastDeploy 实例
实例 0:
export MOONCAKE_CONFIG_PATH="./mooncake_config.json"
export CUDA_VISIBLE_DEVICES=0
python -m fastdeploy.entrypoints.openai.api_server \
--model ${MODEL_NAME} \
--port 52700 \
--max-model-len 32768 \
--max-num-seqs 32 \
--kvcache-storage-backend mooncake实例 1:
export MOONCAKE_CONFIG_PATH="./mooncake_config.json"
export CUDA_VISIBLE_DEVICES=1
python -m fastdeploy.entrypoints.openai.api_server \
--model ${MODEL_NAME} \
--port 52800 \
--max-model-len 32768 \
--max-num-seqs 32 \
--kvcache-storage-backend mooncake步骤 3:测试缓存复用
向两个实例发送相同的 prompt,第二个实例应能复用第一个实例计算的 KV Cache。
# 请求实例 0
curl -X POST "http://0.0.0.0:52700/v1/chat/completions" \
-H "Content-Type: application/json" \
-d '{"messages": [{"role": "user", "content": "Hello, world!"}], "max_tokens": 50}'
# 请求实例 1(应命中缓存)
curl -X POST "http://0.0.0.0:52800/v1/chat/completions" \
-H "Content-Type: application/json" \
-d '{"messages": [{"role": "user", "content": "Hello, world!"}], "max_tokens": 50}'此场景将 PD 分离架构 与 全局缓存池化 结合,实现:
- Prefill 实例可读取 Decode 实例的输出缓存
- 优化多轮对话性能
架构图:
┌──────────────────────────────────────────┐
│ Router │
│ (负载均衡器) │
└─────────────────┬────────────────────────┘
│
┌───────────────┴───────────────┐
│ │
▼ ▼
┌─────────────┐ ┌─────────────┐
│ Prefill │ │ Decode │
│ Instance │◄───────────────►│ Instance │
│ │ KV Transfer │ │
└──────┬──────┘ └──────┬──────┘
│ │
└───────────────┬───────────────┘
│
┌────────▼────────┐
│ MooncakeStore │
│ (全局缓存池) │
└─────────────────┘
步骤 1:启动 Mooncake Master
mooncake_master \
--port=15001 \
--enable_http_metadata_server=true \
--http_metadata_server_host=0.0.0.0 \
--http_metadata_server_port=15002步骤 2:启动 Router
python -m fastdeploy.router.launch \
--port 52700 \
--splitwise步骤 3:启动 Prefill 实例
export MOONCAKE_MASTER_SERVER_ADDR="127.0.0.1:15001"
export MOONCAKE_METADATA_SERVER="http://127.0.0.1:15002/metadata"
export MOONCAKE_PROTOCOL="rdma"
export CUDA_VISIBLE_DEVICES=0
python -m fastdeploy.entrypoints.openai.api_server \
--model ${MODEL_NAME} \
--port 52400 \
--max-model-len 32768 \
--max-num-seqs 32 \
--splitwise-role prefill \
--cache-transfer-protocol rdma \
--router "0.0.0.0:52700" \
--kvcache-storage-backend mooncake步骤 4:启动 Decode 实例
export MOONCAKE_MASTER_SERVER_ADDR="127.0.0.1:15001"
export MOONCAKE_METADATA_SERVER="http://127.0.0.1:15002/metadata"
export MOONCAKE_PROTOCOL="rdma"
export CUDA_VISIBLE_DEVICES=1
python -m fastdeploy.entrypoints.openai.api_server \
--model ${MODEL_NAME} \
--port 52500 \
--max-model-len 32768 \
--max-num-seqs 32 \
--splitwise-role decode \
--cache-transfer-protocol rdma \
--router "0.0.0.0:52700" \
--enable-output-caching \
--kvcache-storage-backend mooncake步骤 5:通过 Router 发送请求
curl -X POST "http://0.0.0.0:52700/v1/chat/completions" \
-H "Content-Type: application/json" \
-d '{"messages": [{"role": "user", "content": "Hello!"}], "max_tokens": 50}'| 参数 | 说明 |
|---|---|
--kvcache-storage-backend mooncake |
启用 Mooncake 作为 KV Cache 存储后端 |
--enable-output-caching |
启用输出 token 缓存(推荐 Decode 实例开启) |
--cache-transfer-protocol rdma |
P 和 D 之间使用 RDMA 进行 KV 传输 |
--splitwise-role prefill/decode |
设置实例在 PD 分离中的角色 |
--router |
PD 分离场景下的 Router 地址 |
通过日志验证缓存命中情况:
# 多实例场景
grep -E "storage_cache_token_num" log_*/api_server.log
# PD 分离场景
grep -E "storage_cache_token_num" log_prefill/api_server.log如果 storage_cache_token_num > 0,表示实例成功从全局池读取了缓存的 KV 块。
# 检查 master 状态
curl http://localhost:15002/metadata
# 检查指标(如配置了 metrics_port)
curl http://localhost:15003/metrics1. 端口被占用
# 检查端口使用情况
ss -ltn | grep 15001
# 终止占用进程
kill -9 $(lsof -t -i:15001)2. RDMA 连接失败
- 检查 RDMA 设备:
ibv_devices - 检查 RDMA 网络:
ibv_devinfo - 降级使用 TCP:设置
MOONCAKE_PROTOCOL=tcp
3. 缓存未共享
- 确认所有实例连接到同一个 Mooncake master
- 检查元数据服务 URL 是否一致
- 确认
global_segment_size足够大
4. /dev/shm 权限不足
# 清理残留的共享内存文件
find /dev/shm -type f -print0 | xargs -0 rm -f开启调试日志:
export FD_DEBUG=1