第四节 查看bin权重文件内容

第四节 查看bin权重文件内容

文章目录


前言

为什么我单独用一节文章记录llava相关bin权重文件内容?原因很简单,它比较重要,我们可以通过查看权重相关变量间接感性认识llava模型结构,以便我们对模型权重含义理解。本篇文章将涉及lora权重与大语言LLM模型llama的权重,以及相应mm_project与vit图像编码权重。这样我们将从权重文件理解llava本身结构,并也给出自带lora训练权重相关内容,将对我们训练模型保存对应权重也是十分必要的,且也能帮助我们如何把lora权重更新原始权重。


一、权重bin文件读取方法

在查找了一些方法后,发现保存bin文件是使用torch完成,自然torch也可以直接读取bin文件,直接torch.load即可实现,代码如下:

res = torch.load("/home/LLaVA/llava_v1.5_lora/llava-v1.5-7b/mm_projector.bin", map_location=torch.device("cpu")) 

二、查看llava-v1.5-7b与llava-v1.5-13b文件权重

在知道权重查看方法后,我们将开始解读权重文件。首先,我将给出可以直接预测模型2个权重文件,这些文件可以直接在huggingface中下载得到,其链接如下。
https://huggingface.co/liuhaotian/llava-v1.5-7b
https://huggingface.co/liuhaotian/llava-v1.5-13b

1、llava-v1.5-7b

a、查看pytorch_model-*.bin权重

下图左边是pytorch_model-00001-of-00002.bin权重,右边是pytorch_model-00002-of-00002.bin权重,中间省略了,如下:

www.zeeklog.com - 第四节 查看bin权重文件内容


实际上面文件你可以发现,该文件实际就是大语言模型的权重,并没有视觉vit编码权重。

b、查看mm_projector.bin权重

我们可以发现该文件内容就是几层简单线性方法,这就是mm_projector的映射头。同时,我们也可发现该文件也是后续的non_lora_trainables.bin文件。

www.zeeklog.com - 第四节 查看bin权重文件内容

当然,为更好说明该文件内容,我们对比a中大语言模型最后几层内容与该文件内容是一致的。从下图可看出,该权重是上面最后一个权重有同样变量与名称的值,实际该文件权重也是lora训练需要保存的值。我将在后面内容讲解中说明。具体关系如下图显示。

www.zeeklog.com - 第四节 查看bin权重文件内容

2、llava-v1.5-13b

a、查看pytorch_model-*.bin权重

下图左边是pytorch_model-00001-of-00002.bin权重,右边是pytorch_model-00002-of-00002.bin权重,中间省略了,如下:

www.zeeklog.com - 第四节 查看bin权重文件内容

实际上面文件你可以发现,该文件实际就是大语言模型的权重,并没有视觉vit编码权重。

b、mm_projector.bin内容解释

该内容与上面7b一样,从下图可看出,该权重是上面最后一个权重有同样变量与名称的值,实际该文件权重也是lora训练需要保存的值。我将在后面内容讲解中说明。具体关系如下图显示。

www.zeeklog.com - 第四节 查看bin权重文件内容

3、llava-v1.5-13b与llava-v1.5-7b对比

主要有以下几个点需要说明:
①、13b就是比7b多了几层,多了几个循环而已;
②、mm_projector.bin都是其一部分内容;
③、13b与7b最后输出分别为(32000,5120)与(32000,4096),其中32000表示llama的tokernizer词汇数。

4、vit视觉编码权重

当然,你疑问上面既然只有语言模型和projector,那图像编码权重在哪呢?显然,7b与13b文件夹中的config.json文件中提供了vit编码权重路径,图像编码会根据路径去加载(如下图),我将在这里不在介绍,后期会解释。

www.zeeklog.com - 第四节 查看bin权重文件内容

三、查看llava-v1.5-13b-lora与llava-v1.5-7b-lora文件权重

可以直接使用权重文件内容我们看了,但大模型不是使用lora训练的嘛,我们如何加载lora权重呢?接下来,我们将介绍具有lora权重文件内容。这2个文件夹权重基本原理类似,我以13b作为介绍,该内容是lora训练,就是–model-path与–model-base结合可以推理,也是后期llava的lora训练会得到的权重文件。

