Prhub

#39268 [Tests] Add Qwen3-VL multimodal memory leak check

vllm-project/vllm · 作者 lalit10 · 合并时间 2026-04-09 19:54

分析状态 已生成
文件变更 3提交数 8 · 评论 6
代码增减 +193 / -1
test multi-modality qwen

执行摘要

新增 Qwen3-VL 多模态模型内存泄漏检测测试,提升稳定性验证。

PR body明确指出,此变更作为issue #16353('Run performance benchmarks for multi-modal models in CI')的一部分,目的是为多模态模型添加性能基准测试以避免回归,如内存泄漏。具体地,专注于Qwen3-VL模型的内存泄漏检测,以提升系统稳定性。

对于关注多模态模型测试或内存管理的工程师,此PR值得精读,以学习如何设计内存泄漏检测测试和权衡阈值设置。重点关注测试逻辑中的内存测量方法和泄漏检测策略。

讨论亮点

Review中,gemini-code-assist[bot] 提出两个关键讨论点:一是内存增长阈值(初始设为256 MiB GPU和128 MiB CPU)过高,可能掩盖小泄漏,建议降低到更敏感值如32 MiB;二是使用峰值RSS(ru_maxrss)可能隐藏初始化后的泄漏,因为峰值通常在模型加载时达到,建议跟踪当前RSS。讨论未显示明确结论,但PR最终被DarkLight1337批准,可能作者已采纳建议或后续提交中调整。

实现拆解

实现主要包括三个文件变更:1) 新增测试文件 tests/models/multimodal/generation/test_memory_leak.py,包含测试逻辑:初始化LLM引擎,定义请求批次,测量GPU使用内存和CPU峰值RSS,通过多轮请求检查内存增长是否超过阈值。2) 修改 vllm/utils/mem_constants.py,添加KB和KiB常量定义。3) 修改 vllm/utils/mem_utils.py,新增format_kib函数用于格式化内存值。测试核心函数包括 _make_messages 构建请求消息,_build_request_batch 生成请求批次,_ru_maxrss_bytes 获取CPU峰值RSS,_gpu_used_bytes 获取GPU使用内存。

文件 模块 状态 重要度
tests/models/multimodal/generation/test_memory_leak.py tests/multimodal/generation added 8.0
vllm/utils/mem_constants.py utils modified 3.0
vllm/utils/mem_utils.py utils modified 3.0

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

关键符号

_make_messages _build_request_batch _ru_maxrss_bytes _gpu_used_bytes format_kib

评论区精华

内存增长阈值设置 测试

gemini-code-assist[bot] 指出 GPU 和 CPU 内存增长阈值过高,可能掩盖小泄漏,建议降低阈值以提高敏感性。

结论:PR 最终被批准,可能作者已考虑此建议并在后续提交中调整阈值。 · 已解决

峰值 RSS vs 当前 RSS 测量 测试

gemini-code-assist[bot] 强调使用峰值 RSS 可能隐藏初始化后的内存泄漏,因为峰值通常在模型加载时达到,建议使用当前 RSS 跟踪。

结论:讨论未明确采纳,但 PR 批准暗示可能已解决或待后续改进。 · addressed

风险与影响

技术风险包括:1) 测试阈值设置可能不准确,如果阈值过高(如review指出),可能导致漏检内存泄漏;反之,过低可能引起误报。2) 内存测量方法依赖resource.getrusage的峰值RSS,可能无法捕捉初始化后的泄漏,影响测试有效性。3) 测试特定于Qwen3-VL-4B-Instruct模型,可能不适用于其他多模态模型,限制了通用性。4) 环境因素如GPU内存波动可能干扰测量结果。

对用户无直接影响,因为这是测试代码变更。对系统:增强CI测试套件,为多模态模型提供内存泄漏检测能力,有助于早期发现和修复回归问题。对团队:提升开发效率,通过自动化测试减少手动内存检查负担,并促进多模态性能基准测试的持续集成。

测试阈值敏感度不足 内存测量方法限制 模型特定依赖

关联 Issue

#16353 [Feature]: Run performance benchmarks for multi-modal models in CI

完整报告

执行摘要

