vLLM 推理 Qwen2.5-VL-7B 视频

vLLM 推理 Qwen2.5-VL-7B 视频

flyfish

from transformers import AutoProcessor
# SamplingParams用于设置采样参数
from vllm import LLM, SamplingParams
# 从自定义的qwen_vl_utils模块导入process_vision_info函数,用于处理视觉信息
from qwen_vl_utils import process_vision_info


MODEL_PATH = "/media/Qwen/Qwen25-VL-7B-Instruct/"
video_path ="/media//test/output/1.mp4"

# 初始化LLM对象,加载指定路径的模型,并进行相关配置
llm = LLM(
    model=MODEL_PATH,  # 模型路径
    gpu_memory_utilization=0.8,  # GPU内存利用率,这里设置为80%
    tensor_parallel_size=1,  # 张量并行大小,设置为1表示不使用张量并行
    max_model_len=8192,  # 模型支持的最大输入长度
    dtype="bfloat16",  # 数据类型,使用bfloat16以减少内存占用
    enforce_eager=True,  # 强制使用即时执行模式
    limit_mm_per_prompt={"image": 10, "video": 10},  # 每个提示的多模态数据限制,这里图像和视频最多各10个
)

# 定义采样参数,用于控制模型生成文本的方式
sampling_params = SamplingParams(
    temperature=0.1,  # 温度参数,控制生成文本的随机性,值越小越确定
    top_p=0.001,  # 核采样的概率阈值,只考虑概率累积和达到该阈值的词
    repetition_penalty=1.05,  # 重复惩罚因子,用于减少生成文本中的重复内容
    max_tokens=8192,  # 生成文本的最大长度
    stop_token_ids=[],  # 停止生成的token ID列表,这里为空表示不设置停止条件
)

# 定义视频输入的消息列表,包含系统消息和用户消息
# 系统消息用于给模型提供一些基本的指令或信息
# 用户消息包含文本和视频信息,要求模型描述指定的视频
video_messages = [
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": [
            {"type": "text", "text": "描述这个视频。"},
            {
                "type": "video", 
                "video": "file:///" + video_path,  # 视频文件的URL
                "total_pixels": 20480 * 28 * 28, "min_pixels": 16 * 28 * 28  # 视频的总像素和最小像素信息
            }
        ]
    },
]


messages = video_messages


processor = AutoProcessor.from_pretrained(MODEL_PATH)
# 使用处理器将消息应用到聊天模板中,生成模型的输入提示,不进行分词操作,并添加生成提示
prompt = processor.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True,
)
# 调用process_vision_info函数处理消息中的视觉信息,返回图像输入和视频输入,不同的程序版本process_vision_info用法不同
image_inputs, video_inputs = process_vision_info(messages)

# 初始化多模态数据字典
mm_data = {}

# 如果视频输入不为空,将视频输入添加到多模态数据字典中
if video_inputs is not None:
    mm_data["video"] = video_inputs

# 定义模型的输入字典,包含提示和多模态数据
llm_inputs = {
    "prompt": prompt,
    "multi_modal_data": mm_data,
}

# 调用LLM对象的generate方法,根据输入和采样参数生成文本
outputs = llm.generate([llm_inputs], sampling_params=sampling_params)
# 从输出结果中提取生成的文本
generated_text = outputs[0].outputs[0].text


print(generated_text)

LLM 参数

模型路径与版本相关参数

  • model:这是一个必需的参数,它指定了要加载的模型的路径或者模型的名称。若提供的是路径,程序会从该路径加载模型;若提供的是名称,程序会尝试从 Hugging Face 的模型库中下载并加载对应的模型。
  • revision:此参数用于指定模型的版本,默认值为 "main"。你可以通过这个参数来选择加载特定版本的模型。

硬件与并行计算相关参数

  • gpu_memory_utilization:该参数表示 GPU 内存的利用率,默认值为 0.9。它的取值范围在 0 到 1 之间,通过调整这个参数可以控制模型加载时使用的 GPU 内存比例。
  • tensor_parallel_size:这个参数用于设置张量并行的大小,默认值为 1。张量并行是一种并行计算技术,通过将模型的张量分割到多个 GPU 上进行计算,从而加速模型的推理过程。
  • max_num_batched_tokens:它指定了每次推理时最大的批处理 token 数量,默认值为 2560。适当调整这个参数可以平衡推理速度和内存使用。
  • swap_space:表示每个 GPU 的交换空间大小(单位为 GB),默认值为 4。当 GPU 内存不足时,会使用交换空间来存储临时数据。

模型运行相关参数

  • dtype:用于指定模型的数据类型,默认值为 "auto"。常见的数据类型包括 "float16""bfloat16" 等,选择合适的数据类型可以在保证模型精度的前提下,减少内存占用。
  • max_model_len:表示模型支持的最大输入长度,默认值为 2048。如果输入的文本长度超过这个值,可能会导致错误或截断输入。
  • quantization:该参数用于指定模型的量化方法,默认值为 None。量化是一种压缩模型的技术,可以减少模型的内存占用和推理时间。
  • enforce_eager:这是一个布尔类型的参数,默认值为 False。当设置为 True 时,会强制使用即时执行模式。

