多模态模型推理请求测试
通过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。

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

参数 |
是否必须 |
参数类型 |
描述 |
---|---|---|---|
container_model_path |
是 |
str |
模型权重路径 |
image_path |
是 |
str |
传给模型的图片路径 |
docker_ip |
是 |
str |
启动多模态OpenAI服务的主机IP |
served_port |
是 |
str |
启动多模态OpenAI服务的端口号 |
参数 |
是否必须 |
默认值 |
参数类型 |
描述 |
---|---|---|---|---|
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。 |