本PR新增了针对Qwen3-VL多模态模型的内存泄漏检测测试,通过重复发送固定请求并监控GPU和CPU内存增长,旨在早期发现潜在泄漏,作为issue #16353多模态性能基准测试计划的一部分,增强CI测试覆盖和模型稳定性验证。

功能与动机

此变更源于issue #16353(“为多模态模型在CI中运行性能基准测试”),旨在避免多模态优化(如处理器缓存)导致的回归,如内存泄漏。PR body明确指出,专注于Qwen3-VL-4B-Instruct模型,添加引擎级泄漏检查,而非完整服务路径基准测试。具体地,通过建立内存基线和检查后续轮次增长,提供针对性泄漏检测能力。

实现拆解

核心文件变更

  • tests/models/multimodal/generation/test_memory_leak.py:新增测试文件,包含以下关键逻辑:
    • 使用LLM初始化模型,设置多模态参数(如limit_mm_per_prompt)。
    • 定义_make_messages_build_request_batch函数构建包含随机文本和图像的请求,避免前缀缓存干扰。
    • 通过_gpu_used_bytes获取GPU使用内存,_ru_maxrss_bytes获取CPU峰值RSS。
    • 执行多轮请求(预热轮和测量轮),检查内存增长是否超过阈值(初始设为0 MiB,但review建议调整)。
    • 使用pytest.mark.core_model标记,并支持参数化图像输入。
  • vllm/utils/mem_constants.py:添加KB_bytesKiB_bytes常量定义,为内存单位提供标准基准。
  • vllm/utils/mem_utils.py:新增format_kib函数,用于格式化内存值为KiB单位,增强测试输出可读性。

关键函数

  • _make_messages:构建包含随机文本和图像URL的聊天消息,避免缓存效应。
  • _build_request_batch:生成固定数量的请求批次,用于每轮测试。
  • _ru_maxrss_bytes:跨平台获取进程峰值RSS(Linux为KB,macOS为字节)。
  • _gpu_used_bytes:同步设备并计算GPU已使用内存。
  • format_kib:新增工具函数,格式化字节值为KiB字符串。

评论区精华

review中,gemini-code-assist[bot] 提出两个高优先级讨论:

“内存增长阈值(256 MiB for GPU和128 MiB for CPU)过高,对于固定输入的4B模型,内存占用应极稳定,高阈值可能掩盖显著泄漏(如每请求10 MiB),建议降低到更敏感值如32 MiB或64 MiB。”

“使用resource.getrusage的峰值RSS可能隐藏初始化后的泄漏,因为峰值通常在模型加载时达到,建议跟踪当前RSS(例如使用psutil)以有效检测测量阶段的泄漏。”

讨论未显示作者明确回应,但PR最终被DarkLight1337批准,暗示可能已采纳建议或在后续提交中调整阈值和测量方法。

风险与影响

技术风险

  • 阈值设置不当:初始阈值过高可能导致小泄漏漏检,而调整过低可能引入误报,影响测试可靠性。
  • 测量方法局限:依赖峰值RSS可能无法捕捉模型加载后的泄漏,需结合当前RSS跟踪以提高准确性。
  • 模型依赖性强:测试仅针对Qwen3-VL-4B-Instruct,缺乏通用性,可能不覆盖其他多模态模型变体。
  • 环境干扰:GPU内存波动或系统负载可能影响测量结果,导致测试不稳定。

影响范围

  • 用户:无直接影响,此为测试代码变更。
  • 系统:增强CI测试套件,为多模态模型提供自动化内存泄漏检测,有助于早期发现回归问题。
  • 团队:提升开发效率,减少手动内存检查负担,并推动多模态性能基准测试的持续集成进程。

关联脉络

本PR直接关联issue #16353,是“多模态模型性能基准测试”功能请求的具体实现之一。从同仓库近期历史PR看,多模态相关变更(如#38388修复嵌套张量比较、#39307更新ColModernVBERT模型)可能受益于此测试覆盖,形成多模态稳定性验证的演进链条。此外,review讨论中提及的阈值和测量方法改进,可能为后续类似测试(如其他模型或更全面的基准测试)提供设计参考。

参与讨论