基于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)
代码解释:
- 导入必要的库: 导入FastAPI、vLLM和OpenAI库。
- 初始化vLLM: 使用
LLM
类初始化vLLM,指定模型名称。请注意,trust_remote_code=True
允许加载远程代码,但需要谨慎使用。 - 定义采样参数: 使用
SamplingParams
类定义文本生成的采样参数,例如温度和top_p。 - 创建API端点: 使用
@app.post
装饰器创建一个POST API端点/v1/chat/completions
,该端点接收OpenAI API兼容的请求。 - 解析请求: 从请求中提取提示(prompt)。
- 使用vLLM生成文本: 调用
llm.generate
方法使用vLLM生成文本。处理潜在的异常情况。 - 构造响应: 构造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_type
为text/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的兼容性使得集成过程更加简单。希望本文能够帮助您更好地利用大型语言模型。