Kimi-K3#

1 引言#

Kimi K3 是一个原生多模态混合专家(MoE)模型。其语言主干结合了 Kimi Delta 注意力(KDA)与周期性门控多头潜在注意力(MLA),并使用 Stable LatentMoE 进行专家计算。该模型还集成了 MoonViT 视觉编码器,支持文本、图像理解、推理和工具调用。

本文档将展示该模型的主要验证步骤,包括支持的特性、特性配置、环境准备、在 Atlas 800 A3 和 Atlas 800 A2 上的多节点部署、功能验证以及精度和性能评估。

本文档基于 vLLM-Ascend 0.23.0 进行验证和编写。当前模型(Kimi-K3)在此版本中首次获得支持。

2 支持的特性#

请参考支持的特性获取该模型支持的特性矩阵。

请参考特性指南获取特性的配置。

3 前提条件#

3.1 模型权重#

从 ModelScope 下载 Eco-Tech/Kimi-K3-w4a8 ModelSlim W4A8 量化权重。本指南包含以下已验证的部署配置:

平台

部署方式

拓扑

4 × Atlas 800 A3 (64G × 16)

混合 Prefill/Decode 部署

DP4/TP16/EP64

16 × Atlas 800 A3 (64G × 16)

八个 Prefill 节点和八个 Decode 节点

每侧 DP8/TP16

8 × Atlas 800 A2 (64G × 8)

混合 Prefill/Decode 部署

DP8/TP8/EP64

检查点目录必须包含已发布的 Kimi K3 包所需的模型配置、分词器、图像处理器和模型权重文件。

建议将模型权重下载到多节点的共享目录,例如 /root/.cache/。

3.2 验证多节点通信(可选)#

如果要部署多节点环境,需要按照验证多节点通信环境中的说明验证多节点通信。

4 安装#

4.1 Docker 镜像安装#

4.1.1 Atlas 800 A3#

Kimi K3 在 Atlas 800 A3 (64G × 16) 上验证通过。选择与主机操作系统匹配的镜像,并在每个节点上启动,请参考使用 Docker。

主机操作系统

镜像

Ubuntu

quay.io/ascend/vllm-ascend:kimi-k3-a3

openEuler

quay.io/ascend/vllm-ascend:kimi-k3-a3-openeuler

在每个节点上运行以下命令:

# Ubuntu:
export IMAGE=quay.io/ascend/vllm-ascend:kimi-k3-a3
# openEuler:
# export IMAGE=quay.io/ascend/vllm-ascend:kimi-k3-a3-openeuler
docker run --rm \
    --name vllm-ascend \
    --shm-size=1g \
    --net=host \
    --privileged=true \
    --device /dev/davinci0 \
    --device /dev/davinci1 \
    --device /dev/davinci2 \
    --device /dev/davinci3 \
    --device /dev/davinci4 \
    --device /dev/davinci5 \
    --device /dev/davinci6 \
    --device /dev/davinci7 \
    --device /dev/davinci8 \
    --device /dev/davinci9 \
    --device /dev/davinci10 \
    --device /dev/davinci11 \
    --device /dev/davinci12 \
    --device /dev/davinci13 \
    --device /dev/davinci14 \
    --device /dev/davinci15 \
    --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 /root/.cache:/root/.cache \
    -it $IMAGE bash

Docker 运行成功后,可以通过执行 docker ps 命令验证正在运行的容器服务。

4.1.2 Atlas 800 A2#

Kimi K3 在 Atlas 800 A2 (64G × 8) 上验证通过。选择与主机操作系统匹配的镜像,并在每个节点上启动,请参考使用 Docker。

主机操作系统

镜像

Ubuntu

quay.io/ascend/vllm-ascend:kimi-k3

openEuler

quay.io/ascend/vllm-ascend:kimi-k3-openeuler

在每个节点上运行以下命令:

# Ubuntu:
export IMAGE=quay.io/ascend/vllm-ascend:kimi-k3
# openEuler:
# export IMAGE=quay.io/ascend/vllm-ascend:kimi-k3-openeuler
docker run --rm \
    --name vllm-ascend \
    --shm-size=1g \
    --net=host \
    --privileged=true \
    --device /dev/davinci0 \
    --device /dev/davinci1 \
    --device /dev/davinci2 \
    --device /dev/davinci3 \
    --device /dev/davinci4 \
    --device /dev/davinci5 \
    --device /dev/davinci6 \
    --device /dev/davinci7 \
    --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 /root/.cache:/root/.cache \
    -it $IMAGE bash

Docker 运行成功后,可以通过执行 docker ps 命令验证正在运行的容器服务。

4.2 源码安装#

如果不想使用上述 Docker 镜像,也可以从源码构建所有组件:

  • 从源码安装 vllm-ascend,请参考安装。

如果要部署多节点环境,需要在每个节点上设置环境。

Kimi K3 的配置、多模态处理、推理解析和工具解析由 vLLM-Ascend 注册。请使用与本文档验证版本匹配的 vLLM 和 vLLM-Ascend 源码修订版本。

5 在线服务部署#

5.1 Atlas 800 A3 部署#

5.1.1 四节点混合部署#

已验证的混合部署使用四个 Atlas 800 A3 (64G × 16) 节点。vLLM 数据并行跨越四个节点,每个节点运行一个 DP rank,张量并行使用节点内的全部 16 个 NPU。最终拓扑为 DP4/TP16/EP64。

启动服务前:

  • 将模型路径、本地 IP 地址、网络接口、服务端口和 DP RPC 端口替换为目标环境的值。

  • NIC_NAME 必须是拥有 LOCAL_IP 的接口。

  • 先启动节点 0。节点 1 到 3 上配置的 NODE0_IP 必须等于节点 0 上的 LOCAL_IP。

  • 分别为节点 1、2、3 分配 --data-parallel-start-rank 值 1、2 和 3。

# Values that must be adapted to the target environment.
export MODEL_PATH=<KIMI_K3_MODEL_PATH>
export LOCAL_IP=<NODE0_LOCAL_IP>
export NIC_NAME=<NODE0_NIC_NAME>
export PORT=<SERVICE_PORT>
export RPC_PORT=<DP_RPC_PORT>

export HCCL_IF_IP=$LOCAL_IP
export GLOO_SOCKET_IFNAME=$NIC_NAME
export TP_SOCKET_IFNAME=$NIC_NAME
export HCCL_SOCKET_IFNAME=$NIC_NAME
export VLLM_ENGINE_READY_TIMEOUT_S=7200
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
export OMP_PROC_BIND=false
export OMP_NUM_THREADS=1
export TASK_QUEUE_ENABLE=1
export HCCL_BUFFSIZE=800
export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15

vllm serve $MODEL_PATH \
    --served-model-name kimi-k3 \
    --port $PORT \
    --allowed-local-media-path / \
    --trust-remote-code \
    --tensor-parallel-size 16 \
    --data-parallel-size 4 \
    --data-parallel-size-local 1 \
    --data-parallel-address $LOCAL_IP \
    --data-parallel-rpc-port $RPC_PORT \
    --enable-prefix-caching \
    --enable-expert-parallel \
    --max-num-seqs 16 \
    --max-model-len 131072 \
    --max-num-batched-tokens 24576 \
    --gpu-memory-utilization 0.9 \
    --compilation-config '{"cudagraph_mode":"FULL_DECODE_ONLY"}' \
    --mm-processor-cache-gb 0 \
    --additional-config '{"enable_cpu_binding":true, "enable_flashcomm1":true}' \
    --mm-encoder-tp-mode data \
    --limit-mm-per-prompt '{"vision_chunk": 2}' \
    --enable-auto-tool-choice \
    --reasoning-parser kimi_k3 \
    --tool-call-parser kimi_k3

在每个工作节点上运行此命令。将 LOCAL_IP 和 NIC_NAME 设置为当前节点,并将 DP_START_RANK 设置为 1、2 或 3。