多模态相关参数

  • limit_mm_per_prompt:此参数用于限制每个提示中的多模态数据数量,例如可以设置为 {"image": 10, "video": 10},表示每个提示中图像和视频的最大数量分别为 10。

这里没有传递的参数

  1. Tokenizer 相关参数

    • tokenizer:指定分词器的名称或路径(默认与 model 共用,可单独指定)。
    • tokenizer_mode"auto"(优先使用快速分词器)或 "slow"(强制使用慢速分词器,默认 "auto")。
    • skip_tokenizer_init:跳过分词器初始化(默认 False),需手动提供 prompt_token_ids
    • trust_remote_code:信任远程代码(如 Hugging Face 自定义模型,默认 False,安全相关)。
  2. 量化相关参数

    • quantization:模型量化方法,支持 "awq""gptq""fp8"(实验性),默认 None(不量化,使用 dtype)。
  3. 版本控制参数

    • revision:模型版本(分支、标签、commit ID,默认 None)。
    • tokenizer_revision:分词器版本(同上)。
  4. 硬件与内存参数

    • cpu_offload_gb:CPU 内存用于卸载模型权重(单位 GB,默认 0),牺牲速度换取更大模型支持。
    • max_seq_len_to_capture:CUDA 图支持的最大序列长度,超过则回退到即时模式(默认未指定,需根据模型调整)。
  5. 安全与多模态参数

    • allowed_local_media_path:允许读取本地媒体文件的路径(安全风险,仅可信环境启用),用于多模态输入(如图像、视频)。
  6. 其他参数

    • seed:随机数生成种子(默认 None),控制采样随机性。
    • disable_custom_all_reduce:禁用自定义 AllReduce(分布式训练相关,默认 False)。
    • hf_overrides:覆盖 Hugging Face 模型配置(字典或可调用对象)。
    • compilation_config:模型编译优化配置(整数或字典,默认 None)。

参数分类总结(按功能)

类别参数
模型与分词器model, tokenizer, tokenizer_mode, skip_tokenizer_init, trust_remote_code, revision, tokenizer_revision
分布式与硬件tensor_parallel_size, gpu_memory_utilization, swap_space, cpu_offload_gb, max_seq_len_to_capture, disable_custom_all_reduce
数据类型与量化dtype, quantization
安全与多模态allowed_local_media_path
初始化与配置seed, enforce_eager, hf_overrides, compilation_config

GPU操作执行模式 enforce_eager 参数

CUDA 图(CUDA Graphs)

1. 核心概念

CUDA 图是 NVIDIA 提供的一项技术,用于将一系列 GPU 操作(如张量计算、内存操作等) 捕获并封装为一个可重复执行的“图”。这个图可以在后续执行时作为一个整体提交给 GPU,避免重复的 CPU-GPU 通信开销,从而提升执行效率。

2. 优势
  • 高效性:捕获图后,只需一次 CPU-GPU 通信即可提交整个计算流程,减少内核启动和同步开销,适合 静态、重复的计算模式(如固定输入形状的推理)。
  • 低延迟:对相同或相似的计算任务,执行速度比即时模式更快。
3. 限制
  • 静态性:要求计算流程(如张量形状、操作顺序)在图捕获时完全确定,不支持动态变化(如条件分支、动态形状调整)。
  • 兼容性问题:某些复杂操作(如非确定性操作、动态内存分配)可能无法被 CUDA 图捕获,导致错误或功能失效。

即时模式(Eager Execution)

1. 核心概念

即时模式是指 每条 GPU 操作指令立即执行,无需预先捕获或构建计算图。操作的结果会立即返回给 CPU,流程控制更灵活(如支持动态条件判断、实时调整张量形状)。

2. 特点
  • 灵活性:适合 动态计算场景(如训练过程中动态调整输入、包含条件分支的模型)。
  • 调试友好:操作结果可实时查看,方便调试和开发。
  • 开销较高:每次操作都需要 CPU-GPU 通信和内核启动,重复执行时效率低于 CUDA 图。

enforce_eager=True 的作用与场景

在 VLLM 的 LLM 类中,enforce_eager 参数控制是否强制使用即时模式(禁用 CUDA 图):

  • 默认 False:混合使用 CUDA 图和即时模式。对于固定输入模式的计算(如常规推理),优先使用 CUDA 图提升效率;遇到动态操作时自动切换到即时模式。
  • True强制禁用 CUDA 图,完全使用即时模式。适用于以下场景:
    1. 复杂操作兼容性:当模型包含动态形状、条件分支(如多模态处理中的视频帧动态解码)、自定义 CUDA 内核等,CUDA 图可能无法正确捕获或执行这些操作,导致错误。此时必须启用即时模式以确保功能正常。
    2. 调试需求:即时模式下操作结果可实时验证,方便排查问题。
    3. 动态输入场景:输入数据形状或计算流程在运行时变化(如变长视频处理),CUDA 图的静态特性无法支持。

