"vscode:/vscode.git/clone" did not exist on "ecebf1bd3c6865e46219771d50b22c785c6be1f1"
QwenImageEncoderSplitDeploy.md 6.91 KB
Newer Older
litzh's avatar
litzh committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
# Text Encoder 分离部署/优化指南 (Advanced Guide)

对于大规模模型推理,Text Encoder 往往占据显存且计算相对独立。LightX2V 提供了两种先进的 Text Encoder 优化方案:**Service Mode (分离部署)****Kernel Mode (内核优化)**

这两种方案目前针对 **Qwen-Image** 系列模型的 Text Encoder 进行过深度优化,显著降低了显存占用并提升了推理吞吐量。

## 方案对比

| 特性 | **Baseline (原始 huggingface)** | **Service Mode (分离部署)** | **Kernel Mode (内核优化)** |
| :--- | :--- | :--- | :--- |
| **部署架构** | 与主模型在同一进程 | 独立服务,通过 HTTP/SHM 通信 | 与主模型在同一进程 |
| **显存占用** | 高 (加载完整 HF 模型) | **极低** (Client 端不加载权重) | **中** (加载精简模型 + Kernel) |
| **跨请求复用** | 无 | **支持** (多客户端共享一个 Encoder) | 无 |
| **通信开销** | 无 | 有 (HTTP/SharedMemory) | 无 |
| **推理速度** | 慢 (标准 Layer) | **极快** (LightLLM 后端加速) | **快** (集成 LightLLM Kernel) |
| **适用场景** | 快速验证、小显存单卡 | **多卡/多机生产环境**、DiT 显存瓶颈 | **高性能单机推理**、追求极限速度 |

