使用 vLLM 部署本地 LLM 指南

发布时间:2024年01月24日

参考资料:

vLLM GitHub首页

vLLM 官方文档

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 调高一点,就会发现结果变得很不通顺,说明随机性大大增强了。

在这里插入图片描述

OpenAI 兼容服务器

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,我这里将 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 的部署,大家快来尝试一下吧!

文章来源:https://blog.csdn.net/spicy_chicken123/article/details/135813924
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。