## GLM-5.1
## 论文
[GLM-5.1: Towards Long-Horizon Tasks](https://z.ai/blog/glm-5.1)

## 模型简介
GLM-5.1 是智谱AI面向智能体工程的下一代旗舰模型，其代码能力相比前代显著增强。它在 SWE-Bench Pro 上达到了当前最优水平，并在 NL2Repo（代码仓库生成）和 Terminal-Bench 2.0（真实终端任务）上大幅领先于 GLM-5。
<div align=center>
    <img src="./doc/bench_51.png"/>
</div>
但最具意义的飞跃并不仅限于首次通过的表现。以往的模型（包括 GLM-5）往往过早耗尽其能力储备：它们会快速应用熟悉的技术以获得初步成果，随后便陷入停滞。即使给予更多时间也无济于事。

相比之下，GLM-5.1 被设计为在更长的时间跨度内持续高效地处理智能体任务。该模型在面对模糊问题时具备更佳的判断力，并能在更长时间的会话中保持高效产出。它能够分解复杂问题、运行实验、解读结果，并精准识别障碍点。通过不断回顾自身推理过程并反复迭代调整策略，GLM-5.1 能在数百轮交互和数千次工具调用中持续优化。运行时间越长，结果越好。

## 环境依赖
| 软件 |   版本    |
| :------: |:-------:|
|     DTK      | 26.04 |
|    python    | 3.10.12 |
| transformers |  5.2.0  |
|    torch     |  2.9.0 |
|     vllm     |  0.15.1  |
|    sglang    |  0.5.10rc0 |

当前仅支持镜像:
- **vLLM推理请使用:** harbor.sourcefind.cn:5443/dcu/admin/base/custom:vllm015-ubuntu22.04-dtk26.04-glm5-0408
- **SGLang推理请使用:** harbor.sourcefind.cn:5443/dcu/admin/base/custom:sglang-0.5.10-glm5-0416

- 挂载地址`-v`根据实际模型情况修改
- 下面以`vLLM`镜像启动示例，如果使用`SGLang`，请对应替换镜像地址

```bash
docker run -it \
    --shm-size 256g \
    --network=host \
    --name glm-5.1 \
    --privileged \
    --device=/dev/kfd \
    --device=/dev/dri \
    --device=/dev/mkfd \
    --group-add video \
    --cap-add=SYS_PTRACE \
    --security-opt seccomp=unconfined \
    -u root \
    -v /opt/hyhal/:/opt/hyhal/:ro \
    -v /path/your_code_data/:/path/your_code_data/ \
    harbor.sourcefind.cn:5443/dcu/admin/base/custom:vllm015-ubuntu22.04-dtk26.04-glm5-0408 bash
```

更多镜像可前往[光源](https://sourcefind.cn/#/service-list)下载使用。

## 数据集
`暂无`

## 训练
`暂无`

## 推理
> 如果出现`ImportError: librocm_smi64.so.2: cannot open shaned object file: No such file or directory`报错，系机器hyhal版本较低所致，请进行升级。

### SGLang
1. 加入环境变量
```bash
export SGLANG_USE_LIGHTOP=1
export HIP_GRAPH_USE_CMD_CACHE=0
export SGLANG_ROCM_USE_AITER_MOE=0
```

2. 启动服务
```bash
model_path=ZhipuAI/GLM-5.1-FP8

option="--numa-node 0 0 0 0 1 1 1 1 "
option+=" --disable-radix-cache "
option+=" --chunked-prefill-size 16384"
option+=" --page-size 64 "
option+=" --nsa-prefill-backend flashmla_auto --nsa-decode-backend flashmla_kv "
# option+=" --quantization slimquant_marlin "

python3 -m sglang.launch_server --model-path "${model_path}" ${option} \
                                --trust-remote-code \
                                --reasoning-parser glm45 \
                                --tool-call-parser glm47 \
                                --kv-cache-dtype fp8_e4m3 \
                                --dtype bfloat16 \
                                --mem-fraction-static 0.925 \
                                --host 0.0.0.0 \
                                --port 8001 \
                                --tp-size 8 \
                                --context-length 32768 \
                                --served-model-name glm-5.1-fp8
```

3. 启动完成后可通过以下方式访问：
```bash
curl http://localhost:8001/v1/chat/completions   \
    -H "Content-Type: application/json"  \
    -d '{
        "model": "glm-5.1-fp8",
        "messages": [
          {"role": "system", "content": "You are a helpful assistant."},
          {"role": "user", "content": "What is 15% of 240?"}
        ],
        "max_tokens": 2048,
        "temperature": 0.7,
        "chat_template_kwargs": {"enable_thinking": false}
    }'
```

### vllm
#### 单机推理
1. 加入环境变量
```bash
# 环境变量
rm -rf ~/.cache
rm -rf ~/.triton
export HIP_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
export ALLREDUCE_STREAM_WITH_COMPUTE=1
export NCCL_MIN_NCHANNELS=16
export NCCL_MAX_NCHANNELS=16
export Allgather_Base_STREAM_WITH_COMPUTE=1
export SENDRECV_STREAM_WITH_COMPUTE=1
export HIP_KERNEL_EVENT_SYSTENFENCE=1
export VLLM_RPC_TIMEOUT=1800000
export VLLM_USE_PD_SPLIT=1
export VLLM_USE_PIECEWISE=1
export VLLM_REJECT_SAMPLE_OPT=1
export USE_FUSED_RMS_QUANT=0
export USE_FUSED_SILU_MUL_QUANT=1
export VLLM_USE_GLOBAL_CACHE13=1
export VLLM_FUSED_MOE_CHUNK_SIZE=16384
export VLLM_CUSTOM_CACHE=1
export VLLM_USE_OPT_CAT=1
export VLLM_USE_FUSED_FILL_RMS_CAT=1
export VLLM_USE_LIGHTOP_MOE_SUM_MUL_ADD=0
export VLLM_USE_LIGHTOP_RMS_ROPE_CONCAT=0
export VLLM_USE_FLASH_MLA=1
export VLLM_DISABLE_DSA=0
export USE_LIGHTOP_TOPK=1
export USE_LIGHTOP_PER_TOKEN_GROUP_QUANT_FP8=1
export USE_LIGHTOP_CONVERT_REQ_INDEX_TO_GLOBAL_INDEX=1
```

2. 启动vllm serve
```bash
vllm serve ZhipuAI/GLM-5.1-FP8 \
    --gpu-memory-utilization 0.925 \
    --port 8001 \
    --tensor-parallel-size 8 \
    --tool-call-parser glm47 \
    --reasoning-parser glm45 \
    --enable-auto-tool-choice \
    --kv-cache-dtype fp8_ds_mla \
    --served-model-name glm-5.1-fp8 \
    --disable-log-requests \
    --compilation-config '{"pass_config": {"fuse_act_quant": false}}'
```

3. 启动完成后可通过以下方式访问：
```bash
curl http://localhost:8001/v1/chat/completions   \
    -H "Content-Type: application/json"  \
    -d '{
        "model": "glm-5.1-fp8",
        "messages": [
          {"role": "system", "content": "You are a helpful assistant."},
          {"role": "user", "content": "Summarize GLM-5 in one sentence."}
        ],
        "max_tokens": 4096,
        "temperature": 0.7,
        "chat_template_kwargs": {"enable_thinking": false}
    }'
```

#### 多机推理
1. 加入环境变量
> 请注意：
> 每个节点上的环境变量都写到.sh文件中，保存后各个计算节点分别source`.sh`文件
>
> VLLM_HOST_IP：节点本地通信口ip，尽量选择IB网卡的IP，**避免出现rccl超时问题**
>
> NCCL_SOCKET_IFNAME和 GLOO_SOCKET_IFNAME：节点本地通信网口ip对应的名称
>
> 通信口和ip查询方法：ifconfig
>
> IB口状态查询：ibstat  !!!一定要active激活状态才可用，各个节点要保持统一

```bash
export ALLREDUCE_STREAM_WITH_COMPUTE=1
export VLLM_HOST_IP=x.x.x.x # 对应计算节点的IP，选择IB口SOCKET_IFNAME对应IP地址
export NCCL_SOCKET_IFNAME=ibxxxx
export GLOO_SOCKET_IFNAME=ibxxxx
export NCCL_IB_HCA=mlx5_0:1 # 环境中的IB网卡名字
unset NCCL_ALGO
export NCCL_MIN_NCHANNELS=16
export NCCL_MAX_NCHANNELS=16
export NCCL_NET_GDR_READ=1
export HIP_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
export VLLM_SPEC_DECODE_EAGER=1
export VLLM_MLA_DISABLE=0
export VLLM_USE_FLASH_MLA=1
export VLLM_RPC_TIMEOUT=1800000

# 海光CPU绑定核
export VLLM_NUMA_BIND=1
export VLLM_RANK0_NUMA=0
export VLLM_RANK1_NUMA=1
export VLLM_RANK2_NUMA=2
export VLLM_RANK3_NUMA=3
export VLLM_RANK4_NUMA=4
export VLLM_RANK5_NUMA=5
export VLLM_RANK6_NUMA=6
export VLLM_RANK7_NUMA=7
```

2. 启动RAY集群
> x.x.x.x 对应第一步 VLLM_HOST_IP

```bash
# head节点执行
ray start --head --node-ip-address=x.x.x.x --port=6379 --num-gpus=8 --num-cpus=32
# worker节点执行
ray start --address='x.x.x.x:6379' --num-gpus=8 --num-cpus=32
```

3. 启动vllm serve
```bash
vllm serve ZhipuAI/GLM-5.1 \
    --port 8001 \
    --trust-remote-code \
    --tensor-parallel-size 32 \ # BW1000是32, BW1100是16
    --gpu-memory-utilization 0.85 \
    --distributed-executor-backend ray \
    --dtype bfloat16 \
    --max-model-len 32768 \
    --tool-call-parser glm47 \
    --reasoning-parser glm45 \
    --enable-auto-tool-choice \
    --served-model-name glm-5.1
```

4. 启动完成后可通过以下方式访问：
```bash
curl http://localhost:8001/v1/chat/completions   \
    -H "Content-Type: application/json"  \
    -d '{
        "model": "glm-5.1",
        "messages": [
          {"role": "system", "content": "You are a helpful assistant."},
          {"role": "user", "content": "Summarize GLM-5 in one sentence."}
        ],
        "max_tokens": 4096,
        "temperature": 1
    }'
```

## 效果展示
<div align=center>
    <img src="./doc/result-DCU.jpg"/>
</div>

### 精度
`DCU与GPU精度一致，推理框架：vllm。`

## 预训练权重
| 模型名称  | 权重大小  | DCU型号  | 最低卡数需求 |下载地址|
|:-----:|:----------:|:----------:|:---------------------:|:----------:|
| GLM-5.1 | 754B | BW1000  | 32 | [ModelScope](https://modelscope.cn/models/ZhipuAI/GLM-5.1) |
| GLM-5.1 | 754B | BW1100  | 16 | [ModelScope](https://modelscope.cn/models/ZhipuAI/GLM-5.1) |
| GLM-5.1-FP8 | 754B | BW1100  | 8 | [ModelScope](https://modelscope.cn/models/ZhipuAI/GLM-5.1-FP8) |

## 源码仓库及问题反馈
- https://developer.sourcefind.cn/codes/modelzoo/glm-5.1_vllm

## 参考资料
- https://github.com/zai-org/GLM-5
