SGLang中Qwen2-VL的模板代码主要在以下文件中:
聊天模板定义:
python/sglang/lang/chat_template.py
第148-157行定义了qwen2-vl模板:148:157:python/sglang/lang/chat_template.py展开代码register_chat_template( ChatTemplate( name="qwen2-vl", default_system_prompt="You are a helpful assistant.", role_prefix_and_suffix={ "system": ("<|im_start|>system\n", "<|im_end|>\n"), "user": ("<|im_start|>user\n", "<|im_end|>\n"), "assistant": ("<|im_start|>assistant\n", "<|im_end|>\n"), }, style=ChatTemplateStyle.PLAIN, stop_str=("<|im_end|>",), image_token="<|vision_start|><|image_pad|><|vision_end|>", ) )
会话模板定义:
python/sglang/srt/conversation.py
第773-787行定义了qwen2-vl会话模板:773:787:python/sglang/srt/conversation.py展开代码register_conv_template( Conversation( name="qwen2-vl", system_message="You are a helpful assistant.", system_template="<|im_start|>system\n{system_message}", roles=("<|im_start|>user", "<|im_start|>assistant"), sep="<|im_end|>\n", sep_style=SeparatorStyle.ADD_NEW_LINE_SINGLE, stop_str=["<|im_end|>"], image_token="<|vision_start|><|image_pad|><|vision_end|>", ) )
多模态处理器:
python/sglang/srt/managers/multimodal_processors/qwen_vl.py
包含了Qwen2-VL的图像处理逻辑对比你提到的vLLM命令参数,SGLang的支持情况如下:
vLLM参数 | SGLang对应参数 | 支持情况 |
---|---|---|
--max-model-len 16384 | --context-length | ✅ 支持 |
--pipeline-parallel-size 2 | --pipeline-parallel-size 或 --pp-size | ✅ 支持 |
--gpu_memory_utilization 0.75 | --mem-fraction-static | ✅ 支持,但语义稍有不同 |
--mm-processor-kwargs '{"min_pixels": 784, "max_pixels": 2352000, "fps": 1}' | 无直接对应 | ❌ 不支持 |
--limit-mm-per-prompt "image=2,video=1" | 无直接对应 | ❌ 不支持 |
详细说明:
--mem-fraction-static
vs --gpu_memory_utilization
:
mem_fraction_static
控制静态内存分配(模型权重和KV缓存池)的比例gpu_memory_utilization
控制整体GPU内存使用比例python/sglang/srt/server_args.py
中,SGLang根据并行度自动设置不同的默认值Pipeline并行支持:
--pipeline-parallel-size
或简写 --pp-size
多模态参数:
--mm-processor-kwargs
和--limit-mm-per-prompt
参数建议的SGLang启动命令:
bash展开代码python -m sglang.launch_server \ --model-path /Qwen2-VL-Any \ --context-length 16384 \ --pp-size 2 \ --mem-fraction-static 0.75 \ --chat-template qwen2-vl \ --host 0.0.0.0 \ --port 30000
比如 sglang:v0.4.6.post1-cu121
bash展开代码docker run -d --gpus all \ --shm-size=32g \ -p 7860:7860 \ -p 8000:8000 \ -e PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True \ -v /root/model/:/Qwen2-VL-Any \ sglang:v0.4.6.post1-cu121 python3 -m sglang.launch_server --host 0.0.0.0 --port 8000 --chat-template qwen2-vl --mem-fraction-static 0.75 --tensor-parallel-size 2 --context-length 65536 --model-path /Qwen2-VL-Any
context-length给大,请求的时候max_tokens要小!!
请求代码:
python展开代码import requests
import base64
# 将图片编码为 base64
def encode_image_to_base64(image_path):
with open(image_path, "rb") as image_file:
return base64.b64encode(image_file.read()).decode('utf-8')
# 封装函数,传入图像路径,返回模型输出
def extract_text_from_image(image_path):
# 构造请求数据
data = {
"model": "/Qwen2-VL-Any", # 模型名称
"messages": [
{
"role": "system",
"content": "你是一个图像文字信息提取专家,可以识别图像中的文字,提取关键信息并输出为JSON格式。"
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "识别图像中的文字,提取关键信息并输出为JSON格式。"
},
{
"type": "image_url",
"image_url": {
"url": f"data:image/png;base64,{encode_image_to_base64(image_path)}"
}
},
# {
# "type": "image_url",
# "image_url": {
# "url": f"data:image/png;base64,{encode_image_to_base64(image_path)}"
# }
# }
]
}
],
"max_tokens": 4096,
"temperature": 0.1
}
# 发送 POST 请求
response = requests.post(
"http://10.150.7.41:8000/v1/chat/completions", # vLLM 的 OpenAI API 兼容端点
json=data,
headers={"Authorization": "Bearer no-key-required"} # vLLM 不需要 API 密钥
)
# 返回模型输出
return response.json()["choices"][0]["message"]["content"]
# 使用示例
image_path = "./yiliao.png"
result = extract_text_from_image(image_path)
print(result)
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!