87 lines
4.0 KiB
Markdown
87 lines
4.0 KiB
Markdown
|
||
基于提供的来源,以下是使用 **Builder Pattern(构建器模式)** 结合 Ray Serve 和 vllm 动态部署**中型大语言模型(Medium-sized LLM)**的原理与操作方案。
|
||
|
||
### 一、 核心原理
|
||
|
||
1. **中型 LLM 定义**:中型模型(如 Llama-3.1-70B)通常具有约 70B 参数。它们通常运行在**单个节点**上,利用 **4 到 8 个 GPU**。
|
||
2. **Builder Pattern 机制**:该模式通过 `build_openai_app` 函数提供高度抽象。开发者只需定义一个 `LLMConfig` 对象,即可自动构建并链接底层的 `LLMServer` 和 `OpenAiIngress` 组件。
|
||
3. **高性能后端 (vLLM)**:Ray Serve LLM 使用 vLLM 作为推理引擎,支持高性能推理和显存管理。
|
||
4. **动态扩缩容与资源调度**:
|
||
* **张量并行 (Tensor Parallelism)**:通过 `tensor_parallel_size` 将模型权重均匀分布在单节点的所有 GPU 上。
|
||
* **副本缩放 (Autoscaling)**:通过 `autoscaling_config` 动态调整 `min_replicas` 和 `max_replicas`,使服务能根据实时流量增减推理副本。
|
||
|
||
---
|
||
|
||
### 二、 操作方案
|
||
|
||
#### 1. 环境准备
|
||
确保已安装必要的依赖包并配置 Hugging Face 访问令牌(针对 Llama-3.1 等受限模型)。
|
||
```bash
|
||
pip install "ray[serve,llm]"
|
||
export HF_TOKEN=<YOUR_HUGGINGFACE_TOKEN>
|
||
```
|
||
|
||
#### 2. 编写部署脚本 (`serve_medium_llm.py`)
|
||
使用 **Builder Pattern** 定义配置并构建应用。以下示例配置了一个典型的 70B 模型部署:
|
||
|
||
```python
|
||
# serve_medium_llm.py
|
||
from ray.serve.llm import LLMConfig, build_openai_app
|
||
import os
|
||
|
||
llm_config = LLMConfig(
|
||
model_loading_config=dict(
|
||
model_id="my-llama-3.1-70b",
|
||
model_source="meta-llama/Llama-3.1-70B-Instruct",
|
||
),
|
||
accelerator_type="A100-40G", # 或 L40S
|
||
deployment_config=dict(
|
||
autoscaling_config=dict(
|
||
min_replicas=1, # 最小副本数
|
||
max_replicas=4, # 最大副本数,实现动态扩展
|
||
)
|
||
),
|
||
runtime_env=dict(env_vars={"HF_TOKEN": os.environ.get("HF_TOKEN")}),
|
||
engine_kwargs=dict(
|
||
max_model_len=32768, # 上下文长度
|
||
tensor_parallel_size=8, # 在单节点的 8 个 GPU 间拆分权重
|
||
),
|
||
)
|
||
|
||
# 使用 Builder Pattern 构建应用
|
||
app = build_openai_app({"llm_configs": [llm_config]})
|
||
```
|
||
|
||
#### 3. 启动部署
|
||
在终端运行以下命令启动服务:
|
||
```bash
|
||
serve run serve_medium_llm:app
|
||
```
|
||
部署过程通常需要几分钟,包括配置集群、启动 vLLM 服务器以及下载模型权重。
|
||
|
||
#### 4. 发送请求测试
|
||
服务启动后,可以通过符合 OpenAI 标准的接口进行访问。
|
||
```python
|
||
from openai import OpenAI
|
||
|
||
client = OpenAI(base_url="http://localhost:8000/v1", api_key="FAKE_KEY")
|
||
response = client.chat.completions.create(
|
||
model="my-llama-3.1-70b",
|
||
messages=[{"role": "user", "content": "解释一下什么是量子纠缠?"}],
|
||
stream=True
|
||
)
|
||
for chunk in response:
|
||
if chunk.choices.delta.content:
|
||
print(chunk.choices.delta.content, end="", flush=True)
|
||
```
|
||
|
||
---
|
||
|
||
### 三、 性能与并发优化建议
|
||
|
||
* **提高并发量**:可以通过降低 `max_model_len` 来减少 KV 缓存所需的显存,从而显著提升每个副本支持的最大并发请求数。
|
||
* **监控指标**:通过 Ray Serve LLM 仪表盘监控 **TTFT(首字延迟)**、**TPOT(单字延迟)** 和 **Token 吞吐量** 来评估服务性能。
|
||
* **精度折衷**:对于资源受限的场景,可以使用**量化模型**(如 FP8)来减少模型内存占用,为 KV 缓存留出更多空间,进而提高并发能力。
|
||
|
||
**比喻理解**:
|
||
部署**中型 LLM** 就像是在一个大型车间里组装一台复杂的精密机器(模型权重)。**Builder Pattern** 是你的“全自动组装线”,你只需设定好机器的参数(Config),生产线就会自动帮你把零件固定好并接通电源。而 **vLLM 和张量并行** 就像是让 8 个熟练工人(GPU)共同抬起这台沉重的机器,每个人只负责自己那一部分的力气,从而让机器能够平稳地运转。 |