You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行LLaVA-1.5-13B预训练模型时CUDA内存不足求助

解决LLaVA-1.5-13B在RTX4070Ti上的CUDA内存不足问题

你的RTX4070Ti(12G显存)显存容量不足以完整加载float16精度的LLaVA-1.5-13B模型——13B参数的LLM仅float16权重就需要约26G显存,再加上多模态模型的视觉编码器、推理时的临时缓存,显存占用远超12G上限。CPU能运行是因为它依赖系统内存,不受GPU显存限制,但速度较慢。以下是可行的解决方案:

1. 4bit量化加载模型(最推荐,显存占用减半)

借助bitsandbytes库对模型做4bit量化,能将显存占用降到13G以内(刚好适配你的显卡),且几乎不损失推理效果。

修改模型加载代码:

from PIL import Image
import requests
import torch
from transformers import AutoProcessor, LlavaForConditionalGeneration

model_id = "llava-hf/llava-1.5-13b-hf"

prompt = "USER: <image>\nWhat are these?\nASSISTANT:"
image_file = "http://images.cocodataset.org/val2017/000000039769.jpg"

model = LlavaForConditionalGeneration.from_pretrained(
    model_id,
    torch_dtype=torch.float16,
    low_cpu_mem_usage=True,
    load_in_4bit=True,  # 启用4bit量化
    bnb_4bit_use_double_quant=True,  # 双重量化进一步压缩显存占用
    bnb_4bit_quant_type="nf4",  # 针对LLM优化的量化类型
    bnb_4bit_compute_dtype=torch.float16  # 计算时保留float16精度保证速度
)

processor = AutoProcessor.from_pretrained(model_id)

raw_image = Image.open(requests.get(image_file, stream=True).raw)
inputs = processor(prompt, raw_image, return_tensors='pt').to("cuda", torch.float16)

output = model.generate(**inputs, max_new_tokens=200, do_sample=False)
print(processor.decode(output[0][2:], skip_special_tokens=True))

2. 切换到更小的模型版本

如果不想用量化,可以换成llava-hf/llava-1.5-7b-hf(7B参数),float16精度下权重约14G,配合梯度检查点优化刚好能在12G显存运行:

model = LlavaForConditionalGeneration.from_pretrained(
    "llava-hf/llava-1.5-7b-hf",
    torch_dtype=torch.float16,
    low_cpu_mem_usage=True,
).to(0)
model.gradient_checkpointing_enable()  # 开启梯度检查点减少推理缓存

3. 模型分片(自动分配到CPU/GPU)

用device_map="auto"让transformers自动将模型部分层放到CPU、部分放到GPU,降低显存占用,代价是推理速度比全GPU慢,但比纯CPU快:

model = LlavaForConditionalGeneration.from_pretrained(
    model_id,
    torch_dtype=torch.float16,
    low_cpu_mem_usage=True,
    device_map="auto"  # 自动分配设备
)

4. 推理时的额外显存优化

  • 推理前手动清理GPU缓存:
torch.cuda.empty_cache()
  • 生成时指定pad_token_id(避免自动生成冗余token占用显存):
output = model.generate(
    **inputs,
    max_new_tokens=200,
    do_sample=False,
    pad_token_id=processor.tokenizer.pad_token_id
)

内容的提问来源于stack exchange,提问作者Jakob Hürlemann

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 08:33:17