跳转到内容

GLM-5 / GLM-5.1 / GLM-5.2

首先下载xLLM提供的镜像:

Terminal window
# A2 x86
docker pull quay.io/jd_xllm/xllm-ai:xllm-dev-a2-x86-cann9-20260605
# A2 arm
docker pull quay.io/jd_xllm/xllm-ai:xllm-dev-a2-arm-cann9-20260605
# A3 arm
docker pull quay.io/jd_xllm/xllm-ai:xllm-dev-a3-arm-cann9-20260605

注意: A2 机器性能未进行压测。

然后创建对应的容器

Terminal window
sudo docker run -it --ipc=host -u 0 --privileged --name mydocker --network=host \
-v /var/queue_schedule:/var/queue_schedule \
-v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
-v /usr/local/Ascend/add-ons/:/usr/local/Ascend/add-ons/ \
-v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \
-v /var/log/npu/conf/slog/slog.conf:/var/log/npu/conf/slog/slog.conf \
-v /var/log/npu/slog/:/var/log/npu/slog \
-v ~/.ssh:/root/.ssh \
-v /var/log/npu/profiling/:/var/log/npu/profiling \
-v /var/log/npu/dump/:/var/log/npu/dump \
-v /runtime/:/runtime/ -v /etc/hccn.conf:/etc/hccn.conf \
-v /export/home:/export/home \
-v /home/:/home/ \
-w /export/home \
quay.io/jd_xllm/xllm-ai:xllm-dev-hb-rc2-x86

下载官方仓库与模块依赖:

Terminal window
git clone https://github.com/xLLM-AI/xllm.git
cd xllm
git checkout release/v0.10.0
git submodule update --init --recursive

下载安装依赖:

Terminal window
pip install --upgrade pre-commit
yum install numactl

执行编译,在build/下生成可执行文件build/xllm/core/server/xllm

Terminal window
python setup.py build --device npu

若机器为重启后初次拉起服务,需先执行以下脚本对device进行初始化

Section titled “若机器为重启后初次拉起服务,需先执行以下脚本对device进行初始化”

#若不执行且npu未初始化可能导致xllm进程拉起失败

Terminal window
python -c "import torch_npu
for i in range(16):torch_npu.npu.set_device(i)"
Terminal window
python tools/export_mtp.py --input-dir ${W4A8/W8A8权重目录} --output-dir ${导出MTP权重目录}
Terminal window
##### 1, 配置相关环境变量
export LD_PRELOAD=/usr/lib64/libtcmalloc.so.4:$LD_PRELOAD
export HCCL_EXEC_TIMEOUT=300
export HCCL_CONNECT_TIMEOUT=300
export HCCL_OP_EXPANSION_MODE="AIV"
export HCCL_IF_BASE_PORT=2864
##### 2, 清除残留日志
rm -rf /root/ascend/log/
Terminal window
XLLM_PATH="./myxllm/xllm/build/xllm/core/server/xllm"
# xllm可执行文件路径
MODEL_PATH=/path/to/GLM-5.2-W8A8/
# 模型路径(以Glm-5.2-w8a8为例)
DRAFT_MODEL_PATH=/path/to/GLM-5.2-MTP/
# 前面导出的mtp权重
MASTER_NODE_ADDR="11.87.49.110:10015"
LOCAL_HOST="11.87.49.110"
# Service Port
START_PORT=18994
START_DEVICE=0
LOG_DIR="logs"
NNODES=16
for (( i=0; i<$NNODES; i++ ))
do
PORT=$((START_PORT + i))
DEVICE=$((START_DEVICE + i))
LOG_FILE="$LOG_DIR/node_$i.log"
#可选:numactl绑核 (NUMA亲和性查询命令: npu-smi info -t topo)
#nohup numactl -C $((DEVICE*40))-$((DEVICE*40+39)) $XLLM_PATH \
nohup $XLLM_PATH \
--model $MODEL_PATH \
--port $PORT \
--master_node_addr=$MASTER_NODE_ADDR \
--nnodes=$NNODES \
--node_rank=$i \
--max_memory_utilization=0.86 \
--max_tokens_per_batch=4096 \
--max_seqs_per_batch=16 \
--block_size=128 \
--enable_prefix_cache=true \
--enable_chunked_prefill=true \
--enable_graph=true \
--enable_schedule_overlap=true \
--communication_backend="hccl" \
--graph_decode_batch_size_limit=2 \
--draft_model=$DRAFT_MODEL_PATH \
--num_speculative_tokens=3 \
--ep_size=16 \
--dp_size=2 \
--tool_call_parser=auto \
> $LOG_FILE 2>&1 &
done
# --max_memory_utilization 单卡最大显存占用比例
# --max_tokens_per_batch 单batch最大token数 (主要限制prefill)
# --max_seqs_per_batch 单batch最大请求数 (主要限制decode)
# --communication_backend 通信backend 可选(hccl / lccl) 此处建议hccl
# --enable_schedule_overlap 开启异步调度
# --enable_prefix_cache 开启prefix_cache
# --enable_chunked_prefill 开启chunked_prefill
# --enable_graph 开启aclgraph,需要额外显存
# --acl_graph_decode_batch_size_limit 抓图的最大bs,当前需<= 32 / (预测token数 + 1)
# --draft_model mtp - mtp权重路径
# --num_speculative_tokens mtp - 预测token数

日志出现”Brpc Server Started”表示服务成功拉起。

Terminal window
#开启确定性计算
export LCCL_DETERMINISTIC=1
export HCCL_DETERMINISTIC=true
export ATB_MATMUL_SHUFFLE_K_ENABLE=0
# 开启动态profiling模式
export PROFILING_MODE=dynamic
\rm -rf ~/dynamic_profiling_socket_*
Terminal window
MASTER_NODE_ADDR="11.87.49.110:19990"
LOCAL_HOST="11.87.49.110"
START_PORT=15890
START_DEVICE=0
LOG_DIR="logs"
NNODES=32
LOCAL_NODES=16
export HCCL_IF_BASE_PORT=48439
unset HCCL_OP_EXPANSION_MODE
for (( i=0; i<$LOCAL_NODES; i++ ))do
PORT=$((START_PORT + i))
DEVICE=$((START_DEVICE + i)); LOG_FILE="$LOG_DIR/node_$i.log"
nohup numactl -C $((DEVICE*40))-$((DEVICE*40+39)) $XLLM_PATH \
--model $MODEL_PATH \
--host $LOCAL_HOST \
--port $PORT \
--master_node_addr=$MASTER_NODE_ADDR \
--nnodes=$NNODES \
--node_rank=$i \
--max_memory_utilization=0.85 \
--max_tokens_per_batch=8192 \
--max_seqs_per_batch=128 \
--block_size=128 \
--enable_prefix_cache=true \
--enable_chunked_prefill=true \
--communication_backend="hccl" \
--enable_schedule_overlap=true \
--enable_graph=true \
--acl_graph_decode_batch_size_limit=4 \
--draft_model=$DRAFT_MODEL_PATH \
--num_speculative_tokens=3 \
--ep_size=32 \
--dp_size=4 \
--rank_tablefile=/yourPath/ranktable.json \
--tool_call_parser=auto \
> $LOG_FILE 2>&1 &
done
Terminal window
MASTER_NODE_ADDR="11.87.49.110:19990"
LOCAL_HOST="11.87.49.111"
START_PORT=15890
START_DEVICE=0
LOG_DIR="logs"
NNODES=32
LOCAL_NODES=16
export HCCL_IF_BASE_PORT=48439
unset HCCL_OP_EXPANSION_MODE
for (( i=0; i<$LOCAL_NODES; i++ ))do
PORT=$((START_PORT + i))
DEVICE=$((START_DEVICE + i)); LOG_FILE="$LOG_DIR/node_$i.log"
nohup numactl -C $((DEVICE*40))-$((DEVICE*40+39)) $XLLM_PATH \
--model $MODEL_PATH \
--host $LOCAL_HOST \
--port $PORT \
--master_node_addr=$MASTER_NODE_ADDR \
--nnodes=$NNODES \
--node_rank=$((i + LOCAL_NODES)) \
--max_memory_utilization=0.85 \
--max_tokens_per_batch=8192 \
--max_seqs_per_batch=128 \
--block_size=128 \
--enable_prefix_cache=true \
--enable_chunked_prefill=true \
--communication_backend="hccl" \
--enable_schedule_overlap=true \
--enable_graph=true \
--acl_graph_decode_batch_size_limit=4 \
--draft_model=$DRAFT_MODEL_PATH \
--num_speculative_tokens=3 \
--ep_size=32 \
--dp_size=4 \
--rank_tablefile=/yourPath/ranktable.json \
--tool_call_parser=auto \
> $LOG_FILE 2>&1 &
done

A3 ranktable配置

A2 ranktable配置

(注意A3与A2的ranktable格式差异)

命令:

Terminal window
npu-smi info -t topo

前述命令中

Terminal window
numactl -C $((DEVICE*12))-$((DEVICE*12+11))

表示该进程绑在对应亲和的核上,可根据机器具体情况修改绑定的核id

EX3.Glm-5 权重量化 (GLM5.2 量化指导待更新)

Section titled “EX3.Glm-5 权重量化 (GLM5.2 量化指导待更新)”
Terminal window
pip install transformers==5.2.0
git clone https://gitcode.com/Ascend/msmodelslim.git
cd msmodelslim
bash install.sh
Terminal window
msmodelslim quant \
--model_path ${MODEL_PATH} \
--save_path ${SAVE_PATH} \
--device npu:0 \
--model_type GLM-5 \
--quant_type w8a8 \
--trust_remote_code True

xllm支持PD分离部署,这需要与另一个开源库xllm service配套使用。

首先,我们下载安装xllm service,与安装编译xllm类似:

Terminal window
git clone https://github.com/xLLM-AI/xllm-service.git
cd xllm-service
git submodule init
git submodule update

xllm_service依赖etcd,使用etcd官方提供的安装脚本进行安装,其脚本提供的默认安装路径是/tmp/etcd-download-test/etcd,我们可以手动修改其脚本中的安装路径,也可以运行完脚本之后手动迁移:

Terminal window
mv /tmp/etcd-download-test/etcd /path/to/your/etcd

先应用patch:

Terminal window
sh prepare.sh

再执行编译:

Terminal window
mkdir -p build
cd build
cmake ..
make -j 8
cd ..

!!! warning “可能的错误” 这里能会遇到关于boost-localeboost-interprocess的安装错误:vcpkg-src/packages/boost-locale_x64-linux/include: No such file or directory,/vcpkg-src/packages/boost-interprocess_x64-linux/include: No such file or directory 我们使用vcpkg重新安装这些包: bash /path/to/vcpkg remove boost-locale boost-interprocess /path/to/vcpkg install boost-locale:x64-linux /path/to/vcpkg install boost-interprocess:x64-linux

启动etcd:

Terminal window
./etcd-download-test/etcd --listen-peer-urls 'http://localhost:2390' --listen-client-urls 'http://localhost:2389' --advertise-client-urls 'http://localhost:2391'

跨机配置时,etcd参考如下:

Terminal window
/tmp/etcd-download-test/etcd --listen-peer-urls 'http://0.0.0.0:3390' --listen-client-urls 'http://0.0.0.0:3389' --advertise-client-urls 'http://11.87.191.82:3389'

启动xllm service:

Terminal window
ENABLE_DECODE_RESPONSE_TO_SERVICE=true ./xllm_master_serving --etcd_addr="127.0.0.1:12389" --http_server_port 28888 --rpc_server_port 28889 --tokenizer_path=/export/home/models/GLM-5-W8A8/

跨机配置时,启动xllm service:

Terminal window
ENABLE_DECODE_RESPONSE_TO_SERVICE=true ../xllm-service/build/xllm_service/xllm_master_serving --etcd_addr="11.87.191.82:3389" --http_server_port 38888 --rpc_server_port 38889 --tokenizer_path=/export/home/models/GLM-5-W8A8/
  • 启动Prefill实例
