参考资料:
vLLM GitHub首页
vLLM 官方文档
vLLM 安装:直接 pip install 即可
我选取了 OpenChat-3.5-0106 模型,这个模型是由 mistralai/Mistral-7B-v0.1 微调得到的,参数量为 7B
模型下载链接:
openchat/openchat-3.5-0106 · Hugging Face
大家可以选取自己喜欢的模型进行下载。
首先展示一个使用 vLLM 对数据集进行离线批量推理的示例,即使用 vLLM 为输入提示列表生成文本。
需要导入两个使用 vLLM 引擎运行离线推理的主要类:LLM, SamplingParams
SamplingParams 可以设置 temperature, top_p, top_k 等各种参数,这些参数和模型的生成方式有关,关于这些参数的详细可以看源代码:
其中 temperature
越大,生成结果的随机性越强,top_p
也可以改变模型生成的随机性。
更详细的讲解可以看这篇 huggingface 里面的博客:
如何生成文本:通过 Transformers 用不同的解码方法生成文本
离线批量推理的代码如下,注意把我这里 LLM 构造方法里面 model 的路径替换成你下载好的模型的路径:
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="/root/autodl-tmp/kdy/models/openchat-3.5-0106")
outputs = llm.generate(prompts, sampling_params)
# Print the outputs.
for output in outputs:
prompt = output.prompt
generated_text = output.outputs[0].text
print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}")
把 temperature 调高一点,就会发现结果变得很不通顺,说明随机性大大增强了。
vLLM 可以为 LLM 服务进行部署,提供了一个示例 FastAPI 服务器,可以检查 vllm/entrypoints/api_server.py 以获取服务器实现。
在这里我们不演示了,直接将 vLLM 部署为模仿 OpenAI API 协议的服务器,这使得 vLLM 可以用作使用 OpenAI API 的应用程序的直接替代品。
可以输入python -m vllm.entrypoints.openai.api_server --help
查看命令行参数的详细信息。
我们输入以下命令启动服务器,--model 为本地模型的路径,--served-model-name 是模型在服务器中的别名,这里我们取简称 openchat,其他都是默认值,当然也可以自己设置。
具体实现的详情可参考 vllm/vllm/entrypoints/openai/api_server.py at main · vllm-project/vllm (github.com)
python -m vllm.entrypoints.openai.api_server \
--model "/root/autodl-tmp/kdy/models/openchat-3.5-0106" \
--served-model-name "openchat" \
终端输出如下,服务器启动成功:
OpenAI 提供了 Completions 和 ChatCompletions 两个相关的 API,两个 API 很相似,你可以使用其中的任意一个。
Completions 的文档如下:
Completions 说明
服务器启动成功后,我们可以在 shell 中发送一个请求进行测试,该请求使用了 OpenAI Chat API 查询模型,请求内容如下:
curl http://localhost:8000/v1/completions \
-H "Content-Type: application/json" \
-d '{
"model": "openchat",
"prompt": "San Francisco is a",
"max_tokens": 7,
"temperature": 0
}'
-d 里面是请求的参数,可以自己设置。temperature 为 0,代表每次模型的回答都相同,不具有随机性,你可以自由调整参数来满足你的需求
可以看到返回了如下结果,其中我框住的是模型为我们续写的内容。
当然,你也可以试一试 ChatCompletions 格式的请求,ChatCompletions API 的请求内容如下,两种的格式还是有一些区别的。
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "openchat",
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Who won the world series in 2020?"}
]
}'
输出结果如下:
这里更建议使用 ChatCompletions 格式,因为经过多次测试,Completions API 的回答有时候会出现一些问题,例如模型反复重复一句话。
如果想通过代码来完成服务器的查询,较为简单的方式是直接下载 python 包 openai,不想下载的话用 requests 发送请求也是可以的,不过稍微麻烦一点,就不演示了,我这里将 OpenAI ChatCompletions API 与 vLLM 结合使用。
代码内容如下,注意,这段代码必须在启动服务器后运行!
from openai import OpenAI
# Modify OpenAI's API key and API base to use vLLM's API server.
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="openchat",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Tell me a joke."},
]
)
print(chat_response)
输出结果如下,它为我们讲了一个很冷的笑话。
如果只想看输出结果,把最后一行代码修改为如下代码即可。
print(chat_response.choices[0].message.content)
可以看到现在只有输出结果了,依然是一个人类理解不了的笑话。
这样我们就完成了本地 LLM 的部署,大家快来尝试一下吧!