# Values that must be adapted to the target environment.
export MODEL_PATH=<KIMI_K3_MODEL_PATH>
export LOCAL_IP=<WORKER_LOCAL_IP>
export NODE0_IP=<NODE0_LOCAL_IP>
export NIC_NAME=<WORKER_NIC_NAME>
export PORT=<SERVICE_PORT>
export RPC_PORT=<DP_RPC_PORT>
export DP_START_RANK=<1_OR_2_OR_3>

export HCCL_IF_IP=$LOCAL_IP
export GLOO_SOCKET_IFNAME=$NIC_NAME
export TP_SOCKET_IFNAME=$NIC_NAME
export HCCL_SOCKET_IFNAME=$NIC_NAME
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
export OMP_PROC_BIND=false
export OMP_NUM_THREADS=1
export TASK_QUEUE_ENABLE=1
export HCCL_BUFFSIZE=800
export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15

vllm serve $MODEL_PATH \
    --headless \
    --served-model-name kimi-k3 \
    --port $PORT \
    --allowed-local-media-path / \
    --trust-remote-code \
    --tensor-parallel-size 16 \
    --data-parallel-size 4 \
    --data-parallel-size-local 1 \
    --data-parallel-start-rank $DP_START_RANK \
    --data-parallel-address $NODE0_IP \
    --data-parallel-rpc-port $RPC_PORT \
    --enable-prefix-caching \
    --enable-expert-parallel \
    --max-num-seqs 16 \
    --max-model-len 131072 \
    --max-num-batched-tokens 24576 \
    --gpu-memory-utilization 0.9 \
    --compilation-config '{"cudagraph_mode":"FULL_DECODE_ONLY"}' \
    --mm-processor-cache-gb 0 \
    --additional-config '{"enable_cpu_binding":true, "enable_flashcomm1":true}' \
    --mm-encoder-tp-mode data \
    --limit-mm-per-prompt '{"vision_chunk": 2}' \
    --enable-auto-tool-choice \
    --reasoning-parser kimi_k3 \
    --tool-call-parser kimi_k3

主节点和工作节点之间的以下值不同:

设置

节点 0

节点 1-3

描述

LOCAL_IP

节点0 IP

当前工作节点IP

每个节点使用自身的IP地址。

NODE0_IP

非必需

节点0 IP

工作节点使用此地址加入DP组。

VLLM_ENGINE_READY_TIMEOUT_S

7200

未设置

仅主节点等待所有引擎就绪。

--headless

省略

启用

工作节点不暴露API端点。

--data-parallel-address

$LOCAL_IP

$NODE0_IP

始终解析为节点0。

--data-parallel-start-rank

默认为0

1、2或3

每个节点必须拥有唯一的DP rank。

关键部署参数:

参数

描述

--tensor-parallel-size 16

使用一个A3节点中的所有16个NPU进行张量并行。

--data-parallel-size 4

在四个节点间创建四个全局DP rank。

--data-parallel-size-local 1

在当前节点上运行一个DP rank。

--data-parallel-start-rank

为工作节点选择全局起始DP rank。

--data-parallel-rpc-port

必须在每个节点上相同且可达。

--enable-expert-parallel

为MoE层启用专家并行。

--max-model-len 131072

设置输入和输出的最大总长度。

--max-num-seqs 16

设置每个DP组的最大活跃序列数。

--max-num-batched-tokens 24576

控制调度器的token预算。

--enable-prefix-caching

启用自动前缀缓存。

--compilation-config

使用FULL_DECODE_ONLY ACL图回放。

--additional-config

启用昇腾CPU绑定和FlashComm1。

HCCL_IF_IP和套接字接口变量

将HCCL、Gloo和TP通信绑定到所选接口。

备注

提供1M-token上下文至少需要八个Atlas 800 A3(64G × 16)节点。请在每个节点上更改以下参数:

Parameter

Four-node default

Eight-node (1M context)

--data-parallel-size

4

8

--max-model-len

131072

1048576

--max-num-batched-tokens

24576

8192

在节点1至7上运行worker命令,并为每个节点分配从1到7的唯一--data-parallel-start-rank。

如果工作节点立即退出,请确认节点0已在运行,--data-parallel-address解析到节点0,且每个工作节点使用唯一的--data-parallel-start-rank。

