基于vLLM本地模型部署跟课复现 #25

Open
opened 2024-10-21 11:03:54 +08:00 by GANGUAGUA · 0 comments

环境准备/准备notebook

离线推理(非交互式)

进入终端,先转到code目录下

cd code

单卡推理

调动文件,启动单卡推理

python vllm_standalone.py

成功后能看到模型给出的答案

基于ray做分布式多卡推理

启动ray

在平台上使用如下命令:

HIP_VISIBLE_DEVICES=0,1,2,3 ray start --head --dashboard-host 0.0.0.0 --num-gpus=4
  • HIP_VISIBLE_DEVICES=0,1,2,3:这是一个环境变量设置,用于指定哪些 GPU 设备对应用程序可见。在这里,HIP_VISIBLE_DEVICES 被设置为 0,1,2,3,意味着应用程序只能看到编号为 0、1、2 和 3 的 GPU 设备。这通常用于在多 GPU 系统中选择特定的 GPU 设备进行计算。
  • ray start:这是启动 Ray 框架的命令。
  • --head:这个参数指定当前节点是 Ray 集群的主节点(head node)

可以看到ray已经成功启动了:

可以通过如下命令查看ray集群状态:

ray status

可以看到如下界面:

接下来打开VS Code

打开VS Code后,在port里查看端口;这里一开始并没有端口自动连接上,所以手动添加了端口。手动添加只需输入端口号'8265'便可成功添加上。

点击这里进入Ray的前端界面:

分布式推理

输入以下命令,开启分布式推理

python vllm_distributed_ray.py

这时回到Ray界面,在最上方 'JOB' 里可以看到我们提交了任务

执行结果

在线推理(交互式)

vllm也支持模拟openai api,调用本地模型可以直接使用openai的调用方式。

单卡推理

python -m vllm.entrypoints.openai.api_server --model /dataset/Qwen1.5-0.5B-Chat/ --tensor-parallel-size 1 --dtype float16
  • python -m:这是 Python 的模块运行方式,用于运行 Python 程序中的模块。
  • vllm.entrypoints.openai.api_server:这是要运行的 Python 模块和入口点。vllm 是一个库的名称,entrypoints 可能是该库中用于定义入口点的子模块,而 openai.api_server 是具体的入口点,用于启动 API 服务器。
  • --model /dataset/Qwen1.5-0.5B-Chat/:这个参数指定了模型的路径。在这里,/dataset/Qwen1.5-0.5B-Chat/ 是模型文件所在的目录。这个目录应该包含模型的权重和配置文件。
  • --tensor-parallel-size 1:这个参数设置了张量并行的大小。在深度学习模型训练和推理中,张量并行是一种并行计算技术,用于在多个 GPU 上分割和处理模型的张量(多维数据数组)。这里的 1 表示不使用张量并行,即所有的计算都在单个 GPU 上完成。
  • --dtype float16:这个参数指定了模型推理时使用的数据类型。在这里,float16 表示使用 16 位浮点数进行计算。使用 float16 可以减少模型推理时的内存使用和加速计算,但可能会牺牲一些精度。

出现端口8000便表示已成功

这时回到Ray界面,可以看到界面上并没有出现新的任务,只有一个刚刚在做分布式推理时已完成的任务。

多卡推理

python -m vllm.entrypoints.openai.api_server --model /dataset/Qwen1.5-0.5B-Chat/ --tensor-parallel-size 4 --dtype float16

多卡推理的代码与单卡推理代码的唯一不同之处在于需要调整GPU使用的数量:

  • --tensor-parallel-size 4:这个参数设置了张量并行的大小。在深度学习模型训练和推理中,张量并行是一种并行计算技术,用于在多个 GPU 上分割和处理模型的张量(多维数据数组)。这里的 4 表示模型的张量将在 4 个 GPU 上并行处理。这种配置可以加速模型的推理过程,特别是对于大型模型。

出现了端口8000,表示已成功

但与单卡推理时不同,这时Ray的界面上会出现新的任务

使用OpenAI python SDK调用vllm部署的模型

创建vllm_openai_call.py文件,然后将以下代码粘贴进文件:

