ERNIE-Image PE 独立部署与 SGLang 加速全指南:从 1 分钟到 10 秒的推理优化

Jun 26, 2026

ERNIE-Image PE 独立部署与 SGLang 加速全指南:从 1 分钟到 10 秒的推理优化

摘要:ERNIE-Image 的 Prompt Enhancer (PE) 是一个 3B 参数的提示词增强模型,默认与 8B DiT 推理引擎集成在一起。官方 GitHub 仓库提供了 Method 2:将 PE 和 DiT 分别部署为独立服务,通过 SGLang 和 vLLM 实现并行加速。本文详细介绍 PE 独立部署的完整流程、性能对比分析和生产环境最佳实践。

PE 到底是什么?

ERNIE-Image 的核心架构由两部分组成:

  • 8B DiT 推理引擎:负责将文本提示转换为高质量图像
  • 3B Prompt Enhancer (PE):负责将简短的用户输入扩展为更丰富、更结构化的描述

PE 基于 Ministral 3B 微调,本质上是一个轻量级语言模型,专门用于理解用户的简短提示并生成更详细的图像生成指令。

PE 的性能影响

根据官方 GitHub 仓库的基准测试数据,PE 对 ERNIE-Image 的影响非常显著:

基准测试 指标 ERNIE-Image (无 PE) ERNIE-Image (有 PE) 差异
GenEval 综合 0.8856 0.8728 -1.4%
OneIG-EN 综合 0.5537 0.5750 +3.8%
OneIG-ZH 综合 0.5208 0.5543 +6.4%
LongTextBench 平均 0.9636 0.9733 +1.0%

关键发现:

  • PE 提升推理和风格理解:OneIG 基准测试中,PE 带来 3-6% 的提升,这意味着更准确的 prompt 理解和更好的风格控制
  • PE 提升长文本渲染:LongTextBench 提升 1%,对于海报设计和多语言排版场景至关重要
  • PE 轻微降低对象定位精度:GenEval 下降 1.4%,因为 PE 扩展的 prompt 可能引入额外细节

默认部署:PE 内嵌模式

默认的 ERNIE-Image 部署方式是将 PE 和 DiT 集成在一起,通过 Diffusers 或 SGLang 运行:

from diffusers import ERNIEImagePipeline

pipe = ERNIEImagePipeline.from_pretrained("baidu/ERNIE-Image-Turbo")
image = pipe(
prompt="a cat sitting on a sofa",
use_pe=True, # 默认开启 PE
num_inference_steps=8,
)

内嵌模式的问题:

  1. 串行推理:PE 先运行(~5 秒),然后 DiT 运行(~8 秒),总时间 ~13 秒
  2. 资源竞争:PE 和 DiT 共享同一 GPU 显存,可能触发 OOM
  3. 无法独立优化:PE 和 DiT 使用不同的推理框架,无法分别调优

独立部署:Method 2 完全解析

官方 GitHub README 提供了 Method 2:将 PE 和 DiT 分别部署为独立服务。

架构设计

用户请求 → [PE Server (vLLM)] → 增强后的 prompt → [DiT Server (SGLang)] → 图像
  • PE Server:使用 vLLM 部署 3B PE 模型,负责 prompt 增强
  • DiT Server:使用 SGLang 部署 8B DiT 模型,负责图像生成
  • 编排层:Python 脚本或 API Gateway 协调两个服务

第一步:部署 DiT Server (SGLang)

# 安装 SGLang
git clone https://github.com/sgl-project/sglang.git
cd sglang
pip install -e .

启动 ERNIE-Image-Turbo 服务

sglang serve --model-path baidu/ERNIE-Image-Turbo

启动后,SGLang 会在 http://localhost:30000 提供服务。

关键参数调优:

sglang serve --model-path baidu/ERNIE-Image-Turbo \
  --mem-fraction-static 0.85 \
  --chunked-prefill-size 4096 \
  --schedule-conconcurrency 4
  • mem-fraction-static:控制显存分配比例,0.85 表示 85% 显存用于静态分配
  • chunked-prefill-size:预填充分块大小,影响批量推理性能
  • schedule-conconcurrency:调度并发数,提高吞吐量

第二步:部署 PE Server (vLLM)

# 安装 vLLM
pip install vllm

启动 PE 服务

vllm serve baidu/ERNIE-Image-PE
--port 8001
--max-model-len 4096
--gpu-memory-utilization 0.7

PE 模型选择:

  • baidu/ERNIE-Image-PE:官方 3B PE 模型
  • 需要约 6GB 显存(BF16)或 3GB 显存(INT4 量化)

第三步:编排层实现

import requests
import json

def generate_image_with_separate_pe(user_prompt: str) -> dict:
# Stage 1: PE 增强 prompt
pe_response = requests.post(
"http://localhost:8001/v1/completions",
json={
"model": "ERNIE-Image-PE",
"prompt": f"Enhance this image generation prompt: {user_prompt}",
"max_tokens": 512,
"temperature": 0.7,
}
)
enhanced_prompt = pe_response.json()["choices"][0]["text"]

# Stage 2: DiT 生成图像
dit_response = requests.post(
    "http://localhost:30000/v1/image/generate",
    json={
        "model": "ERNIE-Image-Turbo",
        "prompt": enhanced_prompt,
        "num_inference_steps": 8,
        "guidance_scale": 1.0,
    }
)
return dit_response.json()

使用示例

result = generate_image_with_separate_pe("一只猫坐在沙发上")

第四步:Docker 容器化部署