1、adapter_model.bin文件解读

adapter_model.bin文件实际就是保存lora权重的矩阵,而且是大语言模型的权浏览重。我查看模型lora训练基本是冻结图像编码模块,而llama2的权重也是冻结的,但是使用lora微调,则lora权重是会更新的,我给出该权重的头部与尾部内容,如下图:

www.zeeklog.com - 第四节 查看bin权重文件内容


从上图可发现,lora训练刚好都是lora_A与lora_B矩阵,这样刚好实现参数更新,其方法如下图显示。


当然,你也发现了刚好没有第一个model.embed_tokens.weight参数与mm_projector.bin权重,实际是没进行lora训练而是完全微调方式,我想这样就可以添加新增token训练了,且参数也少。

2、non_lora_trainables.bin文件解读

不想说了,实际该文件夹就是mm_projector.bin这个文件夹,是一个不进行微调的文件夹。

www.zeeklog.com - 第四节 查看bin权重文件内容

3、lora权重变成模型权重

浮出水面了,我们利用w=w+(lora_A*lora_B)*scaling,就可以实现lora微调方式了,而non_lora_trainables.bin对应的权重文件直接替换原有模型对应参数即可。

四、查看llava-v1-0719-336px-lora-vicuna-13b-v1.3文件权重

在上面,我们基本查看了llava可直接推理与使用lora推理权重文件,但我也想介绍一个依然使用lora推理的权重文件内容。这个和之前的lora权重文件类似,我将不在过多介绍,只是给读者呈现显示。

1、adapter_model.bin文件解读

我给出该权重的头部与尾部内容,如下图:

www.zeeklog.com - 第四节 查看bin权重文件内容


这个和之前说的是一样的。

2、non_lora_trainables.bin文件解读

不想说了,实际该文件夹就是mm_projector.bin这个文件夹,是一个不进行微调的文件夹。但是这个至于一层而已,只是参数问题,不必惊讶。

www.zeeklog.com - 第四节 查看bin权重文件内容

五、llama的vicuna-13b-v1.5权重文件解读

这个文件是大语言模型文件,该文件是要与lora文件内容共同使用,但以上lora训练的adapter_model.bin文件的lora与本文件llama很相似,实际就是语言llama的lora权重矩阵,这样我们就明白为何该文件需要和lora文件共同使用了。该文件权重内容如下:

www.zeeklog.com - 第四节 查看bin权重文件内容


同样需要管制下lm_head权重,我的理解应该是预测头权重。

六、lora训练权重文件

上面所有内容都是llava模型自带内容,但我们自己使用lora训练llava模型会保存哪些文件呢?实际答案很明显,一个语言模型的lora权重文件和一个无需lora训练全微调的projector文件,我将在下面说明。

1、保存权重代码修改

为了保存必要的权重文件,我修改了llava的权重文件,该代码内容在LLaVATrainer.py文件中,其修改内容如下:

 def _save_checkpoint(self, model, trial, metrics=None): if getattr(self.args, 'tune_mm_mlp_adapter', False): from transformers.trainer_utils import PREFIX_CHECKPOINT_DIR checkpoint_folder = f"{PREFIX_CHECKPOINT_DIR}-{self.state.global_step}" run_dir = self._get_output_dir(trial=trial) output_dir = os.path.join(run_dir, checkpoint_folder) # Only save Adapter keys_to_match = ['mm_projector', 'vision_resampler'] if getattr(self.args, "use_im_start_end", False): keys_to_match.extend(['embed_tokens', 'embed_in']) weight_to_save = get_mm_adapter_state_maybe_zero_3(self.model.named_parameters(), keys_to_match) self.model.config.save_pretrained(output_dir) torch.save(weight_to_save, os.path.join(output_dir, f'non_lora_trainables.bin')) #实际也是'mm_projector.bin' from llava.train.train import get_peft_state_maybe_zero_3 adapter_model_dict = get_peft_state_maybe_zero_3(model.named_parameters(),"none" ) # 获得adapter_model.bin文件 adapter_model_dict_all = get_mm_adapter_state_maybe_zero_3(model.named_parameters(),"none" ) torch.save(adapter_model_dict, os.path.join(output_dir, f'adapter_model.bin')) torch.save(adapter_model_dict_all, os.path.join(output_dir, f'adapter_model_all.bin')) else: super(LLaVATrainer, self)._save_checkpoint(model, trial, metrics) 

