LLM工程化 进阶 LLM 模型部署 vLLM TensorRT-LLM

大模型部署方案对比:从理论到实践

AIEng Hub
阅读约 15 分钟

大模型部署方案对比:从理论到实践

随着大语言模型(LLM)的快速发展,如何高效、稳定地部署这些模型成为工程团队面临的核心挑战。本文将深入对比当前主流的 LLM 部署方案,帮助您根据业务场景做出最优选择。

一、部署方案概览

当前主流的 LLM 部署方案可分为以下几类:

方案适用场景性能特点学习曲线
vLLM高并发在线服务极致吞吐,PagedAttention中等
TensorRT-LLMNVIDIA GPU 生产环境极致延迟,高度优化较陡
TGI (Text Generation Inference)企业级 HuggingFace 生态功能丰富,易于集成平缓
Ollama本地开发/边缘部署开箱即用,资源友好平缓
llama.cppCPU/边缘设备低资源占用,量化友好平缓

二、方案深度对比

2.1 vLLM:高并发场景的首选

vLLM 由伯克利大学 Sky Computing Lab 开发,其核心创新是 PagedAttention 算法,显著提升了 GPU 内存利用率和系统吞吐量。

核心优势

  • PagedAttention:将 KV Cache 分页管理,消除内存碎片
  • Continuous Batching:动态批处理,最大化 GPU 利用率
  • 高性能:相比 HuggingFace TGI,吞吐量提升 2-4 倍

快速开始

# 安装 vLLM
pip install vllm

# 启动服务
python -m vllm.entrypoints.openai.api_server \
    --model meta-llama/Llama-2-7b-hf \
    --tensor-parallel-size 1 \
    --dtype half \
    --max-num-seqs 256

API 调用示例

import openai

openai.api_base = "http://localhost:8000/v1"
openai.api_key = "none"

response = openai.ChatCompletion.create(
    model="meta-llama/Llama-2-7b-hf",
    messages=[{"role": "user", "content": "你好,请介绍一下自己"}],
    temperature=0.7,
    max_tokens=512
)

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

性能基准测试

在 A100 40GB GPU 上测试 Llama-2-7B:

并发数vLLM (tok/s)HF TGI (tok/s)提升倍数
185821.04x
85803201.81x
169804502.18x
3214505202.79x

2.2 TensorRT-LLM:NVIDIA 生态的极致优化

TensorRT-LLM 是 NVIDIA 推出的高性能推理库,专为 NVIDIA GPU 深度优化。

核心特性

  • FP8/INT8/INT4 量化:支持多种精度,平衡速度与质量
  • In-flight Batching:真正的动态批处理
  • 多 GPU 支持:Tensor Parallelism 和 Pipeline Parallelism
  • Attention 优化:支持 FlashAttention-2、PagedAttention

构建与部署流程

# 1. 安装 TensorRT-LLM
pip install tensorrt_llm -U --extra-index-url https://pypi.nvidia.com

# 2. 下载并转换模型
git clone https://github.com/NVIDIA/TensorRT-LLM.git
cd TensorRT-LLM/examples/llama

# 3. 构建引擎(以 Llama-2-7B 为例)
python build.py --model_dir /path/to/llama-2-7b \
    --dtype float16 \
    --remove_input_padding \
    --use_gpt_attention_plugin float16 \
    --enable_context_fmha \
    --output_dir ./llama-7b-trt

# 4. 启动服务
python ../run.py --engine_dir ./llama-7b-trt \
    --max_output_len 512 \
    --tokenizer_dir /path/to/llama-2-7b \
    --input_text "你好"

量化优化示例

# FP8 量化构建
python build.py --model_dir /path/to/llama-2-7b \
    --dtype float16 \
    --use_fp8 \
    --fp8_kv_cache \
    --output_dir ./llama-7b-fp8

FP8 量化可在几乎无损精度的情况下,将显存占用降低 50%,推理速度提升 30-50%。

2.3 TGI:HuggingFace 生态的企业级方案

Text Generation Inference (TGI) 是 HuggingFace 推出的生产级推理服务,与 HF 生态无缝集成。

主要特点

  • Safetensors 支持:快速模型加载
  • FlashAttention:内置优化
  • 水印检测:支持 AI 生成内容检测
  • OpenAI 兼容 API:易于迁移
  • 多语言支持:包括中文优化

Docker 部署

# 拉取镜像
model=meta-llama/Llama-2-7b-hf
volume=$PWD/data

docker run --gpus all --shm-size 1g -p 8080:80 \
    -v $volume:/data \
    ghcr.io/huggingface/text-generation-inference:1.4 \
    --model-id $model \
    --num-shard 1 \
    --max-input-length 2048 \
    --max-total-tokens 4096