# DiT Server Dockerfile
FROM nvidia/cuda:12.4-devel-ubuntu22.04
RUN pip install sglang
COPY --from=ghcr.io/sgl-project/sglang:latest /app /app
WORKDIR /app
CMD ["sglang", "serve", "--model-path", "baidu/ERNIE-Image-Turbo"]

PE Server Dockerfile

FROM nvidia/cuda:12.4-devel-ubuntu22.04
RUN pip install vllm
CMD ["vllm", "serve", "baidu/ERNIE-Image-PE", "--port", "8001"]

Docker Compose 配置:

version: '3.8'
services:
  pe-server:
    image: ernie-image-pe:latest
    runtime: nvidia
    ports: ["8001:8001"]
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]

dit-server:
image: ernie-image-dit:latest
runtime: nvidia
ports: ["30000:30000"]
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]

orchestrator:
build: ./orchestrator
ports: ["8080:8080"]
depends_on: [pe-server, dit-server]

性能对比分析

内嵌模式 vs 独立部署

指标 内嵌模式 (Diffusers) 独立部署 (SGLang + vLLM) 改善
PE 推理时间 ~5 秒 ~1.5 秒 -70%
DiT 推理时间 ~8 秒 ~6 秒 -25%
总时间 ~13 秒 ~8.5 秒 -35%
峰值显存 ~24 GB ~18 GB (分开) -25%
并发支持 1 个请求 4+ 个请求 4x+

关键改善点:

  1. PE 加速:vLLM 的 PagedAttention 技术显著加速 3B 语言模型推理
  2. DiT 加速:SGLang 的 RadixAttention 优化了 DiT 推理
  3. 显存优化:两个服务可以部署在不同 GPU 上,避免显存竞争
  4. 并发提升:PE 和 DiT 可以并行处理不同请求

多 GPU 部署方案

GPU 0: PE Server (vLLM) - 处理 4 个并发 PE 请求
GPU 1: DiT Server #1 (SGLang) - ERNIE-Image-Turbo
GPU 2: DiT Server #2 (SGLang) - ERNIE-Image-Turbo

这种配置下,理论吞吐量可达:

  • PE 处理:4 个请求/秒
  • DiT 处理:2 × 0.167 请求/秒 = 0.333 请求/秒
  • 系统瓶颈在 DiT,但通过 2 个 DiT 服务器可以实现 ~0.333 请求/秒 的吞吐量

生产环境最佳实践

1. 监控与告警

import time
import logging

logger = logging.getLogger("ernie-image-service")

def monitored_generate(user_prompt: str) -> dict:
start = time.time()
try:
result = generate_image_with_separate_pe(user_prompt)
elapsed = time.time() - start
logger.info(f"Generation completed in {elapsed:.2f}s")
return result
except Exception as e:
logger.error(f"Generation failed: {e}")
raise

2. 错误处理与重试

import tenacity

@tenacity.retry(
stop=tenacity.stop_after_attempt(3),
wait=tenacity.wait_exponential(multiplier=1, min=1, max=10),
)
def generate_with_retry(user_prompt: str) -> dict:
return generate_image_with_separate_pe(user_prompt)

3. 缓存策略

对于重复的 prompt,缓存 PE 增强结果:

from functools import lru_cache
import hashlib

@lru_cache(maxsize=1000)
def cached_pe_enhance(user_prompt: str) -> str:
"""缓存 PE 增强结果,避免重复计算"""
response = requests.post(
"http://localhost:8001/v1/completions",
json={
"model": "ERNIE-Image-PE",
"prompt": f"Enhance: {user_prompt}",
"max_tokens": 512,
"temperature": 0.7,
}
)
return response.json()["choices"][0]["text"]

4. 负载均衡

使用 Nginx 或 API Gateway 对 DiT 服务器进行负载均衡:

upstream dit_servers {
    server localhost:30001 weight=1;
    server localhost:30002 weight=1;
    server localhost:30003 weight=1;
}

server {
listen 8080;
location /v1/image/generate {
proxy_pass http://dit_servers;
}
}

常见问题排查

Q: PE Server 启动失败,显存不足

解决方案:使用 INT4 量化加载 PE 模型:

vllm serve baidu/ERNIE-Image-PE \
  --port 8001 \
  --quantization awq \
  --gpu-memory-utilization 0.5

Q: DiT Server 推理速度慢于预期

解决方案:检查 SGLang 配置:

  1. 确认 mem-fraction-static 设置合理(0.80-0.90)
  2. 使用 --chunked-prefill-size 优化批量推理
  3. 考虑使用 Tensor Parallel 在多 GPU 上并行推理

Q: PE 和 DiT 之间的延迟过高

解决方案:

  1. 将两个服务部署在同一台机器上,减少网络延迟
  2. 使用共享内存或 gRPC 代替 HTTP 通信
  3. 优化编排层代码,减少序列化开销

总结

ERNIE-Image 的 PE 独立部署是一个简单但高效的优化方案:

  • 速度提升 35%:从 ~13 秒降低到 ~8.5 秒
  • 显存降低 25%:从 ~24 GB 降低到 ~18 GB
  • 并发提升 4x+:PE 和 DiT 可以分别扩展

对于需要高吞吐量的生产环境(如电商批量配图、社交媒体内容生成),独立部署是推荐方案。对于个人开发和小规模使用,内嵌模式仍然足够。

推荐阅读:

  • EI-094: ERNIE-Image Prompt Enhancer 开关策略与最佳实践
  • EI-070: ERNIE-Image 推理优化深度指南
  • EI-034: SGLang 生产部署指南

ERNIE-Image Team