argus-cluster/specs/mvp/v3.8/ray_serve_llm.md

87 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

基于提供的来源,以下是使用 **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共同抬起这台沉重的机器每个人只负责自己那一部分的力气从而让机器能够平稳地运转。