2、lora训练权重文件

直接说重点,我修改后保存了三个权重文件,adapter_model.bin与non_lora_trainables.bin文件内容如下:

www.zeeklog.com - 第四节 查看bin权重文件内容

adapter_model_all.bin文件头部与尾部内容(这个文件可以不需要):
头部:

www.zeeklog.com - 第四节 查看bin权重文件内容


尾部:

www.zeeklog.com - 第四节 查看bin权重文件内容

3、内容解读

adapter_model_all.bin保存为lora文件内容,是视觉内容与mlp映射的lora内容,而adapter_model.bin保存是映射层内容,是包含在adapter_model_all.bin文件中(下图已证明),non_lora_trainables.bin是语言模型权重内容,和上面lora说的non_lora_trainables.bin一致。

www.zeeklog.com - 第四节 查看bin权重文件内容

注:我们lora训练保存后的的模型是多了 module. 字符,这个需要注意!

总结

从权重中,你该明白了吧!

Read more

最新电子电气架构(EEA)调研-3

而新一代的强实时性、高确定性,以及满足CAP定理的同步分布式协同技术(SDCT),可以实现替代TSN、DDS的应用,且此技术已经在无人车辆得到验证,同时其低成本学习曲线、无复杂二次开发工作,将开发人员的劳动强度、学习曲线极大降低,使开发人员更多的去完成算法、执行器功能完善。 五、各大车厂的EEA 我们调研策略是从公开信息中获得各大车厂的EEA信息,并在如下中进行展示。 我们集中了华为、特斯拉、大众、蔚来、小鹏、理想、东风(岚图)等有代表领先性的车辆电子电气架构厂商。        1、华为 图12 华为的CCA电子电气架构              (1)华为“计算+通信”CC架构的三个平台                         1)MDC智能驾驶平台;                         2)CDC智能座舱平台                         3)VDC整车控制平台。        联接指的是华为智能网联解决方案,解决车内、车外网络高速连接问题,云服务则是基于云计算提供的服务,如在线车主服务、娱乐和OTA等。 华

By Ne0inhk
Apache IoTDB 架构特性与 Prometheus+Grafana 监控体系部署实践

Apache IoTDB 架构特性与 Prometheus+Grafana 监控体系部署实践

Apache IoTDB 架构特性与 Prometheus+Grafana 监控体系部署实践 文章目录 * Apache IoTDB 架构特性与 Prometheus+Grafana 监控体系部署实践 * Apache IoTDB 核心特性与价值 * Apache IoTDB 监控面板完整部署方案 * 安装步骤 * 步骤一:IoTDB开启监控指标采集 * 步骤二:安装、配置Prometheus * 步骤三:安装grafana并配置数据源 * 步骤四:导入IoTDB Grafana看板 * TimechoDB(基于 Apache IoTDB)增强特性 * 总结与应用场景建议 Apache IoTDB 核心特性与价值 Apache IoTDB 专为物联网场景打造的高性能轻量级时序数据库,以 “设备 - 测点” 原生数据模型贴合物理设备与传感器关系,通过高压缩算法、百万级并发写入能力和毫秒级查询响应优化海量时序数据存储成本与处理效率,同时支持边缘轻量部署、

By Ne0inhk
SQL Server 2019安装教程(超详细图文)

SQL Server 2019安装教程(超详细图文)

SQL Server 介绍) SQL Server 是由 微软(Microsoft) 开发的一款 关系型数据库管理系统(RDBMS),支持结构化查询语言(SQL)进行数据存储、管理和分析。自1989年首次发布以来,SQL Server 已成为企业级数据管理的核心解决方案,广泛应用于金融、电商、ERP、CRM 等业务系统。它提供高可用性、安全性、事务处理(ACID)和商业智能(BI)支持,并支持 Windows 和 Linux 跨平台部署。 一、获取 SQL Server 2019 安装包 1. 官方下载方式 前往微软官网注册账号后,即可下载 SQL Server Developer 版本(

By Ne0inhk