[CLIP-VIT-L + Qwen] 多模态大模型源码阅读 - MultiModal篇

在这里插入图片描述
参考repo:WatchTower-Liu/VLM-learning; url: VLLM-BASE

前情提要

有关多模态大模型架构中的语言模型部分(MQwen.py)的代码请看(多模态大模型源码阅读 - 1多模态大模型源码阅读 - 2多模态大模型源码阅读 - 3多模态大模型源码阅读 - 4),多模态大模型架构中的视觉模型(visual/CLIP-VIT.py)部分请看多模态大模型源码阅读 - 5,多模态大模型架构中的trainer(trainer.py)部分请看多模态大模型源码阅读 - 6
本节将讲解如何将之前重构的MQwen语言模型部分和CLIP-VIT视觉模型部分整合为MultiModal多模态模型类,并利用多模态模型类进行前向传播,生成预测内容。

源码阅读

导包

import torch 
from torch import nn
from typing import Optional
import os
import sys
sys.path.append("../")
from transformers.modeling_outputs import CausalLMOutputWithPast
from dataclasses import dataclass, asdict
from peft import get_peft_model, LoraConfig, TaskType, PeftModel
from visual.CLIP_VIT import visualModel
from qwen.Mqwen import MQWenLMHeadModel

逐行讲解

对于部分已经用了无数次的模块就不再赘述了~

from typing import Optional

typing模块最重要的就是类型注释功能,这里导入的Optional表示变量可以是制定的类型或者None。例如Optional[str]表示变量可以是str类型或者None。

import sys
sys.path.append("../")

将上一层级目录添加到系统路径中,可以将上一层级的模块直接通过模块名导入。例如上一层级目录中定义了一个叫做abc.py的模块,那么就可以通过import abc直接导入。

from transformers.modeling_outputs import CausalLMOutputWithPast
from dataclasses import dataclass, asdict

CausalLMOutputWithPast专门用于封装因果模型的输出,包含了模型输出和过去的隐藏状态。
dataclass装饰器用于封装数据类型,asdict可以将数据类实例转换为字典。

from peft import get_peft_model, LoraConfig, TaskType, PeftModel

peft用于模型微调,get_peft_model方法获取LoRA,prefix tuning等不同类别的微调模型,LoRA包含了LoRA模型的必要配置参数,TaskType定义模型执行的不同任务类型,如文本分类、摘要总结等。PeftModel是一个基类,指定PEFT的配置。

dataclass部分

@dataclass
class LanguageConfig():
    model_path: str
    torch_dtype: torch.dtype = torch.bfloat16
    trust_remote_code: bool = True

@dataclass
class VisualConfig():
    model_path: str
    pretrained: bool = True
    

@dataclass
class MultiModalConfig():
    replace_token_id: int
    # image_context_length: int = 256
    image_context_length: int = 728
    image_feature_hidden_size: int = 4096

整体含义

用于封装不同配置下的参数类型和初始值。

逐行解读

@dataclass
class LanguageConfig():
    model_path: str
    torch_dtype: torch.dtype = torch.bfloat16
    trust_remote_code: bool = True

LanguageConfig类用于存储和管理语言模型的参数和配置。
model_path代表模型的存储地址,通常为字符串类型,无初始值,需要用户手动传入。
torch_type代表模型使用的数据类型,这里使用半精度浮点数bfloat16
trust_remote_code默认为True,当我们要远程从huggingface加载预训练模型时,通常需要保持这个值为True,因为我们运行的不是本地代码,本地下载模型的可以无视。

@dataclass
class VisualConfig():
    model_path: str
    pretrained: bool = True

VisualConfig代表视觉模型的参数和配置类,model_path与上文相同。
pretrained代表是否加载预训练模型的权重。

@dataclass
class MultiModalConfig():
    replace_token_id: int
    # image_context_length: int = 256
    image_context_length: int = 728
    image_feature_hidden_size: int = 4096

