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_infoMODEL_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_messagesprocessor = 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].textprint(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。
这里没有传递的参数
-
Tokenizer 相关参数
tokenizer
:指定分词器的名称或路径(默认与model
共用,可单独指定)。tokenizer_mode
:"auto"
(优先使用快速分词器)或"slow"
(强制使用慢速分词器,默认"auto"
)。skip_tokenizer_init
:跳过分词器初始化(默认False
),需手动提供prompt_token_ids
。trust_remote_code
:信任远程代码(如 Hugging Face 自定义模型,默认False
,安全相关)。
-
量化相关参数
quantization
:模型量化方法,支持"awq"
、"gptq"
、"fp8"
(实验性),默认None
(不量化,使用dtype
)。
-
版本控制参数
revision
:模型版本(分支、标签、commit ID,默认None
)。tokenizer_revision
:分词器版本(同上)。
-
硬件与内存参数
cpu_offload_gb
:CPU 内存用于卸载模型权重(单位 GB,默认0
),牺牲速度换取更大模型支持。max_seq_len_to_capture
:CUDA 图支持的最大序列长度,超过则回退到即时模式(默认未指定,需根据模型调整)。
-
安全与多模态参数
allowed_local_media_path
:允许读取本地媒体文件的路径(安全风险,仅可信环境启用),用于多模态输入(如图像、视频)。
-
其他参数
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 图,完全使用即时模式。适用于以下场景:- 复杂操作兼容性:当模型包含动态形状、条件分支(如多模态处理中的视频帧动态解码)、自定义 CUDA 内核等,CUDA 图可能无法正确捕获或执行这些操作,导致错误。此时必须启用即时模式以确保功能正常。
- 调试需求:即时模式下操作结果可实时验证,方便排查问题。
- 动态输入场景:输入数据形状或计算流程在运行时变化(如变长视频处理),CUDA 图的静态特性无法支持。
实际使用中,若模型输入和计算流程完全静态,保持默认 False
可获得更好性能;若遇到动态操作报错,则需启用此参数。
模式 | 优势 | 劣势 | 适用场景 |
---|---|---|---|
CUDA 图 | 高效、低延迟(静态任务) | 不支持动态操作 | 固定输入的推理任务(如文本生成) |
即时模式 | 灵活、兼容动态操作 | 效率较低(重复任务) | 动态输入、复杂逻辑、调试场景 |