rag系列文章目录


前言

最近大模型很火,但是能够训练大模型的,一般是头部大厂。相较于大模型训练而言,大模型推理则很多公司都在做,能够很好地进行大模型推理,在成本优化、性能提升、硬件适配、吞吐提高等多个方面很有意义。本文简要介绍两种推理框架Hugging Face Transformers和vllm,并对其简单对比。

一、Hugging Face Transformers

Hugging Face Transformers 是当前最主流的大模型推理与训练框架之一。它既可以快速加载和使用预训练模型,又能用于本地部署、微调和推理任务,覆盖 NLP、CV、语音、多模态等多个领域。它的作者是Hugging face开源社区,支持超过 100,000 个模型,涵盖 GPT、BERT、T5、LLaMA、ChatGLM、Qwen、BGE、CodeLLaMA、Whisper、CLIP 等。

它没有内置的 HTTP 服务器,需要开发者自行搭建。常见做法是结合 FastAPI 或 Flask,将 Transformers 推理代码封装成 REST 接口。例如可使用 transformers.pipeline 生成器,或者直接调用模型。Pipeline 支持批量输入(传入列表参数)并自动按 batch_size 分批。但整个服务要由用户编写和部署,例如通过 Uvicorn 启动 FastAPI 应用。

它加载和推理代码简单直观。通常只需几行代码即可创建模型和 Tokenizer,例如:model = AutoModelForSequenceClassification.from_pretrained(“BAAI/bge-reranker-v2-m3”)。对于批量请求,可使用 model(**batch_inputs) 得到 logits 输出。与之搭配的 Pipeline 也能自动处理输入分割和拼接。总体来说,代码逻辑简洁、社区示例丰富

HuggingFace Transformers:支持常见的 GPU/CPU 推理。通过 device_map=“auto” 可借助 Accelerate 将模型分布在多块 GPU(或 CPU)上。但其默认推理流程没有像 vLLM 那样的动态内存分配和并发请求处理。显存使用受限于张量预分配,如果多个请求并行到来,需要应用层自行管理批量与多线程。Transformer 也支持基本的 INT8 量化(如使用 bitsandbytes 库)以减小显存占用。

代码示例:

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

MODEL_NAME = "meta-llama/Llama-3.2-3B-Instruct"

# Load model and tokenizer
model = AutoModelForCausalLM.from_pretrained(MODEL_NAME, device_map="auto")
tokenizer = AutoTokenizer.from_pretrained(
    MODEL_NAME,
    padding_side="left",
    truncation_side="left"
)

# Set pad_token (LLaMA doesn't define one by default)
tokenizer.pad_token = tokenizer.eos_token

# Define batch of user prompts (4 in total)
user_questions = [
    "What is Thailand's national food symbol?",
    "What is the capital of Norway?",
    "Who invented the telescope?",
    "What is the chemical symbol for gold?"
]

# Format messages in chat format
messages_batch = [
    [
        {"role": "system", "content": "You are a helpful assistant. Respond in two sentences."},
        {"role": "user", "content": question}
    ]
    for question in user_questions
]

# Tokenize using chat template with padding and truncation
input_ids = tokenizer.apply_chat_template(
    messages_batch,
    tokenize=True,
    return_tensors="pt",
    padding=True,
    truncation=True,
    max_length=2048
).to(model.device)

# Clear previous GPU stats (optional, but good practice for clean runs)
torch.cuda.empty_cache()

# Generate responses
input_length = input_ids.shape[1]
generated_ids = model.generate(
    input_ids=input_ids,
    max_new_tokens=128,
    pad_token_id=tokenizer.pad_token_id
)

# Decode outputs
decoded_outputs = tokenizer.batch_decode(
    generated_ids[:, input_length:],
    skip_special_tokens=True
)

二、vllm

vLLM 是一个专为 大语言模型推理(LLM inference) 优化的高性能推理引擎,它是由 UC Berkeley + SkyPilot + HPC 团队(开源)开发的。

