还是炸,改用vllm了

单vlm16g

单LLM9g

ModelScope(魔搭)下载模型通过 vLLM 启动服务,并开放端口给 Windows 访问-CSDN博客

你提供的代码整体结构清晰,目标明确(本地部署 LLM + VLM),但在 VLM 模型加载和推理部分存在几个关键问题,这很可能是导致你“16G 内存 + 16G 显存直接闪退”的根本原因。


🔥 核心问题分析

❌ 1. VLM 模型选型错误:ZhipuAI/GLM-4.6V-Flash 并非小模型!

你注释写的是 “使用更小、更高效的模型”,但实际上:

  • GLM-4V 系列是智谱 AI 的旗舰多模态模型,参数量估计在 10B+ 级别
  • 即使是 -Flash 版本,也未公开支持 4-bit 量化,且默认以 bfloat16 或 float16 加载。
  • 仅模型权重就需要 >20GB 显存(实测 GLM-4V 在 FP16 下需 ~22GB 显存)。

✅ 结论:你在 16G 显存上加载 GLM-4V,必然 OOM 闪退


❌ 2. VLM 加载方式未启用量化或内存优化

你的 _load_vlm_model() 中虽然写了 low_cpu_mem_usage=True,但:

python

编辑

self.vlm_model = Glm4vForConditionalGeneration.from_pretrained(
    self.vlm_model_name,
    dtype="auto",          # ❌ 这不会自动量化!
    device_map="auto",
    low_cpu_mem_usage=True,
    trust_remote_code=True
)
  • dtype="auto" 只是让模型用它训练时的精度(通常是 bfloat16)。
  • 没有启用 load_in_4bit 或 load_in_8bit,无法降低显存占用。
  • 而 GLM-4V 官方未提供 GPTQ/AWQ/GGUF 量化版本,社区也极少有可用量化版。

❌ 3. 图像预处理不足

虽然你在 create_with_multiple_images 中做了 thumbnail((512, 512)),但:

  • GLM-4V 默认支持高分辨率输入(如 1120x1120),内部会做复杂视觉编码。
  • 即使缩图,视觉编码器(ViT)本身参数量大,中间特征图仍占大量显存。

⚠️ 4. LLM 部分也有隐患

  • 你用的是 Qwen2.5-0.5B(这个没问题,很小),但加载时用了 torch.bfloat16
  • 如果你的 GPU 不支持 bfloat16(如 RTX 30/40 系列只支持 float16),可能回退到 float32,翻倍显存。

✅ 解决方案:换一个真正轻量的 VLM!

推荐替代模型(均可在 16G 显存运行):

表格

模型 参数量 显存需求 (4-bit) 是否支持中文 备注
Qwen-VL-Chat ~4B ~8GB 阿里开源,支持多图,有 GGUF/GPTQ
LLaVA-Phi-3-mini ~3.8B ~6GB ⚠️ 弱 微软 Phi-3 + LLaVA,英文强
InternVL-Chat-1.5-4B ~4B ~10GB 中文强,但需 8-bit 才稳
MiniCPM-V-2.6 ~8B ~10GB (int4) 强推!支持高分辨率,有官方 int4

💡 首选推荐:openbmb/MiniCPM-V-2_6


🛠️ 修改建议(以 MiniCPM-V-2.6 为例)

1. 替换模型名称

python

编辑

# self.vlm_model_name = "ZhipuAI/GLM-4.6V-Flash"  # ❌ 删除
self.vlm_model_name = "openbmb/MiniCPM-V-2_6"     # ✅

2. 修改 _load_vlm_model()

python

编辑

def _load_vlm_model(self):
    try:
        print("正在加载 MiniCPM-V 4-bit 量化模型...")
        from transformers import AutoModel, AutoTokenizer
        
        self.vlm_tokenizer = AutoTokenizer.from_pretrained(
            self.vlm_model_name, 
            trust_remote_code=True
        )
        self.vlm_model = AutoModel.from_pretrained(
            self.vlm_model_name,
            torch_dtype=torch.float16,      # 必须 float16(NVIDIA GPU)
            device_map="auto",
            trust_remote_code=True,
            load_in_4bit=True,              # ✅ 关键:4-bit 量化
            bnb_4bit_compute_dtype=torch.float16,
            bnb_4bit_use_double_quant=True,
            bnb_4bit_quant_type="nf4"
        )
        print(f"VLM模型加载成功 (4-bit): {self.vlm_model_name}")
    except Exception as e:
        print(f"VLM加载失败: {e}")
        raise

⚠️ 需安装:

bash

编辑

pip install bitsandbytes accelerate

3. 修改 analyze_images / create_with_image 的推理逻辑

MiniCPM-V 的调用方式不同:

python

编辑

def create_with_image(self, prompt, image_path):
    image = Image.open(image_path).convert('RGB')
    
    msgs = [{'role': 'user', 'content': [prompt, image]}]
    
    response = self.vlm_model.chat(
        image=None,
        msgs=msgs,
        tokenizer=self.vlm_tokenizer,
        sampling=True,
        temperature=0.7
    )
    
    return {"text": response}

具体参考:https://huggingface.co/openbmb/MiniCPM-V-2_6


🔧 其他优化建议

  1. 先只测试 LLM:确保 Qwen2.5-0.5B 能跑通,排除基础环境问题。
  2. 监控显存:运行时开终端执行 nvidia-smi -l 1,看显存峰值。
  3. 关闭 debug 日志:减少内存碎片。
  4. 避免同时加载 LLM + VLM:你当前设计是“按需加载 VLM”,很好,但记得 clear_memory() 后 del model 并 torch.cuda.empty_cache()

✅ 总结

表格

问题 修正方案
用了 GLM-4V(太大) → 换成 MiniCPM-V-2.6 或 Qwen-VL-Chat-int4
未量化 VLM → 加 load_in_4bit=True
图像未充分压缩 → 缩到 448x448 以下(MiniCPM-V 支持动态分辨率)
bfloat16 兼容性 → 改为 torch.float16

如果你愿意,我可以帮你重写 _load_vlm_model 和 create_with_image 以适配 MiniCPM-V-2.6,确保在 16G 显存下稳定运行。只需告诉我你倾向哪个模型(MiniCPM-V 还是 Qwen-VL)。

更多推荐