源大模型Yuan2.0-M32/vllm/yuan_openai_api_server.py 源码解析之vllm推理服务
import requests
import json
outputs = []
with open('/mnt/Yuan2.0-M32/vllm/humaneval/human-eval-gpt4-translation-fixed5.jsonl', 'r', encoding='utf-8') as file:
for line in file:
data = json.loads(line)
prompt = data.get('prompt')
raw_json_data = {
"model": "/mnt/beegfs2/Yuan2-M32-HF/",
"prompt": prompt,
"max_tokens": 256,
"temperature": 1,
"use_beam_search": False,
"top_p": 0,
"top_k": 1,
"stop": "<eod>",
}
json_data = json.dumps(raw_json_data, ensure_ascii=True)
headers = {
"Content-Type": "application/json",
}
response = requests.post(f'http://localhost:8000/v1/completions',
data=json_data,
headers=headers)
output = response.text
output = json.loads(output)
output = output["choices"][0]['text']
#outputs.append(output0)
print(output)
break
GPT-4o
Poe
以下是用 vllm 部署的 Yuan API 代码逐行解释:
python
复制
import requests
import json
- 说明 :导入
requests库用于发送 HTTP 请求,导入json库用于处理 JSON 数据。
python
复制
outputs = []
- 说明 :初始化一个空列表,用于存储输出结果。
python
复制
with open('/mnt/Yuan2.0-M32/vllm/humaneval/human-eval-gpt4-translation-fixed5.jsonl', 'r', encoding='utf-8') as file:
- 操作:访问位于
/mnt/Yuan2.0-M32/vllm/humaneval/路径下的 JSONL 文件,文件名称是human-eval-gpt4-translation-fixed5.jsonl。 - 并以只读模式打开,并将编码设置为 UTF-8。
- 并将其编码设为 UTF-8。
python
复制
for line in file:
- 说明 :逐行读取文件。
python
复制
data = json.loads(line)
- 说明 :将每行的 JSON 数据解析为 Python 字典。
python
复制
prompt = data.get('prompt')
- 说明 :从解析后的字典中获取
prompt字段的值。
python
复制
raw_json_data = {
"model": "/mnt/beegfs2/Yuan2-M32-HF/",
"prompt": prompt,
"max_tokens": 256,
"temperature": 1,
"use_beam_search": False,
"top_p": 0,
"top_k": 1,
"stop": "<eod>",
}
- 说明:创建一个包含请求参数的Python字典对象
raw_json_data。具体配置如下:- 参数键
model对应值为模型文件路径/mnt/beegfs2/Yuan2-M32-HF/。 - 参数键
prompt对应值为其提示文本内容。 - 参数键
max_tokens设置其值为最大输出token数量(建议设置为256)。 - 参数键
temperature设置其值为生成温度调节因子(建议设置为1)。 - 参数键
use_beam_search设置布尔标志位为其是否采用束搜索方法(建议设置为False)。 - 参数键
ttop_p设置其核心采样累积概率阈值(建议设置为0)。 - 参数键
ttop_k设置其核心采样最高概率token数目(建议设置为1)。 - 参数键
sstop>设定终止标记字符串(建议指定\n\n<eod>)。</
- 参数键
python
复制
json_data = json.dumps(raw_json_data, ensure_ascii=True)
- 说明 :对 raw_json_data 字典进行 JSON 格式的编码处理,并保证所有字符限定于 ASCII 字符集范围内。
python
复制
headers = {
"Content-Type": "application/json",
}
- 说明 :定义 HTTP 请求头,指定内容类型为
application/json。
python
复制
response = requests.post(f'http://localhost:8000/v1/completions',
data=json_data,
headers=headers)
说明
python
复制
output = response.text
- 说明 :获取 HTTP 响应的文本内容。
python
复制
output = json.loads(output)
- 说明 :将响应的 JSON 文本解析为 Python 字典。
python
复制
output = output["choices"][0]['text']
- 说明 :从解析后得到的字典中提取生成的文本,并在其中找到
choices列表中的第一个元素的text字段。
python
复制
#outputs.append(output)
- 说明 :将生成的文本追加到
outputs列表中(此行被注释掉,未执行)。
python
复制
print(output)
- 说明 :打印生成的文本。
python
复制
break
- 说明 :跳出
for循环,仅处理文件中的第一行。
总结
该段代码依次读取一个JSON Lines文件中的每一行数据,并从中提取指定的prompt字段值。随后通过vllm平台部署Yuan API并发送请求,在获得处理结果后输出相应的文本内容。目前配置仅对文件的第一条记录进行处理
Step 4. 基于vllm.entrypoints.openai.api_server部署Yuan2-M32-HF
注意:该OpenAI.api_server在调用tokenization方式时存在差异,在调用该服务时,请确保先将tokenizer_config.json中的add_eos_token和add_bos_token字段设置为false
通过OpenAI API server实现Yuan2.0-2B模型的部署过程与step 3具有高度相似性。具体而言,在服务发起与调用的具体流程上可参考上述步骤进行操作。
发起服务命令:
vllm.entrypoints.openai.api_server
调用服务命令:
"stop": "<eod>
openAI api
python -m vllm.entrypoints.openai.api_server --model=/mnt/Yuan2-M32-hf/ --trust-remote-code --disable-custom-all-reduce --tensor-parallel-size=8 --max-num-seqs=1 --gpu-memory-utilization=0.8
2024-07-11 10:17:45,445 INFO worker.py:1749 -- Started a local Ray instance.
GPT-4o
Poe
以下是该 vllm 启动命令逐个参数的详解:
python -m vllm.entrypoints.openai.api_server \
--model=/mnt/Yuan2-M32-hf/ \
--trust-remote-code \
--disable-custom-all-reduce \
--tensor-parallel-size=8 \
--max-num-seqs=1 \
--gpu-memory-utilization=0.8
参数详解
python -m vllm.entrypoints.openai.api_server
注释:通过在 Python 环境中运行命令 python -m vllm.entrypoints.openai.api_server 来启动 OpenAI 格式的 API 服务器功能入口。该模块位于 VLLM 中作为一个功能入口点,并负责实现启动 OpenAI 风格的 API 服务器的功能。
--model=/mnt/Yuan2-M32-hf/
说明:指定模型的位置,在 /mnt/Yuan2-M32-hf 文件夹中存放。该路径不仅指明了存储位置,还明确了具体存放位置。
--trust-remote-code
- 说明 :允许信任远程代码。这通常用于加载可能包含自定义代码的模型。
--disable-custom-all-reduce
- 说明 :禁止启用自定义 all-reduce 操作。它是分布式计算领域中的一个关键操作,在多块 GPU 之间汇总数据时通常被采用。这可能是因为希望采用默认配置下的 all-reduce 实现方式。
--tensor-parallel-size=8
- 说明 :具体来说,我们设置了张量并行的规模为 8. 张量并行这一机制表明,模型的一部分将在多个 GPU 上执行并行计算.规模设定为 8 表示该机制将被应用于 8 个 GPU 环境中进行运算.
--max-num-seqs=1
注释:对模型进行配置时,默认将最大处理序列数设为1。即设置为1以确保单次请求不会超出计算能力限制。
--gpu-memory-utilization=0.8
- 说明 :配置 GPU 内存占用比例的具体数值为 0.8 ,表明最大允许内存占用量为 80\% 。这一参数设置有助于规避由于内存不足可能引发的问题。
其他信息
2024-07-11 10:17:45,445 INFO worker.py:1749 -- Started a local Ray instance.
运行指令的输出数据表明Ray实例已本地启动。Ray被设计为一种专门用于分布式计算的框架,并且vllm可能通过Ray来配置和管理其分布式GPU资源以及任务调度机制。
