← 返回首页
🧠

vLLM基础:高吞吐量推理引擎

📂 llm ⏱ 3 min 444 words

--- title: "vLLM基础:高吞吐量推理引擎" description: "介绍vLLM的核心特性和使用方法,实现高性能LLM服务部署" tags: ["vLLM", "推理优化", "PagedAttention", "服务部署"] category: "llm" icon: "🧠"

vLLM基础:高吞吐量推理引擎

vLLM简介

vLLM是一个高吞吐量的LLM推理和服务引擎,通过PagedAttention等技术显著提升推理效率,是生产环境部署LLM的首选方案之一。

安装vLLM

# 基础安装
pip install vllm

# 需要CUDA 11.8+
nvidia-smi  # 检查GPU驱动

# 验证安装
python -c "import vllm; print(vllm.__version__)"

快速启动

OpenAI兼容服务器

# 启动API服务器
python -m vllm.entrypoints.openai.api_server \
    --model meta-llama/Llama-2-7b-hf \
    --host 0.0.0.0 \
    --port 8000 \
    --tensor-parallel-size 1

# 使用量化模型
python -m vllm.entrypoints.openai.api_server \
    --model TheBloke/Llama-2-7B-Chat-GPTQ \
    --quantization gptq \
    --host 0.0.0.0 \
    --port 8000

Python调用

from openai import OpenAI

# vLLM提供OpenAI兼容接口
client = OpenAI(
    base_url="http://localhost:8000/v1",
    api_key="not-needed"
)

response = client.chat.completions.create(
    model="meta-llama/Llama-2-7b-hf",
    messages=[
        {"role": "system", "content": "你是一个有帮助的助手。"},
        {"role": "user", "content": "什么是机器学习?"}
    ],
    temperature=0.7,
    max_tokens=500
)

print(response.choices[0].message.content)

流式输出

def stream_chat(prompt, model="meta-llama/Llama-2-7b-hf"):
    """流式输出"""
    stream = client.chat.completions.create(
        model=model,
        messages=[{"role": "user", "content": prompt}],
        stream=True
    )
    
    full_response = ""
    for chunk in stream:
        if chunk.choices[0].delta.content:
            content = chunk.choices[0].delta.content
            print(content, end="", flush=True)
            full_response += content
    
    print()
    return full_response

# 使用
# stream_chat("写一个Python快速排序算法")

核心特性

1. PagedAttention

# PagedAttention通过分页管理KV Cache
# 类似操作系统的虚拟内存管理
# 大幅减少显存浪费

# 关键参数
engine_args = {
    "model": "meta-llama/Llama-2-7b-hf",
    "block_size": 16,           # 块大小
    "gpu_memory_utilization": 0.9,  # GPU内存使用率
    "max_num_batched_tokens": 8192,  # 最大批处理token数
    "max_num_seqs": 256          # 最大序列数
}

2. Continuous Batching

# 连续批处理:动态合并请求
# 比静态批处理效率更高

# vLLM自动处理连续批处理
# 无需额外配置

3. 张量并行

# 多GPU张量并行
python -m vllm.entrypoints.openai.api_server \
    --model meta-llama/Llama-2-70b-hf \
    --tensor-parallel-size 4 \
    --host 0.0.0.0 \
    --port 8000

# 4个GPU并行推理70B模型

高级配置

模型配置

from vllm import LLM, SamplingParams

# 初始化LLM引擎
llm = LLM(
    model="meta-llama/Llama-2-7b-hf",
    tensor_parallel_size=1,
    gpu_memory_utilization=0.9,
    max_model_len=4096,
    dtype="auto",
    quantization=None,  # 或 "awq", "gptq"
    trust_remote_code=True
)

# 采样参数
sampling_params = SamplingParams(
    temperature=0.7,
    top_p=0.9,
    max_tokens=500,
    stop=["\n\n"]
)

# 批量生成
prompts = [
    "What is machine learning?",
    "Explain quantum computing",
    "Write a Python function for sorting"
]

outputs = llm.generate(prompts, sampling_params)

for output in outputs:
    print(f"Prompt: {output.prompt[:50]}...")
    print(f"Output: {output.outputs[0].text[:100]}...\n")

性能调优

# 优化配置
llm = LLM(
    model="model-name",
    tensor_parallel_size=2,       # GPU数量
    pipeline_parallel_size=1,     # 流水线并行
    max_num_batched_tokens=8192,  # 批处理大小
    max_num_seqs=256,             # 并发序列数
    block_size=16,                # KV Cache块大小
    gpu_memory_utilization=0.9,   # GPU内存使用率
    swap_space=4,                 # CPU交换空间(GB)
    cpu_offload_gb=0,             # CPU卸载(GB)
    enforce_eager=True,           # 强制eager模式(调试)
    enable_prefix_caching=True    # 启用前缀缓存
)

多模态支持

# vLLM支持多模态模型
# 如LLaVA(视觉语言模型)

from vllm import LLM

llm = LLM(
    model="llava-hf/llava-1.5-7b-hf",
    trust_remote_code=True
)

# 图像+文本输入
# 需要使用特定的输入格式

批量处理

def batch_process(prompts, batch_size=32):
    """高效批量处理"""
    llm = LLM(model="meta-llama/Llama-2-7b-hf")
    sampling_params = SamplingParams(temperature=0.7, max_tokens=200)
    
    # 分批处理
    results = []
    for i in range(0, len(prompts), batch_size):
        batch = prompts[i:i+batch_size]
        outputs = llm.generate(batch, sampling_params)
        results.extend([o.outputs[0].text for o in outputs])
    
    return results

# 使用
prompts = [f"Explain topic {i}" for i in range(100)]
results = batch_process(prompts)

监控与调试

# vLLM提供内置监控
# 启动时启用指标
python -m vllm.entrypoints.openai.api_server \
    --model model-name \
    --host 0.0.0.0 \
    --port 8000 \
    --disable-log-requests  # 禁用请求日志

# 访问 Prometheus 指标
# http://localhost:8000/metrics

与其他方案对比

# 性能对比(大致数据)
comparison = {
    "vLLM": {
        "吞吐量": "高",
        "延迟": "低",
        "显存效率": "高(PagedAttention)",
        "易用性": "高(OpenAI兼容)"
    },
    "TGI": {
        "吞吐量": "高",
        "延迟": "低",
        "显存效率": "中",
        "易用性": "高"
    },
    "llama.cpp": {
        "吞吐量": "中",
        "延迟": "中",
        "显存效率": "高(量化)",
        "易用性": "中"
    }
}

for engine, specs in comparison.items():
    print(f"\n{engine}:")
    for k, v in specs.items():
        print(f"  {k}: {v}")

最佳实践

# 1. 选择合适的量化格式
# AWQ/GPTQ 4-bit: 平衡性能和质量
# FP16: 最高质量

# 2. 配置GPU内存
# gpu_memory_utilization=0.9: 生产环境推荐

# 3. 启用前缀缓存
# enable_prefix_caching=True: 提升重复前缀性能

# 4. 监控关键指标
# - 吞吐量 (tokens/s)
# - 延迟 (TTFT, TPS)
# - GPU利用率

总结

vLLM是目前最高效的LLM推理引擎之一,通过PagedAttention和Continuous Batching等技术,实现了高吞吐量和低延迟的推理服务。其OpenAI兼容接口使得迁移和集成变得简单。