GLM-4.7 接入 UCM 外部 KV Cache:vLLM-Ascend(Atlas 800 A2)与 vLLM(H100)双平台部署实战
GLM-4.7 接入 UCM 外部 KV Cache:vLLM-Ascend(Atlas 800 A2)与 vLLM(H100)双平台部署实战
本文基于 UCM(unified-cache-management)仓库中 Model Tour 的 GLM 文档,完整演示如何在 Ascend Atlas 800 A2 与 NVIDIA H100 两类硬件上,将 GLM-4.7 模型部署为带 UCM 外部 KV Cache 持久化能力的 vLLM / vLLM-Ascend 推理服务:从 Docker 容器启动、UCM YAML 配置、--kv-transfer-config 接线到 API 验证,并对照仓库源码解释每个关键参数与配置加载链路,帮助读者直接复制运行并理解 UCM 在 vLLM 中的集成机制。
一、适用场景与支持范围
UCM 的 Model Tour 按模型家族组织部署教程,GLM 家族页面提供两条完整部署路线:
- Atlas 800 A2(Ascend NPU):部署
GLM-4.7-W8A8-floatmtp(W8A8 量化 + float MTP 权重,可在 ModelScope 的 Eco-Tech/GLM-4.7-W8A8-floatmtp 获取),推理引擎为 vLLM-Ascend,使用预构建的 UCM Docker 镜像; - NVIDIA H100(CUDA):部署
GLM-4.7-FP8(FP8 权重),推理引擎为 vLLM,同样使用预构建 UCM 镜像。
仓库的支持矩阵(docs/docs-site/docs/en/user-guide/support-matrix/index.md)中,GLM-4.x 在 vLLM、vLLM-Ascend、SGLang 三个引擎列均标记为 Supported;计算平台覆盖 CANN(910C、910B、950PR、950DT)与 CUDA(H100、H20、L40、L20)。GLM-4.7 属于 GLM-4.x 系列,与本页教程一致。
两条路线的共同骨架是:
- 宿主机上启动 UCM 预构建镜像容器,挂载模型权重与缓存目录;
- 容器内生成 UCM 配置文件(
Cache|Posix管线:主机内存缓存 + Posix 文件系统持久化); - 通过 vLLM 的
--kv-transfer-config参数接入UCMConnector,指定UCM_CONFIG_FILE; - 用 OpenAI 兼容 API 验证服务。
下文按两条路线分别给出全部可复制命令,并在最后结合仓库源码统一解析关键参数。
二、路线一:vLLM-Ascend + GLM-4.7-W8A8-floatmtp(Atlas 800 A2)
2.1 启动 Docker 容器
将 MODEL_PATH 设为宿主机上的本地模型目录,并从 Quickstart 中复制一个支持 GLM-4.7 且匹配你 Ascend 硬件的 UCM 镜像引用到 IMAGE。以下命令在宿主机上执行:
export MODEL_PATH=/data/weights/GLM-4.7-W8A8-floatmtp
export IMAGE='<full Ascend UCM image reference from Quickstart>'
export CONTAINER_NAME=glm47-ucm
mkdir -p /data/ucm/cache /data/ucm/log
docker pull "$IMAGE"
docker run --rm -it \
--name "$CONTAINER_NAME" \
--network host \
--ipc=host \
--device /dev/davinci0 \
--device /dev/davinci1 \
--device /dev/davinci2 \
--device /dev/davinci3 \
--device /dev/davinci4 \
--device /dev/davinci5 \
--device /dev/davinci6 \
--device /dev/davinci7 \
--device /dev/davinci_manager \
--device /dev/devmm_svm \
--device /dev/hisi_hdc \
-v /usr/local/dcmi:/usr/local/dcmi:ro \
-v /usr/local/Ascend/driver/tools/hccn_tool:/usr/local/Ascend/driver/tools/hccn_tool:ro \
-v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi:ro \
-v /usr/local/Ascend/driver:/usr/local/Ascend/driver:ro \
-v /etc/ascend_install.info:/etc/ascend_install.info:ro \
-v /etc/hccn.conf:/etc/hccn.conf:ro \
-v "$MODEL_PATH:/data/weights/GLM-4.7-W8A8-floatmtp:ro" \
-v /data/ucm:/data/ucm \
-e ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \
-e ENABLE_UCM_PATCH=1 \
-e UCM_LOG_PATH=/data/ucm/log \
--workdir /workspace \
--entrypoint /bin/bash \
"$IMAGE"
要点说明:
- 8 张 910 系列 NPU 通过
--device /dev/davinci{0..7}逐个直通,ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7让运行时可见全部 8 卡,与后面--tensor-parallel-size 8对应; ENABLE_UCM_PATCH=1是关键开关:它触发 UCM 对 vLLM 的运行时 monkey patch。从源码看,ucm/integration/vllm/patch/apply_patch.py 中读取该环境变量(值为1/true时启用),用于替代手工git apply,把 UCM 需要的引擎改造打进当前 vLLM 进程;UCM_LOG_PATH=/data/ucm/log指定 UCM 日志目录;/data/ucm挂载进容器,其中cache子目录用于 KV 数据落盘;- 宿主机 Ascend 驱动(
/usr/local/Ascend/driver、ascend_install.info、hccn.conf等)以只读方式挂入容器。
2.2 配置 UCM
进入容器内执行,创建 /workspace/ucm_config_example.yaml:
cat > /workspace/ucm_config_example.yaml <<'EOF'
ucm_connectors:
- ucm_connector_name: "UcmPipelineStore"
ucm_connector_config:
store_pipeline: "Cache|Posix"
storage_backends: "/data/ucm/cache"
io_direct: false
cache_buffer_capacity_gb: 64
posix_capacity_gb: 0
use_gdr: false
enable_event_sync: true
use_layerwise: true
enable_record_traces: false
use_lite: false
persist_token_threshold: 0
EOF
该配置与仓库示例 examples/ucm_config_example.yaml 结构一致,各字段含义(完整字段定义见 Configuration Parameters):
ucm_connector_name: UcmPipelineStore:选择 Pipeline Store,其store_pipeline在 ucm/store/pipeline/connector.py 中注册,Cache|Posix属于正常生产用例;store_pipeline: "Cache|Posix":KV 数据先经过主机内存缓存(Cache 级),再持久化到 Posix 文件系统(/data/ucm/cache),实现"快路径命中 + 冷数据落盘"的两级布局;io_direct: false:走 OS PageCache 而非 Direct I/O(默认值为true,即绕过 PageCache);cache_buffer_capacity_gb: 64:显式为 Cache 级设置 64 GiB 主机缓冲预算。若不显式配置,vLLM connector 在共享缓冲启用时会取 128 GiB 默认值,显式正容量会覆盖该默认;posix_capacity_gb: 0:关闭基于容量的 Posix 垃圾回收(GC 触发条件为已用量 >=posix_capacity_gb * posix_gc_trigger_threshold_ratio,取 0 即不触发);注意它不会禁止文件系统写入,只是不做容量回收;- 根级开关:
enable_event_sync: true(性能优化开关,推荐开启)、use_layerwise: true(逐层 load/save 模式,推荐值)、use_lite: false(Lite 模式只存/查元数据不搬 KV 数据,仅用于估算命中率)、persist_token_threshold: 0(请求长度低于该阈值时 UCM 不处理,0 表示不限制)。
2.3 启动推理服务
服务参数需参考 vLLM-Ascend 官方文档的 GLM4.x 指南。以下命令在容器内执行:
export MODEL_PATH=/data/weights/GLM-4.7-W8A8-floatmtp
export ENABLE_UCM_PATCH=1
export VLLM_CPU_AFFINITY=1
export HCCL_BUFFSIZE=512
export OMP_PROC_BIND=false
export OMP_NUM_THREADS=1
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
export HCCL_OP_EXPANSION_MODE=AIV
export VLLM_ASCEND_BALANCE_SCHEDULING=1
export VLLM_ASCEND_ENABLE_TOPK_OPTIMIZE=1
vllm serve "$MODEL_PATH" \
--host 0.0.0.0 \
--port 7800 \
--data-parallel-size 1 \
--tensor-parallel-size 8 \
--enable-expert-parallel \
--seed 1024 \
--served-model-name glm \
--max-model-len 133000 \
--max-num-batched-tokens 8192 \
--max-num-seqs 16 \
--async-scheduling \
--quantization ascend \
--trust-remote-code \
--gpu-memory-utilization 0.9 \
--speculative-config '{"num_speculative_tokens":3,"method":"mtp"}' \
--compilation-config '{"cudagraph_capture_sizes":[1,2,4,8,16,32,64,128,256,512],"cudagraph_mode":"FULL_DECODE_ONLY"}' \
--additional-config '{"enable_cpu_binding":false,"enable_shared_expert_dp":true,"ascend_fusion_config":{"fusion_ops_gmmswigluquant":false}}' \
--kv-transfer-config '{
"kv_connector": "UCMConnector",
"kv_connector_module_path": "ucm.integration.vllm.ucm_connector",
"kv_role": "kv_both",
"kv_connector_extra_config": {
"UCM_CONFIG_FILE": "/workspace/ucm_config_example.yaml"
}
}'
关键参数解读:
--quantization ascend:匹配 W8A8 量化权重在 NPU 上的反量化路径;--tensor-parallel-size 8+--enable-expert-parallel:8 卡 TP,并对 MoE 专家启用专家并行;--speculative-config '{"num_speculative_tokens":3,"method":"mtp"}:启用 MTP(Multi-Token Prediction)投机解码,与 floatmtp 权重配套;--max-model-len 133000:约 133K 上下文,是长上下文 KV 复用场景的主要收益来源。
--kv-transfer-config 是 vLLM 与 UCM 的接线点:
| 字段 | 作用 |
|---|---|
kv_connector |
选择 UCMConnector。 |
kv_connector_module_path |
指定 connector 模块:ucm.integration.vllm.ucm_connector。 |
kv_role |
kv_both 同时启用 KV Cache 的加载(load)与保存(save)。 |
kv_connector_extra_config.UCM_CONFIG_FILE |
指向第 2.2 步创建的 /workspace/ucm_config_example.yaml。 |
2.4 调用 API 验证
服务就绪后,打开宿主机上的第二个终端:
curl --fail http://127.0.0.1:7800/health
curl --fail http://127.0.0.1:7800/v1/models
curl --fail-with-body http://127.0.0.1:7800/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{
"model": "glm",
"messages": [
{
"role": "user",
"content": "Explain the role of KV cache in large language model inference."
}
],
"max_completion_tokens": 1024,
"temperature": 0
}'
预期结果:HTTP 200、/v1/models 返回模型列表中包含 glm、chat completion 响应包含 choices 字段。注意 HTTP 服务就绪只说明引擎启动成功,并不等于 UCM 缓存命中;要确认外部缓存生效,请按 Quickstart 的验证方法,用跨越多个 128-token block 的可复现长前缀重放请求,并检查 ucm: 前缀的 metrics 与外部命中计数。
三、路线二:vLLM + GLM-4.7-FP8(NVIDIA H100)
3.1 启动 Docker 容器
在宿主机设置 MODEL_PATH 为本地模型目录,并从 Quickstart 复制一个支持该模型与 H100 的 CUDA UCM 镜像引用到 IMAGE:
export MODEL_PATH=/data/weights/GLM-4.7-FP8
export IMAGE='<full CUDA UCM image reference from Quickstart>'
export CONTAINER_NAME=glm47-ucm-h100
mkdir -p /data/ucm/cache /data/ucm/log
docker pull "$IMAGE"
docker run --rm -it \
--name "$CONTAINER_NAME" \
--gpus '"device=0,1,2,3,4,5,6,7"' \
--ipc=host \
--network=host \
-v "$MODEL_PATH:/data/weights/GLM-4.7-FP8:ro" \
-v /data/ucm:/data/ucm \
--workdir /workspace \
--entrypoint /bin/bash \
"$IMAGE"
与 A2 路线相比,CUDA 路线只需 --gpus 设备直通与 --ipc=host(保证共享内存充足),无需 Ascend 驱动挂载。
3.2 配置 UCM
在容器内执行,配置内容与 A2 路线一致,同样使用 Cache|Posix 管线写入 /data/ucm/cache:
mkdir -p /data/ucm/cache /data/ucm/log
cat > /workspace/ucm_config_example.yaml <<'EOF'
ucm_connectors:
- ucm_connector_name: "UcmPipelineStore"
ucm_connector_config:
store_pipeline: "Cache|Posix"
storage_backends: "/data/ucm/cache"
io_direct: false
cache_buffer_capacity_gb: 64
posix_capacity_gb: 0
use_gdr: false
enable_event_sync: true
use_layerwise: true
enable_record_traces: false
use_lite: false
persist_token_threshold: 0
EOF
Cache|Posix:KV 数据经主机内存中转并持久化到/data/ucm/cache;cache_buffer_capacity_gb: 64:主机缓存缓冲预算 64 GiB;posix_capacity_gb: 0:关闭容量式 GC,但不影响文件系统写入。
参数完整定义见 Configuration Parameters。
3.3 启动推理服务
在容器内执行:
export MODEL_PATH=/data/weights/GLM-4.7-FP8
export ENABLE_UCM_PATCH=1
export UCM_LOG_PATH=/data/ucm/log
vllm serve "$MODEL_PATH" \
--host 0.0.0.0 \
--port 7800 \
--data-parallel-size 1 \
--tensor-parallel-size 8 \
--served-model-name glm47 \
--max-model-len 32768 \
--max-num-seqs 8 \
--max-num-batched-tokens 8192 \
--trust-remote-code \
--gpu-memory-utilization 0.90 \
--enable-prefix-caching \
--block-size 128 \
--enable-auto-tool-choice \
--tool-call-parser glm47 \
--reasoning-parser glm45 \
--speculative-config '{"method":"mtp","num_speculative_tokens":1}' \
--enforce-eager \
--kv-transfer-config '{
"kv_connector": "UCMConnector",
"kv_connector_module_path": "ucm.integration.vllm.ucm_connector",
"kv_role": "kv_both",
"kv_connector_extra_config": {
"UCM_CONFIG_FILE": "/workspace/ucm_config_example.yaml"
}
}'
CUDA 路线的模型侧要点:
--served-model-name glm47:对外模型名与 A2 路线的glm不同,调用 API 时务必一致;--enable-prefix-caching+--block-size 128:开启引擎内前缀缓存,128 token 的块大小与 UCM 外部缓存的块粒度对齐;--tool-call-parser glm47、--reasoning-parser glm45:分别启用 GLM-4.7 的自动工具调用解析与 GLM-4.5 风格的推理内容解析;--speculative-config '{"method":"mtp","num_speculative_tokens":1}':单 token MTP 投机解码;--max-model-len 32768:32K 上下文,长于 A2 路线的 133K 设定,可按显存与业务调整。
--kv-transfer-config 各字段作用与 A2 路线表格完全一致(kv_connector、kv_connector_module_path、kv_role: kv_both、UCM_CONFIG_FILE)。
3.4 调用 API 验证
服务就绪后,在宿主机第二个终端执行(注意 model 字段为 glm47):
curl --fail http://127.0.0.1:7800/health
curl --fail http://127.0.0.1:7800/v1/models
curl --fail-with-body http://127.0.0.1:7800/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{
"model": "glm47",
"messages": [
{
"role": "user",
"content": "Explain the role of KV cache in large language model inference."
}
],
"max_completion_tokens": 1024,
"temperature": 0
}'
预期结果:HTTP 200、模型列表包含 glm47、响应含 choices 字段。
四、配置加载链路与关键实现(源码级)
以上两条路线共用同一套 vLLM 集成机制,结合仓库源码可以看清完整链路:
- YAML 解析:
--kv-transfer-config传入的kv_connector_extra_config.UCM_CONFIG_FILE由 ucm/utils.py 中的Config._load_config读取——若存在UCM_CONFIG_FILE键则调用load_ucm_config_from_yaml加载 YAML 文件(文件缺失或解析失败会记录日志并回退为空配置);若未提供该键,则退化为直接把kv_connector_extra_config作为配置(向后兼容),两者都没有时使用默认的UcmNfsStore配置并打印告警。 - 连接器实例化:ucm/integration/vllm/ucm_connector.py 中的
UCMConnector(继承 vLLM 的KVConnectorBase_V1并实现SupportsHMA)在构造时读取ENABLE_UCM_PATCH与VLLM_CPU_AFFINITY两个环境变量并打印环境检查日志(L3235-L3243),随后经Config(vllm_config.kv_transfer_config)得到launch_config,即你在 YAML 中写的全部参数。这也是为什么两条路线都要求导出ENABLE_UCM_PATCH=1:运行时补丁开关与 connector 缺一不可。 - Store 构建:
UcmPipelineStore由 ucm/store/factory_v1.py 按ucm_connector_name映射到 ucm/store/pipeline/connector.py 中的实现类,store_pipeline字符串再通过UcmPipelineStoreBuilder.register("Cache|Posix", ...)注册表(L395)找到对应 builder,按"Cache 级 → Posix 级"组装管线。启动日志中确认出现create UcmPipelineStore with config:及预期存储路径,是管线装配成功的直观信号。 - 角色与容错:
kv_role: kv_both使 connector 同时承担 load/save 职责;源码中还可以看到,对多 KV 分组(hybrid multi-group)模型,UCMConnector 明确拒绝kv_load_failure_policy='recompute'组合(L3247-L3270),默认fail策略下加载失败的请求会走引擎自身的重算路径。
五、验证、排障与调优建议
- 区分"服务就绪"与"缓存命中":
/health与/v1/models通过只证明引擎起来了。按 Quickstart 的方法,构造跨越多个 128-token block 的可复现长前缀请求发送两次(或保留缓存目录后重启服务再重放),检查/metrics中ucm:前缀指标的外部命中数、完成加载数与输出正确性; - 多实例共享存储:
posix_capacity_gb只控制 GC 预算,不预留文件系统空间。多实例共享同一文件系统时,应只让一个实例启用 GC,其余保持0,避免各自按独立预算回收; - 命中率评估:需要单独评估 KV Cache 命中率而不实际搬运数据时,可临时设
use_lite: true(只存/查元数据,无加速效果),评估完毕再切回false; - 参数修改:存储与后端的更多选项(Mooncake、3FS、压缩、NFS 直连等)见 developer-guide/cache-configuration;命中缺失或加载失败的通用排查见 troubleshooting。
六、小结
GLM 家族的 UCM 部署遵循统一模板:容器挂载权重与缓存目录 → 容器内生成 Cache|Posix 管线 YAML → --kv-transfer-config 指定 UCMConnector 与 UCM_CONFIG_FILE → OpenAI 兼容 API 验证。A2 路线面向 W8A8 + MTP 的 8 卡 NPU 长上下文(133K)部署,H100 路线面向 FP8 权重的 8 卡 GPU 部署,二者的差异集中在量化方式、上下文长度、投机解码规模与工具/推理解析器上,UCM 侧配置则完全一致。掌握这一模板后,替换权重路径与模型专属引擎参数,即可将同一套外部 KV Cache 加速方案平移到 Model Tour 中的其他模型家族。