Advertisement

源大模型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资源以及任务调度机制。

全部评论 (0)

还没有任何评论哟~