通过节点0验证服务:

curl http://<NODE0_LOCAL_IP>:<SERVICE_PORT>/v1/chat/completions \
    -H "Content-Type: application/json" \
    -d '{
        "model": "kimi-k3",
        "messages": [{
            "role": "user",
            "content": [{
                "type": "text",
                "text": "The future of AI is"
            }]
        }],
        "max_tokens": 1024,
        "temperature": 1.0,
        "top_p": 0.95
    }'

服务应返回HTTP 200和包含生成文本的choices字段。

5.1.2 十六节点PD分离部署#

经验证的 PD 分离拓扑使用 16 个 Atlas 800 A3(64G × 16)节点:八个 Prefill 节点和八个 Decode 节点。两侧均使用 DP8/TP16。

通用服务流程请参考 PD Disaggregation with Mooncake。

5.1.2.2 创建引擎模板#
KV_PORT=36000

unset ftp_proxy FTP_PROXY
unset https_proxy HTTPS_PROXY
unset http_proxy HTTP_PROXY

export VLLM_RPC_TIMEOUT=3600000
export VLLM_EXECUTE_MODEL_TIMEOUT_SECONDS=30000
export HCCL_EXEC_TIMEOUT=204
export HCCL_CONNECT_TIMEOUT=120

nic_name=<PREFILL_NIC_NAME>
local_ip=<PREFILL_LOCAL_IP>

export HCCL_IF_IP=${local_ip}
export GLOO_SOCKET_IFNAME=${nic_name}
export TP_SOCKET_IFNAME=${nic_name}
export HCCL_SOCKET_IFNAME=${nic_name}
export OMP_PROC_BIND=false
export OMP_NUM_THREADS=10
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
export VLLM_ASCEND_ENABLE_MLAPO=1
export HCCL_BUFFSIZE=1024
export TASK_QUEUE_ENABLE=1
export VLLM_USE_V1=1
export ASCEND_RT_VISIBLE_DEVICES=$1
export LD_LIBRARY_PATH=/usr/local/Ascend/ascend-toolkit/latest/python/site-packages/mooncake:$LD_LIBRARY_PATH

export PYTHONHASHSEED=0
export ACL_OP_INIT_MODE=1

vllm serve <KIMI_K3_MODEL_PATH> \
    --host 0.0.0.0 \
    --port $2 \
    --data-parallel-size $3 \
    --data-parallel-rank $4 \
    --data-parallel-address $5 \
    --data-parallel-rpc-port $6 \
    --tensor-parallel-size $7 \
    --enable-expert-parallel \
    --seed 1024 \
    --served-model-name kimi-k3 \
    --max-model-len 133120 \
    --max-num-batched-tokens 8192 \
    --max-num-seqs 16 \
    --enforce-eager \
    --trust-remote-code \
    --gpu-memory-utilization 0.9 \
    --mm-encoder-tp-mode data \
    --skip-mm-profiling \
    --safetensors_load_strategy prefetch \
    --mamba-cache-mode align \
    --enable-prefix-caching \
    --additional-config '{"recompute_scheduler_enable":false}' \
    --limit-mm-per-prompt '{"vision_chunk": 2}' \
    --kv-transfer-config \
    '{
      "kv_connector": "MooncakeConnectorV1",
      "kv_role": "kv_producer",
      "kv_port": "'"$KV_PORT"'",
      "kv_connector_extra_config": {
        "prefill": {
            "dp_size": 8,
            "tp_size": '"$7"'
        },
        "decode": {
            "dp_size": 8,
            "tp_size": '"$7"'
        }
      }
    }'
KV_PORT=36200

unset ftp_proxy FTP_PROXY
unset https_proxy HTTPS_PROXY
unset http_proxy HTTP_PROXY

export VLLM_RPC_TIMEOUT=3600000
export VLLM_EXECUTE_MODEL_TIMEOUT_SECONDS=30000
export HCCL_EXEC_TIMEOUT=204
export HCCL_CONNECT_TIMEOUT=120

nic_name=<DECODE_NIC_NAME>
local_ip=<DECODE_LOCAL_IP>

export HCCL_IF_IP=${local_ip}
export GLOO_SOCKET_IFNAME=${nic_name}
export TP_SOCKET_IFNAME=${nic_name}
export HCCL_SOCKET_IFNAME=${nic_name}
export OMP_PROC_BIND=false
export OMP_NUM_THREADS=10
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
export VLLM_ASCEND_ENABLE_MLAPO=1
export HCCL_BUFFSIZE=1024
export TASK_QUEUE_ENABLE=1
export HCCL_OP_EXPANSION_MODE="AIV"
export VLLM_USE_V1=1
export ASCEND_RT_VISIBLE_DEVICES=$1
export LD_LIBRARY_PATH=/usr/local/Ascend/ascend-toolkit/latest/python/site-packages/mooncake:$LD_LIBRARY_PATH

vllm serve <KIMI_K3_MODEL_PATH> \
    --host 0.0.0.0 \
    --port $2 \
    --data-parallel-size $3 \
    --data-parallel-rank $4 \
    --data-parallel-address $5 \
    --data-parallel-rpc-port $6 \
    --tensor-parallel-size $7 \
    --enable-expert-parallel \
    --seed 1024 \
    --served-model-name kimi-k3 \
    --max-model-len 133120 \
    --max-num-batched-tokens 8192 \
    --max-num-seqs 16 \
    --trust-remote-code \
    --gpu-memory-utilization 0.9 \
    --mm-encoder-tp-mode data \
    --skip-mm-profiling \
    --compilation-config '{"cudagraph_mode": "FULL_DECODE_ONLY"}' \
    --safetensors_load_strategy prefetch \
    --mamba-cache-mode align \
    --enable-prefix-caching \
    --additional-config '{"recompute_scheduler_enable":false}' \
    --limit-mm-per-prompt '{"vision_chunk":2}' \
    --kv-transfer-config \
    '{
      "kv_connector": "MooncakeConnectorV1",
      "kv_role": "kv_consumer",
      "kv_port": "'"$KV_PORT"'",
      "kv_connector_extra_config": {
        "prefill": {
            "dp_size": 8,
            "tp_size": '"$7"'
        },
        "decode": {
            "dp_size": 8,
            "tp_size": '"$7"'
        }
      }
    }'
5.1.2.3 启动引擎#

在每个节点上部署 launch_online_dp.py 及相应的引擎模板。以下示例在 DP8/TP16 组中启动一个本地 DP rank:

python launch_online_dp.py \
    --dp-size 8 \
    --tp-size 16 \
    --dp-size-local 1 \
    --dp-rank-start <LOCAL_DP_RANK> \
    --dp-address <PD_MASTER_IP> \
    --dp-rpc-port <DP_RPC_PORT> \
    --vllm-start-port <VLLM_START_PORT>

每个八节点侧使用rank 0到7。为Prefill和Decode组配置独立的主地址、RPC端口和vLLM端口范围。

引擎启动后,按照使用Mooncake进行PD分离中的描述配置并启动负载均衡代理。

关键PD设置:

设置

值

描述

拓扑

8P8D

八个Prefill节点和八个Decode节点。

--dp-size

8

每侧八个DP rank。

--tp-size

16

使用节点中的所有16个NPU。

--dp-size-local

1

每个节点一个DP rank。

KV_PORT

P为36000,D为36200

分离生产者和消费者的KV流量。

recompute_scheduler_enable

false

匹配经验证的Prefill和Decode配置。

5.2 Atlas 800 A2部署#

5.2.1 八节点混合部署#

已验证的Atlas 800 A2部署使用八个节点,每个节点配备八个NPU。每个节点运行一个DP rank,并使用所有八个本地NPU进行张量并行。每个DP rank同时处理Prefill和Decode,形成DP8/TP8/EP64拓扑。节点0运行API服务器和DP rank 0,节点1至7运行无头DP工作节点。此基线仅服务于语言模型。