# vllm_openai_call.py
from openai import OpenAI
client = OpenAI(base_url="http://127.0.0.1:8000/v1", api_key="EMPTY")
print(client.models.list())
completion = client.chat.completions.create(
model="/dataset/Qwen1.5-0.5B-Chat/",
messages=[
{"role": "system", "content": "你是一个很有帮助的AI助手"},
{"role": "user", "content": "2018年世界杯冠军是哪个国家?"},
{"role": "assistant", "content": "法国。"},
{"role": "user", "content": "决赛在哪里踢的?"}
],
max_tokens=128
)
print(completion.choices[0].message.content)

执行:

python vllm_openai_call.py

开源模型的部署及tools使用

开源模型的部署

新启一个终端terminal,首先需要先转到code目录下

cd code

输入以下命令对开源模型进行部署

python -m vllm.entrypoints.openai.api_server \
--model /dataset/Qwen2-7B-Instruct/ \
--served-model-name Qwen2-7B-Instruct \
--tensor-parallel-size 4 \
--dtype float16
  • python -m:这是 Python 的模块运行方式,用于运行 Python 程序中的模块。
  • vllm.entrypoints.openai.api_server:这是要运行的 Python 模块和入口点。vllm 是一个库的名称,entrypoints 可能是该库中用于定义入口点的子模块,而 openai.api_server 是具体的入口点,用于启动 API 服务器。
  • --model /dataset/Qwen2-7B-Instruct/:这个参数指定了模型的路径。在这里,/dataset/Qwen2-7B-Instruct/ 是模型文件所在的目录。这个目录应该包含模型的权重和配置文件。模型名称 Qwen2-7B-Instruct 暗示这可能是一个用于处理指令的自然语言处理模型,具有大约 7B(70 亿)个参数。
  • --served-model-name Qwen2-7B-Instruct:这个参数为服务的模型指定了一个名称。在这个例子中,模型被命名为 Qwen2-7B-Instruct。这个名称通常用于在 API 调用中引用模型,使得客户端可以明确地请求特定的模型进行推理。
  • --tensor-parallel-size 4:这个参数设置了张量并行的大小。在这里,4 表示模型的张量将在 4 个 GPU 上并行处理。这种配置可以加速模型的推理过程,特别是对于大型模型。
  • --dtype float16:这个参数指定了模型推理时使用的数据类型。在这里,float16 表示使用 16 位浮点数进行计算。使用 float16 可以减少模型推理时的内存使用和加速计算,但可能会牺牲一些精度。

所以,这条命令的作用是启动一个 API 服务器,该服务器加载了位于 /dataset/Qwen2-7B-Instruct/ 路径下的模型,并使用 float16 数据类型进行推理。由于 --tensor-parallel-size 设置为 4,这意味着推理过程将在 4 个 GPU 上并行进行,这可以显著提高处理速度,尤其是在处理大型模型时。

出现8000端口代表部署成功

使用tools

这里我们也新开一个终端,并转到code目录下

cd code

这里我们五个文件都测试了一遍:

python ex01_api_call_chat.py

python ex02_api_call_chat.py

python ex03_api_call_paper_reviewer.py

python ex04_api_call_tools.py

python ex05_api_call_tools.py

# 环境准备/准备notebook ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1729131255296-cca9783f-844c-474a-ae94-5d7927edb71d.png) # 离线推理(非交互式) 进入终端,先转到code目录下 ```plain cd code ``` ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1729131403553-e4e59f4e-79d6-439a-b3c8-2e0f1a6a8b69.png) ## 单卡推理 调动文件,启动单卡推理 ```plain python vllm_standalone.py ``` ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1729070498672-7662497d-3509-4979-a8b5-89e5b29e8f75.png) 成功后能看到模型给出的答案 ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1729070506876-73753924-d60b-4283-a754-c6b11fad618e.png) ## 基于ray做分布式多卡推理 ### 启动ray 在平台上使用如下命令: ```plain HIP_VISIBLE_DEVICES=0,1,2,3 ray start --head --dashboard-host 0.0.0.0 --num-gpus=4 ``` + `HIP_VISIBLE_DEVICES=0,1,2,3`:这是一个环境变量设置,用于指定哪些 GPU 设备对应用程序可见。在这里,HIP_VISIBLE_DEVICES 被设置为 0,1,2,3,意味着应用程序只能看到编号为 0、1、2 和 3 的 GPU 设备。这通常用于在多 GPU 系统中选择特定的 GPU 设备进行计算。 + `ray start`:这是启动 Ray 框架的命令。 + `--head`:这个参数指定当前节点是 Ray 集群的主节点(head node) <font style="color:#000000;">可以看到ray已经成功启动了:</font> ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1729135284667-f0ede240-294f-4234-b001-1fe50ab195dc.png) **<font style="color:#DF2A3F;"></font>** <font style="color:#000000;">可以通过如下命令查看ray集群状态:</font> ```plain ray status ``` <font style="color:#000000;">可以看到如下界面:</font> ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1729132010809-85327f7d-d9bb-4e77-9403-abb5cb70346e.png) 接下来打开VS Code ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1729132183479-e4f4868d-3f6c-4f43-b7fe-fb2211ea608c.png) 打开VS Code后,在port里查看端口;这里一开始并没有端口自动连接上,所以手动添加了端口。手动添加只需输入端口号'8265'便可成功添加上。 ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1729135330967-47f7f059-4583-441d-b7aa-30ceb1e0cfa2.png) 点击这里进入Ray的前端界面: ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1729135580986-f784adbf-dce2-4128-8e5e-16a94f584323.png) ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1729138353545-a910e51c-de85-4987-b8ce-7c3a8860dc60.png) ### 分布式推理 输入以下命令,开启分布式推理 ```plain python vllm_distributed_ray.py ``` 这时回到Ray界面,在最上方 'JOB' 里可以看到我们提交了任务 ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1729074373504-40d20265-a3ec-40f1-a112-75a83cd7f218.png) 执行结果 ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1729074396509-659bebff-6750-49da-8973-0ef119d77d4f.png) # 在线推理(交互式) vllm也支持模拟openai api,调用本地模型可以直接使用openai的调用方式。 ## 单卡推理 ```plain python -m vllm.entrypoints.openai.api_server --model /dataset/Qwen1.5-0.5B-Chat/ --tensor-parallel-size 1 --dtype float16 ``` + `python -m`:这是 Python 的模块运行方式,用于运行 Python 程序中的模块。 + `vllm.entrypoints.openai.api_server`:这是要运行的 Python 模块和入口点。vllm 是一个库的名称,entrypoints 可能是该库中用于定义入口点的子模块,而 openai.api_server 是具体的入口点,用于启动 API 服务器。 + `--model /dataset/Qwen1.5-0.5B-Chat/`:这个参数指定了模型的路径。在这里,/dataset/Qwen1.5-0.5B-Chat/ 是模型文件所在的目录。这个目录应该包含模型的权重和配置文件。 + `--tensor-parallel-size 1`:这个参数设置了张量并行的大小。在深度学习模型训练和推理中,张量并行是一种并行计算技术,用于在多个 GPU 上分割和处理模型的张量(多维数据数组)。这里的 1 表示不使用张量并行,即所有的计算都在单个 GPU 上完成。 + `--dtype float16`:这个参数指定了模型推理时使用的数据类型。在这里,float16 表示使用 16 位浮点数进行计算。使用 float16 可以减少模型推理时的内存使用和加速计算,但可能会牺牲一些精度。 出现端口8000便表示已成功 ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1729139166946-10434c8e-f173-437d-876a-0816f7043361.png) 这时回到Ray界面,可以看到界面上并没有出现新的任务,只有一个刚刚在做分布式推理时已完成的任务。 ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1729139283221-6e318b4c-aba3-43ae-a08e-c4294f17973f.png) ## 多卡推理 ```plain python -m vllm.entrypoints.openai.api_server --model /dataset/Qwen1.5-0.5B-Chat/ --tensor-parallel-size 4 --dtype float16 ``` 多卡推理的代码与单卡推理代码的**唯一不同之处**在于需要调整GPU使用的数量: + `--tensor-parallel-size 4`:这个参数设置了张量并行的大小。在深度学习模型训练和推理中,张量并行是一种并行计算技术,用于在多个 GPU 上分割和处理模型的张量(多维数据数组)。这里的 4 表示模型的张量将在 4 个 GPU 上并行处理。这种配置可以加速模型的推理过程,特别是对于大型模型。 出现了端口8000,表示已成功 ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1729139505782-0d041418-8f9d-4120-bae5-a85b15538585.png) 但与单卡推理时不同,这时Ray的界面上会出现新的任务 ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1729139671307-a169fcb7-9487-42db-93cd-6c1deb35821c.png) ## **<font style="color:#333333;">使用OpenAI python SDK调用vllm部署的模型</font>** 创建vllm_openai_call.py文件,然后将以下代码粘贴进文件: ```plain # vllm_openai_call.py from openai import OpenAI client = OpenAI(base_url="http://127.0.0.1:8000/v1", api_key="EMPTY") print(client.models.list()) completion = client.chat.completions.create( model="/dataset/Qwen1.5-0.5B-Chat/", messages=[ {"role": "system", "content": "你是一个很有帮助的AI助手"}, {"role": "user", "content": "2018年世界杯冠军是哪个国家?"}, {"role": "assistant", "content": "法国。"}, {"role": "user", "content": "决赛在哪里踢的?"} ], max_tokens=128 ) print(completion.choices[0].message.content) ``` 执行: ```plain python vllm_openai_call.py ``` ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1729159937462-bfe510e8-cd88-4527-8858-6dcfba99fc0d.png) # 开源模型的部署及tools使用 ## 开源模型的部署 新启一个终端terminal,首先需要先转到code目录下 ```plain cd code ``` 输入以下命令对开源模型进行部署 ```plain python -m vllm.entrypoints.openai.api_server \ --model /dataset/Qwen2-7B-Instruct/ \ --served-model-name Qwen2-7B-Instruct \ --tensor-parallel-size 4 \ --dtype float16 ``` + `python -m`:这是 Python 的模块运行方式,用于运行 Python 程序中的模块。 + `vllm.entrypoints.openai.api_server`:这是要运行的 Python 模块和入口点。vllm 是一个库的名称,entrypoints 可能是该库中用于定义入口点的子模块,而 openai.api_server 是具体的入口点,用于启动 API 服务器。 + `--model /dataset/Qwen2-7B-Instruct/`:这个参数指定了模型的路径。在这里,/dataset/Qwen2-7B-Instruct/ 是模型文件所在的目录。这个目录应该包含模型的权重和配置文件。模型名称 Qwen2-7B-Instruct 暗示这可能是一个用于处理指令的自然语言处理模型,具有大约 7B(70 亿)个参数。 + `--served-model-name Qwen2-7B-Instruct`:这个参数为服务的模型指定了一个名称。在这个例子中,模型被命名为 Qwen2-7B-Instruct。这个名称通常用于在 API 调用中引用模型,使得客户端可以明确地请求特定的模型进行推理。 + `--tensor-parallel-size 4`:这个参数设置了张量并行的大小。在这里,4 表示模型的张量将在 4 个 GPU 上并行处理。这种配置可以加速模型的推理过程,特别是对于大型模型。 + `--dtype float16`:这个参数指定了模型推理时使用的数据类型。在这里,float16 表示使用 16 位浮点数进行计算。使用 float16 可以减少模型推理时的内存使用和加速计算,但可能会牺牲一些精度。 所以,这条命令的作用是启动一个 API 服务器,该服务器加载了位于 /dataset/Qwen2-7B-Instruct/ 路径下的模型,并使用 float16 数据类型进行推理。由于 --tensor-parallel-size 设置为 4,这意味着推理过程将在 4 个 GPU 上并行进行,这可以显著提高处理速度,尤其是在处理大型模型时。 出现8000端口代表部署成功 ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1729157450962-64e4b558-6a49-4ddc-a8ba-3d9f6ecc23ae.png) ## 使用tools 这里我们也新开一个终端,并转到code目录下 ```plain cd code ``` ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1729077690979-3f858b74-772a-46f8-92f3-d6e328fd6256.png) 这里我们五个文件都测试了一遍: ```plain python ex01_api_call_chat.py ``` ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1729077702719-905ec324-9803-411c-8f3d-c2dfab837e1c.png) ```plain python ex02_api_call_chat.py ``` ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1729078097830-3bc2d2e3-cff5-4337-9398-41afd616e6dd.png) ```plain python ex03_api_call_paper_reviewer.py ``` ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1729078087326-e492fb0b-f57f-432c-8ee8-1d0e4df2a183.png) ```plain python ex04_api_call_tools.py ``` ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1729078076070-9748aa3d-db27-4f2c-b818-4a3e628c4a8d.png) ```plain python ex05_api_call_tools.py ``` ![](https://cdn.nlark.com/yuque/0/2024/png/48118617/1729077935582-07344dd6-bf2c-4281-ad7d-eac60f55c03b.png)
Sign in to join this conversation.
No Label
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: HswOAuth/llm_share#25
No description provided.