客户端调用

import requests

headers = {"Content-Type": "application/json"}
payload = {
    "inputs": "你好,请介绍一下机器学习",
    "parameters": {
        "max_new_tokens": 512,
        "temperature": 0.7,
        "top_p": 0.9
    }
}

response = requests.post(
    "http://localhost:8080/generate",
    headers=headers,
    json=payload
)

print(response.json()["generated_text"])

2.4 Ollama:本地开发的首选

Ollama 让本地运行大模型变得极其简单,适合开发调试和边缘部署。

安装与使用

# macOS/Linux
curl -fsSL https://ollama.com/install.sh | sh

# 运行模型
ollama run llama2

# 自定义模型(Modelfile)
cat > Modelfile << 'EOF'
FROM llama2
PARAMETER temperature 0.7
PARAMETER top_p 0.9
SYSTEM """你是一个专业的 AI 助手,请用中文回答。"""
EOF

ollama create my-llama2 -f Modelfile
ollama run my-llama2

REST API 调用

import requests
import json

response = requests.post('http://localhost:11434/api/generate', 
    json={
        'model': 'llama2',
        'prompt': '你好,请介绍一下自己',
        'stream': False,
        'options': {
            'temperature': 0.7,
            'num_predict': 512
        }
    }
)

result = response.json()
print(result['response'])

三、选型决策树

根据您的具体场景,可以参考以下决策流程:

是否需要极致性能(高并发在线服务)?
├── 是 → 使用 NVIDIA GPU?
│   ├── 是 → TensorRT-LLM(极致延迟)或 vLLM(极致吞吐)
│   └── 否 → vLLM(AMD/Intel GPU 也支持)
└── 否 → 是否需要 HuggingFace 生态深度集成?
    ├── 是 → TGI
    └── 否 → 是否本地开发/边缘部署?
        ├── 是 → Ollama 或 llama.cpp
        └── 否 → vLLM(通用场景)

四、生产环境最佳实践

4.1 容器化部署

# vLLM Dockerfile 示例
FROM nvidia/cuda:12.1-runtime-ubuntu22.04

RUN apt-get update && apt-get install -y python3-pip
RUN pip install vllm

EXPOSE 8000

CMD python -m vllm.entrypoints.openai.api_server \
    --model ${MODEL_NAME} \
    --tensor-parallel-size ${TP_SIZE:-1} \
    --dtype half \
    --max-num-seqs 256 \
    --port 8000

4.2 Kubernetes 部署

apiVersion: apps/v1
kind: Deployment
metadata:
  name: vllm-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: vllm
  template:
    metadata:
      labels:
        app: vllm
    spec:
      containers:
      - name: vllm
        image: vllm/vllm-openai:latest
        resources:
          limits:
            nvidia.com/gpu: "1"
        env:
        - name: MODEL_NAME
          value: "meta-llama/Llama-2-7b-hf"
        ports:
        - containerPort: 8000
---
apiVersion: v1
kind: Service
metadata:
  name: vllm-service
spec:
  selector:
    app: vllm
  ports:
  - port: 8000
    targetPort: 8000
  type: LoadBalancer

4.3 监控与日志

# 使用 Prometheus 监控 vLLM
from prometheus_client import Counter, Histogram, start_http_server

# 定义指标
request_count = Counter('llm_requests_total', 'Total requests')
request_duration = Histogram('llm_request_duration_seconds', 'Request duration')
tokens_generated = Counter('llm_tokens_generated_total', 'Total tokens generated')

# 启动 metrics 服务
start_http_server(9090)

# 在推理代码中埋点
@request_duration.time()
def generate(request):
    request_count.inc()
    response = model.generate(request)
    tokens_generated.inc(len(response.tokens))
    return response

五、常见问题与解决方案

问题可能原因解决方案
OOM (显存不足)批处理过大/序列过长减小 max_num_seqs,启用量化
首 token 延迟高模型加载/编译开销预热服务,使用 TensorRT 引擎
吞吐量不达预期批处理策略不当调整 batching 参数,使用 Continuous Batching
精度下降量化配置不当使用更保守的量化策略,校准数据集

六、总结

选择合适的 LLM 部署方案需要综合考虑性能需求、硬件环境、团队技能和生态兼容性:

  • vLLM 是高并发在线服务的最佳选择,PagedAttention 带来显著吞吐提升
  • TensorRT-LLM 适合 NVIDIA 生态的生产环境,提供极致延迟优化
  • TGI 适合深度使用 HuggingFace 生态的团队,功能丰富且稳定
  • Ollama 是本地开发和边缘部署的理想选择,简单易用

建议从 vLLM 或 TGI 开始,根据实际性能需求逐步迁移到 TensorRT-LLM 等更优化的方案。


参考资源: