Ascend-SACT/GLM-IMAGE-Optimization
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

GLM-Image 部署指南

1. 背景介绍

GLM-Image 是一个基于多模态大语言模型的图像生成模型,由智谱AI开发。该模型采用两阶段架构:

  • AR模型(Autoregressive Model):基于Transformer的自回归模型,负责生成图像的先验token序列
  • ViT(Vision Transformer):视觉编码器,用于处理图像特征
  • Diffusion模型:基于DiT(Diffusion Transformer)的扩散模型,结合VAE解码器完成图像生成

GLM-Image支持以下功能:

  • 文本到图像生成(Text-to-Image)
  • 图像到图像编辑(Image-to-Image)
  • 高分辨率图像生成(支持多种分辨率)

2. 环境介绍

2.1 版本依赖

组件版本说明
vllmv0.18.0核心推理引擎
vllm-ascendv0.18.0rc1昇腾NPU适配
vllm-omniv0.18.0多模态扩展
transformers4.37.0+HuggingFace模型库
diffusers0.25.0+扩散模型库
torch2.1.0+PyTorch框架

2.2 硬件和组网方式

部署方式硬件配置组网方式优势劣势
单卡部署昇腾910B 32GB单卡部署简单,配置方便处理超大图片可能有内存溢出风险
多卡部署多个昇腾910BDP/SP能处理大图片,性能更好部署复杂,需要配置分布式

3. 服务部署

3.1 使用镜像部署

3.1.1 镜像下载

下载当前仓库下的 glm-image.tar 到目标机器:

# 将镜像文件传输到目标机器
scp glm-image.tar user@target-machine:/path/to/destination/

3.1.2 加载镜像

在目标机器执行:

docker load -i glm-image.tar

3.1.3 启动容器

docker 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"

3.2 手动安装部署

3.2.1 下载vllm-ascend镜像

docker pull quay.io/ascend/vllm-ascend:v0.18.0rc1

3.2.2 下载模型权重

# 创建模型目录
mkdir -p /opt/data/weights/modelscope

# 下载GLM-Image模型
modelscope download --model ZhipuAI/GLM-Image --local_dir /opt/data/weights/modelscope/GLM-Image

3.2.3 启动容器

docker 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

3.2.4 安装依赖和代码

进入容器后执行:

# 进入容器
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 .

3.2.5 应用补丁

如果有必要的补丁文件,应用补丁:

cd /vllm-workspace
patch -p1 < vllm-omni-v0.18.0.patch

注意事项:

  • 补丁文件使用 git diff 命令生成,格式为 unified diff
  • patch -p1 参数表示忽略补丁文件中的第一级路径前缀
  • 应用补丁前请确保当前目录正确
  • 如果补丁应用失败,请检查:
    • vllm-omni版本是否与补丁文件匹配
    • 是否有其他修改冲突
    • 可以使用 --dry-run 参数先测试补丁应用

4. 模型验证

4.1 离线验证

4.1.1 运行离线测试

使用提供的离线测试脚本:

cd /vllm-workspace/glm_image/test/offline

# 默认生成1920x1024分辨率的图像
./run.sh

# 指定分辨率生成图像
./run.sh 1536 864  # 生成1536x864分辨率的图像
./run.sh 512 512   # 生成512x512分辨率的图像

4.1.2 测试脚本说明

run.sh 脚本参数:

  • 第一个参数:图像宽度(默认1920)
  • 第二个参数:图像高度(默认1024)
  • 输出文件:output_{width}x{height}.png
  • 日志文件:e2e_{width}x{height}.log

示例输出:

运行测试后,会在当前目录生成图像文件,例如:

# 生成1920x1024分辨率的图像
./run.sh

# 查看生成的图像
ls -lh output_1920x1024.png

生成的图像文件位于 /vllm-workspace/glm_image/test/offline/output_{width}x{height}.png,可以直接使用图片查看器打开查看生成效果。

4.2 在线验证

4.2.1 启动服务

根据需要选择启动方式:

方式1:SP+Graph模式(推荐)

cd /vllm-workspace/glm_image/bin
./start_sp.sh

方式2:graph模式(全图模式)