MultiModalConfig代表多模态模型的参数和配置类。
replace_token_id指定input_ids中用于替换的token_id,例如输入为[102,103,101]的数据,指定101为replace_token_id,则将101替换为图片特征数据。
image_context_length代表图像上下文长度。
image_feature_hidden_size指定图像特征隐藏层维度大小。

模型微调

def make_lora(model, finetune_args):
    peft_config = LoraConfig(
            task_type=TaskType.CAUSAL_LM,
            inference_mode=False,
            r=finetune_args.lora_rank,
            lora_alpha=32,
            lora_dropout=finetune_args.lora_dropout,
            target_modules = finetune_args.target_modules.split('|') # 把model打印出来,找跟attention相关的模块
        
### 多模态大模型中的 LoRA 应用与实现方法 在多模态大模型Multimodal Large Language Models, MLLMs)中,LoRA(Low-Rank Adaptation)已经成为一种高效的微调方法,尤其在计算资源受限的场景下表现突出。LoRA 的核心思想是通过引入低秩矩阵来调整预训练模型的参数,而不是直接更新全部参数,从而显著降低计算和存储需求。 #### LoRA 在多模态大模型中的应用 在多模态场景中,模型通常包含多个模态(如文本、图像、音频等)的处理模块。例如,BLIP-2 模型利用预训练的视觉模型和语言模型,并通过一个可学习的 Q-Former 模块来连接它们。在这种情况下,LoRA 可以应用于语言模型部分,以微调其参数,同时保持视觉模型的参数固定[^3]。这种策略不仅降低了训练成本,还能保持模型的高性能。 #### LoRA 的实现方法 在实现 LoRA 时,通常需要使用特定的配置来定义低秩矩阵的参数。以下是一个典型的 LoRA 配置代码示例: ```python from peft import LoraConfig, get_peft_model # 定义 LoraConfig config = LoraConfig( r=16, # 低秩矩阵的秩 lora_alpha=32, # 缩放因子 lora_dropout=0.05, # Dropout 概率 bias="none" # 是否调整偏置项 ) # 使用 get_peft_model 方法包装基础模型 model = get_peft_model(model, config) model.print_trainable_parameters() ``` 通过这种方式,LoRA 能够将模型的可训练参数数量显著减少,从而提高训练效率。例如,在 Qwen-VL 模型中,LoRA 被用于微调多模态大模型,同时通过设置 `--fix_vit` 参数保持视觉模型的参数固定。以下是 Qwen-VL 的微调命令示例: ```bash #!/bin/bash export CUDA_DEVICE_MAX_CONNECTIONS=1 DIR=`pwd` MODEL="/root/autodl-tmp/Qwen-VL-Chat" DATA="/root/autodl-tmp/data.json" export CUDA_VISIBLE_DEVICES=0 python3 finetune.py \ --model_name_or_path $MODEL \ --data_path $DATA \ --bf16 True \ --fix_vit True \ --output_dir output_qwen \ --num_train_epochs 5 \ --per_device_train_batch_size 1 \ --per_device_eval_batch_size 1 \ --gradient_accumulation_steps 8 \ --evaluation_strategy "no" \ --save_strategy "steps" \ --save_steps 1000 \ --save_total_limit 10 \ --learning_rate 1e-5 \ --weight_decay 0.1 \ --adam_beta2 0.95 \ --warmup_ratio 0.01 \ --lr_scheduler_type "cosine" \ --logging_steps 1 \ --report_to "none" \ --model_max_length 600 \ --lazy_preprocess True \ --gradient_checkpointing \ --use_lora ``` #### LoRA 的优势 LoRA 的优势在于其高效性,特别是在多模态大模型中。通过仅微调低秩矩阵,LoRA 能够显著减少计算资源的消耗,同时保持模型性能的稳定性。这种方法在资源受限的环境中尤为有用,例如在边缘设备或小型实验室中[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值