vLLM快速入门:开启高效推理与部署之旅

在如今这个人工智能飞速发展的时代,语言模型的应用已经深入到我们生活的方方面面,从智能聊天机器人到文本生成工具,都离不开强大的语言模型技术支持。而vLLM作为一个专注于高效推理和部署的开源项目,正在为研究人员和开发人员提供一种全新的解决方案,让语言模型的使用变得更加便捷、高效。

初识vLLM:背景与意义

vLLM(Very Large Language Model Inference)是一个专注于大型语言模型推理的开源项目,旨在帮助用户以高效、灵活的方式进行离线批量推理和在线服务部署。其核心目标是通过优化推理过程,降低硬件资源消耗,提高模型的响应速度和吞吐量,从而使得语言模型在各种应用场景下的表现更加出色。

对于科研人员来说,vLLM提供了一个理想的实验平台,可以方便地测试和验证新的语言模型架构和算法。而对于开发者而言,vLLM则是一个强大的工具,能够快速将语言模型集成到实际产品和服务中,加速产品迭代和创新。

环境搭建:开启vLLM之旅的第一步

在开始使用vLLM之前,需要先确保系统环境符合要求。vLLM支持Linux操作系统,并且需要Python版本在3.9到3.12之间。对于使用NVIDIA GPU的用户,可以通过pip直接安装vLLM。

推荐使用uv,一个快速的Python环境管理工具,来创建和管理Python环境。安装uv后,可以通过以下命令创建新的Python环境并安装vLLM:

复制代码
uv venv --python 3.12 --seed
source .venv/bin/activate
uv pip install vllm --torch-backend=auto

这里,--torch-backend=auto选项会自动检测系统中安装的CUDA驱动版本,并选择合适的PyTorch索引。如果需要指定特定的后端,例如cu126,可以使用--torch-backend=cu126或者设置环境变量UV_TORCH_BACKEND=cu126

对于不使用CUDA平台的用户,可以参考官方文档获取详细的安装指导。此外,也可以选择使用conda来创建和管理Python环境,然后通过pip安装uv和vLLM:

复制代码
conda create -n myenv python=3.12 -y
conda activate myenv
pip install --upgrade uv
uv pip install vllm --torch-backend=auto

通过这种方式,用户可以根据自己的需求和系统配置灵活地搭建vLLM环境,为后续的推理和部署工作做好准备。

离线批量推理:高效处理文本生成任务

安装完成后,vLLM就可以开始进行离线批量推理了。离线批量推理是一种在无网络连接的情况下,对大量输入提示进行文本生成的方法,适用于需要批量处理文本数据的场景,如文档摘要、内容创作等。

以下是一个简单的离线推理示例:

复制代码
from vllm import LLM, SamplingParams

prompts = [
    "Hello, my name is",
    "The president of the United States is",
    "The capital of France is",
    "The future of AI is",
]
sampling_params = SamplingParams(temperature=0.8, top_p=0.95)

llm = LLM(model="facebook/opt-125m")

outputs = llm.generate(prompts, sampling_params)

for output in outputs:
    prompt = output.prompt
    generated_text = output.outputs[0].text
    print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}")

在这个示例中,首先导入了LLMSamplingParams两个关键类。LLM类是vLLM引擎的核心,用于运行离线推理,而SamplingParams类则用于指定采样过程中的参数,如温度(temperature)和核采样概率(top_p)。

然后,定义了一个包含多个输入提示的列表prompts,并设置了相应的采样参数。接着,初始化了LLM实例,指定了要使用的模型为facebook/opt-125m。最后,通过调用llm.generate方法,将输入提示添加到vLLM引擎的等待队列中,并执行引擎以生成输出结果。输出结果以RequestOutput对象的形式返回,包含了所有输出标记。

需要注意的是,vLLM默认会使用模型创建者推荐的采样参数,这些参数存储在Hugging Face模型仓库中的generation_config.json文件中。如果希望使用vLLM的默认采样参数,可以在创建LLM实例时设置generation_config="vllm"

此外,vLLM支持从Hugging Face和ModelScope两种平台下载模型。如果需要使用ModelScope上的模型,只需在初始化引擎前设置环境变量VLLM_USE_MODELSCOPE=True即可。