cd /vllm-workspace/glm_image/bin
./start_graph.sh

4.2.2 服务配置说明

Graph模式配置文件 (glm_image_graph.yaml):

  • Stage 0 (AR模型):使用设备0,负责生成先验token
  • Stage 1 (Diffusion模型):使用设备1,负责图像生成
  • 适合单机双卡部署

SP+全图模式配置文件 (glm_image_diffusion_sp.yaml):

  • Stage 0 (AR模型):使用设备0,1,采用TP=2进行张量并行
  • Stage 1 (Diffusion模型):使用设备2,3,采用SP=2进行序列并行
  • 适合单机四卡部署,性能更好

关键配置参数说明:

  1. AR模型配置(Stage 0)

    • model_stage: ar - 指定为AR模型阶段
    • max_num_seqs: 1 - 最大批处理数量,图像生成通常设置为1
    • gpu_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 - 视觉词汇表大小
  2. Diffusion模型配置(Stage 1)

    • model_stage: dit - 指定为DiT模型阶段
    • num_inference_steps: 50 - 扩散推理步数,影响生成质量和速度
    • guidance_scale: 1.5 - 引导系数,控制生成与提示词的符合度
    • height/width - 生成图像的尺寸
  3. 并行配置

    • tensor_parallel_size: 2 - 张量并行度,将模型权重切分到多个设备
    • sequence_parallel_size: 2 - 序列并行度,将序列切分到多个设备
    • ulysses_degree: 2 - Ulysses算法的并行度
    • ring_degree: 1 - Ring并行度

4.2.3 在线测试

方式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

4.2.4 测试结果

测试脚本会生成以下文件:

  • 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,可以直接使用图片查看器打开查看生成效果。

5. 精度和性能优化

当前大部分代码来源于社区的pr,但是由于社区的pr基于0.19.0开发,而当前昇腾库依赖0.18.0,导致大部分变更需要手动合入。

5.1 精度优化

PR主要修改点
PR:3245cache default HF processor to reduce input preprocessing latency
PR:920GLM Image 性能调优
PR:1399cache-dit for GLM-Image
PR:1983add GLM-Image SP support
PR:3235fix(npu)per-stage runtime env for HCCL ports + GLM-Image NPU stage config
PR: 2267Fix image quality in /v1/images/generations for multi-stage pipeline

5.2 性能优化

由于GLM-Image包含AR与DiT两大模块,二者特性差异较大,需针对性开展优化。

DIT 类生成模型加速 (非自回归迭代)自回归 (AR) 大模型加速 (LLM/VLM)
适用场景多模态生成:视图生成、3D 重建文本生成:聊天对话、代码生成
计算模式扩散迭代:固定步数 T,逐步去噪串行依赖:Token i 依赖 Token i-1
性能瓶颈Prefill: 计算boundPrefill: 计算bound, Decode: 显存带宽Bound
加速重点减少FA计算、多卡并行拆分序列等KVCache显存优化、提高BatchSize等
并行方式USP/CFG/TP/EP/VAEPatchDP/TP/EP/PP/CP/SP
推理引擎Diffusers、DiffSynthEngine等vLLM、Sglang等

使用1张910b3卡进行50 steps推理,生成1024x1024大小的图片,进行性能基线数据收集,如下为整体耗时统计。

1780025296676_image.png

AR-97.8s、DiT-37.3s、E2E-140.5s(input_preprocess_time-5.3s)

AR(自回归) 调优

在基线场景的profiling分析报告中可以看到,空泡占比约79.6%,存在明显的hostbound,因此考虑启用图模式以降低host侧开销,减少host和kernel之间的交付。 1780025442074_image.png

AR图优化

由于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路径。 1776693037291_image.png

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

AR TP优化

1780026178524_image.png

继续分析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调优

Cache 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-SP 调优

在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)相对收益
Base1,AR-1,DiT-197.837.3140.5-
AR-图模式+异步调度1,AR-1,DiT-129.637.166.7102.6%
AR-TP44,AR-4,DiT-119.831.056.817.4%
DiT-Cache4,AR-4,DiT-119.812.632.574.7%
DiT-SP44,AR-4,DiT-419.46.125.626.9%