File size: 5,057 Bytes
dff4ac8 | 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 | # LightLLM + LightX2V 部署
本文档介绍如何基于 Docker 镜像 `lightx2v/lightllm_lightx2v:20260407`,通过 LightLLM + LightX2V 部署 SenseNova-U1 推理服务。
## 1) 拉取并进入 Docker 镜像
```bash
docker pull lightx2v/lightllm_lightx2v:20260407
docker run --gpus all --ipc=host --network host -it lightx2v/lightllm_lightx2v:20260407 /bin/bash
```
## 2) 在容器内克隆运行时依赖
镜像中自带的源码未必是最新版本,建议重新克隆这两个仓库,并将 LightLLM 切到已验证的分支:
```bash
git clone https://github.com/ModelTC/LightX2V.git
git clone https://github.com/ModelTC/LightLLM.git
cd LightLLM
git checkout neo_plus_clean
```
## 3) X2I 相关参数
在同一个 API 服务中开启图像生成时,用到以下参数:
- `--enable_multimodal_x2i`
开启图像生成能力。
- `--x2i_server_used_gpus`
分配给 X2I 生成服务的 GPU 数量。
- `--x2i_server_deploy_mode {colocate,separate}`
- `colocate`:理解与生成共用同一块可见 GPU 资源池。
- `separate`:理解与生成拆分为独立服务,可分别占用不同的 GPU。
- `--x2i_use_naive_impl`
X2I 使用原生 PyTorch 实现,仅用于调试与测试,不建议在生产环境追求吞吐量时使用。
## 4) 部署模式
### 模式 A:`colocate`(单服务共用 GPU)
适合快速验证与简化运维。LLM 理解路径(`--tp`)与 X2I 生成路径(`--x2i_server_used_gpus`)从同一组可见 GPU 中分配资源。
示例(共 2 张 GPU):
- 理解路径:`tp=2`
- 生成路径:`cfg=2`(在 `neopp_dense_parallel_cfg.json` 中配置)
```bash
PYTHONPATH=/workspace/LightX2V/ \
python -m lightllm.server.api_server \
--model_dir $MODEL_DIR \
--enable_multimodal_x2i \
--x2i_server_deploy_mode colocate \
--x2i_server_used_gpus 2 \
--x2v_gen_model_config /workspace/LightX2V/configs/neopp/neopp_dense_parallel_cfg.json \
--host 0.0.0.0 \
--port 8000 \
--max_req_total_len 65536 \
--mem_fraction 0.75 \
--tp 2
```
### 模式 B:`separate`(理解与生成分离部署)
`separate` 的思路与 LLM 服务中的 PD 分离类似:将不同阶段放到不同的 GPU 组上,避免长阶段拖慢短阶段。
在多模态场景下,图像生成通常是长阶段,而理解请求轻量且耗时较短。将两者分离后,即便生成 worker 被占满,理解请求依然能正常流转。
推荐的部署配置方案:
1. **默认方案(以稳定性为先):理解 `tp=1` + 生成 1 GPU**
- 理解:`--tp 1`
- 生成:`--x2i_server_used_gpus 1`
- 适合作为混合负载下的基线方案。pipeline 简单,又能避免理解与生成互相产生队头阻塞。
2. **理解加强方案:理解 `tp=2` + 生成 1 GPU**
- 理解:`--tp 2`
- 生成:`--x2i_server_used_gpus 1`
- 适用于复杂 prompt 或高理解 QPS 成为瓶颈的场景。
3. **生成加强方案:理解 `tp=1/2` + 生成并行**
- 理解:`--tp 1` 或 `--tp 2`
- 生成方案 A(2 GPU):`--x2i_server_used_gpus 2` +
`/workspace/LightX2V/configs/neopp/neopp_dense_parallel_cfg.json`
- 生成方案 B(4 GPU):`--x2i_server_used_gpus 4` +
`/workspace/LightX2V/configs/neopp/neopp_dense_parallel_cfg_seq.json`
- 适用于生成延迟/吞吐量占主导的场景,也是最常见的扩容路径。
`separate` 模式启动 API 服务示例:
```bash
PYTHONPATH=/workspace/LightX2V/ \
python -m lightllm.server.api_server \
--model_dir $MODEL_DIR \
--enable_multimodal_x2i \
--x2i_server_deploy_mode separate \
--x2i_server_used_gpus 1 \
--x2v_gen_model_config /workspace/LightX2V/configs/neopp/neopp_dense.json \
--host 0.0.0.0 \
--port 8000 \
--max_req_total_len 65536 \
--mem_fraction 0.75 \
--tp 2
```
## 5) 量化
`separate` 模式的另一个好处是,理解与生成可以各自采用独立的量化策略。
两条路径解耦后,可分别针对各自的质量与延迟目标进行调优:
1. **理解 FP16/BF16 + 生成 FP8**
- 理解:不加量化参数,保持默认精度。
- 生成:使用 FP8 生成配置,例如
`/workspace/LightX2V/configs/neopp/neopp_dense_fp8.json`
- 推荐作为生产环境的默认量化方案。
2. **理解 FP8 + 生成 FP8**
- 理解:添加 `--quant_type fp8w8a8`
- 生成:使用 FP8 生成配置
`/workspace/LightX2V/configs/neopp/neopp_dense_fp8.json`
- 适用于 GPU 显存或吞吐量吃紧的场景。
说明:
- `--quant_type fp8w8a8` 控制理解路径的量化精度。
- 生成侧的精度由 `--x2v_gen_model_config` 决定。
## 6) OpenAI 兼容 API
API 服务启动之后,可直接通过 LightLLM 暴露的 OpenAI 兼容端点发送请求。下面是一个最简的文生图示例:
```bash
python examples/serving/client.py \
--mode t2i \
--prompt "A cozy coffee shop storefront with infographic style."
```
更多模式(VQA、图像编辑、图文交错生成)及请求格式,详见 [`examples/serving/client.py`](../examples/serving/client.py)。
|