详情性能数据可参考: [Performance Benchmark](https://github.com/ModelTC/LightX2V/pull/829)

---

## 1. Service Mode (分离部署模式)

Service Mode 将 Text Encoder 作为一个独立的服务启动,基于高性能 LLM 推理框架 **LightLLM**。主模型 (LightX2V Client) 通过 API 请求获取 hidden states。

### 1.1 环境准备

Text Encoder 服务端需要使用 **LightLLM** 框架。

**服务端安装步骤:**
1. 拉取 LightLLM 代码 (指定 `return_hiddens` 分支)
```bash
git clone git@github.com:ModelTC/LightLLM.git -b return_hiddens
cd LightLLM
```

2. 配置环境
请参考 LightLLM 官方文档配置 Python 环境 (通常需要 PyTorch, CUDA, Triton 等)。
*注意:确保服务端环境支持 FlashAttention 以获得最佳性能。*

### 1.2 启动 Text Encoder 服务

使用 `lightllm.server.api_server` 启动服务。

**编写启动脚本 `start_encoder_service.sh` (参考示例):**

```bash
#!/bin/bash
# 显卡设置 (例如使用独立的卡运行 Text Encoder)
export CUDA_VISIBLE_DEVICES=1
export LOADWORKER=18

# 指向 LightLLM 代码目录
# export PYTHONPATH=/path/to/LightLLM:$PYTHONPATH

# 模型相关路径 (需替换为实际路径)
MODEL_DIR="/path/to/models/Qwen-Image-Edit-2511/text_encoder"
TOKENIZER_DIR="/path/to/models/Qwen-Image-Edit-2511/tokenizer"
PROCESSOR_DIR="/path/to/models/Qwen-Image-Edit-2511/processor"

# 设置环境变量供 LightLLM 内部使用
export LIGHTLLM_TOKENIZER_DIR=$TOKENIZER_DIR
export LIGHTLLM_PROCESSOR_DIR=$PROCESSOR_DIR
export LIGHTLLM_TRITON_AUTOTUNE_LEVEL=1

python -m lightllm.server.api_server \
    --model_dir $MODEL_DIR \
    --host 0.0.0.0 \
    --port 8010 \
    --tp 1 \
    --enable_fa3 \
    --return_input_hidden_states \
    --enable_multimodal \
    --disable_dynamic_prompt_cache
```

**关键参数说明:**
*   `--return_input_hidden_states`: **必须开启**。让 LightLLM 返回 hidden states 而不是生成的 token,这是 Service Mode 的核心。
*   `--enable_multimodal`: 开启多模态支持 (处理 Qwen 的 Vision Token)。
*   `--port 8010`: 服务监听端口,需与 Client 端配置一致。
*   `--tp 1`: Tensor Parallel 度,通常 Text Encoder 单卡即可部署。
*   `--enable_fa3`: 启用 FlashAttention。
*   `--disable_dynamic_prompt_cache`: 禁用动态 Prompt Cache。

启动服务:
```bash
bash start_encoder_service.sh
```
看到类似 "Uvicorn running on http://0.0.0.0:8010" 即表示启动成功。

### 1.3 配置 LightX2V Client

在 LightX2V 端,只需修改 `config_json` 来启用 Service Mode。

**配置文件 (`configs/qwen_image/qwen_image_i2i_2511_service.json`):**

```json
{
    "text_encoder_type": "lightllm_service",
    "lightllm_config": {
        "service_url": "http://localhost:8010",
        "service_timeout": 30,
        "service_retry": 3,
        "use_shm": true
    },
    // ... 其他参数 (infer_steps, prompt_template 等) ...
}
```

**参数说明:**
*   `text_encoder_type`: 设置为 **"lightllm_service"**
*   `service_url`: Text Encoder 服务的地址。
*   `use_shm`: **强烈推荐开启**
    *   `true`: 启用共享内存 (Shared Memory) 通信。如果 Client 和 Server 在同一台机器 (即使不同 Docker 容器,需挂载共享内存),数据传输将通过内存直读,**零拷贝,速度极快**
    *   `false`: 使用 HTTP 传输 base64 编码数据。适用于跨机部署。

**运行推理:**

编写运行脚本 (`scripts/qwen_image/qwen_image_i2i_2511_service.sh`):

```bash
python -m lightx2v.infer \
    --model_cls qwen_image \
    --task i2i \
    --model_path /path/to/Qwen-Image-Edit-2511 \
    --config_json configs/qwen_image/qwen_image_i2i_2511_service.json \
    --prompt "Make the girl from Image 1 wear the black dress from Image 2..." \
    --image_path "1.png,2.png,3.png" \
    --save_result_path output.png
```

---

## 2. Kernel Mode (内核优化模式)

Kernel Mode 适合单机高性能推理场景。它不在后台启动独立服务,而是在进程内直接加载 Text Encoder,但**替换了 HuggingFace 原始的慢速算子**,集成了 LightLLM 的核心 Triton Kernel。

### 2.1 优势
*   **无需独立服务**: 简化部署运维。
*   **Triton 加速**: 使用高度优化的 FlashAttention 和 Fused RMSNorm Triton Kernel。
*   **无通信开销**: 纯进程内内存操作。

### 2.2 配置方法

只需修改 `config_json` 启用 Kernel Mode。

**配置文件 (`configs/qwen_image/qwen_image_i2i_2511_kernel.json`):**

```json
{
    "text_encoder_type": "lightllm_kernel",
    "lightllm_config": {
        "use_flash_attention_kernel": true,
        "use_rmsnorm_kernel": true
    },
    // ... 其他参数 ...
}
```

**参数说明:**
*   `text_encoder_type`: 设置为 **"lightllm_kernel"**
*   `use_flash_attention_kernel`: 启用 FlashAttention 加速 Attention 层。 默认情况下将使用 flash_attention_2,但你也可以使用 “use_flash_attention_kernel”: “flash_attention_3”。
*   `use_rmsnorm_kernel`: 启用 Fused RMSNorm Kernel (需安装 `sgl_kernel` 或相关依赖,如未安装会自动降级)。

**运行推理:**

编写运行脚本 (`scripts/qwen_image/qwen_image_i2i_2511_kernel.sh`):

```bash
python -m lightx2v.infer \
    --model_cls qwen_image \
    --task i2i \
    --model_path /path/to/Qwen-Image-Edit-2511 \
    --config_json configs/qwen_image/qwen_image_i2i_2511_kernel.json \
    --prompt "..." \
    --image_path "..." \
    --save_result_path output.png
```

---

## 总结建议

*   **开发调试**: 默认模式 (HuggingFace) 兼容性最好。
*   **单机高性能**: 使用 **Kernel Mode**
*   **多机/多卡/显存受限**: 使用 **Service Mode**。将 Text Encoder 部署在显存较小的卡上,主卡专注于 DiT 推理,并通过 Shared Memory 实现高效通信。