Terminal window
BATCH_SIZE=256
#推理最大batch数量
XLLM_PATH="./myxllm/xllm/build/xllm/core/server/xllm"
#推理入口文件路径(上一步中编译产物)
MODEL_PATH=/export/home/models/GLM-5-w8a8/
#模型路径(此处为int量化的Glm-5)
DRAFT_MODEL_PATH=/export/home/models/GLM-5-MTP/
MASTER_NODE_ADDR="11.87.49.110:10015"
LOCAL_HOST="11.87.49.110"
# Service Port
START_PORT=18994
START_DEVICE=0
LOG_DIR="logs"
NNODES=16
for (( i=0; i<$NNODES; i++ ))
do
PORT=$((START_PORT + i))
DEVICE=$((START_DEVICE + i))
LOG_FILE="$LOG_DIR/node_$i.log"
nohup numactl -C $((i*40))-$((i*40+39)) $XLLM_PATH \
--model $MODEL_PATH --model_id glmmoe \
--host $LOCAL_HOST \
--port $PORT \
--master_node_addr=$MASTER_NODE_ADDR \
--nnodes=$NNODES \
--node_rank=$i \
--max_memory_utilization=0.86 \
--max_tokens_per_batch=5000 \
--max_seqs_per_batch=$BATCH_SIZE \
--communication_backend=hccl \
--enable_schedule_overlap=true \
--enable_prefix_cache=false \
--enable_chunked_prefill=false \
--enable_graph=true \
--draft_model $DRAFT_MODEL_PATH \
--num_speculative_tokens 1 \
--tool_call_parser=auto \
--enable_disagg_pd=true \
--instance_role=PREFILL \
--etcd_addr=$LOCAL_HOST:3389 \
--transfer_listen_port=$((36100 + i)) \
--disagg_pd_port=8877 \
> $LOG_FILE 2>&1 &
done
#--etcd_addr=$LOCAL_HOST:3389 参考etcd中advertise-client-urls的配置
#--instance_role=DECODE PD配置,DECODE\PREFILL
  • 启动Decode实例

    Terminal window
    BATCH_SIZE=256
    #推理最大batch数量
    XLLM_PATH="./myxllm/xllm/build/xllm/core/server/xllm"
    #推理入口文件路径(上一步中编译产物)
    MODEL_PATH=/export/home/models/GLM-5-w8a8/
    #模型路径(此处为int量化的Glm-5)
    DRAFT_MODEL_PATH=/export/home/models/GLM-5-MTP/
    MASTER_NODE_ADDR="11.87.49.110:10015"
    LOCAL_HOST="11.87.49.110"
    # Service Port
    START_PORT=18994
    START_DEVICE=0
    LOG_DIR="logs"
    NNODES=16
    for (( i=0; i<$NNODES; i++ ))
    do
    PORT=$((START_PORT + i))
    DEVICE=$((START_DEVICE + i))
    LOG_FILE="$LOG_DIR/node_$i.log"
    nohup numactl -C $((i*40))-$((i*40+39)) $XLLM_PATH \
    --model $MODEL_PATH --model_id glmmoe \
    --host $LOCAL_HOST \
    --port $PORT \
    --master_node_addr=$MASTER_NODE_ADDR \
    --nnodes=$NNODES \
    --node_rank=$i \
    --max_memory_utilization=0.86 \
    --max_tokens_per_batch=5000 \
    --max_seqs_per_batch=$BATCH_SIZE \
    --communication_backend=hccl \
    --enable_schedule_overlap=true \
    --enable_prefix_cache=false \
    --enable_chunked_prefill=false \
    --enable_graph=true \
    --draft_model $DRAFT_MODEL_PATH \
    --num_speculative_tokens 1 \
    --tool_call_parser=auto \
    --enable_disagg_pd=true \
    --instance_role=DECODE \
    --etcd_addr=$LOCAL_HOST:3389 \
    --transfer_listen_port=$((36100 + i)) \
    --disagg_pd_port=8877 \
    > $LOG_FILE 2>&1 &
    done
    #--etcd_addr=$LOCAL_HOST:3389 参考etcd中advertise-client-urls的配置
    #--instance_role=DECODE PD配置,DECODE\PREFILL

    需要注意:

  • PD分离需要读取/etc/hccn.conf文件,确保将物理机上的该文件映射到了容器中

  • etcd_addr需与xllm_serviceetcd_addr相同 测试命令和上面类似,注意curl http://localhost:{PORT}/v1/chat/completions ...PORT选择为启动xLLM service的http_server_port

  • 多机部署P或者Q时(例如部署两个P),需要增加—rank_tablefile来完成通信。