启动服务前:

  • 将模型路径、本地 IP 地址、网络接口、服务端口和 DP RPC 端口替换为目标环境的值。

  • NIC_NAME 必须是拥有 LOCAL_IP 的接口。

  • 首先启动节点0。节点1至7上配置的NODE0_IP必须等于节点0上的LOCAL_IP。

  • 为每个工作节点分配一个从1到7的唯一DP_START_RANK。

  • 确保代理绕过设置包含八个节点使用的所有API和通信IP地址。

# Values that must be adapted to the target environment.
export MODEL_PATH=<KIMI_K3_MODEL_PATH>
export LOCAL_IP=<NODE0_LOCAL_IP>
export NIC_NAME=<NODE0_NIC_NAME>
export PORT=<SERVICE_PORT>
export RPC_PORT=<DP_RPC_PORT>

source /usr/local/Ascend/ascend-toolkit/set_env.sh
source /vllm-workspace/vllm-ascend/vllm_ascend/_cann_ops_custom/vendors/custom_transformer/bin/set_env.bash

export PYTHONPATH=/vllm-workspace/vllm-ascend:${PYTHONPATH:-}
export VLLM_HOST_IP=$LOCAL_IP
export HCCL_IF_IP=$LOCAL_IP
export GLOO_SOCKET_IFNAME=$NIC_NAME
export TP_SOCKET_IFNAME=$NIC_NAME
export HCCL_SOCKET_IFNAME=$NIC_NAME
export HCCL_CONNECT_TIMEOUT=1800
export HCCL_EXEC_TIMEOUT=1800
export HCCL_BUFFSIZE=256
export HCCL_INTRA_ROCE_ENABLE=1
export VLLM_EXECUTE_MODEL_TIMEOUT_SECONDS=30000
export OMP_PROC_BIND=false
export OMP_NUM_THREADS=10
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
export VLLM_LOGGING_LEVEL=INFO
export TASK_QUEUE_ENABLE=1
export TIKTOKEN_CACHE_DIR=/root/.cache/tiktoken-k3
export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7

vllm serve $MODEL_PATH \
    --host 0.0.0.0 \
    --port $PORT \
    --served-model-name kimi-k3 \
    --trust-remote-code \
    --language-model-only \
    --mm-encoder-tp-mode data \
    --skip-mm-profiling \
    --limit-mm-per-prompt '{"vision_chunk":2}' \
    --data-parallel-size 8 \
    --data-parallel-size-local 1 \
    --data-parallel-start-rank 0 \
    --data-parallel-address $LOCAL_IP \
    --data-parallel-rpc-port $RPC_PORT \
    --tensor-parallel-size 8 \
    --enable-expert-parallel \
    --dtype bfloat16 \
    --max-model-len 262144 \
    --gpu-memory-utilization 0.90 \
    --enable-prefix-caching \
    --compilation-config '{"cudagraph_mode":"FULL_DECODE_ONLY","cudagraph_capture_sizes":[1,2,4,8]}' \
    --tokenizer-mode kimi_k3 \
    --enable-auto-tool-choice \
    --reasoning-parser kimi_k3 \
    --tool-call-parser kimi_k3 \
    --additional-config '{"enable_flashcomm1":false,"ascend_compilation_config":{"enable_npugraph_ex":true,"enable_static_kernel":false},"enable_cpu_binding":true}'

在每个工作节点上运行此命令。将LOCAL_IP和NIC_NAME设置为当前节点,并将DP_START_RANK设置为从1到7的唯一值。

# Values that must be adapted to the target environment.
export MODEL_PATH=<KIMI_K3_MODEL_PATH>
export LOCAL_IP=<WORKER_LOCAL_IP>
export NODE0_IP=<NODE0_LOCAL_IP>
export NIC_NAME=<WORKER_NIC_NAME>
export PORT=<SERVICE_PORT>
export RPC_PORT=<DP_RPC_PORT>
export DP_START_RANK=<1_TO_7>

source /usr/local/Ascend/ascend-toolkit/set_env.sh
source /vllm-workspace/vllm-ascend/vllm_ascend/_cann_ops_custom/vendors/custom_transformer/bin/set_env.bash

export PYTHONPATH=/vllm-workspace/vllm-ascend:${PYTHONPATH:-}
export VLLM_HOST_IP=$LOCAL_IP
export HCCL_IF_IP=$LOCAL_IP
export GLOO_SOCKET_IFNAME=$NIC_NAME
export TP_SOCKET_IFNAME=$NIC_NAME
export HCCL_SOCKET_IFNAME=$NIC_NAME
export HCCL_CONNECT_TIMEOUT=1800
export HCCL_EXEC_TIMEOUT=1800
export HCCL_BUFFSIZE=256
export HCCL_INTRA_ROCE_ENABLE=1
export VLLM_EXECUTE_MODEL_TIMEOUT_SECONDS=30000
export OMP_PROC_BIND=false
export OMP_NUM_THREADS=10
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
export VLLM_LOGGING_LEVEL=INFO
export TASK_QUEUE_ENABLE=1
export TIKTOKEN_CACHE_DIR=/root/.cache/tiktoken-k3
export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7

vllm serve $MODEL_PATH \
    --headless \
    --host 0.0.0.0 \
    --port $PORT \
    --served-model-name kimi-k3 \
    --trust-remote-code \
    --language-model-only \
    --mm-encoder-tp-mode data \
    --skip-mm-profiling \
    --limit-mm-per-prompt '{"vision_chunk":2}' \
    --data-parallel-size 8 \
    --data-parallel-size-local 1 \
    --data-parallel-start-rank $DP_START_RANK \
    --data-parallel-address $NODE0_IP \
    --data-parallel-rpc-port $RPC_PORT \
    --tensor-parallel-size 8 \
    --enable-expert-parallel \
    --dtype bfloat16 \
    --max-model-len 262144 \
    --gpu-memory-utilization 0.90 \
    --enable-prefix-caching \
    --compilation-config '{"cudagraph_mode":"FULL_DECODE_ONLY","cudagraph_capture_sizes":[1,2,4,8]}' \
    --tokenizer-mode kimi_k3 \
    --enable-auto-tool-choice \
    --reasoning-parser kimi_k3 \
    --tool-call-parser kimi_k3 \
    --additional-config '{"enable_flashcomm1":false,"ascend_compilation_config":{"enable_npugraph_ex":true,"enable_static_kernel":false},"enable_cpu_binding":true}'

主节点和工作节点之间的以下值不同:

设置

节点 0

节点1-7

描述

LOCAL_IP

节点0 IP

当前工作节点IP

每个节点使用自己的通信IP地址。

NODE0_IP

非必需

节点0 IP

工作节点使用此地址加入DP组。

--headless

省略

启用

工作节点不暴露API端点。

--data-parallel-address

$LOCAL_IP

$NODE0_IP

始终解析为节点0。

--data-parallel-start-rank

0

从1到7的唯一值

每个节点拥有一个全局DP rank。

关键A2部署参数:

参数

描述

--tensor-parallel-size 8

使用一个A2节点中的所有八个NPU进行张量并行。

--data-parallel-size 8

在八个节点上创建八个全局DP rank。

--data-parallel-size-local 1

在当前节点上运行一个DP rank。

--language-model-only

为此已验证的A2基线禁用多模态编码器。

--max-model-len 262144

设置256K的输入和输出组合上下文限制。

--compilation-config

使用FULL_DECODE_ONLY图回放,捕获大小为1、2、4和8。

--additional-config

启用NPU图执行和CPU绑定,同时保持FlashComm1禁用。

不要为此基线设置HCCL_OP_EXPANSION_MODE=AIV。首先启动节点0,然后尽快启动节点1至7。如果工作节点立即退出,请验证节点0正在运行、所有节点使用相同的RPC端口、--data-parallel-address解析到节点0,并且每个工作节点具有唯一的DP起始rank。

6 功能验证#

6.1 Atlas 800 A3#

A3混合或PD服务就绪后,向API端点发送多模态请求:

curl http://<SERVICE_IP>:<SERVICE_PORT>/v1/chat/completions \
    -H "Content-Type: application/json" \
    -d '{
        "model": "kimi-k3",
        "messages": [{
            "role": "user",
            "content": [
                {
                    "type": "image_url",
                    "image_url": {"url": "<IMAGE_URL_OR_DATA_URL>"}
                },
                {
                    "type": "text",
                    "text": "Describe the image."
                }
            ]
        }],
        "max_tokens": 1024,
        "temperature": 1.0,
        "top_p": 0.95
    }'

服务应返回HTTP 200和包含图像描述的choices字段。当前实现支持图像输入,但不支持视频输入。

6.2 Atlas 800 A2#

已验证的A2部署使用--language-model-only。所有八个DP rank就绪后,向节点0 API端点发送文本请求:

curl http://<NODE0_LOCAL_IP>:<SERVICE_PORT>/v1/chat/completions \
    -H "Content-Type: application/json" \
    -d '{
        "model": "kimi-k3",
        "messages": [{
            "role": "user",
            "content": "Explain data parallelism in one sentence."
        }],
        "max_tokens": 64
    }'

服务应返回HTTP 200和包含生成文本的choices字段。节点1至7是无头工作节点,不直接接受HTTP请求。

X-data-parallel-rank是一个可选的HTTP请求头,用于将请求固定到特定的DP rank。没有此头时,节点0上的内部vLLM负载均衡器会选择一个可用rank。对于此DP8部署,仅在验证单个rank、排查工作节点问题或测试rank本地前缀缓存行为时使用从0到7的整数:

-H "X-data-parallel-rank: 0" \

生产流量通常应省略此头,以便请求在所有DP rank之间保持均衡。即使选择了工作节点rank,请求也始终发送到节点0 API端点。

7 精度评估#

以下是 Kimi K3 的一种精度评估方法。

使用 AISBench#

  1. 环境搭建和评估流程请参考 Using AISBench。

  2. 对 Kimi K3 服务运行 AISBench 并收集生成的结果文件。比较结果时,请保持模型和 tokenizer 版本、chat template、采样设置、数据集和评估器版本固定不变。

8 性能评估#

使用 AISBench#

环境搭建和评估流程请参考 Using AISBench for performance evaluation。

使用 vLLM Benchmark#

使用 vllm bench serve 测量 Kimi K3 服务的在线服务性能。以下是一个针对八个 128k 输入、1k 输出请求的最小示例。请根据目标环境替换服务地址、模型路径、数据集路径和结果目录。

更多详情请参考 vllm benchmark。

export DATA_NUM=8
export CONCURRENCY=8

vllm bench serve \
  --base-url http://<SERVICE_HOST>:<SERVICE_PORT> \
  --endpoint /v1/completions \
  --model kimi-k3 \
  --tokenizer <KIMI_K3_MODEL_PATH> \
  --tokenizer-mode kimi_k3 \
  --trust-remote-code \
  --dataset-name custom \
  --dataset-path <DATASET_PATH> \
  --custom-output-len 1024 \
  --skip-chat-template \
  --num-prompts ${DATA_NUM} \
  --request-rate inf \
  --max-concurrency ${CONCURRENCY} \
  --ignore-eos \
  --temperature 0 \
  --seed 0 \
  --disable-shuffle \
  --save-result \
  --result-dir <RESULT_DIR>

9 性能调优#

以上述已验证的部署值为基准。针对目标工作负载,联合调整 max-model-len、max-num-seqs、max-num-batched-tokens 和 gpu-memory-utilization。

更多指导请参考性能调优指南和特性矩阵。

10 常见问题#

关于常见环境、安装和通用参数问题,请参考公共 FAQ。

  • 问:当前 Kimi K3 实现支持哪些多模态输入?

    答:当前本地处理器接受图像输入。不支持视频输入。

  • 问:Kimi K3 推理和工具调用需要哪些服务器选项?

    答:同时配置 --enable-auto-tool-choice、--reasoning-parser kimi_k3 和 --tool-call-parser kimi_k3。

  • 问:如何选择 TP 大小?

    答:TP 大小必须能整除检查点的注意力头数。它还会影响 KDA 状态布局和专家放置,因此需同时验证内存容量和通信性能。