Hugging Face Transformers 库为庞大的模型架构生态系统提供了一个灵活、统一的接口。从研究到在自定义数据集上进行微调,Transformers 是所有这些任务的首选工具包。

但当涉及到大规模部署这些模型时,推理速度和效率往往成为核心。这时就轮到 vLLM 了,这是一个专为高吞吐量推理而设计的库,它从 Hugging Face Hub 获取模型,并针对生产就绪性能进行优化。

vLLM 代码库最近增加了一项功能,允许利用 Transformers 作为后端来运行模型。因此,vLLM 将在现有的 Transformers 架构之上优化吞吐量/延迟。在这篇文章中,我们将探讨 vLLM 如何利用 Transformers 后端将灵活性效率结合起来,使您能够更快、更智能地部署最先进的模型。

Transformers 和 vLLM:推理实践

让我们从一个简单的文本生成任务开始,使用 meta-llama/Llama-3.2-1B 模型,看看这些库的表现如何。

使用 Transformers 进行推理

Transformers 库以其简单性和多功能性脱颖而出。使用其 pipeline API,推理变得轻而易举

from transformers import pipeline

pipe = pipeline("text-generation", model="meta-llama/Llama-3.2-1B")
result = pipe("The future of AI is")

print(result[0]["generated_text"])

这种方法非常适合原型设计或小规模任务,但并未针对高容量推理或低延迟部署进行优化。

使用 vLLM 进行推理

vLLM 走了另一条路,通过 PagedAttention(一种内存高效的注意力机制)和动态批处理等特性来优先考虑效率。以下是 vLLM 中的相同任务

from vllm import LLM, SamplingParams

llm = LLM(model="meta-llama/Llama-3.2-1B")
params = SamplingParams(max_tokens=20)
outputs = llm.generate("The future of AI is", sampling_params=params)
print(f"Generated text: {outputs[0].outputs[0].text}")

vLLM 的推理速度明显更快且更节省资源,尤其是在负载下。例如,它可以在 GPU 内存使用量更低的情况下处理每秒数千个请求。

vLLM 的部署超能力:OpenAI 兼容性

除了原始性能之外,vLLM 还提供了与 OpenAI 兼容的 API,使其可以作为外部服务的直接替代品。启动服务器

vllm serve meta-llama/Llama-3.2-1B

然后使用 curl 查询它

curl https://:8000/v1/completions \
  -H "Content-Type: application/json" \
  -d '{"model": "meta-llama/Llama-3.2-1B", "prompt": "San Francisco is a", "max_tokens": 7, "temperature": 0}'

或者使用 Python 的 OpenAI 客户端

from openai import OpenAI

client = OpenAI(api_key="EMPTY", base_url="https://:8000/v1")
completion = client.completions.create(
    model="meta-llama/Llama-3.2-1B",
    prompt="San Francisco is a",
    max_tokens=7,
    temperature=0
)
print("Completion result:", completion.choices[0].text)

这种兼容性大幅降低了成本并增强了控制力,让您可以使用 vLLM 的优化方案在本地扩展推理。

为什么我们需要 Transformers 后端?

Transformers 库针对贡献和添加新模型进行了优化。另一方面,将新模型添加到 vLLM 中则稍微复杂一些

理想世界中,一旦新模型被添加到 Transformers 中,我们就能够在 vLLM 中使用它。通过集成 Transformers 后端,我们正朝着这个理想世界迈进。

这是关于如何使您的 Transformers 模型与 vLLM 兼容以实现集成的官方文档。我们遵循了这一点,并使 modeling_gpt2.py 与集成兼容!您可以在此Transformers 拉取请求中查看更改。

对于已经在 Transformers 中(并且与 vLLM 兼容)的模型,我们需要执行以下操作

llm = LLM(model="new-transformers-model", model_impl="transformers")

注意

添加 model_impl 参数并非严格必要。如果模型在 vLLM 中不是原生支持的,vLLM 会自行切换到 Transformers 实现。

或者对于来自 Hugging Face Hub 的自定义模型

llm = LLM(model="custom-hub-model", model_impl="transformers", trust_remote_code=True)

这个后端充当了桥梁,将 Transformers 的即插即用灵活性与 vLLM 的推理能力结合起来。您可以获得两全其美的优势:使用 Transformers 进行快速原型设计,以及使用 vLLM 进行优化的部署。

案例研究:Helium

Kyutai 团队的 Helium 模型尚未被 vLLM 原生支持。您可能希望使用 vLLM 对该模型进行优化的推理,而这正是 Transformers 后端发挥作用的地方。

让我们看看实际操作

vllm serve kyutai/helium-1-preview-2b --model-impl transformers

使用 OpenAI API 查询它

from openai import OpenAI

openai_api_key = "EMPTY"
openai_api_base = "https://:8000/v1"

client = OpenAI(
    api_key=openai_api_key,
    base_url=openai_api_base,
)

completion = client.completions.create(model="kyutai/helium-1-preview-2b", prompt="What is AI?")
print("Completion result:", completion)

在这里,vLLM 高效地处理输入,利用 Transformers 后端无缝加载 kyutai/helium-1-preview-2b。与在 Transformers 中原生运行相比,vLLM 提供了更低的延迟和更好的资源利用率。

将 Transformers 的模型生态系统与 vLLM 的推理优化相结合,您将解锁一个既灵活又可扩展的工作流程。无论您是原型设计新模型、部署自定义创作,还是扩展多模态应用,这种组合都能加速您从研究到生产的进程。