它提供一键式的服务器功能。运行命令 vllm serve <模型名> --task score 即可启动一个兼容 OpenAI API 的 HTTP 服务。vLLM 内置 /score 和 /rerank 等端点(对应跨编码器评分),可直接以 JSON 格式批量提交查询对并返回评分。开发者也可使用 OpenAI 官方客户端或任意 HTTP 客户端调用该服务,无需手动实现并发队列或批处理逻辑。

vllm通过其 LLM 类实现离线推理或通过 vllm serve 命令启动服务器。在离线模式下,示例代码如下:llm = LLM(model=“BAAI/bge-reranker-v2-m3”, task=“score”),然后调用 llm.score(text1, text2) 得到对应分数docs.vllm.ai。这种方式与 Transformers 类似,但需要显式指定 task=“score”。注意某些新模型可能需要 --hf_overrides 参数指定架构与配置。使用 CLI 启动服务器时(如 vllm serve )连同 API 调用则无需额外编码,配置稍复杂。总体来看,Transformers 的加载/推理代码较为直观,而 vLLM 需要掌握其特定类和参数。

vllm提供更高级的资源优化。其 PagedAttention 技术将 KV 缓存分块管理,避免一次性占用连续大块内存,从而提高显存利用率。vLLM 支持多种硬件:NVIDIA/AMD GPU、Intel CPU、Gaudi 加速卡、TPU 以及 AWS Trainium/Inferentia 等。此外,vLLM 原生支持多种量化方案(GPTQ、AWQ、INT4/8/FP8)加速推理。在并发方面,vLLM 的“持续批处理”机制能自动将新到请求填充到完成槽位,有效提高吞吐并减少延迟波动。Transformers 则需要依赖加速库或分布式框架显式管理并发,缺少类似的内置机制。

代码示例:

import torch
from vllm import LLM, SamplingParams
from transformers import AutoTokenizer

# Initialize tokenizer separately to apply chat template
MODEL_NAME = "meta-llama/Llama-3.2-3B-Instruct"
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
tokenizer.pad_token = tokenizer.eos_token  # Just in case

# Define a batch of prompts (4 in total)
user_questions = [
    "What is Thailand's national food symbol?",
    "What is the capital of Norway?",
    "Who invented the telescope?",
    "What is the chemical symbol for gold?"
]

# Create structured chat messages
messages_batch = [
    [
        {"role": "system", "content": "You are a helpful assistant. Respond in two sentences."},
        {"role": "user", "content": question}
    ]
    for question in user_questions
]

# Manually apply chat template to each prompt
rendered_prompts = [
    tokenizer.apply_chat_template(messages, tokenize=False)
    for messages in messages_batch
]

# Define generation parameters
sampling_params = SamplingParams(max_tokens=128)

# Initialize vLLM
llm = LLM(
    model=MODEL_NAME,
    max_model_len=2048,
)

# Run batch generation
outputs = llm.generate(rendered_prompts, sampling_params)

三、使用场景

HuggingFace Transformers:适合原型开发、小规模部署或对实时延迟要求不严格的场景。其生态成熟、文档和社区资源丰富,对模型定制(微调)、调试友好。如果只需偶尔批量推理(例如每日离线处理)或资源充足、使用简单部署框架即可满足需求,使用 Transformers 直接集成较为方便。

vLLM:适合高并发、大吞吐量和生产级部署场景。例如有大量重排序请求(如大型搜索引擎或推荐系统的后处理)时,vLLM 的优化能显著降低成本和延迟。它还支持复杂硬件和分布式设置,适合处理超大模型或受限显存环境。vLLM 的内置并行化和量化特性使其在规模化部署中表现更优。但如果需求仅是小规模推理或快速原型,开销相对较重的 vLLM 可能并无必要。


总结

两种推理框架面向的侧重点不同,部署一般使用vllm,而开发调试使用hugging face较为方便。
参考文档

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