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 |
|
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 |
|
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 |
描述 |
|---|---|---|---|
|
节点0 IP |
当前工作节点IP |
每个节点使用自身的IP地址。 |
|
非必需 |
节点0 IP |
工作节点使用此地址加入DP组。 |
|
|
未设置 |
仅主节点等待所有引擎就绪。 |
|
省略 |
启用 |
工作节点不暴露API端点。 |
|
|
|
始终解析为节点0。 |
|
默认为 |
|
每个节点必须拥有唯一的DP rank。 |
关键部署参数:
参数 |
描述 |
|---|---|
|
使用一个A3节点中的所有16个NPU进行张量并行。 |
|
在四个节点间创建四个全局DP rank。 |
|
在当前节点上运行一个DP rank。 |
|
为工作节点选择全局起始DP rank。 |
|
必须在每个节点上相同且可达。 |
|
为MoE层启用专家并行。 |
|
设置输入和输出的最大总长度。 |
|
设置每个DP组的最大活跃序列数。 |
|
控制调度器的token预算。 |
|
启用自动前缀缓存。 |
|
使用 |
|
启用昇腾CPU绑定和FlashComm1。 |
|
将HCCL、Gloo和TP通信绑定到所选接口。 |
备注
提供1M-token上下文至少需要八个Atlas 800 A3(64G × 16)节点。请在每个节点上更改以下参数:
Parameter |
Four-node default |
Eight-node (1M context) |
|---|---|---|
|
|
|
|
|
|
|
|
|
在节点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 rank。 |
|
|
使用节点中的所有16个NPU。 |
|
|
每个节点一个DP rank。 |
|
P为 |
分离生产者和消费者的KV流量。 |
|
|
匹配经验证的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 |
描述 |
|---|---|---|---|
|
节点0 IP |
当前工作节点IP |
每个节点使用自己的通信IP地址。 |
|
非必需 |
节点0 IP |
工作节点使用此地址加入DP组。 |
|
省略 |
启用 |
工作节点不暴露API端点。 |
|
|
|
始终解析为节点0。 |
|
|
从 |
每个节点拥有一个全局DP rank。 |
关键A2部署参数:
参数 |
描述 |
|---|---|
|
使用一个A2节点中的所有八个NPU进行张量并行。 |
|
在八个节点上创建八个全局DP rank。 |
|
在当前节点上运行一个DP rank。 |
|
为此已验证的A2基线禁用多模态编码器。 |
|
设置256K的输入和输出组合上下文限制。 |
|
使用 |
|
启用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#
环境搭建和评估流程请参考 Using AISBench。
对 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 状态布局和专家放置,因此需同时验证内存容量和通信性能。