PD-Colocated with Mooncake Multi-Instance#

开始使用#

vLLM-Ascend 现在支持带有 Mooncake 功能的 PD 共置部署。本指南提供了逐步说明,以使用有限资源测试这些功能。

以 Qwen2.5-72B-Instruct 模型为例,本指南演示了如何在两个 Atlas 800T A2 节点上使用 vllm-ascend v0.11.0(配合 vLLM v0.11.0)部署两个 vLLM 实例。每个实例占用 4 个 NPU 卡,并使用 PD 共置部署。

验证多节点通信环境#

物理层要求#

  • 两个 Atlas 800T A2 节点必须通过 RoCE 网络物理互连。如果没有 RoCE 互连,跨节点 KV 缓存访问性能将显著下降。

  • 所有 NPU 卡必须正常通信。节点内通信使用 HCCS,而节点间通信使用 RoCE 网络。

验证流程#

以下流程作为参考示例。请根据您的实际环境修改 IP 地址等参数。

  1. 单节点验证:

    按顺序执行以下命令。结果必须全部为 success 且状态必须为 UP

    # Check the remote switch ports
    for i in {0..7}; do hccn_tool -i $i -lldp -g | grep Ifname; done
    # Get the link status of the Ethernet ports (UP or DOWN)
    for i in {0..7}; do hccn_tool -i $i -link -g ; done
    # Check the network health status
    for i in {0..7}; do hccn_tool -i $i -net_health -g ; done
    # View the network detected IP configuration
    for i in {0..7}; do hccn_tool -i $i -netdetect -g ; done
    # View gateway configuration
    for i in {0..7}; do hccn_tool -i $i -gateway -g ; done
    
  2. 检查 NPU HCCN 配置:

    确保环境中存在 hccn.conf 文件。如果使用 Docker,请将其挂载到容器中。

    cat /etc/hccn.conf
    
  3. 获取 NPU IP 地址:

    for i in {0..7}; do hccn_tool -i $i -ip -g; done
    
  4. 跨节点 PING 测试:

    # Execute the following command on each node, replacing x.x.x.x
    # with the target node's NPU card address.
    for i in {0..7}; do hccn_tool -i $i -ping -g address x.x.x.x; done
    
  5. 检查 NPU TLS 配置

    # The tls settings should be consistent across all nodes
    for i in {0..7}; do hccn_tool -i $i -tls -g ; done | grep switch
    

使用 Docker 运行#

在每个节点上启动一个 Docker 容器。

# Update the vllm-ascend image
export IMAGE=quay.io/ascend/vllm-ascend:v0.11.0
export NAME=vllm-ascend

# Run the container using the defined variables
# This test uses four NPU cards to create the container.
# Mount the hccn.conf file from the host node into the container.
docker run --rm \
--name $NAME \
--net=host \
--shm-size=1g \
--device /dev/davinci0 \
--device /dev/davinci1 \
--device /dev/davinci2 \
--device /dev/davinci3 \
--device /dev/davinci_manager \
--device /dev/devmm_svm \
--device /dev/hisi_hdc \
-v /usr/local/dcmi:/usr/local/dcmi \
-v /usr/local/Ascend/driver/tools/hccn_tool:\
/usr/local/Ascend/driver/tools/hccn_tool \
-v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
-v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ \
-v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \
-v /etc/ascend_install.info:/etc/ascend_install.info \
-v /etc/hccn.conf:/etc/hccn.conf \
-v /root/.cache:/root/.cache \
-it $IMAGE bash

(可选)安装 Mooncake#

Mooncake 在 v0.11.0 镜像中已预安装且功能正常。以下安装步骤是可选的。

Mooncake 是 Kimi(由 Moonshot AI 提供的领先 LLM 服务)的服务平台。安装和编译指南:kvcache-ai/Mooncake

首先,使用以下命令获取 Mooncake 项目:

git clone -b v0.3.7.post2 --depth 1 https://github.com/kvcache-ai/Mooncake.git
cd Mooncake
git submodule update --init --recursive

安装 MPI:

apt-get install mpich libmpich-dev -y

安装相关依赖项(不需要安装 Go):

bash dependencies.sh -y

编译和安装:

mkdir build
cd build
cmake .. -DUSE_ASCEND_DIRECT=ON
make -j
make install

安装后,验证 Mooncake 是否正确安装:

python -c "import mooncake; print(mooncake.__file__)"
# Expected output path:
# /usr/local/Ascend/ascend-toolkit/latest/python/
# site-packages/mooncake/__init__.py

启动 Mooncake 主服务#

要在其中一个节点容器中启动 Mooncake 主服务,请使用以下命令:

docker exec -it vllm-ascend bash
cd /vllm-workspace/Mooncake
mooncake_master --port 50088 \
  --eviction_high_watermark_ratio 0.95 \
  --eviction_ratio 0.05

参数

说明

端口

50088

主服务端口

驱逐高水位比率

0.95

高水位比率(95% 阈值)

驱逐比率

0.05

满时驱逐百分比(5%)

创建名为 mooncake.json 的 Mooncake 配置文件#

mooncake.json 文件的模板如下:

{
    "metadata_server": "P2PHANDSHAKE",
    "protocol": "ascend",
    "device_name": "",
    "use_ascend_direct": true,
    "master_server_address": "<your_server_ip>:50088",
    "global_segment_size": 107374182400
}

参数

说明

元数据服务器

P2PHANDSHAKE

点对点握手模式

协议

ascend

Ascend 专有协议

使用 ascend 直连

true

启用直接硬件访问

主服务器地址

90.90.100.188:50088(例如)

主服务器地址

全局段大小

107374182400

每段大小(100 GB)

vLLM 实例部署#

在节点 1 和节点 2 上创建容器,并在每个容器中启动 Qwen2.5-72B-Instruct 模型服务,以测试跨节点、跨实例 KV 缓存的可重用性和性能。实例 1 使用第一个 Atlas 800T A2 服务器上的 NPU 卡 [0-3],而实例 2 使用第二个服务器上的卡 [0-3]。

部署实例 1#

根据您的实际环境配置替换文件路径、主机和端口参数。

export LD_LIBRARY_PATH=/usr/local/Ascend/ascend-toolkit/\
latest/python/site-packages:$LD_LIBRARY_PATH
export MOONCAKE_CONFIG_PATH="/vllm-workspace/mooncake.json"
# NPU buffer pool: quantity:size(MB)
# Allocates 4 buffers of 8MB each for KV transfer
export ASCEND_BUFFER_POOL=4:8

vllm serve <path_to_your_model>/Qwen2.5-72B-Instruct/ \
--served-model-name qwen \
--dtype bfloat16 \
--max-model-len 25600 \
--tensor-parallel-size 4 \
--host <your_server_ip> \
--port 8002 \
--max-num-batched-tokens 4096 \
--gpu-memory-utilization 0.9 \
--kv-transfer-config '{
      "kv_connector": "MooncakeConnectorStoreV1",
      "kv_role": "kv_both",
      "kv_connector_extra_config": {
          "use_layerwise": false,
          "mooncake_rpc_port": "0",
          "load_async": true,
          "register_buffer": true
      }
  }'

部署实例 2#

实例 2 的部署方法与实例 1 相同。只需根据您的实例 2 配置修改 --host--port 参数。

配置参数#

参数

说明

kv_connector

MooncakeConnectorStoreV1

使用 StoreV1 版本

kv_role

kv_both

启用生产和消费

use_layerwise

false

传输整个缓存(见注释)

mooncake_rpc_port

0

自动端口分配

load_async

true

启用异步加载

register_buffer

true

PD 共置模式必需

关于 use_layerwise 的说明:

  • false:传输整个 KV 缓存(适用于具有足够带宽的跨节点)

  • true:逐层传输(适用于单节点内存限制)

基准测试#

我们推荐使用 aisbench 工具评估性能。测试使用 数据集 A,包含完全随机的数据,配置如下:

  • 输入/输出令牌:1024/10

  • 总请求数:100

  • 并发数:25

测试过程包括三个步骤:

步骤 1:基线(无缓存)#

将数据集 A 发送到节点 1 的实例 1,并记录首令牌时间(TTFT)为 TTFT1

步骤 2 的准备#

在步骤 2 之前,将完全随机的数据集 B 发送到实例 1。由于统一 HBM/DRAM KV 缓存采用 LRU(最近最少使用)驱逐策略,数据集 B 的缓存会将数据集 A 的缓存从 HBM 中驱逐,使数据集 A 的缓存仅保留在节点 1 的 DRAM 中。

步骤 2:本地 DRAM 命中#

再次将数据集 A 发送到实例 1,以测量命中本地 DRAM 中 KV 缓存的性能。记录 TTFT 为 TTFT2

步骤 3:跨节点 DRAM 命中#

将数据集 A 发送到实例 2。借助 Mooncake KV 缓存池,这将实现从节点 1 DRAM 的跨节点 KV 缓存命中。记录 TTFT 为 TTFT3

模型配置

from ais_bench.benchmark.models import VLLMCustomAPIChatStream
from ais_bench.benchmark.utils.model_postprocessors import extract_non_reasoning_content

models = [
    dict(
        attr="service",
        type=VLLMCustomAPIChatStream,
        abbr='vllm-api-stream-chat',
        path="<path_to_your_model>/Qwen2.5-72B-Instruct",
        model="qwen",
        request_rate = 0,
        retry = 2,
        host_ip = "<your_server_ip>",
        host_port = 8002,
        max_out_len = 10,
        batch_size= 25,
        trust_remote_code=False,
        generation_kwargs = dict(
            temperature = 0,
            ignore_eos = True,
        ),
    )
]

性能基准测试命令

ais_bench --models vllm_api_stream_chat \
  --datasets gsm8k_gen_0_shot_cot_str_perf \
  --debug --summarizer default_perf --mode perf

测试结果#

请求

并发

TTFT1 (ms)

TTFT2 (ms)

TTFT3 (ms)

100

25

2322

739

948