GLM-Image 是一个基于多模态大语言模型的图像生成模型,由智谱AI开发。该模型采用两阶段架构:
GLM-Image支持以下功能:
| 组件 | 版本 | 说明 |
|---|---|---|
| vllm | v0.18.0 | 核心推理引擎 |
| vllm-ascend | v0.18.0rc1 | 昇腾NPU适配 |
| vllm-omni | v0.18.0 | 多模态扩展 |
| transformers | 4.37.0+ | HuggingFace模型库 |
| diffusers | 0.25.0+ | 扩散模型库 |
| torch | 2.1.0+ | PyTorch框架 |
| 部署方式 | 硬件配置 | 组网方式 | 优势 | 劣势 |
|---|---|---|---|---|
| 单卡部署 | 昇腾910B 32GB | 单卡 | 部署简单,配置方便 | 处理超大图片可能有内存溢出风险 |
| 多卡部署 | 多个昇腾910B | DP/SP | 能处理大图片,性能更好 | 部署复杂,需要配置分布式 |
下载当前仓库下的 glm-image.tar 到目标机器:
# 将镜像文件传输到目标机器
scp glm-image.tar user@target-machine:/path/to/destination/在目标机器执行:
docker load -i glm-image.tardocker run -it -u root -d --net=host \
--privileged \
--ipc=host \
--device=/dev/davinci_manager \
--device=/dev/devmm_svm \
--device=/dev/hisi_hdc \
-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 /usr/local/sbin:/usr/local/sbin \
-v /usr/local/Ascend/driver/tools/hccn_tool:/usr/local/Ascend/driver/tools/hccn_tool \
-v /opt/data/weights/modelscope:/opt/data/weights/modelscope \
--name glm-image \
glm-image:omni-v0.18.0.rc \
/bin/bash注意事项:
/opt/data/weights/modelscope 为实际的权重地址--name glm-image 可以按需修改容器名称-c "cd /vllm-workspace/glm_image && ./start_graph.sh"docker pull quay.io/ascend/vllm-ascend:v0.18.0rc1# 创建模型目录
mkdir -p /opt/data/weights/modelscope
# 下载GLM-Image模型
modelscope download --model ZhipuAI/GLM-Image --local_dir /opt/data/weights/modelscope/GLM-Imagedocker run -it -u root -d --net=host \
--privileged \
--ipc=host \
--device=/dev/davinci_manager \
--device=/dev/devmm_svm \
--device=/dev/hisi_hdc \
-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 /usr/local/sbin:/usr/local/sbin \
-v /usr/local/Ascend/driver/tools/hccn_tool:/usr/local/Ascend/driver/tools/hccn_tool \
-v /opt/data/weights/modelscope:/opt/data/weights/modelscope \
--name glm-image \
quay.io/ascend/vllm-ascend:v0.18.0rc1 \
/bin/bash进入容器后执行:
# 进入容器
docker exec -it glm-image bash
# 安装基础依赖
pip install transformers==4.37.0 diffusers==0.25.0
# 下载vllm-omni代码
cd /vllm-workspace
git clone -b v0.18.0 https://github.com/vllm-project/vllm-omni.git
cd vllm-omni
# 安装vllm-omni
VLLM_OMNI_TARGET_DEVICE=npu pip install -v -e .如果有必要的补丁文件,应用补丁:
cd /vllm-workspace
patch -p1 < vllm-omni-v0.18.0.patch注意事项:
git diff 命令生成,格式为 unified diffpatch -p1 参数表示忽略补丁文件中的第一级路径前缀--dry-run 参数先测试补丁应用使用提供的离线测试脚本:
cd /vllm-workspace/glm_image/test/offline
# 默认生成1920x1024分辨率的图像
./run.sh
# 指定分辨率生成图像
./run.sh 1536 864 # 生成1536x864分辨率的图像
./run.sh 512 512 # 生成512x512分辨率的图像run.sh 脚本参数:
output_{width}x{height}.pnge2e_{width}x{height}.log示例输出:
运行测试后,会在当前目录生成图像文件,例如:
# 生成1920x1024分辨率的图像
./run.sh
# 查看生成的图像
ls -lh output_1920x1024.png生成的图像文件位于 /vllm-workspace/glm_image/test/offline/output_{width}x{height}.png,可以直接使用图片查看器打开查看生成效果。

