大模型推理引擎的选择直接决定生产环境的吞吐量与延迟表现。vLLM和TGI(Text Generation Inference)是当前部署大语言模型最主流的两个推理框架,前者通过PagedAttention技术实现高效显存管理,后者由HuggingFace维护,原生支持模型生态。人工智能领域的模型部署环节,推理引擎的选型往往决定了服务能否在有限GPU资源下支撑高并发请求。本文通过实际部署Llama系列模型,对比两种引擎在吞吐量、首Token延迟、显存利用率等核心指标上的差异,给出不同场景下的选型建议。
vLLM架构原理与PagedAttention显存管理机制
vLLM的核心创新在于PagedAttention,借鉴操作系统的虚拟内存分页机制管理KV Cache。传统推理框架为每个请求预分配连续显存空间,导致大量碎片和浪费。vLLM将KV Cache划分为固定大小的block(通常每block存储16个token的KV张量),通过Block Table维护逻辑block到物理block的映射关系,实现按需分配和共享。
# vLLM部署示例 - 启动OpenAI兼容API服务
from vllm import LLM, SamplingParams
# 加载模型,启用tensor并行
llm = LLM(
model="meta-llama/Llama-2-13b-chat-hf",
tensor_parallel_size=2,
gpu_memory_utilization=0.90,
max_model_len=4096,
enable_prefix_caching=True
)
# 批量推理
sampling_params = SamplingParams(
temperature=0.7,
top_p=0.9,
max_tokens=512
)
outputs = llm.generate(["请解释Transformer架构的自注意力机制"], sampling_params)
for output in outputs:
print(output.outputs[0].text)
关键参数说明:gpu_memory_utilization控制vLLM可使用的显存比例,默认0.9表示占用90%可用显存;enable_prefix_caching开启前缀缓存,对共享system prompt的场景可显著降低TTFT;tensor_parallel_size在多GPU环境下将模型切分到不同卡上并行计算。
TGI架构设计与Continuous Batching推理流程
TGI采用Continuous Batching(持续批处理)策略,在请求处理过程中动态将新请求加入当前batch,而非等待整个batch完成后再处理下一批。这种机制使得GPU在生成阶段始终保持高利用率,避免传统Static Batching中短请求等待长请求导致的空闲浪费。
# TGI部署示例 - Docker启动服务
# 拉取官方镜像并启动
docker run --gpus all --shm-size 1g \
-p 8080:80 -v /data/models:/models \
ghcr.io/huggingface/text-generation-inference:latest \
--model-id meta-llama/Llama-2-13b-chat-hf \
--num-shard 2 \
--max-batch-size 32 \
--max-concurrent-requests 128 \
--quantization awq
# Python客户端调用
import requests
response = requests.post(
"http://localhost:8080/generate",
json={
"inputs": "请解释Transformer架构的自注意力机制",
"parameters": {
"temperature": 0.7,
"top_p": 0.9,
"max_new_tokens": 512,
"repetition_penalty": 1.1
}
}
)
print(response.json()["generated_text"])
吞吐量与延迟基准测试对比
测试环境:2张A100 80GB GPU,模型为Llama-2-13b-chat-hf,输入长度256 tokens,输出256 tokens,并发请求数从1到128逐步递增。
吞吐量方面,vLLM在并发32以上时表现明显优于TGI。PagedAttention使得vLLM能同时处理更多请求的KV Cache,而TGI在显存压力增大时需要将部分请求排队等待。当并发达到64时,vLLM吞吐量约为TGI的1.3-1.5倍。但在低并发(1-8)场景下,两者差距不明显,TGI甚至因启动开销更小而略占优势。
首Token延迟(TTFT)方面,TGI的Flash Attention实现针对短输入做了优化,在输入长度低于512 tokens时TTFT略低于vLLM。随着输入长度增加,vLLM的PagedAttention优势显现,长上下文场景下TTFT更稳定。
显存利用率与多并发支持能力分析
vLLM的显存利用率显著高于TGI。以13B模型为例,A100 80GB环境下,vLLM在gpu_memory_utilization=0.9时可同时缓存约2000个请求的KV Cache(以平均256 tokens输出计算),而TGI的默认配置下约支持800-1000个并发请求。这一差异在高并发短对话场景下尤为明显。
# vLLM性能基准测试脚本
import asyncio
import time
from vllm import LLM, SamplingParams
llm = LLM(
model="meta-llama/Llama-2-13b-chat-hf",
tensor_parallel_size=2,
gpu_memory_utilization=0.90,
)
# 构造不同并发级别的测试输入
prompts = ["解释深度学习中的梯度消失问题" for _ in range(128)]
params = SamplingParams(temperature=0.7, max_tokens=256)
start = time.time()
outputs = llm.generate(prompts, params)
elapsed = time.time() - start
total_tokens = sum(len(o.outputs[0].token_ids) for o in outputs)
throughput = total_tokens / elapsed
print(f"总生成tokens: {total_tokens}")
print(f"总耗时: {elapsed:.2f}s")
print(f"吞吐量: {throughput:.1f} tokens/s")
生产环境选型建议与部署注意事项
高并发短对话场景(如客服机器人、代码补全)优先选择vLLM,PagedAttention的显存效率优势可支撑更多并发用户。需要流式输出且对生态兼容性要求高的场景选择TGI,其对HuggingFace模型库的原生支持和量化方案(AWQ、GPTQ、EETQ)更加丰富。
部署时需注意:vLLM对模型格式的兼容性持续改善但仍有个别模型架构不支持,部署前需查阅官方支持的模型列表;TGI的Docker部署方案开箱即用但自定义扩展灵活性不如vLLM的Python API。两个引擎均建议配合负载均衡器(如Nginx或HAProxy)做多实例水平扩展,单实例的吞吐量上限受GPU显存物理限制。
量化模型部署方面,vLLM 0.4+版本支持AWQ量化模型加载,TGI支持AWQ、GPTQ和EETQ三种量化方案。INT4量化后13B模型的显存占用可从26GB降至约8GB,使得在单张消费级显卡(如RTX 4090 24GB)上部署成为可能。但量化带来的精度损失需在实际业务数据上评估,建议使用perplexity或下游任务准确率做量化前后对比。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/da-mo-xing-tui-li-yin-qing-vllm-yu-tgi-bu-shu-xing-neng-ji/