CLIP-VIT-L + Qwen 多模态源码阅读 - 语言模型篇(3)

多模态学习笔记 - 语言模型篇(3)

参考repo:WatchTower-Liu/VLM-learning; url: VLLM-BASE

吐槽

今天接着昨天的源码继续看,黑神话:悟空正好今天发售,希望广大coder能玩的开心~

学习心得

前情提要

详情请看多模态源码阅读 - 2
上次我们讲到利用view()函数对token_type_ids、position_ids进行重新塑形,确保这些张量的最后一个维度和input_shape(输入序列数据)的最后一个维度相等。重构的代码中默认启用缓存键值对(显然use_cache的bool值有点可有可无了QAQ),如果past_key_values的值为空,代表处于推理或者训练的第一步,此时我们初始化past_length为0,初始化past_key_values为长度为Qwen模型层数量的元组,self.h是Qwen模型的成员变量,我们无需太过关心(因为我们只是继承Qwen模型的成员变量,并重构了forward方法)。
如果我们当前不处于训练或推理的第一步,past_key_values显然就不为空(因为我们默认启用缓存键值对,ps:科研级代码是这样的),不管缓存量化(use_cache_quantization)启用与否,我们将past_length更新为第一个注意力头键张量的第二个或倒数第二个维度。这里唯一的区别只是元组的维数和维度不太一样。
如果position_ids为None,我们需要初始化一个position_ids,起始位置为past_length,终止位置为psst_lenght + input_shape[=1],确保我们的position_ids长度与input_shape的最后一个维度相等,随后重新塑形,同样是为了确保position_ids为二维张量,且最后一个维度与input_shape对齐,代码如下:

        if token_type_ids is not None:
            token_type_ids = token_type_ids.view(-1, input_shape[-1])
        if position_ids is not None:
            position_ids = position_ids.view(-1, input_shape[-1])

        if past_key_values is None:
            past_length = 0
            past_key_values = tuple([None] * len(self.h))
        else:
            if self.use_cache_quantization:
                past_length = past_key_values[0][0][0].size(2)
            else:
                past_length = past_key_values[0][0].size(-2)
        if position_ids is None:
            position_ids = torch.arange(
                past_length,
                input_shape[-1] + past_length,
                dtype=torch.long,
                device=device,
            )
            position_ids = position_ids.unsqueeze(0).view(-1, input_shape[-1])

新的记忆

代码块1

接着上面的代码,继续看MQwen.py中MQwenModel中重构的forward方法,代码如下:

		if attention_mask is not None:
            # image_feaute_length = self.otherConfig["image_context_length"]*self.otherConfig["image_feature_hidden_size"]
            # attention_mask_length = attention_mask.shape[-1] - image_feaute_length + self.otherConfig["image_context_length"]
            # attention_mask = torch.ones((batch_size, attention_mask_length), dtype=torch.long, device=device)
            if batch_size <= 0:
                raise ValueError("batch_size has to be defined and > 0")
            attention_mask = attention_mask.view(batch_size, -1)
            attention_mask = attention_mask[:, None, None, :]
            attention_mask = attention_mask.to(dtype=self.dtype)
            attention_mask 
### Qwen2.5_VL 源码解读与分析 #### 一、简介 Qwen2.5_VL 是一个多模态大模型,能够处理文本和图像等多种形式的数据。该模型基于Transformer架构进行了改进,在视觉-语言理解方面表现出色[^1]。 #### 二、整体框架结构 此部分主要介绍Qwen2.5_VL的整体设计思路以及各个模块之间的关系。通常来说,这类多模态预训练模型会包含以下几个核心组件: - **编码器(Encoder)**: 负责将输入数据转换成固定长度的向量表示; - **解码器(Decoder)**: 接收来自编码器的信息并生成最终输出序列; - **跨模态交互机制**: 实现不同感官信息间的有效融合; 对于具体实现细节,则可以参照相似项目如MiniCPM-Llama3-V中的描述。 #### 三、关键技术点剖析 ##### 1. 输入处理阶段 在接收外部传入的内容之前,程序会对原始素材做初步加工以便后续操作更加高效便捷。这其中包括但不限于对图片执行动态裁剪以适应特定尺寸要求、利用ViT(视觉变换网络)抽取图形特征等步骤[^2]。 ```python from transformers import AutoFeatureExtractor, CLIPModel def extract_image_features(image_path): feature_extractor = AutoFeatureExtractor.from_pretrained(&#39;openai/clip-vit-base-patch32&#39;) model = CLIPModel.from_pretrained(&#39;openai/clip-vit-base-patch32&#39;) inputs = feature_extractor(images=image_path, return_tensors="pt") outputs = model.get_image_features(**inputs) return outputs.detach().numpy() ``` ##### 2. 数据表示方式 为了使计算机更好地理解和表达人类感知到的世界,研究者们提出了多种方法来构建统一而丰富的语义空间。在这个过程中,如何合理地定义对象间的关系成为了关键所在。例如通过引入注意力机制让机器学会关注重要部位从而提高识别精度。 ##### 3. 多任务联合训练策略 为了让单一模型具备更广泛的应用场景,开发者往往会采用多任务学习的方式对其进行优化。即在一个神经网络内部同时完成多项子任务的学习过程,以此达到参数共享的目的进而提升泛化能力。这种方式不仅有助于减少过拟合现象的发生概率,还能够在一定程度上缓解资源消耗问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值