实际使用中,若模型输入和计算流程完全静态,保持默认 False 可获得更好性能;若遇到动态操作报错,则需启用此参数。

模式优势劣势适用场景
CUDA 图高效、低延迟(静态任务)不支持动态操作固定输入的推理任务(如文本生成)
即时模式灵活、兼容动态操作效率较低(重复任务)动态输入、复杂逻辑、调试场景
<think>好的,用户想了解如何使用vLLM部署Qwen2.5-VL-7B-Instruct模型。根据提供的引用内容,我需要整理出一个详细的步骤指南。首先,用户可能对vLLM不太熟悉,需要先简单介绍一下vLLM是什么,以及它的优势,比如高效推理、内存优化等。 接下来,环境搭建是关键部分。用户可能需要在Linux环境下操作,所以需要明确Python版本,如3.8或更高。安装vLLM时,要注意可能需要的依赖库,比如PyTorch和Transformers库。引用中提到了安装vLLM的命令,但需要检查是否需要指定版本,比如使用`pip install vllm`或者从源码安装。另外,模型下载部分需要说明如何通过Hugging Face获取模型,可能需要使用`git clone`或者`snapshot_download`函数。 然后,启动vLLM服务器的步骤需要详细说明,包括使用的命令参数,比如指定模型路径、主机和端口,是否启用Tensor并行等。用户可能需要调整参数以适应不同的硬件配置,比如GPU数量。此外,API调用部分需要给出示例代码,说明如何发送请求和处理响应,这部分要确保代码正确,并且使用正确的模型名称。 最后,用户可能关心性能优化和常见问题,比如内存不足如何处理,多GPU配置的注意事项。需要根据引用中的信息,提醒用户参考官方文档或社区资源。另外,用户可能对应用场景感兴趣,比如图像理解或文档处理,可以结合引用提到的发票识别案例来说明。 需要确保整个教程结构清晰,步骤明确,避免遗漏关键点。同时,检查LaTeX格式是否正确,行内公式用$...$,独立公式用$$...$$,但当前问题可能不涉及数学公式,所以可能不需要使用。但根据系统指令,如果有任何数学表达式,必须正确应用格式。此外,回答末尾要生成相关问题,帮助用户深入理解,比如部署后的性能优化、与其他模型的对比等。 确保引用标识正确添加到参考内容末尾,例如环境搭建部分引用[^1],模型下载引用和[^2]。可能还需要注意用户是否有权限访问模型文件,是否需要申请或使用特定凭证。此外,模型版本可能有更新,需要确认引用的指南是否仍然适用,必要时提醒用户查看最新文档。 总结来说,回答需要分步骤指导,涵盖环境准备、安装依赖、模型下载、服务器启动和API调用,每个步骤都需详细说明,并引用提供的资料。同时,生成的相关问题应引导用户进一步探索优化和应用场景。</think>以下是根据提供的引用资料整理的vLLM部署Qwen2.5-VL-7B-Instruct模型详细指南: ### 一、环境搭建 1. **操作系统要求** 推荐使用Linux系统(Ubuntu 20.04/22.04已验证可用),需确保GPU驱动和CUDA工具包已正确安装。 2. **Python环境配置** ```bash conda create -n qwen_vl python=3.8 conda activate qwen_vl ``` 3. **安装vLLM框架** ```bash pip install vllm # 或从源码安装最新版本 # git clone https://github.com/vllm-project/vllm && cd vllm && pip install -e . ``` 4. **安装依赖库** ```bash pip install torch transformers ``` ### 二、模型下载 1. **通过HuggingFace获取模型** ```bash git clone https://huggingface.co/Qwen/Qwen2.5-VL-7B-Instruct # 或使用huggingface_hub库 from huggingface_hub import snapshot_download snapshot_download(repo_id="Qwen/Qwen2.5-VL-7B-Instruct") ``` ### 三、启动vLLM服务器 ```bash python -m vllm.entrypoints.api_server \ --model /path/to/Qwen2.5-VL-7B-Instruct \ --host 0.0.0.0 \ --port 8000 \ --tensor-parallel-size 1 # 根据GPU数量调整 ``` ### 四、API调用示例 ```python import requests response = requests.post("http://localhost:8000/generate", json={ "prompt": "<|im_start|>user\n发票中的开票金额是多少?<|im_end|>\n<|im_start|>assistant\n", "max_tokens": 512, "temperature": 0.7 }) print(response.json()["text"]) ``` ### 五、关键参数说明 | 参数 | 说明 | |------|------| | `--tensor-parallel-size` | GPU并行数量(需与CUDA_VISIBLE_DEVICES配合使用)| | `--max-model-len` | 最大上下文长度(默认为4096)| | `--quantization` | 量化模式(可选awq/squeezellm)| ### 六、性能优化建议 1. **内存不足处理** 启用`--swap-space 16`参数扩展交换空间 2. **多GPU配置** 设置`CUDA_VISIBLE_DEVICES=0,1,2,3`后调整`--tensor-parallel-size=4`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二分掌柜的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值