
# GLM-5模型基于ModelArts轻量算力节点适配NPU推理指导
#### 方案概览
本文主要介绍如何在ModelArts的轻量算力节点环境中，部署GLM-5模型并使用NPU卡Snt9b23进行推理。
GLM-5是智谱AI发布的新一代开源旗舰大模型，主打复杂系统工程与长程智能体任务，在编程与Agent能力上获得开源SOTA表现。
#### 获取镜像
 表1获取镜像 
| 分类   | 名称                                                                                                                                                                                                                     | 获取路径    |
|:---|:---|:---|
| 基础镜像 | Snt9b23：西南-贵阳一： swr.cn-southwest-2.myhuaweicloud.com/com-huaweicloud-mastudio/vllm-ascend:ascend-vllm_glm5-a3-v20.20260213001022.127106045 | 从SWR拉取。 |
   
#### 约束限制
- 确保容器可以访问公网。
 
#### 步骤一：准备环境
1. 请参考[轻量算力节点资源开通](https://support.huaweicloud.com/resmgmt-modelarts/usermanual-server-0005.html)，购买轻量算力节点资源，并确保机器已开通，密码已获取，能通过SSH登录，不同机器之间网络互通。
   ![](https://support.huaweicloud.com/bestpractice-modelarts/public_sys-resources/note_3.0-zh-cn.png)
   当容器需要提供服务给多个用户，或者多个用户共享使用该容器时，应限制容器访问Openstack的管理地址（169.254.169.254），以防止容器获取宿主机的元数据。具体操作请参见[禁止容器获取宿主机元数据](https://support.huaweicloud.com/bestpractice-cce/cce_bestpractice_0318.html#section4)。
   
2. SSH登录机器后，检查NPU设备状态。运行如下命令，返回NPU设备信息。
   ```
   npu-smi info                    # 在每个实例节点上运行此命令可以看到NPU卡状态
   npu-smi info -l | grep Total    # 在每个实例节点上运行此命令可以看到总卡数
   ```
   如出现错误，可能是机器上的NPU设备没有正常安装，或者NPU镜像被其他容器挂载。请先正常[安装固件和驱动](https://support.huaweicloud.com/resmgmt-modelarts/usermanual-server-0033.html)，或释放被挂载的NPU。
   
3. 检查docker是否安装。
   ```
   docker -v   #检查docker是否安装
   ```
   如尚未安装，运行以下命令安装docker。
   ```
   yum install -y docker-engine.aarch64 docker-engine-selinux.noarch docker-runc.aarch64
   ```
   
4. 配置IP转发，用于容器内的网络访问。执行以下命令查看net.ipv4.ip_forward配置项的值，如果为1，可跳过此步骤。
   ```
   sysctl -p | grep net.ipv4.ip_forward
   ```
   如果net.ipv4.ip_forward配置项的值不为1，执行以下命令配置IP转发。
   ```
   sed -i 's/net\.ipv4\.ip_forward=0/net\.ipv4\.ip_forward=1/g' /etc/sysctl.conf
   sysctl -p | grep net.ipv4.ip_forward
   ```
   
 
#### 步骤二：获取基础镜像
建议使用官方提供的镜像部署服务。镜像地址{image_url}参见[表1]。
```
docker pull {image_url}
```
#### 步骤三：启动容器镜像
1. Snt9b23启动容器镜像。启动前请先按照参数说明修改${}中的参数。
   ```
   export work_dir="自定义挂载的工作目录"
   export container_work_dir="自定义挂载到容器内的工作目录"
   export container_name="自定义容器名称"
   export image_name="镜像名称或ID"
   // 启动一个容器去运行镜像 
   docker run -itd --shm-size=500g \
       --net=host \
       --privileged=true \
       -u root \
       -w /home/models \
       --device=/dev/davinci_manager \
       --device=/dev/hisi_hdc \
       --device=/dev/devmm_svm \
       --entrypoint=bash \
       -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
       -v /usr/local/dcmi:/usr/local/dcmi \
       -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
       -v /etc/ascend_install.info:/etc/ascend_install.info \
       -v /usr/local/sbin:/usr/local/sbin \
       -v /etc/hccn.conf:/etc/hccn.conf \
       -v /usr/bin/hccn_tool:/usr/bin/hccn_tool \
       -v ${work_dir}:${container_work_dir} \
       --name ${container_name} \
       ${image_name}
   ```
   **参数说明：**
   - -v ${work_dir}:${container_work_dir}：代表需要在容器中挂载宿主机的目录。宿主机和容器使用不同的文件系统。work_dir为宿主机中工作目录，目录下可存放项目所需代码、数据等文件。container_work_dir为要挂载到的容器中的目录。为方便两个地址可以相同。
     ![](https://support.huaweicloud.com/bestpractice-modelarts/public_sys-resources/note_3.0-zh-cn.png)
     driver及npu-smi需同时挂载至容器。
     
   
   - --name ${container_name}：容器名称，进入容器时会用到，此处可以自己定义一个容器名称。
   
   - ${image_name}：容器镜像的名称，获取地址参见[表1]。
    
2. Snt9b23需要使用root权限进入容器中。
   ```
   docker exec -itu root ${container_name} bash
   ```
   
 
#### 步骤四：下载模型权重
[下载模型权重](https://modelers.cn/models/Eco-Tech/GLM-5-w4a8/tree/main)
如下图所示，下载GLM-5-w4a8权重下所有文件。在**步骤三** 的${work_dir}目录下创建GLM5-w4a8目录，并下载权重到GLM5-w4a8目录，容器启动时使用${container_work_dir}目录加载权重。
图1下载GLM-5-w4a8模型权重   
![](https://support.huaweicloud.com/bestpractice-modelarts/figure/zh-cn_image_0000002553721957.png "点击放大")
#### 步骤五：启动GLM5推理服务
调用推理服务请在服务器端通过命令行调用。
```
# 挂载到的容器中的工作目录，，具体配置值以挂载到容器的工作目录为准
container_work_dir="/xxx/"
# 环境变量配置
export HCCL_OP_EXPANSION_MODE="AIV"
export OMP_PROC_BIND=false
export OMP_NUM_THREADS=10
export VLLM_USE_V1=1
export HCCL_BUFFSIZE=200
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
export VLLM_ASCEND_BALANCE_SCHEDULING=1
export VLLM_LOGGING_CONFIG_PATH=//home/ma-user/AscendCloud/logging_config.json
export VALIDATORS_CONFIG_PATH=/home/ma-user/AscendCloud/validator_without_gd.json
# 启动推理服务
vllm serve ${container_work_dir}/GLM5-w4a8 \
--host 0.0.0.0 \
--port 8077 \
--data-parallel-size 1 \
--tensor-parallel-size 16 \
--enable-expert-parallel \
--seed 1024 \
--served-model-name glm-5 \
--max-num-seqs 8 \
--max-model-len 131072 \
--max-num-batched-tokens 4096 \
--trust-remote-code \
--gpu-memory-utilization 0.95 \
--quantization ascend \
--enable-chunked-prefill \
--enable-prefix-caching \
--tool-call-parser glm47 \
--reasoning-parser glm45 \
--async-scheduling \
--enable-auto-tool-choice \
--middleware vllm.entrypoints.middleware.param_check.ValidateSamplingParams \
--additional-config '{"multistream_overlap_shared_expert":true}' \
--compilation-config '{"cudagraph_mode": "FULL_DECODE_ONLY"}' \
--speculative-config '{"num_speculative_tokens": 3, "method": "deepseek_mtp"}'
```
参数解释如下：
- model_path：模型权重路径，当前设置为**${container_work_dir}/GLM5-w4a8**
- served-model-name：模型名称
- max-model-len：模型支持的最大长度
 
#### 步骤六：查看GLM5推理结果
通过以下命令可以请求服务推理
```
curl http://127.0.0.1:8077/v1/chat/completions -H "Content-Type: application/json" -d '{"messages": [{"role": "user", "content": "我想去洗车，洗车店距离我家50米，你说我应该开车过去还是走过去？"}], "model": "glm-5"}' | jq
```
图2查看推理结果   
![](https://support.huaweicloud.com/bestpractice-modelarts/figure/zh-cn_image_0000002522640100.png "点击放大")
