大模型部署方案对比:从理论到实践
随着大语言模型(LLM)的快速发展,如何高效、稳定地部署这些模型成为工程团队面临的核心挑战。本文将深入对比当前主流的 LLM 部署方案,帮助您根据业务场景做出最优选择。
一、部署方案概览
当前主流的 LLM 部署方案可分为以下几类:
| 方案 | 适用场景 | 性能特点 | 学习曲线 |
|---|---|---|---|
| vLLM | 高并发在线服务 | 极致吞吐,PagedAttention | 中等 |
| TensorRT-LLM | NVIDIA GPU 生产环境 | 极致延迟,高度优化 | 较陡 |
| TGI (Text Generation Inference) | 企业级 HuggingFace 生态 | 功能丰富,易于集成 | 平缓 |
| Ollama | 本地开发/边缘部署 | 开箱即用,资源友好 | 平缓 |
| llama.cpp | CPU/边缘设备 | 低资源占用,量化友好 | 平缓 |
二、方案深度对比
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) | 提升倍数 |
|---|---|---|---|
| 1 | 85 | 82 | 1.04x |
| 8 | 580 | 320 | 1.81x |
| 16 | 980 | 450 | 2.18x |
| 32 | 1450 | 520 | 2.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 等更优化的方案。
参考资源: