Qwen2 VL推理调优实践
发表于 2025/06/20
0
Qwen2 VL概述
Qwen2 VL(Qwen-VL)是阿里巴巴通义千问(Qwen)系列的最新一代多模态大模型,专注于视觉-语言(Vision-Language)理解与生成任务。作为Qwen-VL-1.0的升级版本,该模型深度融合了强大的视觉感知与自然语言处理能力,能够同时处理图像、文本、检测框等多模态输入,支持任意分辨率和宽高比的输入,并在开放域问答、细粒度视觉定位、文档解析等场景中展现卓越性能。
Qwen2 VL推理过程及调优分析
以一次图片理解为例:当用户输入一张包含金毛犬的图片并提问"这是什么动物?"时,首先对输入图片进行预处理,此阶段在CPU上进行,然后送入Vision Encoder模块输出为vision token,与prompt("这是什么动物?")分词编码后的token拼接,作为QwenLM Decoder模块的输入,输出最终答案。此次推理优化主要为CPU侧的图片预处理,因此将只介绍图片预处理阶段流程。
图片预处理
1.调整宽和高,生成新分辨率的图片
2.对图片进行归一化操作,主要为求均值和标准差操作
3.对图片进行缩放操作
图片处理模块时延分析
统计一次离线推理图片预处理阶段各个操作的耗时,结果如下表所示,可以看到调整图片的宽高阶段占据了大部分时间。
图片预处理 | 调整宽高 | 缩放 | 归一化 | 其他 |
---|---|---|---|---|
占比 | 29.9% | 12.4% | 25.9% | 34.7% |
性能分析
通过Python自带的cProfile工具,统计了一次推理过程中预处理阶段的各个函数耗时,简便起见,仅展示其中的Top10:
ncalls | tottime | percall | cumtime | percall | filename:lineno (function) |
---|---|---|---|---|---|
40 | 0.129 | 0.003 | 0.129 | 0.003 | {method 'cpu' of 'torch._C._TensorBase' objects} |
7 | 0.025 | 0.004 | 0.025 | 0.004 | {built-in method torch.arange} |
1 | 0.019 | 0.019 | 0.019 | 0.019 | image_transforms.py:352(normalize) |
1 | 0.018 | 0.018 | 0.018 | 0.018 | {method 'resize' of 'ImagingCore' objects} |
10 | 0.015 | 0.001 | 0.020 | 0.002 | {built-in method numpy.array} |
4 | 0.011 | 0.003 | 0.011 | 0.003 | {method 'reshape' of 'numpy.ndarray' objects} |
131 | 0.007 | 0.000 | 0.007 | 0.000 | {built-in method torch._C._nn.linear} |
2 | 0.006 | 0.003 | 0.006 | 0.003 | {method 'astype' of 'numpy.ndarray' objects} |
186 | 0.006 | 0.000 | 0.006 | 0.000 | {built-in method torch.cat} |
164 | 0.006 | 0.000 | 0.006 | 0.000 | {function _TensorBase.to at 0xfffdbb503760} |
从中可以看到,resize函数排在了Top4,符合之前离线推理时统计的预期,此外,在在线推理时,还会多一次resize操作。因此,选中此热点函数作为优化对象,鲲鹏boositkit媒体库(KPCV,https://www.hikunpeng.com/document/detail/zh/kunpengaccel/media/rn_kpcv/kunpengaccel_kpcv_28_0002.html)已对resize函数进行过优化,尝试将resize函数替换为KPCV优化的版本,下文将详细描述使能过程。
调优实施及结果
1.kpcv安装
参考https://www.hikunpeng.com/document/detail/zh/kunpengaccel/media/ug_kpcv/kunpengaccel_kpcv_06_0005.html2.resize替换
原代码中图像为RGB排列,Opencv为BGR,需进行转换。image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
image = cv2.resize(image, (resized_width, resized_height))
image = cv2.cv2Color(image, cv2.COLOR_BGR2RGB)
3.调优结果
从表中可以看出,图片分辨率越大,提升效果越明显。当图片分辨率为3840×2160和1080×1920时,优化效果最佳,端到端推理时间能降低12%;当图片分辨率为784×1280时,图片处理部分耗时能有47%的提升,由于后续推理的性能波动,端到端提升相对较小。为了验证其性能提升,在推理小图片时增大图片数,当图片数为4时,可以看到端到端能有5%的提升。总图片数 | 分辨率 | resize之后的 分辨率 | 端到端耗时 (优化前) | 端到端耗时 (优化后) | 端到端提升 | 图片处理耗时 (优化前) | 图片处理耗时 (优化后) | 图片处理提升 |
---|---|---|---|---|---|---|---|---|
1 | 3840×2160 | 1176×672 | 1048 | 920 | 12% | 193 | 140 | 27% |
1 | 1920×1080 | 1176×672 | 696 | 612 | 12% | 59 | 27 | 54% |
1 | 1280×784 | 1120×700 | 689 | 685 | 0.5% | 40 | 21 | 47% |
4 | 1280×784 | 1120×700 | 736 | 696 | 5% | 98 | 57 | 41% |