通过离线批量推理,用户可以在本地高效地处理大量文本生成任务,无需依赖外部网络连接,大大提高了数据处理的安全性和隐私性。

在线服务部署:实现模型的快速应用

除了离线推理,vLLM还可以部署为一个与OpenAI API协议兼容的服务器。这意味着vLLM可以作为OpenAI API的替代方案,直接用于那些已经基于OpenAI API构建的应用程序中,实现无缝集成和快速切换。

启动vLLM服务器的命令如下:

复制代码
vllm serve Qwen/Qwen2.5-1.5B-Instruct

默认情况下,服务器会在http://localhost:8000地址启动。用户可以通过--host--port参数自定义服务器的地址和端口。目前,vLLM服务器一次只能托管一个模型,并实现了列出模型、创建聊天完成和创建完成等接口。

在服务器运行过程中,会自动应用Hugging Face模型仓库中的generation_config.json文件中的采样参数。如果希望禁用此行为,可以在启动服务器时添加--generation-config vllm参数。

此外,服务器还支持通过--api-key参数或环境变量VLLM_API_KEY启用API密钥验证功能,以增强安全性。

以下是一些与vLLM服务器交互的示例:

OpenAI Completions API 示例

通过命令行工具curl查询模型:

复制代码
curl http://localhost:8000/v1/models

使用curl发送文本生成请求:

复制代码
curl http://localhost:8000/v1/completions \
    -H "Content-Type: application/json" \
    -d '{
        "model": "Qwen/Qwen2.5-1.5B-Instruct",
        "prompt": "San Francisco is a",
        "max_tokens": 7,
        "temperature": 0
    }'

也可以通过Python中的openai包与服务器交互:

复制代码
from openai import OpenAI

openai_api_key = "EMPTY"
openai_api_base = "http://localhost:8000/v1"
client = OpenAI(
    api_key=openai_api_key,
    base_url=openai_api_base,
)
completion = client.completions.create(model="Qwen/Qwen2.5-1.5B-Instruct",
                                      prompt="San Francisco is a")
print("Completion result:", completion)

OpenAI Chat Completions API 示例

使用curl发送聊天请求:

复制代码
curl http://localhost:8000/v1/chat/completions \
    -H "Content-Type: application/json" \
    -d '{
        "model": "Qwen/Qwen2.5-1.5B-Instruct",
        "messages": [
            {"role": "system", "content": "You are a helpful assistant."},
            {"role": "user", "content": "Who won the world series in 2020?"}
        ]
    }'

使用Python中的openai包发送聊天请求:

复制代码
from openai import OpenAI

openai_api_key = "EMPTY"
openai_api_base = "http://localhost:8000/v1"

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

chat_response = client.chat.completions.create(
    model="Qwen/Qwen2.5-1.5B-Instruct",
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Tell me a joke."},
    ]
)
print("Chat response:", chat_response)

通过在线服务部署,vLLM使得模型的共享和协作变得更加容易,团队成员可以在不同的项目中复用同一个模型服务,提高资源利用率,同时也便于对模型进行统一管理和维护。

注意力后端:优化计算性能的关键

vLLM支持多种注意力后端,以适应不同的平台和加速器架构,从而实现高效的注意力计算。它会自动选择与系统和模型规格兼容的最优后端。如果需要手动指定后端,可以通过设置环境变量VLLM_ATTENTION_BACKEND来实现,可选值包括FLASH_ATTNFLASHINFERXFORMERS

需要注意的是,目前没有预构建的包含Flash Infer的vllm轮子,因此需要先在环境中安装Flash Infer。可以参考Flash Infer的官方文档或查看Dockerfile中的安装说明。

通过合理选择和配置注意力后端,用户可以根据自己的硬件环境和任务需求,进一步优化vLLM的计算性能,提高模型的推理速度和效率。

总结

vLLM以其简便的安装流程、高效的离线批量推理能力和强大的在线服务部署功能,为语言模型的推理和应用提供了一个全面而灵活的解决方案。无论是科研人员还是开发者,都可以借助vLLM快速开展实验、构建原型,并将语言模型集成到实际产品和服务中。

随着vLLM的不断发展和完善,我们有理由相信,它将在语言模型领域发挥越来越重要的作用,推动人工智能技术的创新和普及。未来,期待vLLM在更多场景下大放异彩,为各行各业带来更多的便利和可能性。