基于vLLM构建OpenAI-API兼容API服务:详细步骤与优化指南

12

基于vLLM构建与OpenAI-API兼容的API服务:详细指南

在人工智能领域,大型语言模型(LLM)正变得越来越普及。为了充分利用这些模型,我们需要高效且易于使用的API服务。本文将深入探讨如何利用vLLM构建与OpenAI-API兼容的API服务,从而实现推理加速并简化集成过程。

一、前言

随着开源模型的日益普及,将它们集成到实际应用中变得至关重要。在“开源模型应用落地-qwen1.5-7b-chat与vllm实现推理加速的正确姿势(八)”一文中,我们已经了解了如何使用vLLM加速qwen1.5-7b-chat的推理。本文将在此基础上,进一步探讨如何基于vLLM构建与OpenAI-API兼容的API服务,以便更方便地使用这些模型。

二、术语

为了更好地理解本文的内容,以下是一些关键术语的解释:

2.1、vLLM

vLLM是一个开源的大模型推理加速框架。它通过PagedAttention机制有效地管理attention中缓存的张量,从而显著提高吞吐量。与HuggingFace Transformers相比,vLLM能够实现高达14-24倍的吞吐量提升,这使得它成为部署LLM的理想选择。

2.2、OpenAI-API Compatible API Service

OpenAI-API兼容的API服务是指遵循OpenAI API接口规范的服务。这意味着开发者可以使用与OpenAI API相同的方式和方法来调用这些服务,从而轻松利用各种语言模型的功能。这种兼容性极大地简化了集成过程,并降低了学习成本。

三、前提条件

在开始构建API服务之前,需要满足以下前提条件:

3.1. 基础环境及前置条件

  • Python环境: 确保已安装Python 3.8或更高版本。
  • pip包管理器: 确保pip已更新到最新版本。
  • CUDA环境: 如果希望利用GPU加速,需要安装CUDA和相应的驱动程序。
  • vLLM: 按照vLLM的官方文档安装vLLM及其依赖项。
  • 模型: 下载或准备好需要部署的语言模型,例如qwen1.5-7b-chat。

四、构建OpenAI-API兼容的API服务

接下来,我们将详细介绍如何基于vLLM构建与OpenAI-API兼容的API服务。我们将使用FastAPI框架来创建API,并使用vLLM进行推理加速。

4.1、安装依赖

首先,安装所需的Python依赖包:

pip install fastapi uvicorn vllm openai

4.2、创建FastAPI应用

创建一个名为main.py的文件,并添加以下代码:

from fastapi import FastAPI, Request, HTTPException
from fastapi.responses import StreamingResponse
from vllm import LLM, SamplingParams
import openai
import json

app = FastAPI()

llm = LLM(model="Qwen/Qwen1.5-7B-Chat", trust_remote_code=True)

sampling_params = SamplingParams(temperature=0.8, top_p=0.95, max_tokens=2048)

@app.post("/v1/chat/completions")
async def chat_completions(request: Request):
    json_post_raw = await request.body()
    json_post = json.loads(json_post_raw)
    prompt = json_post["messages"][0]["content"]
    # 使用vLLM生成文本
    try:
        results = llm.generate(prompt, sampling_params)
        for output in results:
            answer = output.outputs[0].text
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

    # 构造OpenAI API兼容的响应
    response = {
        "id": "chatcmpl-xxxxxxxxxxxxxxxxxxxxxxxx",
        "object": "chat.completion",
        "created": 1629757595,
        "model": "Qwen/Qwen1.5-7B-Chat",
        "choices": [
            {
                "message": {
                    "role": "assistant",
                    "content": answer
                },
                "finish_reason": "stop",
                "index": 0
            }
        ],
        "usage": {
            "prompt_tokens": 0,
            "completion_tokens": 0,
            "total_tokens": 0
        }
    }
    return response


if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

代码解释:

  1. 导入必要的库: 导入FastAPI、vLLM和OpenAI库。
  2. 初始化vLLM: 使用LLM类初始化vLLM,指定模型名称。请注意,trust_remote_code=True允许加载远程代码,但需要谨慎使用。
  3. 定义采样参数: 使用SamplingParams类定义文本生成的采样参数,例如温度和top_p。
  4. 创建API端点: 使用@app.post装饰器创建一个POST API端点/v1/chat/completions,该端点接收OpenAI API兼容的请求。
  5. 解析请求: 从请求中提取提示(prompt)。
  6. 使用vLLM生成文本: 调用llm.generate方法使用vLLM生成文本。处理潜在的异常情况。
  7. 构造响应: 构造OpenAI API兼容的JSON响应,包含生成的文本。

