[NPU][Docs] Add Kimi-K2.5-W4A8 instance doc on NPU (#25269)
This commit is contained in:
@@ -0,0 +1,314 @@
|
||||
---
|
||||
title: "Kimi K2.5 examples"
|
||||
metatags:
|
||||
description: "Documentation for Kimi K2.5 examples"
|
||||
---
|
||||
## Introduction
|
||||
|
||||
Kimi K2.5 is an open-source, native multimodal agentic model built through continual pretraining on approximately 15 trillion mixed visual and text tokens atop Kimi-K2-Base. It seamlessly integrates vision and language understanding with advanced agentic capabilities, instant and thinking modes, as well as conversational and agentic paradigms.
|
||||
|
||||
## Environment Preparation
|
||||
|
||||
### Model Weight
|
||||
|
||||
- `Kimi-K2.5`: Download Kimi-K2.5 from [modelers](https://modelers.cn/models/moonshotai/Kimi-K2.5), [modelscope](https://www.modelscope.cn/models/Eco-Tech/Kimi-K2.5-w4a8) or [huggingface](https://huggingface.co/moonshotai/Kimi-K2.5).
|
||||
- `Kimi-K2.5-w4a8`: Download Kimi-K2.5-w4a8 from [modelers](https://modelers.cn/models/Eco-Tech/Kimi-K2.5-w4a8), [modelscope](https://www.modelscope.cn/models/Eco-Tech/Kimi-K2.5-w4a8).
|
||||
- You can use [msmodelslim](https://gitcode.com/Ascend/msmodelslim) to quantize `Kimi-K2.5-w4a8` from `Kimi-K2.5`.
|
||||
|
||||
|
||||
### Installation
|
||||
|
||||
The dependencies required for the NPU runtime environment have been integrated into a Docker image and uploaded to the online platform. You can directly pull it.
|
||||
|
||||
```bash Command
|
||||
# Atlas 800 A3
|
||||
docker pull swr.cn-southwest-2.myhuaweicloud.com/base_image/dockerhub/lmsysorg/sglang:cann8.5.0-a3-openEuler-20260427
|
||||
|
||||
# Start container
|
||||
docker run -itd --shm-size=16g --privileged=true --name ${NAME} --net=host \
|
||||
-v /var/queue_schedule:/var/queue_schedule \
|
||||
-v /etc/ascend_install.info:/etc/ascend_install.info \
|
||||
-v /usr/local/sbin:/usr/local/sbin \
|
||||
-v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
|
||||
-v /usr/local/Ascend/firmware:/usr/local/Ascend/firmware \
|
||||
--device=/dev/davinci0:/dev/davinci0 \
|
||||
--device=/dev/davinci1:/dev/davinci1 \
|
||||
--device=/dev/davinci2:/dev/davinci2 \
|
||||
--device=/dev/davinci3:/dev/davinci3 \
|
||||
--device=/dev/davinci4:/dev/davinci4 \
|
||||
--device=/dev/davinci5:/dev/davinci5 \
|
||||
--device=/dev/davinci6:/dev/davinci6 \
|
||||
--device=/dev/davinci7:/dev/davinci7 \
|
||||
--device=/dev/davinci8:/dev/davinci8 \
|
||||
--device=/dev/davinci9:/dev/davinci9 \
|
||||
--device=/dev/davinci10:/dev/davinci10 \
|
||||
--device=/dev/davinci11:/dev/davinci11 \
|
||||
--device=/dev/davinci12:/dev/davinci12 \
|
||||
--device=/dev/davinci13:/dev/davinci13 \
|
||||
--device=/dev/davinci14:/dev/davinci14 \
|
||||
--device=/dev/davinci15:/dev/davinci15 \
|
||||
--device=/dev/davinci_manager:/dev/davinci_manager \
|
||||
--device=/dev/hisi_hdc:/dev/hisi_hdc \
|
||||
--entrypoint=bash \
|
||||
swr.cn-southwest-2.myhuaweicloud.com/base_image/dockerhub/lmsysorg/sglang:cann8.5.0-a3-openEuler-20260427
|
||||
```
|
||||
|
||||
### Best Practices
|
||||
Note: Using this image for **best practices**, switch to the more stable version 4.57.1 of transformers.
|
||||
```
|
||||
# reinstall transformers
|
||||
|
||||
# Install transformers version 4.57.1 from PyPI
|
||||
pip install transformers==4.57.1
|
||||
|
||||
# Install from GitHub v4.57.1 tag from GitHub
|
||||
pip install git+https://github.com/huggingface/transformers.git@v4.57.1
|
||||
```
|
||||
|
||||
## Deployment
|
||||
|
||||
### Single-node Deployment
|
||||
|
||||
- Quantized model `Kimi-K2.5-w4a8` can be deployed on 1 Atlas 800 A3 (64G x 16) .
|
||||
|
||||
Run the following script to execute online inference.
|
||||
|
||||
```shell Launch Server
|
||||
# high performance cpu
|
||||
echo performance | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
|
||||
sysctl -w vm.swappiness=0
|
||||
sysctl -w kernel.numa_balancing=0
|
||||
sysctl -w kernel.sched_migration_cost_ns=50000
|
||||
# bind cpu
|
||||
export SGLANG_SET_CPU_AFFINITY=1
|
||||
|
||||
unset https_proxy
|
||||
unset http_proxy
|
||||
unset HTTPS_PROXY
|
||||
unset HTTP_PROXY
|
||||
unset ASCEND_LAUNCH_BLOCKING
|
||||
# cann
|
||||
source /usr/local/Ascend/ascend-toolkit/set_env.sh
|
||||
source /usr/local/Ascend/nnal/atb/set_env.sh
|
||||
|
||||
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
|
||||
export STREAMS_PER_DEVICE=32
|
||||
export SGLANG_DISAGGREGATION_BOOTSTRAP_TIMEOUT=600
|
||||
export SGLANG_ENABLE_SPEC_V2=1
|
||||
export SGLANG_ENABLE_OVERLAP_PLAN_STREAM=1
|
||||
export DEEP_NORMAL_MODE_USE_INT8_QUANT=1
|
||||
export SGLANG_DEEPEP_NUM_MAX_DISPATCH_TOKENS_PER_RANK=112
|
||||
export HCCL_BUFFSIZE=1500
|
||||
export HCCL_SOCKET_IFNAME=lo
|
||||
export GLOO_SOCKET_IFNAME=lo
|
||||
|
||||
python -m sglang.launch_server \
|
||||
--model-path ${MODEL_PATH} --quantization modelslim --dtype bfloat16 \
|
||||
--model-loader-extra-config '{"enable_multithread_load": true}' \
|
||||
--host 0.0.0.0 --port 8000 \
|
||||
--trust-remote-code --device npu --attention-backend ascend \
|
||||
--tp-size 16 --base-gpu-id 0 --mem-fraction-static 0.77 --max-running-requests 256 \
|
||||
--chunked-prefill-size 32768 --context-length 8192 --max-prefill-tokens 16384 \
|
||||
--enable-multimodal --mm-attention-backend ascend_attn --sampling-backend ascend \
|
||||
--enable-dp-attention --dp-size 16 \
|
||||
--moe-a2a-backend deepep --deepep-mode auto \
|
||||
--cuda-graph-bs 1 2 4 8 9 10 12 16 --disable-radix-cache \
|
||||
--enable-prefill-delayer --prefill-delayer-max-delay-passes 200 \
|
||||
--speculative-algorithm EAGLE3 \
|
||||
--speculative-draft-model-path ${DRAFT_MODEL_PATH} \
|
||||
--speculative-num-steps 4 --speculative-eagle-topk 1 \
|
||||
--speculative-num-draft-tokens 5 \
|
||||
--speculative-draft-model-quantization unquant
|
||||
```
|
||||
|
||||
### Multi-node Deployment
|
||||
|
||||
- Quantized model `Kimi-K2.5-w4a8` also can be deployed on 2 Atlas 800 A3 (64G x 16) .
|
||||
|
||||
**A3 series**
|
||||
|
||||
Modify the IP of 2 nodes, then run the same scripts on two nodes.
|
||||
|
||||
**node 0/1**
|
||||
|
||||
```shell Launch Multi-node Server
|
||||
echo performance | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
|
||||
sysctl -w vm.swappiness=0
|
||||
sysctl -w kernel.numa_balancing=0
|
||||
sysctl -w kernel.sched_migration_cost_ns=50000
|
||||
# bind cpu
|
||||
export SGLANG_SET_CPU_AFFINITY=1
|
||||
|
||||
unset https_proxy
|
||||
unset http_proxy
|
||||
unset HTTPS_PROXY
|
||||
unset HTTP_PROXY
|
||||
unset ASCEND_LAUNCH_BLOCKING
|
||||
# cann
|
||||
source /usr/local/Ascend/ascend-toolkit/set_env.sh
|
||||
source /usr/local/Ascend/nnal/atb/set_env.sh
|
||||
|
||||
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
|
||||
export STREAMS_PER_DEVICE=32
|
||||
export SGLANG_DISAGGREGATION_BOOTSTRAP_TIMEOUT=600
|
||||
export DEEP_NORMAL_MODE_USE_INT8_QUANT=1
|
||||
export SGLANG_DEEPEP_NUM_MAX_DISPATCH_TOKENS_PER_RANK=96
|
||||
export HCCL_BUFFSIZE=2400
|
||||
export SGLANG_ENABLE_SPEC_V2=1
|
||||
export SGLANG_ENABLE_OVERLAP_PLAN_STREAM=1
|
||||
export SGLANG_SCHEDULER_DECREASE_PREFILL_IDLE=1
|
||||
export SGLANG_PREFILL_DELAYER_MAX_DELAY_PASSES=200
|
||||
export SGLANG_NPU_USE_MLAPO=1
|
||||
|
||||
# Run command ifconfig on two nodes, find out which inet addr has same IP with your node IP. That is your public interface, which should be added here
|
||||
export HCCL_SOCKET_IFNAME=xxx
|
||||
export GLOO_SOCKET_IFNAME=xxx
|
||||
|
||||
NODES_IP=('your ip1' 'your ip2')
|
||||
|
||||
LOCAL_IPS=$(hostname -I)
|
||||
for i in "${!NODES_IP[@]}";
|
||||
do
|
||||
if [[ " ${LOCAL_IPS} " =~ " ${NODES_IP[$i]} " ]];
|
||||
then
|
||||
echo "${NODES_IP[$i]}"
|
||||
python -m sglang.launch_server \
|
||||
--model-path ${MODEL_PATH} --quantization modelslim --dtype bfloat16 \
|
||||
--model-loader-extra-config '{"enable_multithread_load": true}' \
|
||||
--host 0.0.0.0 --port 8880 --dist-init-addr ${NODES_IP[0]}:5000 --nnodes 2 --node-rank $i \
|
||||
--trust-remote-code --device npu --attention-backend ascend \
|
||||
--tp-size 32 --base-gpu-id 0 --mem-fraction-static 0.62 --max-running-requests 386 \
|
||||
--chunked-prefill-size 65536 --context-length 8192 --max-prefill-tokens 16384 \
|
||||
--enable-multimodal --mm-attention-backend ascend_attn --sampling-backend ascend \
|
||||
--enable-dp-attention --dp-size 32 \
|
||||
--moe-a2a-backend deepep --deepep-mode auto \
|
||||
--cuda-graph-bs 1 2 4 6 8 10 12 --disable-radix-cache \
|
||||
--speculative-algorithm EAGLE3 \
|
||||
--speculative-draft-model-path ${DRAFT_MODEL_PATH} \
|
||||
--speculative-num-steps 4 \
|
||||
--speculative-eagle-topk 1 \
|
||||
--speculative-num-draft-tokens 5 \
|
||||
--speculative-draft-model-quantization unquant
|
||||
NODE_RANK=$i
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
```
|
||||
|
||||
### Prefill-Decode Disaggregation
|
||||
|
||||
Here is an example of a large scale EP scenario (3P1D) for `Kimi-K2.5-w4a8` on 5 Atlas 800 A3 (64G x 16) .
|
||||
|
||||
Modify the IP of 5 nodes, then run the same scripts on 5 nodes. Then start an additional Router on the first P node.
|
||||
|
||||
```shell
|
||||
# System Settings
|
||||
echo performance | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
|
||||
sysctl -w vm.swappiness=10
|
||||
sysctl -w kernel.numa_balancing=0
|
||||
|
||||
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
|
||||
export SGLANG_SET_CPU_AFFINITY=1
|
||||
export STREAMS_PER_DEVICE=32
|
||||
|
||||
unset https_proxy
|
||||
unset http_proxy
|
||||
unset HTTPS_PROXY
|
||||
unset HTTP_PROXY
|
||||
unset ASCEND_LAUNCH_BLOCKING
|
||||
# cann
|
||||
source /usr/local/Ascend/ascend-toolkit/set_env.sh
|
||||
source /usr/local/Ascend/nnal/atb/set_env.sh
|
||||
|
||||
P_IP=('your prefill ip1' 'your prefill ip2' 'your prefill ip3')
|
||||
D_IP=('your decode ip1' 'your decode ip2')
|
||||
LOCAL_IPS=$(hostname -I)
|
||||
|
||||
export ASCEND_MF_STORE_URL="tcp://${P_IP[0]}:24669"
|
||||
|
||||
for i in "${!P_IP[@]}";
|
||||
do
|
||||
if [[ " ${LOCAL_IPS} " =~ " ${P_IP[$i]} " ]];
|
||||
then
|
||||
echo "Prefill -> ${P_IP[$i]}"
|
||||
|
||||
export HCCL_SOCKET_IFNAME=lo
|
||||
export GLOO_SOCKET_IFNAME=lo
|
||||
|
||||
export HCCL_BUFFSIZE=3600
|
||||
|
||||
export SGLANG_DISAGGREGATION_BOOTSTRAP_TIMEOUT=60
|
||||
|
||||
python -m sglang.launch_server \
|
||||
--model-path ${MODEL_PATH} --quantization modelslim --dtype bfloat16 \
|
||||
--disaggregation-mode prefill --disaggregation-transfer-backend ascend \
|
||||
--host ${P_IP[$i]} --port 8000 --disaggregation-bootstrap-port $((8998+$i)) --nnodes 1 --node-rank 0 \
|
||||
--trust-remote-code --device npu --attention-backend ascend \
|
||||
--tp-size 16 --base-gpu-id 0 --mem-fraction-static 0.68 --max-running-requests 8 \
|
||||
--chunked-prefill-size 32768 --context-length 81920 \
|
||||
--enable-multimodal --mm-attention-backend ascend_attn --sampling-backend ascend \
|
||||
--enable-dp-attention --dp-size 4 \
|
||||
--disable-radix-cache \
|
||||
--moe-a2a-backend deepep --deepep-mode auto
|
||||
NODE_RANK=$i
|
||||
exit 0
|
||||
fi
|
||||
done
|
||||
|
||||
|
||||
for i in "${!D_IP[@]}";
|
||||
do
|
||||
if [[ " ${LOCAL_IPS} " =~ " ${D_IP[$i]} " ]];
|
||||
then
|
||||
echo "Decode -> ${D_IP[$i]}"
|
||||
|
||||
# Run command ifconfig on two nodes, find out which inet addr has same IP with your node IP. That is your public interface, which should be added here
|
||||
export HCCL_SOCKET_IFNAME=xxx
|
||||
export GLOO_SOCKET_IFNAME=xxx
|
||||
|
||||
export DEEP_NORMAL_MODE_USE_INT8_QUANT=1
|
||||
export SGLANG_DEEPEP_NUM_MAX_DISPATCH_TOKENS_PER_RANK=32
|
||||
export HCCL_BUFFSIZE=2400
|
||||
|
||||
export SGLANG_ENABLE_SPEC_V2=1
|
||||
export SGLANG_ENABLE_OVERLAP_PLAN_STREAM=1
|
||||
|
||||
export SGLANG_DISAGGREGATION_BOOTSTRAP_TIMEOUT=60
|
||||
|
||||
python -m sglang.launch_server \
|
||||
--model-path ${MODEL_PATH} --quantization modelslim --dtype bfloat16 \
|
||||
--disaggregation-mode decode --disaggregation-transfer-backend ascend \
|
||||
--host ${D_IP[$i]} --port 8001 --dist-init-addr ${D_IP[0]}:5000 --nnodes 2 --node-rank $i \
|
||||
--trust-remote-code --device npu --attention-backend ascend \
|
||||
--tp-size 32 --base-gpu-id 0 --mem-fraction-static 0.74 --max-running-requests 128 \
|
||||
--chunked-prefill-size 65536 --context-length 81920 \
|
||||
--disable-radix-cache \
|
||||
--enable-multimodal --mm-attention-backend ascend_attn --sampling-backend ascend \
|
||||
--enable-dp-attention --dp-size 32 \
|
||||
--moe-a2a-backend deepep --deepep-mode auto \
|
||||
--cuda-graph-bs 4
|
||||
NODE_RANK=$i
|
||||
exit 0
|
||||
fi
|
||||
done
|
||||
```
|
||||
|
||||
SGLang Model Gateway (former Router)
|
||||
|
||||
```shell
|
||||
python -m sglang_router.launch_router \
|
||||
--pd-disaggregation \
|
||||
--policy cache_aware \
|
||||
--prefill http://'your prefill ip1':8000 8998 \
|
||||
--prefill http://'your prefill ip2':8000 8999 \
|
||||
--prefill http://'your prefill ip3':8000 9000 \
|
||||
--decode http://'your decode ip1':8001 \
|
||||
--host 127.0.0.1 \
|
||||
--port 6688 \
|
||||
```
|
||||
|
||||
|
||||
### Using Benchmark
|
||||
|
||||
Refer to [Benchmark and Profiling](../../developer_guide/benchmark_and_profiling) for details.
|
||||
Reference in New Issue
Block a user