使用 AIStudio 开发机和 SGLang 运行 Qwen2.5-VL-7B-Instruct 进行视觉问答
视觉语言模型(VLM)是能够处理图像和文本的大型语言模型(LLM),不仅能回答文本问题,还能根据图片生成回答。本示例展示如何使用 SGLang 运行 Qwen2.5-VL-7B-Instruct 模型,提供视觉问答功能。SGLang 是一个高效的服务框架,支持快速部署视觉语言模型,并通过 OpenAI 兼容的 API 提供推理服务。
前提条件
- 由于国内网络环境问题,安装 sglang 过程中可能遇到障碍。建议在有代理服务的情况下体验。
- 如需了解如何在 AIStudio 开发机安装 Clash 客户端并为 Shell 环境启用代理服务,您可以参考第三方学术加速服务指南。
准备 CUDA 镜像
Sglang 要求环境支持系统级 CUDA。可以先使用镜像中心,以提交 Dockerfile 的方式免费构建镜像。镜像名称/标签示例:cuda-12.4-cudnn9:v1
。
Dockerfile 内容:
FROM cr.infini-ai.com/infini-ai/ubuntu:22.04-20240429
# 设置环境变量
# DEBIAN_FRONTEND=noninteractive 防止安装过程中的交互式提示
# PATH 添加CUDA可执行文件路径
# LD_LIBRARY_PATH 添加CUDA库文件路径
# CUDA_HOME 设置CUDA根目录
ENV PATH=/usr/local/cuda/bin:/usr/local/cuda-12.4/bin${PATH:+:${PATH}} \
LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda-12.4/lib64:/usr/lib/x86_64-linux-gnu${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}} \
CUDA_HOME=/usr/local/cuda \
CPATH=/usr/include${CPATH:+:${CPATH}} \
LIBRARY_PATH=/usr/lib/x86_64-linux-gnu${LIBRARY_PATH:+:${LIBRARY_PATH}}
# 安装CUDA并配置系统环境
# 1. 更新apt并安装必要工具
# 2. 清理apt缓存减小镜像体积
# 3. 下载CUDA安装包
# 4. 静默安装CUDA工具包(请勿安装 driver)
# 5. 配置动态链接库搜索路径
# 6. 更新动态链接库缓存
# 7. 清理安装包
RUN apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get install -y wget build-essential \
&& rm -rf /var/lib/apt/lists/* \
&& wget https://developer.download.nvidia.com/compute/cuda/12.4.1/local_installers/cuda_12.4.1_550.54.15_linux.run \
&& sh cuda_12.4.1_550.54.15_linux.run --toolkit --silent --override \
&& echo '/usr/local/cuda/lib64' >> /etc/ld.so.conf \
&& echo '/usr/local/cuda-12.4/lib64' >> /etc/ld.so.conf \
&& ldconfig \
&& rm cuda_12.4.1_550.54.15_linux.run
# 安装cuDNN并配置环境
# 1. 下载并安装NVIDIA CUDA仓库公钥
# 2. 更新apt源
# 3. 安装cuDNN
# 4. 配置额外的库路径
# 5. 更新动态链接库缓存
# 6. 清理安装包和apt缓存
RUN wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb \
&& dpkg -i cuda-keyring_1.1-1_all.deb \
&& apt-get update \
&& apt-get install -y cudnn-cuda-12 \
&& echo '/usr/lib/x86_64-linux-gnu' >> /etc/ld.so.conf \
&& ldconfig \
&& rm cuda-keyring_1.1-1_all.deb \
&& rm -rf /var/lib/apt/lists/*
创建 AIStudio 开发机
点击下方链接,直接访问智算云控制台的创建开发机页面。建议选择 A100 / H800 等满足 Flashinfer 要求的机型。
进入创建页面后,请根据页面提示,完成开发机相应配置。在选择镜像时,请务必选择您创建的自定义 CUDA 环境镜像。
安装 SGLang
根据 SGLang 官方指导进行安装。在本次实验中,直接允许 uv 安装到系统环境即可(--system
)。您可以可以自行创建虚拟环境。
pip install --upgrade pip
pip install uv
uv pip install "sglang[all]>=0.4.4.post1" --find-links https://flashinfer.ai/whl/cu124/torch2.5/flashinfer-python --system
启动 SGLang 服务器
SGLang 支持通过命令行启动服务器,为视觉语言模型提供推理服务。以下是使用指定配置启动服务器的步骤,针对 Qwen2.5-VL-7B-Instruct 模型进行了优化:
在终端中运行以下命令以启动 SGLang 服务器:
bashexport SGLANG_USE_MODELSCOPE=true export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True # 8k 上下文 python3 -m sglang.launch_server --model-path Qwen/Qwen2.5-VL-7B-Instruct --port 8888 --host 0.0.0.0 --context-length 8096 --max-running-requests 1 --mem-fract ion-static 0.35 --tensor-parallel-size 1 --chat-template qwen2-vl # 32k 上下文 # python3 -m sglang.launch_server --model-path Qwen/Qwen2.5-VL-7B-Instruct --port 8888 --host 0.0.0.0 --context-length 8192 --max-running-requests 2 --mem-fraction-static 0.45 --tensor-parallel-size 1 --chat-template qwen2-vl --chunked-prefill-size -1
export SGLANG_USE_MODELSCOPE=true
: 启用 ModelScope 支持。本地不存在模型时,从 ModelScope 下载指定模型。export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True
: 配置 PyTorch 的 CUDA 内存分配器,启用可扩展内存段,减少内存碎片并提高大模型的稳定性。--model-path Qwen/Qwen2.5-VL-7B-Instruct
: 指定模型路径,若本地已有则使用本地路径,否则自动下载。--port 8888
: 服务监听端口,设为 8888。--host 0.0.0.0
: 绑定到所有网络接口,允许外部访问。--context-length 8196
: 设置最大上下文长度。如需支持高分辨率图片,则需要支持长序列输入,可设置 32768,但较大的上下文长度极易造成 OOM 问题。如果图片分辨率较低,建议设置更小的值,例如 8196。--max-running-requests 2
: 限制最大并发请求数为 2,避免过载。--mem-fraction-static 0.7
: 分配 60% 的 GPU 显存用于静态缓存,剩余用于动态分配。--tensor-parallel-size 1
: 张量并行大小设为 1,表示单 GPU 运行。--chat-template qwen2-vl
: 使用 Qwen2-VL 的视觉聊天模板,必需参数以支持图像输入。
WARNING
运行 Qwen2.5-VL 模型时且上下文长度设置较大值时,SGLang 可能存在问题。暂可咱通过设置
--chunked-prefill-size -1
禁用分块预填充(chunked prefill) 绕过。详见 https://github.com/sgl-project/sglang/issues/4171启动后,SGLang 服务器会自动下载模型、加载模型权重并初始化运行时。日志会显示类似以下信息:
shell[INFO] Server running on http://0.0.0.0:8888
加载时间取决于硬件性能和模型大小(7B 参数量在单 GPU 上通常需要数分钟)。
发送视觉问答请求
SGLang 提供 OpenAI 兼容的 API 接口,可以通过 HTTP 请求与服务器交互。以下是如何发送包含图像和文本的请求的示例:
运行以下代码,向服务器发送视觉问答请求:
curl --request POST \
--url "http://localhost:8888/v1/chat/completions" \
--header "Content-Type: application/json" \
--data '{
"model": "Qwen/Qwen2.5-VL-7B-Instruct",
"messages": [
{
"role": "user",
"content": [
{
"type": "image_url",
"image_url": {
"url": "https://sf-maas-uat-prod.oss-cn-shanghai.aliyuncs.com/dog.png"
}
},
{
"type": "text",
"text": "请简要描述图片是什么内容?"
}
]
}
],
"temperature": 0.7,
"stream": false
}'
返回的 JSON 示例:
{
"id": "1250f5a07f9e400298132dad89115a3b",
"object": "chat.completion",
"created": 1742978926,
"model": "Qwen/Qwen2.5-VL-7B-Instruct",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "这张图片展示了一只可爱的金毛犬。狗狗的眼神清澈而深情,耳朵微微垂下,显得非常友善和平静。背景是柔和的绿色模糊,突出了狗狗的面部特征。",
"reasoning_content": null,
"tool_calls": null
},
"logprobs": null,
"finish_reason": "stop",
"matched_stop": 151645
}
],
"usage": {
"prompt_tokens": 1398,
"total_tokens": 1440,
"completion_tokens": 42,
"prompt_tokens_details": null
}
}
技术细节
- 视觉聊天模板:
--chat-template qwen2-vl
是必需的,因为 Qwen2-VL 的默认模板仅支持文本。若未指定,服务器将无法处理图像,导致性能下降或错误。 - SGLang 与视觉模型:本教程旨在指导用户在开发机安装 SGLang,不代表任何推荐意见。建议您充分对比 SGLang 与 vLLM 等框架在视觉模型推理上的效果。您也可以自行尝试 SGLang 在大语言模型上的推理效果。
使用 GenStudio 的 Qwen2.5-VL 服务
大模型服务平台已上架通义千问视觉语言模型,涵盖 Qwen2.5-VL 7B/72B 等尺寸模型。为开发者和企业提供了强大的多模态能力支持,打造更智能的 AI 应用。欢迎接入使用。
结论
这个示例展示了如何使用 SGLang 独立运行 Qwen2.5-VL-7B-Instruct,实现视觉问答功能。你可以根据需求修改请求内容或服务器参数,进一步定制服务!