4.3、运行API服务

在终端中运行以下命令启动API服务:

python main.py

这将启动一个运行在http://0.0.0.0:8000的API服务。

五、测试API服务

可以使用curl或任何HTTP客户端来测试API服务。以下是一个使用curl的示例:

curl -X POST \
  http://0.0.0.0:8000/v1/chat/completions \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "Qwen/Qwen1.5-7B-Chat",
    "messages": [{"role": "user", "content": "你好,请自我介绍一下。"}]
  }'

如果一切顺利,您将收到一个包含模型生成的文本的JSON响应。

六、流式响应

OpenAI API支持流式响应,这意味着服务器可以逐步发送生成的文本,而不是等待整个文本生成完毕。vLLM也支持流式输出。要实现流式响应,可以修改main.py文件如下:

from fastapi import FastAPI, Request, HTTPException
from fastapi.responses import StreamingResponse
from vllm import LLM, SamplingParams
import openai
import json

app = FastAPI()

llm = LLM(model="Qwen/Qwen1.5-7B-Chat", trust_remote_code=True)

sampling_params = SamplingParams(temperature=0.8, top_p=0.95, max_tokens=2048)

async def stream_response(prompt: str):
    results = llm.generate(prompt, sampling_params, stream=True)
    for output in results:
        text = output.outputs[0].text
        chunk = {
            "id": "chatcmpl-xxxxxxxxxxxxxxxxxxxxxxxx",
            "object": "chat.completion.chunk",
            "created": 1629757595,
            "model": "Qwen/Qwen1.5-7B-Chat",
            "choices": [
                {
                    "delta": {
                        "content": text
                    },
                    "finish_reason": None,
                    "index": 0
                }
            ],
            "usage": {
                "prompt_tokens": 0,
                "completion_tokens": 0,
                "total_tokens": 0
            }
        }
        yield json.dumps(chunk).encode() + b"\n"

@app.post("/v1/chat/completions")
async def chat_completions(request: Request):
    json_post_raw = await request.body()
    json_post = json.loads(json_post_raw)
    prompt = json_post["messages"][0]["content"]
    return StreamingResponse(stream_response(prompt), media_type="text/event-stream")


if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

修改说明:

  • stream_response函数: 创建一个生成器函数,该函数使用llm.generate生成文本,并设置stream=True以启用流式输出。然后,它将每个生成的文本块构造为OpenAI API兼容的chat.completion.chunk格式,并通过yield关键字逐步返回。
  • chat_completions函数: 使用StreamingResponse类返回流式响应,并设置media_typetext/event-stream

使用相同的curl命令测试API服务,您将看到服务器逐步发送生成的文本。

七、高级配置

vLLM提供了许多高级配置选项,可以根据您的需求进行调整。

7.1、GPU配置

可以使用gpu_memory_utilization参数来控制vLLM使用的GPU内存比例。例如,要将GPU内存使用率限制为0.8,可以修改LLM初始化代码如下:

llm = LLM(model="Qwen/Qwen1.5-7B-Chat", gpu_memory_utilization=0.8, trust_remote_code=True)

7.2、量化

vLLM支持多种量化技术,可以进一步降低GPU内存使用量并提高推理速度。可以使用quantization参数来指定量化方法。例如,要使用GPTQ量化,可以修改LLM初始化代码如下:

llm = LLM(model="Qwen/Qwen1.5-7B-Chat", quantization="GPTQ", trust_remote_code=True)

7.3、多GPU支持

vLLM可以利用多GPU进行并行推理。要启用多GPU支持,只需在运行API服务时指定可见的GPU设备。例如,要使用GPU 0和GPU 1,可以设置CUDA_VISIBLE_DEVICES环境变量:

CUDA_VISIBLE_DEVICES=0,1 python main.py

八、安全性考虑

在部署API服务时,必须考虑安全性问题。

8.1、身份验证

建议实施身份验证机制,以确保只有授权用户才能访问API服务。可以使用API密钥、OAuth 2.0等方法进行身份验证。

8.2、速率限制

为了防止滥用,应实施速率限制。可以使用FastAPI提供的中间件或第三方库来实现速率限制。

8.3、输入验证

对API的输入进行验证,以防止恶意输入。例如,可以限制输入文本的长度和格式。

九、总结

本文详细介绍了如何基于vLLM构建与OpenAI-API兼容的API服务。通过使用vLLM,可以显著提高推理速度并降低资源消耗。同时,与OpenAI API的兼容性使得集成过程更加简单。希望本文能够帮助您更好地利用大型语言模型。

AI快讯