Python 多模态大模型的 LLaVA / Qwen-VL 推理

1次阅读

多模态模型部署常见问题包括:autoprocessor加载失败需手动构造;qwen-vl属性名不匹配需查dir(model);多图输入须单图处理;显存优化需降精度、调图像尺寸并避免torch.compile。

Python 多模态大模型的 LLaVA / Qwen-VL 推理

LLaVA 加载模型时卡在 AutoProcessor.from_pretrained

常见现象是下载卡住、报 ConnectionError 或返回空 processor。这不是代码写错了,而是 Hugging Face 默认尝试加载远程 Tokenizer + image processor 配置,但部分多模态模型(如原始 LLaVA-1.5)没把 processor 配置推到 Hub,或用了非标准字段。

实操建议:

立即学习Python免费学习笔记(深入)”;

  • 手动构造 processor:用 CLIPImageProcessor 处理图像,llamaTokenizer(或对应 base 模型的 tokenizer)处理文本,别依赖 AutoProcessor
  • 检查模型路径是否含 llava-v1.5 类字样——这类权重通常不带完整 processor,得按其 github README 手动拼接组件
  • 若用 llava-hf/llava-1.5-7b-hf 这类 HF 官方封装版,确认 transformers >= 4.36,旧版本会因缺少 LlavaProcessor 类而 fallback 失败

Qwen-VL 推理时报错 AttributeError: 'Qwen2VLForConditionalGeneration' Object has no attribute 'model'

这是 transformers 版本和模型结构不匹配的典型症状。Qwen-VL 系列(尤其是 Qwen2-VL)内部结构和 LLaMA 不同,它的语言模型主干叫 language_model,不是通用的 model 属性。

实操建议:

立即学习Python免费学习笔记(深入)”;

  • 别直接调 model.modelmodel.transformer ——先 print dir(model) 看真实属性名
  • 图像 token 插入逻辑必须走 model.get_vision_tower()model.get_mm_projector(),不能硬套 LLaVA 的 model.vision_tower
  • 使用 qwen-vl 官方 repo 的 QwenVLProcessor,而非 transformers 自带的 AutoProcessor,后者不识别 image 字段的嵌套格式

多图输入时 batch 推理崩掉或输出错乱

LLaVA / Qwen-VL 均不原生支持「单 prompt + 多图」的 batch 维度对齐。你传入 [img1, img2] 和一个 prompt,模型内部会把两张图 flatten 成一串 patch tokens,但 attention mask 和 position id 很容易没对齐,导致生成乱码或 CUDA error。

实操建议:

立即学习Python免费学习笔记(深入)”;

  • 强制单图 per sample:哪怕你要比对两张图,也拆成两个独立样本,用 torch.cat 合并 logits 再后处理
  • Qwen-VL 支持 patch_size 动态缩放,但 batch 内所有图必须等宽高比,否则 image_grid_thw 计算会出错;预处理时统一 resize + pad,别只 crop
  • LLaVA 的 image_newline token 是 per-image 插入的,batch 中某张图缺这个 token,整个 batch 的 token offset 就全偏了

本地部署时显存爆掉,OOM when allocating tensor

多模态模型的视觉编码器(ViT)本身就很吃显存,再加上大语言模型,哪怕 7B 参数 + 448×448 图像,A100 80G 也可能扛不住。问题常出在图像预处理阶段:默认用 float32 加载 PIL 图,再转 tensor,中间没释放。

实操建议:

立即学习Python免费学习笔记(深入)”;

  • 图像加载后立刻 .to(torch.bfloat16).half(),ViT encoder 通常兼容,别等进 model 才转
  • 禁用 torch.compile:目前多模态 forward 中存在动态 shape(如不同图 patch 数不同),torch.compile 会反复 recompile 导致显存泄漏
  • Qwen-VL 的 max_image_size 默认是 1280,实际推理时设成 448512 能省一半显存,但注意别小到让文字区域被裁掉

真正麻烦的是图像 token 和文本 token 的长度耦合——改图尺寸不仅影响 vision encoder,还牵连 language model 的 KV cache 长度。这点很容易被忽略,调参时得两边一起看。

text=ZqhQzanResources