ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

LMDeploy 部署 Qwen2-VL 多模态模型:从离线 pipeline 推理到 api_server 在线服务

LMDeploy 部署 Qwen2-VL 多模态模型:从离线 pipeline 推理到 api_server 在线服务 人工智能大模型模型推理服务推理引擎本地部署模型量化【免费下载链接】lmdeployLMDeploy is a toolkit for compressing, deploying, and serving LLMs.项目地址https://gitcode.com/gh_mirrors/lm/lmdeploy点击查看免费下载本篇技术指南以 Qwen2-VL-7B-Instruct 为例系统讲解如何用 LMDeploy 完成 Qwen2-VL 系列多模态大模型的部署与推理。你将掌握环境与依赖安装、基于 pipeline 的离线推理含多图多轮对话与分辨率控制技巧、基于lmdeploy serve api_server与 Docker 的在线服务搭建并了解视觉编码、mRoPE 位置编码等底层实现原理。支持范围与引擎LMDeploy 支持 Qwen-VL 系列模型具体支持情况如下表所示ModelSizeSupported Inference EngineQwen2-VL2B, 7BPyTorch从仓库源码看这一支持并不局限于文档表格列出的尺寸而是覆盖了完整的架构族。在 lmdeploy/archs.py 中Qwen2VLForConditionalGeneration、Qwen2_5_VLForConditionalGeneration等架构均被注册到 LMDeploy 的模型体系中在 lmdeploy/pytorch/models/module_map.py 中Qwen2VLForConditionalGeneration被映射到 lmdeploy/pytorch/models/qwen2_vl.py 中的同名 PyTorch 重写实现Qwen2_5_VLForConditionalGeneration则映射到 lmdeploy/pytorch/models/qwen2_5_vl.py即 Qwen2.5-VL 同样可以基于本文介绍的方式部署。本文将以 Qwen2-VL-7B-Instruct仓库内示例亦常使用 2B 版本为例演示使用 LMDeploy 部署 Qwen2-VL 系列模型的方法。安装与环境准备安装 LMDeploy 与上游依赖请参考安装文档安装 LMDeploy并安装上游 Qwen2-VL 模型库所需的依赖pip install qwen_vl_utilsqwen_vl_utils是 Qwen 官方提供的视觉工具库负责图像数据的基础处理是 Qwen2-VL 模型在 LMDeploy 中正常工作的必要依赖。基于 Docker 构建推理镜像你也可以为 Qwen2-VL 的推理构建 docker image。如果宿主机器上的 CUDA 版本12.4可以执行如下命令构建镜像git clone https://github.com/InternLM/lmdeploy.git cd lmdeploy docker build --build-arg CUDA_VERSIONcu12 -t openmmlab/lmdeploy:qwen2vl . -f ./docker/Qwen2VL_Dockerfile否则可以基于 LMDeploy cu11 的镜像来构建docker build --build-arg CUDA_VERSIONcu11 -t openmmlab/lmdeploy:qwen2vl . -f ./docker/Qwen2VL_Dockerfile查看仓库中的 docker/Qwen2VL_Dockerfile 可以理解该镜像的构成逻辑它以openmmlab/lmdeploy:latest-cu12或latest-cu11为基础镜像通过ARG CUDA_VERSIONcu12切换随后安装两个关键依赖# we use transformers to load vision part of qwen2_vl and it needs transformers v4.44.2 RUN python3 -m pip install githttps://github.com/huggingface/transformers.git RUN python3 -m pip install qwen_vl_utils值得注意的是Dockerfile 中的注释明确说明加载 Qwen2-VL 的视觉部分依赖transformers v4.44.2因此镜像内直接以源码方式安装最新版 transformers而不仅仅是固定版本的 pip 包。这也解释了为什么在线部署场景下推荐直接使用该镜像以避免本地 transformers 版本过旧导致的视觉编码器加载失败。离线推理基于 pipeline以下是使用 pipeline 进行离线推理的示例更多用法参考 VLM离线推理 pipelinefrom lmdeploy import pipeline from lmdeploy.vl import load_image pipe pipeline(Qwen/Qwen2-VL-2B-Instruct) image load_image(https://raw.githubusercontent.com/open-mmlab/mmdeploy/main/tests/data/tiger.jpeg) response pipe((fdescribe this image, image)) print(response)load_image位于lmdeploy.vl模块支持从 URL 或本地路径加载图片返回的图片对象可直接与文本 prompt 组成元组传入 pipeline。多图多轮对话Qwen2-VL 天然支持多图输入与多轮对话示例代码如下from lmdeploy import pipeline, GenerationConfig pipe pipeline(Qwen/Qwen2-VL-2B-Instruct, log_levelINFO) messages [ dict(roleuser, content[ dict(typetext, textDescribe the two images in detail.), dict(typeimage_url, image_urldict(urlhttps://raw.githubusercontent.com/QwenLM/Qwen-VL/master/assets/mm_tutorial/Beijing_Small.jpeg)), dict(typeimage_url, image_urldict(urlhttps://raw.githubusercontent.com/QwenLM/Qwen-VL/master/assets/mm_tutorial/Chongqing_Small.jpeg)) ]) ] out pipe(messages, gen_configGenerationConfig(top_k1)) messages.append(dict(roleassistant, contentout.text)) messages.append(dict(roleuser, contentWhat are the similarities and differences between these two images.)) out pipe(messages, gen_configGenerationConfig(top_k1))这里采用 OpenAI 风格的对话消息结构content是一个列表其中typetext表示文本片段typeimage_url表示图片输入支持同一轮消息中携带多张图片多轮对话则通过向messages列表追加assistant回复与下一轮user提问实现GenerationConfig(top_k1)用于控制采样策略。控制图片分辨率加速推理图片分辨率直接影响视觉 token 数量进而影响显存占用与推理延迟。Qwen2-VL 的 image processor 支持通过min_pixels/max_pixels约束输入图像的像素范围示例代码如下from lmdeploy import pipeline, GenerationConfig pipe pipeline(Qwen/Qwen2-VL-2B-Instruct, log_levelINFO) min_pixels 64 * 28 * 28 max_pixels 64 * 28 * 28 messages [ dict(roleuser, content[ dict(typetext, textDescribe the two images in detail.), dict(typeimage_url, image_urldict(min_pixelsmin_pixels, max_pixelsmax_pixels, urlhttps://raw.githubusercontent.com/QwenLM/Qwen-VL/master/assets/mm_tutorial/Beijing_Small.jpeg)), dict(typeimage_url, image_urldict(min_pixelsmin_pixels, max_pixelsmax_pixels, urlhttps://raw.githubusercontent.com/QwenLM/Qwen-VL/master/assets/mm_tutorial/Chongqing_Small.jpeg)) ]) ] out pipe(messages, gen_configGenerationConfig(top_k1)) messages.append(dict(roleassistant, contentout.text)) messages.append(dict(roleuser, contentWhat are the similarities and differences between these two images.)) out pipe(messages, gen_configGenerationConfig(top_k1))示例中min_pixels与max_pixels均设为64 * 28 * 28即固定图片总像素约为 50176。在 Qwen2-VL 中 28 是 patch 的基准尺寸该参数组合将图片缩放并裁剪到固定 token 预算内从而显著减少视觉编码与注意力计算的开销实现推理加速。分辨率控制与视觉 token 的底层原理min_pixels/max_pixels之所以有效可以从视觉模型封装 lmdeploy/vl/model/qwen2.py 的preprocess实现中一探究竟optional_keys {min_pixels, max_pixels} outputs [] for modality, image, params in images: image_kwargs {key: params[key] for key in params.keys() if key in optional_keys} result self.processor.image_processor(images[image], return_tensorspt, **image_kwargs) merge_length self.processor.image_processor.merge_size**2 image_tokens result[image_grid_thw].prod(dim1) // merge_length可以看到image_url消息中的min_pixels、max_pixels会被收集为image_kwargs原样透传给 HuggingFace 的image_processor处理器据此对图像进行缩放与填充。而视觉 token 的数量由image_grid_thw时间、高、宽的三维 grid 尺寸计算得出image_grid_thw三个维度的乘积除以merge_size**2即 2×2 patch 合并即为该图最终在语言模型输入中占据的 token 数。因此固定像素预算就等价于固定了视觉 token 的上限。在 PyTorch 后端实现 lmdeploy/pytorch/models/qwen2_vl.py 中这一计算链路与视觉编码器相互印证PatchEmbed使用 3D 卷积temporal_patch_size2, patch_size14将图像切分为 patchPatchMerger将 2×2 的相邻 patch 合并为一个 tokenVisionRotaryEmbedding与rot_pos_emb则负责为视觉特征生成基于 grid 坐标的旋转位置编码。语言模型部分通过mrope_position_ids多模态旋转位置编码将文本、图像的位置信息统一注入注意力计算这是 Qwen2-VL 在长上下文与图像-文本混合输入下仍能保持位置一致性的关键机制。在prepare_inputs_for_generation中视觉输出通过inputs_embeds.masked_scatter(image_mask[..., None], image_embeds)按image_token_id的掩码精确替换到文本 embedding 序列的对应位置。在线服务基于 api_server你可以通过lmdeploy serve api_serverCLI 工具启动服务lmdeploy serve api_server Qwen/Qwen2-VL-2B-Instruct基于 Docker 镜像启动服务也可以基于前文构建的 docker image 启动服务docker run --runtime nvidia --gpus all \ -v ~/.cache/huggingface:/root/.cache/huggingface \ --env HUGGING_FACE_HUB_TOKENsecret \ -p 23333:23333 \ --ipchost \ openmmlab/lmdeploy:qwen2vl \ lmdeploy serve api_server Qwen/Qwen2-VL-2B-Instruct命令要点说明--runtime nvidia --gpus all将全部 GPU 透传给容器-v ~/.cache/huggingface:/root/.cache/huggingface复用宿主机 HuggingFace 模型缓存避免容器内重复下载权重--env HUGGING_FACE_HUB_TOKENsecret当模型为 gated 模型时所需的访问令牌公开模型可省略-p 23333:23333将容器的 23333 端口映射到宿主机该端口为 api_server 的默认服务端口--ipchost共享宿主机 IPC 命名空间是 PyTorch 后端多进程推理的常见要求。使用 docker-compose 编排服务Docker compose 的方式也是一种选择。在 LMDeploy 代码库的根目录下创建docker-compose.yml文件内容参考如下version: 3.5 services: lmdeploy: container_name: lmdeploy image: openmmlab/lmdeploy:qwen2vl ports: - 23333:23333 environment: HUGGING_FACE_HUB_TOKEN: secret volumes: - ~/.cache/huggingface:/root/.cache/huggingface stdin_open: true tty: true ipc: host command: lmdeploy serve api_server Qwen/Qwen2-VL-2B-Instruct deploy: resources: reservations: devices: - driver: nvidia count: all capabilities: [gpu]然后执行命令启动服务docker-compose up -d通过docker logs -f lmdeploy可以查看启动的日志信息如果发现类似下方的日志信息就表明服务启动成功了HINT: Please open http://0.0.0.0:23333 in a browser for detailed api usage!!! HINT: Please open http://0.0.0.0:23333 in a browser for detailed api usage!!! HINT: Please open http://0.0.0.0:23333 in a browser for detailed api usage!!! INFO: Started server process [2439] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Uvicorn running on http://0.0.0.0:23333 (Press CTRLC to quit)日志中Application startup complete与Uvicorn running on http://0.0.0.0:23333表明服务进程已就绪此时即可通过 HTTP 接口访问该多模态推理服务。有关lmdeploy serve api_server的详细参数可以通过lmdeploy serve api_server -h查阅例如--model-name、--tp张量并行数、--max-batch-size、--cache-max-entry-count等均可按需调整。关于api_server更多的介绍以及访问api_server的方法请阅读 api_server_vl.md。更多进阶阅读若需要更丰富的离线推理用法如流式输出、视觉-语言混合输入的更多写法可继续阅读 VLM离线推理 pipeline若需要了解 api_server 的 RESTful 接口规范、请求格式与多模态消息构造可阅读 api_server_vl.md若对 Qwen2-VL 的 PyTorch 后端算子重写与权重加载细节感兴趣可直接阅读源码 lmdeploy/pytorch/models/qwen2_vl.py 与视觉模型封装 lmdeploy/vl/model/qwen2.py。本文介绍的部署路径同样适用于 Qwen2.5-VL 系列模型视觉封装类Qwen2VLModel的_arch同时包含Qwen2VLForConditionalGeneration与Qwen2_5_VLForConditionalGeneration两种架构见 lmdeploy/vl/model/qwen2.py因此在更换模型权重后即可复用同一套 pipeline 与 api_server 流程将多模态能力平滑升级到新一代模型。赞分享人工智能大模型模型推理服务推理引擎本地部署模型量化【免费下载链接】lmdeployLMDeploy is a toolkit for compressing, deploying, and serving LLMs.项目地址https://gitcode.com/gh_mirrors/lm/lmdeploy点击查看免费下载相关推荐LMDeploy 部署 Qwen2-VL 多模态模型离线推理与 OpenAI 兼容在线服务实战LMDeploy 部署 Qwen2 VL 多模态模型离线推理与 OpenAI 兼容在线服务实战 本文以 LMDeploy 为工具完整讲解 Qwen2 VL人工智能大模型模型推理服务推理引擎本地部署模型量化LMDeploy 部署 LLaVA 系列多模态模型从离线推理到在线服务完整指南LMDeploy 部署 LLaVA 系列多模态模型从离线推理到在线服务完整指南 LMDeploy 为 LLaVA 系列视觉语言模型VLM提供了从模型仓库加人工智能大模型模型推理服务推理引擎本地部署模型量化LMDeploy 部署 MiniCPM-V 系列多模态模型从离线推理到 OpenAI 兼容服务LMDeploy 部署 MiniCPM V 系列多模态模型从离线推理到 OpenAI 兼容服务 MiniCPM V 是面向端侧与云端部署的高效视觉语言模型V人工智能大模型模型推理服务推理引擎本地部署模型量化上一篇Hindsight Reflect 深度解析基于 Disposition 的 Agentic 记忆推理下一篇Tachyon 椭圆曲线扩展实战用 generate_ec_points 代码生成器添加 Short Weierstrass 曲线创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表