根据需要选择启动方式:
方式1:SP+Graph模式(推荐)
cd /vllm-workspace/glm_image/bin
./start_sp.sh方式2:graph模式(全图模式)
cd /vllm-workspace/glm_image/bin
./start_graph.shGraph模式配置文件 (glm_image_graph.yaml):
SP+全图模式配置文件 (glm_image_diffusion_sp.yaml):
关键配置参数说明:
AR模型配置(Stage 0)
model_stage: ar - 指定为AR模型阶段max_num_seqs: 1 - 最大批处理数量,图像生成通常设置为1gpu_memory_utilization: 0.7 - GPU显存利用率,根据实际情况调整max_tokens: 3601 - 最大生成token数,需要根据目标分辨率动态计算stop_token_ids: [16385] - EOS token ID,确保AR模型正确停止temperature: 0.9 - 采样温度,控制生成随机性top_p: 0.75 - 核采样参数top_k: 16512 - 视觉词汇表大小Diffusion模型配置(Stage 1)
model_stage: dit - 指定为DiT模型阶段num_inference_steps: 50 - 扩散推理步数,影响生成质量和速度guidance_scale: 1.5 - 引导系数,控制生成与提示词的符合度height/width - 生成图像的尺寸并行配置
tensor_parallel_size: 2 - 张量并行度,将模型权重切分到多个设备sequence_parallel_size: 2 - 序列并行度,将序列切分到多个设备ulysses_degree: 2 - Ulysses算法的并行度ring_degree: 1 - Ring并行度方式1:使用OpenAI兼容接口
cd /vllm-workspace/glm_image/test/online
# 默认生成1920x1024分辨率的图像
./openai.sh
# 指定分辨率
./openai.sh 1536 864方式2:使用Images API
cd /vllm-workspace/glm_image/test/online
# 默认生成1920x1024分辨率的图像
./test.sh
# 指定分辨率
./test.sh 1536 864测试脚本会生成以下文件:
output_t2i_{width}x{height}.png:生成的图像resp.json:API响应结果示例输出:
运行测试后,会在当前目录生成图像文件:
# 生成1536x864分辨率的图像
./test.sh 1536 864
# 查看生成的图像
ls -lh output_t2i_1536x864.png
# 查看API响应
cat resp.json | python3 -m json.tool生成的图像文件位于 /vllm-workspace/glm_image/test/online/output_t2i_{width}x{height}.png,可以直接使用图片查看器打开查看生成效果。

当前大部分代码来源于社区的pr,但是由于社区的pr基于0.19.0开发,而当前昇腾库依赖0.18.0,导致大部分变更需要手动合入。
| PR | 主要修改点 |
|---|---|
| PR:3245 | cache default HF processor to reduce input preprocessing latency |
| PR:920 | GLM Image 性能调优 |
| PR:1399 | cache-dit for GLM-Image |
| PR:1983 | add GLM-Image SP support |
| PR:3235 | fix(npu)per-stage runtime env for HCCL ports + GLM-Image NPU stage config |
| PR: 2267 | Fix image quality in /v1/images/generations for multi-stage pipeline |
由于GLM-Image包含AR与DiT两大模块,二者特性差异较大,需针对性开展优化。
| DIT 类生成模型加速 (非自回归迭代) | 自回归 (AR) 大模型加速 (LLM/VLM) | |
|---|---|---|
| 适用场景 | 多模态生成:视图生成、3D 重建 | 文本生成:聊天对话、代码生成 |
| 计算模式 | 扩散迭代:固定步数 T,逐步去噪 | 串行依赖:Token i 依赖 Token i-1 |
| 性能瓶颈 | Prefill: 计算bound | Prefill: 计算bound, Decode: 显存带宽Bound |
| 加速重点 | 减少FA计算、多卡并行拆分序列等 | KVCache显存优化、提高BatchSize等 |
| 并行方式 | USP/CFG/TP/EP/VAEPatch | DP/TP/EP/PP/CP/SP |
| 推理引擎 | Diffusers、DiffSynthEngine等 | vLLM、Sglang等 |
使用1张910b3卡进行50 steps推理,生成1024x1024大小的图片,进行性能基线数据收集,如下为整体耗时统计。

AR-97.8s、DiT-37.3s、E2E-140.5s(input_preprocess_time-5.3s)
在基线场景的profiling分析报告中可以看到,空泡占比约79.6%,存在明显的hostbound,因此考虑启用图模式以降低host侧开销,减少host和kernel之间的交付。

由于AR部分会循环1281次请求,每个请求仅执行一次prefill,随后进行多轮自回归decode,且单次prefill耗时小于200ms,decode阶段占主导,所有重点是优化当前阶段的decode时延。在vLLM-Omni中,AR阶段可通过配置文件直接开启vLLM 的编译与图相关能力。结合当前局点以E2E时延为优先的目标,据此Stage0选用FULL_DECODE_ONLY,并设置cudagraph_capture_sizes: [1, 2],与小batch场景对齐,在控制显存与capture成本的同时,重点优化decode路径。

虽然配置名是cuda,但是vllm-omni在底层进行了抽象,主要用于静态图捕获 + 静态尺寸推理,所以cuda和cann通用。
开启图模式结果:AR-29.6s、DiT-37.1s、E2E-66.7s
从上图可以看出,优化后free的比例从79%降低到18%,还有一定的优化空间。

继续分析AR模块的算子占比,发现MM占比71%,考虑使用TP优化。在vLLM-Omni中,AR阶段的TP完整复用vLLM标准方案,部署侧通过tensor_parallel_size开启。
- stage_id: 0
...
devices: "0,1,2,3"
tensor_parallel_size: 4结果:AR-19.8s,DiT-31.0s,E2E-56.8s。现在AR模型的耗时从97.8s降低到19.8s,接下来重点看DiT阶段的优化方案。
在DiT类模型中,推理通常处于计算bound。这类模型依赖多步去噪完成生成,加速路径主要有两类:一是通过步数蒸馏减少去噪步数,直接降低总计算量;二是在不做步数蒸馏的场景下(例如本局点固定50步),可借助Cache在相邻step间复用中间结果,跳过部分冗余block计算。vLLM-Omni在DiffusionStage提供两套可选的DiT加速Cache,通过统一参数cache_backend 接入:Cache-DiT基于DBCache/SCM/TaylorSeer,按block 残差判断当前step是否可跳过计算;TeaCache基于时间步embedding相似度的Hook缓存,在相似step间复用transformer残差。
- stage_id: 1
...
cache-backend cache_dit开启Cache-DiT结果:AR-19.8s,DiT-12.6s,E2E-32.5s
在DiT类模型中,也可以考虑使用Ulysses Parallel的方式降低FA耗时,把序列维度和注意力头维度拆到多张卡上,使每张卡只算局部序列和局部head。
stage_id: 1
...
devices: "0,1,2,3"
parallel_config:
ulysses_degree: 4
ring_degree: 1
sequence_parallel_size: 4通过SP=4进行切分,结果:AR-19.4s,DiT-6.1s,E2E-25.6s
本次基于vLLM-Omni推理框架,快速完成GLM-Image模型的迭代优化,E2E推理耗时从140s优化至25.6s,性能提升5.4倍,满足客户需求。
| 优化子项 | 卡数 | AR(s) | DiT(s) | E2E(s) | 相对收益 |
|---|---|---|---|---|---|
| Base | 1,AR-1,DiT-1 | 97.8 | 37.3 | 140.5 | - |
| AR-图模式+异步调度 | 1,AR-1,DiT-1 | 29.6 | 37.1 | 66.7 | 102.6% |
| AR-TP4 | 4,AR-4,DiT-1 | 19.8 | 31.0 | 56.8 | 17.4% |
| DiT-Cache | 4,AR-4,DiT-1 | 19.8 | 12.6 | 32.5 | 74.7% |
| DiT-SP4 | 4,AR-4,DiT-4 | 19.4 | 6.1 | 25.6 | 26.9% |