24G单卡MiniCPM-V-2_6也可以微调

一、MiniCPM-V-2_6简介

       MiniCPM-V 2.6 是 MiniCPM-V 系列中最新、性能最佳的模型。该模型基于 SigLip-400M 和 Qwen2-7B 构建,共 8B 参数。与 MiniCPM-Llama3-V 2.5 相比,MiniCPM-V 2.6 性能提升显著,并引入了多图和视频理解的新功能。MiniCPM-V 2.6 的主要特点包括:

  • 🔥 领先的性能。 MiniCPM-V 2.6 在最新版本 OpenCompass 榜单上(综合 8 个主流多模态评测基准)平均得分 65.2,以8B量级的大小在单图理解方面超越了 GPT-4o mini、GPT-4V、Gemini 1.5 Pro 和 Claude 3.5 Sonnet 等主流商用闭源多模态大模型

  • 🖼️ 多图理解和上下文学习。 MiniCPM-V 2.6 还支持多图对话和推理。它在 Mantis-Eval、BLINK、Mathverse mv 和 Sciverse mv 等主流多图评测基准中取得了最佳水平,并展现出了优秀的上下文学习能力。

  • 🎬 视频理解。 MiniCPM-V 2.6 还可以接受视频输入,进行对话和提供涵盖时序和空间信息的详细视频描述。模型在 有/无字幕 评测场景下的 Video-MME 表现均超过了 GPT-4V、Claude 3.5 Sonnet 和 LLaVA-NeXT-Video-34B等商用闭源模型。

  • 💪 强大的 OCR 能力及其他功能。 MiniCPM-V 2.6 可以处理任意长宽比的图像,像素数可达 180 万(如 1344x1344)。在 OCRBench 上取得最佳水平,超过 GPT-4o、GPT-4V 和 Gemini 1.5 Pro 等商用闭源模型。基于最新的 RLAIF-V 和 VisCPM 技术,其具备了可信的多模态行为,在 Object HalBench 上的幻觉率显著低于 GPT-4o 和 GPT-4V,并支持英语、中文、德语、法语、意大利语、韩语等多种语言

  • 🚀 卓越的效率。 除了对个人用户友好的模型大小,MiniCPM-V 2.6 还表现出最先进的视觉 token 密度(即每个视觉 token 编码的像素数量)。它仅需 640 个 token 即可处理 180 万像素图像,比大多数模型少 75%。这一特性优化了模型的推理速度、首 token 延迟、内存占用和功耗。因此,MiniCPM-V 2.6 可以支持 iPad 等终端设备上的高效实时视频理解

  • 💫 易于使用。 MiniCPM-V 2.6 可以通过多种方式轻松使用:(1) llama.cpp 和 ollama 支持在本地设备上进行高效的 CPU 推理,(2) int4 和 GGUF 格式的量化模型,有 16 种尺寸,(3) vLLM 支持高吞吐量和内存高效的推理,(4) 针对新领域和任务进行微调,(5) 使用 Gradio 快速设置本地 WebUI 演示,(6) 在线demo即可体验。

       结论有惊喜。🔥 

二、环境准备

          具体的环境可以参考我的上篇文(Qwen-VL部署)。这里不再重复内容。另外微调使用的swift这个框架进行的微调,所以还要准备swift的环境。

swift环境安装。

git clone https://github.com/modelscope/swift.git
cd swift

#创建虚拟环境
conda create -n minicpm python=3.10 -y
conda activate minicpm
conda install pytorch torchvision torchaudio pytorch-cuda=12.4 -c pytorch -c nvidia

#安装swift的依赖
pip install -e .[llm]

三、微调

        1、准备数据
[{
    "id": "3",
    "image": "/data/labelstudio/data/media/upload/1/ef7c451a-GC-10-1b.png",
    "conversations": [
      {
        "from": "user",
        "value": "<image>\\n请检查图片中的问题。"
      },
      {
        "from": "assistant",
        "value": "图片中存在井盖破损的问题"
      }
    ]
  }
]
        2、微调指令
CUDA_VISIBLE_DEVICES=0 swift sft   \
--model_type minicpm-v-v2_6-chat    \
--model_id_or_path /data/autodl/minicpm-v-2-6/MiniCPM-V-2_6   \
--dataset /data/autodl/minicpm-v-2-6/result_cpm.json  self-cognition \
--sft_type lora \
--max_length 6000 \
--learning_rate 1e-3 \
--batch_size 2 \
--num_train_epochs 3   \
--logging_steps 3 \
--eval_steps 100 \
--save_steps 100 \
--gradient_accumulation_steps 8 \
--model_name 智能助手   'Intelligent  Assistant' \
--model_author  风之飘渺  'Smart' 
#--deepspeed default-zero2 加了这个会报错,官方也没有说法
        3、微调说明
  1. 正常用官方的脚本一直报OOM的,但是用这个指令是可以微调的,虽然效果很差。
  2. 参数max_length 不能再大,再大的话会OOM,我的是这样。
  3. batch_size 反而可以到4也没有报OOM,再大没有试,我数据样本少。
  4. 微调的数据,一定要与我上面给的格式相同,否则会报一些如:KeyError:from之类的错误,基本上是数据样本里缺少相应的关键字。

       总之还是很强的一个多模态大模型,微调前的测试感觉,MiniCPM-V 2.6 比 Qwen-VL、Qwen2-VL都要好,在识图方面。最怕的就是但是,但是还是来了。同样的数据微调后,MiniCPM-V 2.6啥也不是了,测试图片识别方面能力下降。没做任何特殊设置,基本上同条件微调,都是默认的参数。

# test.py import torch from PIL import Image from modelscope import AutoModel, AutoTokenizer model = AutoModel.from_pretrained('OpenBMB/MiniCPM-V-2', trust_remote_code=True, torch_dtype=torch.bfloat16) # For Nvidia GPUs support BF16 (like A100, H100, RTX3090) model = model.to(device='cuda', dtype=torch.bfloat16) # For Nvidia GPUs do NOT support BF16 (like V100, T4, RTX2080) #model = model.to(device='cuda', dtype=torch.float16) # For Mac with MPS (Apple silicon or AMD GPUs). # Run with `PYTORCH_ENABLE_MPS_FALLBACK=1 python test.py` #model = model.to(device='mps', dtype=torch.float16) tokenizer = AutoTokenizer.from_pretrained('OpenBMB/MiniCPM-V-2', trust_remote_code=True) model.eval() image = Image.open(r"C:\Users\86182\Desktop\sjk\tp\1741706283410.jpg").convert('RGB') question = 'What is in the image?' msgs = [{'role': 'user', 'content': question}] res, context, _ = model.chat( image=image, msgs=msgs, context=None, tokenizer=tokenizer, sampling=True, temperature=0.7 ) print(res) 以上是代码,以下是报错 --------------------------------------------------------------------------- OutOfMemoryError Traceback (most recent call last) Cell In[5], line 8 6 model = AutoModel.from_pretrained('OpenBMB/MiniCPM-V-2', trust_remote_code=True, torch_dtype=torch.bfloat16) 7 # For Nvidia GPUs support BF16 (like A100, H100, RTX3090) ----> 8 model = model.to(device='cuda', dtype=torch.bfloat16) 9 # For Nvidia GPUs do NOT support BF16 (like V100, T4, RTX2080) 10 #model = model.to(device='cuda', dtype=torch.float16) 11 # For Mac with MPS (Apple silicon or AMD GPUs). 12 # Run with `PYTORCH_ENABLE_MPS_FALLBACK=1 python test.py` 13 #model = model.to(device='mps', dtype=torch.float16) 15 tokenizer = AutoTokenizer.from_pretrained('OpenBMB/MiniCPM-V-2', trust_remote_code=True) File ~\AppData\Roaming\Python\Python311\site-packages\transformers\modeling_utils.py:2460, in PreTrainedModel.to(self, *args, **kwargs)
最新发布
03-20
<think>嗯,用户遇到了PyTorch模型加载时的CUDA内存不足错误,特别是在使用torch.bfloat16运行OpenBMB/MiniCPM-V-2模型时。我需要根据提供的引用资料和系统指令来整理解决方案。首先,要确认错误的原因,可能包括模型太大、数据批量过大、内存未释放或者多卡配置问题。 根据引用[1],常见原因有模型和数据过大,所以可能需要减小批量大小或者使用混合精度。用户提到用了bfloat16,但可能还需要其他优化措施。引用[3]提到将模型精度从32位降到16位解决了问题,虽然用户已经用了bfloat16,但可能需要检查是否正确设置,比如在加载模型时指定torch_dtype=torch.bfloat16。 另外,引用[2]和[3]提到多卡训练的问题,如果服务器有多个GPU,使用device_map="auto"可能会分散模型到不同卡上,但需要确保没有抢占其他进程的资源。用户可能需要设置CUDA_VISIBLE_DEVICES来限制使用的GPU,避免冲突。 内存释放方面,引用[1]和[5]指出显存未释放的问题,可能需要手动清理缓存,或者检查是否有不必要的变量占用内存。另外,数据加载优化,比如使用更高效的数据加载器或减少数据预处理时的内存占用,可能也有帮助。 还有引用[4]提到的内存碎片问题,调整max_split_size_mb参数可能有效。用户需要设置环境变量PYTORCH_CUDA_ALLOC_CONF来优化内存分配。 步骤应该是先检查显存使用情况,然后尝试减小批量大小,接着确认模型精度设置是否正确,使用内存优化技术如梯度检查点,再考虑多卡或卸载到CPU,最后调整内存分配参数。同时,生成相关问题时要覆盖这些方面,比如如何检查显存、优化方法、多卡训练的影响等。</think>### 分步解决方案:解决PyTorch模型加载时的CUDA OutOfMemoryError错误 #### 1. **显存使用分析与基础优化** - **检查显存占用** 通过`nvidia-smi`或`torch.cuda.memory_summary()`查看显存分配情况,确认是否因模型/数据过大导致内存不足[^1][^4]。 - **减小批量大小(Batch Size)** 将`batch_size`缩小至显存可容纳范围,例如从32调整为16或8[^5]。 - **释放残留显存** 手动清理缓存:`torch.cuda.empty_cache()`,并检查代码中是否存在未释放的中间变量[^4]。 #### 2. **模型加载优化** - **显式指定数据类型** 加载模型时添加`torch_dtype=torch.bfloat16`参数(需硬件支持): ```python model = AutoModelForCausalLM.from_pretrained("OpenBMB/MiniCPM-V-2", torch_dtype=torch.bfloat16) ``` 确保与训练时使用的精度一致[^3]。 - **分阶段加载模型** 使用`device_map="auto"`将模型分块加载到多张GPU: ```python model = AutoModelForCausalLM.from_pretrained(..., device_map="auto") ``` 若需指定单卡,设置`CUDA_VISIBLE_DEVICES=0`[^3][^2]。 #### 3. **内存优化技术** - **梯度检查点(Gradient Checkpointing)** 通过时间换空间策略减少显存占用: ```python model.gradient_checkpointing_enable() ``` - **混合精度训练** 使用`torch.amp.autocast`自动管理精度(需CUDA计算能力>=7.0): ```python with torch.autocast(device_type='cuda', dtype=torch.bfloat16): outputs = model(inputs) ``` #### 4. **多卡与CPU卸载** - **多GPU并行** 使用`DataParallel`或`DistributedDataParallel`分散显存压力。 - **CPU卸载技术** 将部分模型参数暂时卸载到CPU内存: ```python model = AutoModelForCausalLM.from_pretrained(..., device_map="sequential", offload_folder="offload") ``` #### 5. **环境配置调优** - **调整内存分配策略** 设置环境变量避免显存碎片: ```bash export PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:128 ``` 或在代码中添加`max_split_size_mb`参数。 --- ###
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值