更新时间:2025-09-08 GMT+08:00
分享

多模态模型推理请求测试

通过online_serving.py方式发送请求(单图单轮对话)

由于多模态推理涉及图片的编解码,所以采用脚本方式调用服务API。脚本中需要配置的参数如表1 脚本参数说明所示。

import base64
import requests
import argparse
import json
from typing import List
# Function to encode the image
def encode_image(image_path):
  with open(image_path, "rb") as image_file:
    return base64.b64encode(image_file.read()).decode('utf-8')

def get_stop_token_ids(model_path):
    with open(f"{model_path}/config.json") as file:
        data = json.load(file)
        if data.get('architectures')[0] == "InternVLChatModel":
            return [0, 92543, 92542]
    return None

def post_img(args):
    # Path to your image
    image_path = args.image_path
    # Getting the base64 string
    image_base64 = encode_image(image_path)
    stop_token_ids = args.stop_token_ids if args.stop_token_ids is not None else get_stop_token_ids(args.model_path)
    headers = {
      "Content-Type": "application/json"
    }
    payload = {
      "model": args.model_path,
      "messages": [
        {
          "role": "user",
          "content": [
            {
              "type": "text",
              "text": args.text
            },
            {
              "type": "image_url",
              "image_url": {
                "url": f"data:image/jpeg;base64,{image_base64}"
              }
            }
          ]
        }
      ],
      "max_tokens": args.max_tokens,
      "temperature": args.temperature,
      "ignore_eos": args.ignore_eos,
      "stream": args.stream,
      "top_k": args.top_k,
      "top_p": args.top_p,
      "stop_token_ids": stop_token_ids,
      "repetition_penalty": args.repetition_penalty,
    }
    response = requests.post(f"http://{args.docker_ip}:{args.served_port}/v1/chat/completions", headers=headers, json=payload)
    print(response.json())

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    # 必填
    parser.add_argument("--model-path", type=str, required=True)
    parser.add_argument("--image-path", type=str, required=True)
    parser.add_argument("--docker-ip", type=str, required=True)
    parser.add_argument("--served-port", type=str, required=True)
    parser.add_argument("--text", type=str, required=True)
    # 选填
    parser.add_argument("--temperature", type=float, default=0) # 输出结果的随机性。可选
    parser.add_argument("--ignore-eos", type=bool, default=False) # 在生成过程中是否忽略结束符号,在生成EOS token后继续生成token。可选
    parser.add_argument("--top-k", type=int, default=-1) # 参数控制着生成结果的多样性。其值越小,生成的文本就越独特,但可能缺乏连贯性。相反,其值越大,文本就越连贯,但多样性也会降低。可选
    parser.add_argument("--top-p", type=int, default=1.0) # 参数的取值范围为0到1。值越小,生成的内容就越意外,但可能牺牲连贯性。值越大,内容就越连贯,但意外性也会减弱。可选
    parser.add_argument("--stream", type=int, default=False) # 是否开启流式推理。默认为False,表示不开启流式推理。
    parser.add_argument("--max-tokens", type=int, default=16) # 生成序列的最大长度。必选
    parser.add_argument("--repetition-penalty", type=float, default=1.0) # 减少重复生成文本的概率。可选
    parser.add_argument("--stop-token-ids", nargs='+', type=int, default=None) # 停止tokens列表。可选
    args = parser.parse_args()
    post_img(args)

运行此脚本:

python online_serving.py --model-path ${container_model_path} --image-path ${image_path} --docker-ip ${docker_ip} --served-port ${port} --text 图片内容是什么

相关请求参数说明参照表1

图1 输入示例图

推理输出结果如下图所示。

图2 推理输出结果示意图
表1 脚本参数说明

参数

是否必须

参数类型

描述

container_model_path

str

模型权重路径

image_path

str

传给模型的图片路径

docker_ip

str

启动多模态OpenAI服务的主机IP

served_port

str

启动多模态OpenAI服务的端口号

表2 请求服务json参数说明

参数

是否必须

默认值

参数类型

描述

model

Str

通过OpenAI服务API接口启动服务时,推理请求必须填写此参数。取值必须和启动推理服务时的model ${container_model_path}参数保持一致。

messages

-

Dict

请求输入的问题和图片。

role表示消息的发送者,这里只能为用户。content表示消息的内容,类型为list。

单图单轮对话content必须包含两个元素,第一个元素type字段取值为text,表示文本类型, text字段取值为输入问题的字符串。 第二个元素type字段取值为image_url, 表示图片类型,image_url字段取值为是输入图片的base64编码。

max_tokens

16

Int

每个输出序列要生成的最大tokens数量。

top_k

-1

Int

控制要考虑的前几个tokens的数量的整数。设置为-1表示考虑所有tokens。适当降低该值可以减少采样时间。

top_p

1.0

Float

控制要考虑的前几个tokens的累积概率的浮点数。必须在 (0,1] 范围内。设置为1表示考虑所有tokens。

temperature

1.0

Float

控制采样的随机性的浮点数。较低的值使模型更加确定性,较高的值使模型更加随机。0表示贪婪采样。

stream

False

Bool

是否开启流式推理。默认为False,表示不开启流式推理。

ignore_eos

False

Bool

ignore_eos表示是否忽略EOS并且继续生成token。

repetition_penalty

1.0

Float

减少重复生成文本的概率。

stop_token_ids

None

Int

停止tokens列表。internvl2和minicpmv需要传入,参考离线推理脚本examples/offline_inference_vision_language.py的stop_token_ids。

相关文档