Deepseek 模型部署
本章节包含 Deepseek V3.2 和 Deepseek-R1 部署脚本。
- 脚本涉及的参数说明和一键运行说明见 快速开始。
- 如果需要修改部署方式,请更新
run.sh中PREFILL_SERVER_COUNT和DECODE_SERVER_COUNT。 - DeepEP 的配置文件内容参考 DeepEP 配置文件
- Deepseek-R1 使用的 EPLP 文件下载地址:EPLP。该策略只做参考,MOE 模型的 EPLB 策略建议用户根据数据集或线上流量自行确定。
信息
启动 SGLang 服务前切换python虚拟环境到sglang-0.5.6 workon sglang-0.5.6 或 source ~/.virtualenvs/sglang-0.5.6/bin/activate
清理triton缓存:rm -rf ~/.triton/cache/ && rm -r /tmp/*
Deepseek V3.2
该示例启动方式为2P4D,请准备6台机器。最小部署方式为2机混布(如 TP8 PP2)。
Prefill启动脚本 prefill_server.sh
#!/bin/bash
source ~/.virtualenvs/sglang-0.5.6/bin/activate
export SGLANG_ENABLE_STRICT_MEM_CHECK_DURING_IDLE=0
export TP_SOCKET_IFNAME=bond1
export GLOO_SOCKET_IFNAME=bond1
export MUSA_LAUNCH_BLOCKING=0
export MCCL_IB_GID_INDEX=3
export MCCL_NET_SHARED_BUFFERS=0
export MCCL_PROTOS=2
# export SGLANG_USE_DEEPGEMM_BMM=0
export MC_TE_METRIC=true
export SGLANG_DISAGGREGATION_BOOTSTRAP_TIMEOUT=600
export SGLANG_PP_LAYER_PARTITION="32,29"
#export SGLANG_PP_LAYER_PARTITION="31,30"
export SGLANG_DISAGGREGATION_THREAD_POOL_SIZE=16
export SGLANG_DISAGGREGATION_QUEUE_SIZE=8
export SGLANG_SET_CPU_AFFINITY=1
export SGLANG_ENABLE_TORCH_INFERENCE_MODE=false
export SGLANG_ALLOW_OVERWRITE_LONGER_CONTEXT_LEN=1
export SGLANG_MOE_PADDING=1
#export LD_LIBRARY_PATH=/usr/local/musa/lib:$LD_LIBRARY_PATH
# export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/:${LD_LIBRARY_PATH}
export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:/usr/local/musa/lib:$LD_LIBRARY_PATH
export SGLANG_USE_MUSA_FUSED_KERNEL=1
export VLLM_CONFIGURE_LOGGING=0
export VLLM_PATCH_MUSA_CUSTOM_OPS=1
export MATE_FORCE_JIT=1
export SGLANG_DEEPEP_BF16_DISPATCH=0
export NVSHMEM_IB_TRAFFIC_CLASS=136
#export MC_IB_TC=136
#export SGLANG_USE_CUDA_ROTARY_EMBEDDING=1
# export SGLANG_USE_MTT=1
#export MC_ENABLE_DEST_DEVICE_AFFINITY=1
export SGLANG_DISAGGREGATION_MAPPING_IB_DEVICE_TO_GPU=1
export SGLANG_DEEP_GEMM_BLOCK_M=256
export MC_IB_TC=136
export MC_IB_PCIE_RELAXED_ORDERING=1
# 获取当前环境的 RDMA 设备名列表,在启动时作为 disaggregation-ib-device 参数值
IB_DEVS=()
for dev in /sys/class/infiniband/*; do
ibdev=$(basename "$dev")
for port in "$dev"/ports/*; do
# 速率(如 200 Gb/sec)
rate=$(cat "$port/rate" 2>/dev/null)
# link_layer: InfiniBand / Ethernet (RoCE)
link=$(cat "$port/link_layer" 2>/dev/null)
# 状态为 Up
state=$(cat "$port/state" 2>/dev/null)
# 只要是 200G/400G 且状态为 Up(IB 或 RoCE 都收)
if [[ "$rate" == *"200 Gb"* || "$rate" == *"400 Gb"* ]] && [[ "$state" == "4"* ]]; then
IB_DEVS+=("$ibdev")
break
fi
done
done
# 排序 + 去重
IB_DEVS_SORTED=$(printf "%s\n" "${IB_DEVS[@]}" | sort -V | uniq)
# 生成 MCCL / SGLang 变量
MCCL_IB_HCA=$(echo "$IB_DEVS_SORTED" | paste -sd, -)
SGLANG_IB_DEVICES="$MCCL_IB_HCA"
echo "IB_DEVICES=$MCCL_IB_HCA"
# 获取 RDMA 设备名列表结束
NODE_RANK=$1
PREFILL_IP="${2}:5303"
LOG_DIR=$3
MODEL_PATH=$4
HOST_IP=$5
PROFILER_DIR_BASE="$PWD"
export SGLANG_TORCH_PROFILER_DIR="${PROFILER_DIR_BASE}/traces/sglang_prefill_profiling_p${NODE_RANK}"
mkdir -p "${LOG_DIR}"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
DEEP_EP_CONFIG="${SCRIPT_DIR}/deepep.config"
export SGLANG_EXPERT_DISTRIBUTION_RECORDER_DIR=/home/dist/qn/scripts/ning.qiao/dsv32
export LD_LIBRARY_PATH=/usr/local/lib/:/usr/local/mtshmem/lib/:/usr/local/musa/lib:/usr/local/musa/lib:/usr/local/openmpi/lib:/usr/local/musa/mudnn/lib:/usr/lib/x86_64-linux-gnu:ldconfig
#echo -e "\033[32mLOG_DIR: ${LOG_DIR}\033[0m"
nohup python3 -m sglang.launch_server \
--model-path $MODEL_PATH \
--served-model-name deepseek-v3.2\
--trust-remote-code \
--disable-cuda-graph \
--disable-overlap-schedule \
--host 0.0.0.0 \
--port 20133 \
--attention-backend nsa \
--nsa-prefill-backend tilelang \
--nsa-decode-backend tilelang \
--sampling-backend flashinfer \
--disaggregation-mode prefill \
--dist-init-addr $PREFILL_IP \
--chunked-prefill-size -1 \
--max-prefill-tokens 4096 \
--nnodes 2 \
--node-rank $NODE_RANK \
--tensor-parallel-size 8 \
--ep-size 8 \
--dp-size 8 \
--context-length 6000 \
--pp-size 2 \
--moe-a2a-backend deepep \
--deepep-mode normal \
--moe-dense-tp-size 1 \
--enable-dp-attention \
--enable-dp-lm-head \
--load-balance-method round_robin \
--deepep-config "$DEEP_EP_CONFIG" \
--max-running-requests 64 \
--enable-cache-report \
--mem-fraction-static 0.8 \
--disable-radix-cache \
--schedule-conservativeness 1 \
--disaggregation-ib-device $SGLANG_IB_DEVICES \
--disable-shared-experts-fusion > "${LOG_DIR}/P${NODE_RANK}_${HOST_IP}_$(date '+%Y%m%d_%H%M%S').log" 2>&1 &
Decode启动脚本 decode_server.sh
source ~/.virtualenvs/sglang-0.5.6/bin/activate
export GLOO_SOCKET_IFNAME=bond0
export TP_SOCKET_IFNAME=bond0
export MUSA_LAUNCH_BLOCKING=0
export MCCL_IB_GID_INDEX=3
export MCCL_NET_SHARED_BUFFERS=0
export MCCL_PROTOS=2
#export SGLANG_DEEPEP_NUM_MAX_DISPATCH_TOKENS_PER_RANK=16
export SGLANG_USE_DEEPGEMM_BMM=0
export MC_TE_METRIC=true
export SGLANG_DISAGGREGATION_WAITING_TIMEOUT=600
export SGLANG_TORCH_PROFILER_DIR=/home/dist/qn/scripts/ning.qiao/dsv32
export NVSHMEM_IB_ENABLE_SHUFFLE=0
export NVSHMEM_ENABLE_NIC_PE_MAPPING=1
export NVSHMEM_HCA_PE_MAPPING=mlx5_bond_2:1:2,mlx5_bond_3:1:2,mlx5_bond_4:1:2,mlx5_bond_5:1:2
export SGLANG_DISAGGREGATION_THREAD_POOL_SIZE=16
export SGLANG_DISAGGREGATION_QUEUE_SIZE=8
export SGLANG_SET_CPU_AFFINITY=1
export SGLANG_ENABLE_TORCH_INFERENCE_MODE=false
export SGLANG_ALLOW_OVERWRITE_LONGER_CONTEXT_LEN=1
export SGLANG_MOE_PADDING=1
export SGLANG_USE_MUSA_FUSED_KERNEL=1
export VLLM_CONFIGURE_LOGGING=0
export VLLM_PATCH_MUSA_CUSTOM_OPS=1
export MATE_FORCE_JIT=1
export SGLANG_DEEPEP_LOW_LATENCY_USE_NVLINK=1
#export SGLANG_USE_CUDA_ROTARY_EMBEDDING=1
#export LD_LIBRARY_PATH=/usr/local/musa/lib:$LD_LIBRARY_PATH
# export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/:${LD_LIBRARY_PATH}
export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:/usr/local/musa/lib:$LD_LIBRARY_PATH
export SGLANG_DEEPEP_BF16_DISPATCH=0
export MC_IB_TC=136
export MC_IB_PCIE_RELAXED_ORDERING=1
export SGLANG_USE_MTT=0
export NVSHMEM_IB_TRAFFIC_CLASS=136
#export MC_ENABLE_DEST_DEVICE_AFFINITY=1
# export SGL_DISAGGREGATION_MAPPING_IB_DEVICE_TO_GPU=1
export SGLANG_DISAGGREGATION_MAPPING_IB_DEVICE_TO_GPU=1
export MUSA_DEVICE_PAGE_SIZE=0x1000
#export MUSA_MANAGED_FORCE_DEVICE_ALLOC=1
export NVSHMEM_IBGDA_NIC_HANDLER=gpu
export NVSHMEM_IBGDA_FORCE_NIC_BUF_MEMTYPE=gpumem
# 获取当前环境的 RDMA 设备名列表,在启动时作为 disaggregation-ib-device 参数值
IB_DEVS=()
for dev in /sys/class/infiniband/*; do
ibdev=$(basename "$dev")
for port in "$dev"/ports/*; do
# 速率(如 200 Gb/sec)
rate=$(cat "$port/rate" 2>/dev/null)
# link_layer: InfiniBand / Ethernet (RoCE)
link=$(cat "$port/link_layer" 2>/dev/null)
# 状态为 Up
state=$(cat "$port/state" 2>/dev/null)
# 只要是 200G/400G 且状态为 Up(IB 或 RoCE 都收)
if [[ "$rate" == *"200 Gb"* || "$rate" == *"400 Gb"* ]] && [[ "$state" == "4"* ]]; then
IB_DEVS+=("$ibdev")
break
fi
done
done
# 排序 + 去重
IB_DEVS_SORTED=$(printf "%s\n" "${IB_DEVS[@]}" | sort -V | uniq)
# 生成 MCCL / SGLang 变量
MCCL_IB_HCA=$(echo "$IB_DEVS_SORTED" | paste -sd, -)
SGLANG_IB_DEVICES="$MCCL_IB_HCA"
echo "IB_DEVICES=$MCCL_IB_HCA"
# 获取 RDMA 设备名列表结束
NODE_RANK=$1
DECODER_IP="${2}:5403"
LOG_DIR=$3
MODEL_PATH=$4
HOST_IP=$5
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
export LD_LIBRARY_PATH=/usr/local/lib/:/usr/local/mtshmem/lib/:/usr/local/musa/lib:/usr/local/openmpi/lib:/usr/local/musa/mudnn/lib:/usr/lib/x86_64-linux-gnu:ldconfig
nohup python3 -m sglang.launch_server \
--model $MODEL_PATH \
--trust-remote-code \
--disable-cuda-graph-padding \
--ep-size 32 \
--tp-size 32 \
--dp-size 32 \
--cuda-graph-bs $(seq 1 16) \
--mem-fraction-static 0.76 \
--speculative-algorithm EAGLE \
--speculative-num-steps 3 \
--speculative-eagle-topk 1 \
--speculative-num-draft-tokens 4 \
--enable-dp-lm-head \
--enable-dp-attention \
--port 20143 \
--moe-a2a-backend deepep \
--deepep-mode low_latency \
--dist-init-addr $DECODER_IP \
--nnodes 4 \
--node-rank $NODE_RANK \
--max-running-requests 1920 \
--attention-backend nsa \
--nsa-prefill-backend tilelang \
--nsa-decode-backend tilelang \
--moe-dense-tp-size 1 \
--host 0.0.0.0 \
--sampling-backend flashinfer \
--disable-shared-experts-fusion \
--chunked-prefill-size -1 \
--load-balance-method round_robin \
--disable-radix-cache \
--decode-log-interval 1 \
--enable-single-batch-overlap \
--disaggregation-ib-device $SGLANG_IB_DEVICES \
--disaggregation-mode decode \
--schedule-conservativeness 0.8 \
--prefill-round-robin-balance > "${LOG_DIR}/D${NODE_RANK}_${HOST_IP}_$(date '+%Y%m%d_%H%M%S').log" 2>&1 &
Router启动脚本 router.sh
source ~/.virtualenvs/sglang-0.5.6/bin/activate
export PATH=/root/.virtualenvs/sglang-0.5.6/bin/:$PATH
PREFILL_IP="http://${1}:20133"
DECODE_IP="http://$2:20143"
LOG_DIR=$3
ulimit -n 65535
nohup python -m sglang_router.launch_router \
--pd-disaggregation \
--prefill $PREFILL_IP \
--decode $DECODE_IP \
--host 0.0.0.0 \
--request-timeout-secs 7200 \
--port 30000 > "${LOG_DIR}/router_$(date '+%Y%m%d_%H%M%S').log" 2>&1 &
hostfile文件示例
192.168.100.101
192.168.100.102
192.168.100.103
192.168.100.104
192.168.100.105
192.168.100.106
一键运行脚本 run.sh
#!/bin/bash
CURRENT_TIME=$(date "+%Y%m%d_%H%M%S")
#echo $CURRENT_TIME
#mkdir -p ./output/$CURRENT_TIME
PREFILL_SERVER_COUNT=${PREFILL_SERVER_COUNT:-2}
DECODER_SERVER_COUNT=${DECODER_SERVER_COUNT:-4}
WORLD_SIZE=$(( (PREFILL_SERVER_COUNT + DECODER_SERVER_COUNT) * 8 ))
echo -e "\033[32mPREFILL_SERVER_COUNT: $PREFILL_SERVER_COUNT, DECODER_SERVER_COUNT: $DECODER_SERVER_COUNT, \033[0m"
set -u
WORK_HOME="$PWD"
EXPNAME="P${PREFILL_SERVER_COUNT}_D${DECODER_SERVER_COUNT}_gpus${WORLD_SIZE}"
MODEL_PATH=${MODEL_PATH:-"/data/models/DeepSeek-V3.2/"}
HOSTFILE=./hostfile
LOG_DIR=$WORK_HOME/output/$EXPNAME/$CURRENT_TIME/
PREFILL_SCRIPT_FILE="$WORK_HOME/prefill_server.sh"
DECODER_SCRIPT_FILE="$WORK_HOME/decode_server.sh"
ROUTER_SCRIPT_FILE="$WORK_HOME/router.sh"
#ROUTER_SCRIPT_FILE="$WORK_HOME/router_sgl.sh"
set +u
echo -e "\033[32mWORK_HOME: $WORK_HOME\033[0m"
echo -e "\033[32mMODEL_PATH: $MODEL_PATH\033[0m"
echo -e "\033[32mPREFILL_CRIPT_FILE: $PREFILL_SCRIPT_FILE\033[0m"
echo -e "\033[32mDECODER_SCRIPT_FILE: $DECODER_SCRIPT_FILE\033[0m"
# bash generate_hostfile.sh
COUNT=0
hostlist=$(grep -v '^#\|^$' $HOSTFILE | awk '{print $1}' | xargs)
# Check if hostlist is empty
if [ -z "$hostlist" ]; then
echo "Error: hostlist is empty. Please add IP addresses to the hostfile."
exit 1
fi
PREFILL_MASTER_IP=$(head -n 1 $HOSTFILE)
DECODER_MASTER_IP=$(tail -n $DECODER_SERVER_COUNT $HOSTFILE | head -n1)
echo -e "\033[32mPREFILL_MASTER_IP: $PREFILL_MASTER_IP\033[0m"
echo -e "\033[32mDECODER_MASTER_IP: $DECODER_MASTER_IP\033[0m"
mkdir -p $LOG_DIR
for host in ${hostlist[@]}; do
echo $host
if [[ $COUNT -lt $PREFILL_SERVER_COUNT ]]; then
PREFILL_INDEX=$COUNT
cmd="bash -c 'cd $WORK_HOME;source ~/.virtualenvs/sglang-0.5.6/bin/activate; bash $PREFILL_SCRIPT_FILE $PREFILL_INDEX $PREFILL_MASTER_IP $LOG_DIR $MODEL_PATH $host'"
#cmd="bash -c 'cd $WORK_HOME; echo $PATH '"
echo $cmd
ssh -p 62216 -f -n $host $cmd
else
DECODER_INDEX=$((COUNT - PREFILL_SERVER_COUNT))
cmd="bash -c 'cd $WORK_HOME;source ~/.virtualenvs/sglang-0.5.6/bin/activate; bash $DECODER_SCRIPT_FILE $DECODER_INDEX $DECODER_MASTER_IP $LOG_DIR $MODEL_PATH $host'"
echo $cmd
ssh -p 62216 -f -n $host $cmd
fi
((COUNT++))
done
cmd="bash -c 'cd $WORK_HOME;source ~/.virtualenvs/sglang-0.5.6/bin/activate; bash $ROUTER_SCRIPT_FILE $PREFILL_MASTER_IP $DECODER_MASTER_IP $LOG_DIR'"
echo $cmd
ssh -p 62216 -f -n $PREFILL_MASTER_IP $cmd
echo -e "Main log file: \033[34m$LOG_DIR\033[0m"
DeepSeek R1
该示例启动方式为2P4D,请准备6台机器。最小部署方式为2机混布(如 TP8 PP2)。
Prefill启动脚本 prefill_server.sh
#!/bin/bash
source ~/.virtualenvs/sglang-0.5.6/bin/activate
export TP_SOCKET_IFNAME=bond1
export GLOO_SOCKET_IFNAME=bond1
export MUSA_LAUNCH_BLOCKING=0
export MCCL_IB_GID_INDEX=3
export MCCL_NET_SHARED_BUFFERS=0
export MCCL_PROTOS=2
export SGLANG_USE_DEEPGEMM_BMM=0
export MC_TE_METRIC=true
export SGLANG_DISAGGREGATION_BOOTSTRAP_TIMEOUT=600
export SGLANG_PP_LAYER_PARTITION="32,29"
#export SGLANG_PP_LAYER_PARTITION="31,30"
export SGLANG_DISAGGREGATION_THREAD_POOL_SIZE=16
export SGLANG_DISAGGREGATION_QUEUE_SIZE=8
export SGLANG_SET_CPU_AFFINITY=1
export SGLANG_ENABLE_TORCH_INFERENCE_MODE=true
export SGLANG_ALLOW_OVERWRITE_LONGER_CONTEXT_LEN=1
export SGLANG_MOE_PADDING=1
#export LD_LIBRARY_PATH=/usr/local/musa/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:/usr/local/musa/lib:$LD_LIBRARY_PATH
export SGLANG_USE_MUSA_FUSED_KERNEL=1
export VLLM_CONFIGURE_LOGGING=0
export VLLM_PATCH_MUSA_CUSTOM_OPS=1
export MATE_FORCE_JIT=1
export NVSHMEM_IB_TRAFFIC_CLASS=136
#export MC_IB_TC=136
#export SGLANG_USE_CUDA_ROTARY_EMBEDDING=1
# export SGLANG_USE_MTT=1
#export MC_ENABLE_DEST_DEVICE_AFFINITY=1
export SGLANG_DISAGGREGATION_MAPPING_IB_DEVICE_TO_GPU=1
export SGL_DEEP_GEMM_BLOCK_M=256
export MC_IB_TC=136
export MC_IB_PCIE_RELAXED_ORDERING=1
export SGLANG_DEEPEP_USE_MUSA_ACE=1
# 获取当前环境的 RDMA 设备名列表,在启动时作为 disaggregation-ib-device 参数值
IB_DEVS=()
for dev in /sys/class/infiniband/*; do
ibdev=$(basename "$dev")
for port in "$dev"/ports/*; do
# 速率(如 200 Gb/sec)
rate=$(cat "$port/rate" 2>/dev/null)
# link_layer: InfiniBand / Ethernet (RoCE)
link=$(cat "$port/link_layer" 2>/dev/null)
# 状态为 Up
state=$(cat "$port/state" 2>/dev/null)
# 只要是 200G/400G 且状态为 Up(IB 或 RoCE 都收)
if [[ "$rate" == *"200 Gb"* || "$rate" == *"400 Gb"* ]] && [[ "$state" == "4"* ]]; then
IB_DEVS+=("$ibdev")
break
fi
done
done
# 排序 + 去重
IB_DEVS_SORTED=$(printf "%s\n" "${IB_DEVS[@]}" | sort -V | uniq)
# 生成 MCCL / SGLang 变量
MCCL_IB_HCA=$(echo "$IB_DEVS_SORTED" | paste -sd, -)
SGLANG_IB_DEVICES="$MCCL_IB_HCA"
echo "IB_DEVICES=$MCCL_IB_HCA"
# 获取 RDMA 设备名列表结束
NODE_RANK=$1
PREFILL_IP="${2}:5303"
LOG_DIR=$3
MODEL_PATH=$4
HOST_IP=$5
PROFILER_DIR_BASE="$PWD"
export SGLANG_TORCH_PROFILER_DIR="${PROFILER_DIR_BASE}/sglang_prefill_profiling_P${NODE_RANK}"
mkdir -p "${LOG_DIR}"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
DEEP_EP_CONFIG="${SCRIPT_DIR}/deepep.config"
EPLB_FILE="${SCRIPT_DIR}/expert_distribution_recorder_ep8_pp2_${NODE_RANK}.pt"
#echo -e "\033[32mLOG_DIR: ${LOG_DIR}\033[0m"
nohup python3 -m sglang.launch_server \
--model-path $MODEL_PATH \
--served-model-name deepseek-r1 \
--trust-remote-code \
--disable-cuda-graph \
--disable-overlap-schedule \
--host 0.0.0.0 \
--port 20133 \
--attention-backend fa3 \
--prefill-attention-backend fa3 \
--sampling-backend flashinfer \
--disaggregation-mode prefill \
--dist-init-addr $PREFILL_IP \
--chunked-prefill-size -1 \
--max-prefill-tokens 8192 \
--nnodes 2 \
--node-rank $NODE_RANK \
--tensor-parallel-size 8 \
--ep-size 8 \
--dp-size 8 \
--context-length 6000 \
--pp-size 2 \
--moe-a2a-backend deepep \
--deepep-mode normal \
--moe-dense-tp-size 1 \
--enable-dp-attention \
--enable-dp-lm-head \
--load-balance-method round_robin \
--deepep-config "$DEEP_EP_CONFIG" \
--max-running-requests 128 \
--enable-cache-report \
--mem-fraction-static 0.8 \
--pp-max-micro-batch-size 1 \
--disable-radix-cache \
--enable-single-batch-overlap \
--schedule-conservativeness 1 \
--init-expert-location "$EPLB_FILE" \
--eplb-rebalance-experts-per-chunk 32 \
--ep-dispatch-algorithm dynamic \
--enable-eplb \
--eplb-algorithm deepseek \
--eplb-rebalance-num-iterations 1000 \
--eplb-min-rebalancing-utilization-threshold 0.85 \
--enable-eplb-rebalance-async \
--eplb-rebalance-layers-per-chunk 1 \
--disaggregation-ib-device $SGLANG_IB_DEVICES \
--disable-shared-experts-fusion > "${LOG_DIR}/P${NODE_RANK}_${HOST_IP}_$(date '+%Y%m%d_%H%M%S').log" 2>&1 &
Decode启动脚本 decode_server.sh
#!/bin/bash
source ~/.virtualenvs/sglang-0.5.6/bin/activate
export GLOO_SOCKET_IFNAME=bond0
export TP_SOCKET_IFNAME=bond0
export MUSA_LAUNCH_BLOCKING=0
export MCCL_IB_GID_INDEX=3
export MCCL_NET_SHARED_BUFFERS=0
export MCCL_PROTOS=2
export SGLANG_DEEPEP_NUM_MAX_DISPATCH_TOKENS_PER_RANK=160
export SGLANG_USE_DEEPGEMM_BMM=0
export MC_TE_METRIC=true
export SGLANG_DISAGGREGATION_WAITING_TIMEOUT=6000
export NVSHMEM_IB_ENABLE_SHUFFLE=0
export NVSHMEM_ENABLE_NIC_PE_MAPPING=1
export NVSHMEM_HCA_PE_MAPPING=mlx5_bond_2:1:2,mlx5_bond_3:1:2,mlx5_bond_4:1:2,mlx5_bond_5:1:2
export SGLANG_DISAGGREGATION_THREAD_POOL_SIZE=16
export SGLANG_DISAGGREGATION_QUEUE_SIZE=8
export SGLANG_SET_CPU_AFFINITY=1
export SGLANG_ENABLE_TORCH_INFERENCE_MODE=false
export SGLANG_ALLOW_OVERWRITE_LONGER_CONTEXT_LEN=1
export SGLANG_MOE_PADDING=1
export SGLANG_USE_MUSA_FUSED_KERNEL=1
export VLLM_CONFIGURE_LOGGING=0
export VLLM_PATCH_MUSA_CUSTOM_OPS=1
export MATE_FORCE_JIT=1
export SGLANG_DEEPEP_LOW_LATENCY_USE_NVLINK=1
#export SGLANG_USE_CUDA_ROTARY_EMBEDDING=1
#export LD_LIBRARY_PATH=/usr/local/musa/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:/usr/local/musa/lib:$LD_LIBRARY_PATH
export MC_IB_TC=136
export MC_IB_PCIE_RELAXED_ORDERING=1
export SGLANG_USE_MTT=0
export NVSHMEM_IB_TRAFFIC_CLASS=136
#export MC_ENABLE_DEST_DEVICE_AFFINITY=1
export SGLANG_DISAGGREGATION_MAPPING_IB_DEVICE_TO_GPU=1
export MUSA_DEVICE_PAGE_SIZE=0x1000
#export MUSA_MANAGED_FORCE_DEVICE_ALLOC=1
export NVSHMEM_IBGDA_NIC_HANDLER=gpu
export NVSHMEM_IBGDA_FORCE_NIC_BUF_MEMTYPE=gpumem
# 获取当前环境的 RDMA 设备名列表,在启动时作为 disaggregation-ib-device 参数值
IB_DEVS=()
for dev in /sys/class/infiniband/*; do
ibdev=$(basename "$dev")
for port in "$dev"/ports/*; do
# 速率(如 200 Gb/sec)
rate=$(cat "$port/rate" 2>/dev/null)
# link_layer: InfiniBand / Ethernet (RoCE)
link=$(cat "$port/link_layer" 2>/dev/null)
# 状态为 Up
state=$(cat "$port/state" 2>/dev/null)
# 只要是 200G/400G 且状态为 Up(IB 或 RoCE 都收)
if [[ "$rate" == *"200 Gb"* || "$rate" == *"400 Gb"* ]] && [[ "$state" == "4"* ]]; then
IB_DEVS+=("$ibdev")
break
fi
done
done
# 排序 + 去重
IB_DEVS_SORTED=$(printf "%s\n" "${IB_DEVS[@]}" | sort -V | uniq)
# 生成 MCCL / SGLang 变量
MCCL_IB_HCA=$(echo "$IB_DEVS_SORTED" | paste -sd, -)
SGLANG_IB_DEVICES="$MCCL_IB_HCA"
echo "IB_DEVICES=$MCCL_IB_HCA"
# 获取 RDMA 设备名列表结束
NODE_RANK=$1
DECODER_IP="${2}:5403"
LOG_DIR=$3
MODEL_PATH=$4
HOST_IP=$5
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
EPLB_FILE="$SCRIPT_DIR/deepseek_r1_eplb_weight-decoder-ep32-mtp-padhi.pt"
PROFILER_DIR_BASE="$PWD"
export SGLANG_TORCH_PROFILER_DIR="${PROFILER_DIR_BASE}/sglang_prefill_profiling_D${NODE_RANK}"
nohup python3 -m sglang.launch_server \
--model $MODEL_PATH \
--trust-remote-code \
--disable-cuda-graph-padding \
--cuda-graph-bs $(seq 1 54) \
--tensor-parallel-size 32 \
--ep-size 32 \
--dp-size 32 \
--mem-fraction-static 0.76 \
--speculative-algorithm EAGLE \
--speculative-num-steps 1 \
--speculative-eagle-topk 1 \
--speculative-num-draft-tokens 2 \
--enable-dp-lm-head \
--enable-dp-attention \
--port 20143 \
--moe-a2a-backend deepep \
--deepep-mode low_latency \
--dist-init-addr $DECODER_IP \
--nnodes 4 \
--node-rank $NODE_RANK \
--max-running-requests 1920 \
--attention-backend fa3 \
--moe-dense-tp-size 1 \
--host 0.0.0.0 \
--sampling-backend flashinfer \
--disable-shared-experts-fusion \
--chunked-prefill-size -1 \
--enable-single-batch-overlap \
--disaggregation-mode decode \
--disaggregation-ib-device $SGLANG_IB_DEVICES \
--load-balance-method round_robin \
--init-expert-location $EPLB_FILE \
--ep-num-redundant-experts 0 \
--disable-radix-cache \
--schedule-conservativeness 0.8 \
--prefill-round-robin-balance > "${LOG_DIR}/D${NODE_RANK}_${HOST_IP}_$(date '+%Y%m%d_%H%M%S').log" 2>&1 &
Router启动脚本 router.sh
#!/bin/bash
source ~/.virtualenvs/sglang-0.5.6/bin/activate
PREFILL_IP="http://${1}:20133"
DECODE_IP="http://$2:20143"
LOG_DIR=$3
ulimit -n 65535
nohup python -m sglang_router.launch_router \
--pd-disaggregation \
--prefill $PREFILL_IP \
--decode $DECODE_IP \
--host 0.0.0.0 \
--port 30000 > "${LOG_DIR}/router_$(date '+%Y%m%d_%H%M%S').log" 2>&1 &
hostfile文件示例
192.168.100.101
192.168.100.102
192.168.100.103
192.168.100.104
192.168.100.105
192.168.100.106
一键运行脚本 run.sh
#!/bin/bash
CURRENT_TIME=$(date "+%Y%m%d_%H%M%S")
#echo $CURRENT_TIME
#mkdir -p ./output/$CURRENT_TIME
PREFILL_SERVER_COUNT=${PREFILL_SERVER_COUNT:-2}
DECODER_SERVER_COUNT=${DECODER_SERVER_COUNT:-4}
WORLD_SIZE=$(( (PREFILL_SERVER_COUNT + DECODER_SERVER_COUNT) * 8 ))
echo -e "\033[32mPREFILL_SERVER_COUNT: $PREFILL_SERVER_COUNT, DECODER_SERVER_COUNT: $DECODER_SERVER_COUNT, \033[0m"
set -u
WORK_HOME="$PWD"
EXPNAME="P${PREFILL_SERVER_COUNT}_D${DECODER_SERVER_COUNT}_gpus${WORLD_SIZE}"
MODEL_PATH=${MODEL_PATH:-"/data/models/DeepSeek-R1-0528/"}
HOSTFILE=./hostfile
LOG_DIR=$WORK_HOME/output/$EXPNAME/$CURRENT_TIME/
PREFILL_SCRIPT_FILE="$WORK_HOME/prefill_server.sh"
DECODER_SCRIPT_FILE="$WORK_HOME/decode_server.sh"
ROUTER_SCRIPT_FILE="$WORK_HOME/router.sh"
#ROUTER_SCRIPT_FILE="$WORK_HOME/router_sgl.sh"
set +u
echo -e "\033[32mWORK_HOME: $WORK_HOME\033[0m"
echo -e "\033[32mMODEL_PATH: $MODEL_PATH\033[0m"
echo -e "\033[32mPREFILL_CRIPT_FILE: $PREFILL_SCRIPT_FILE\033[0m"
echo -e "\033[32mDECODER_SCRIPT_FILE: $DECODER_SCRIPT_FILE\033[0m"
# bash generate_hostfile.sh
COUNT=0
hostlist=$(grep -v '^#\|^$' $HOSTFILE | awk '{print $1}' | xargs)
# Check if hostlist is empty
if [ -z "$hostlist" ]; then
echo "Error: hostlist is empty. Please add IP addresses to the hostfile."
exit 1
fi
PREFILL_MASTER_IP=$(head -n 1 $HOSTFILE)
DECODER_MASTER_IP=$(tail -n $DECODER_SERVER_COUNT $HOSTFILE | head -n1)
echo -e "\033[32mPREFILL_MASTER_IP: $PREFILL_MASTER_IP\033[0m"
echo -e "\033[32mDECODER_MASTER_IP: $DECODER_MASTER_IP\033[0m"
mkdir -p $LOG_DIR
for host in ${hostlist[@]}; do
echo $host
if [[ $COUNT -lt $PREFILL_SERVER_COUNT ]]; then
PREFILL_INDEX=$COUNT
cmd="bash -c 'cd $WORK_HOME; bash $PREFILL_SCRIPT_FILE $PREFILL_INDEX $PREFILL_MASTER_IP $LOG_DIR $MODEL_PATH $host'"
#cmd="bash -c 'cd $WORK_HOME; echo $PATH '"
echo $cmd
ssh -p 62216 -f -n $host $cmd
else
DECODER_INDEX=$((COUNT - PREFILL_SERVER_COUNT))
cmd="bash -c 'cd $WORK_HOME; bash $DECODER_SCRIPT_FILE $DECODER_INDEX $DECODER_MASTER_IP $LOG_DIR $MODEL_PATH $host'"
echo $cmd
ssh -p 62216 -f -n $host $cmd
fi
((COUNT++))
done
cmd="bash -c 'cd $WORK_HOME; bash $ROUTER_SCRIPT_FILE $PREFILL_MASTER_IP $DECODER_MASTER_IP $LOG_DIR'"
echo $cmd
ssh -p 62216 -f -n $PREFILL_MASTER_IP $cmd
echo -e "Main log file: \033[34m$LOG_DIR\033[0m"

