使用adapter微调模型的简单教程

news/2024/11/23 4:23:13/

https://github.com/OpenGVLab/LLaMA-Adapter/tree/main/llama_adapter_v2_multimodal
这个连接中有一个大模型微调的例子

个人认为adapter只有在backbone比较大,学习的比较好的情况下有用,不适合一般的任务。

———————尽管有代码,貌似没效果—————————
这个是adapter的代码块,可直接用

# 这个是adapter的代码块,可直接用
class Adapter(nn.Module):"""Conventional Adapter layer, in which the weights of up and down sampler modulesare parameters and are optimized."""def __init__(self, config):super().__init__()self.config = configself.input_dim = 768reduction_factor = 16self.down_sample_size = self.input_dim // reduction_factorself.down_sampler = nn.Linear(self.input_dim, self.down_sample_size)self.up_sampler = nn.Linear(self.down_sample_size, self.input_dim)self.gate = nn.Parameter(torch.zeros(1))def forward(self, x):z = self.down_sampler(x)z = gelu(z)z = self.up_sampler(z)output = z + xif self.gate is not None:output = self.gate * outputreturn output

我把它直接用在bert的输出层中,也可以用在其他地方


class BertOutput(nn.Module):def __init__(self, config):super(BertOutput, self).__init__()self.dense = nn.Linear(config.intermediate_size, config.hidden_size)self.LayerNorm = BertLayerNorm(config.hidden_size, eps=config.layer_norm_eps)self.dropout = nn.Dropout(config.hidden_dropout_prob)self.adapter = Adapter(config) # here !def forward(self, hidden_states, input_tensor):hidden_states = self.dense(hidden_states)hidden_states = self.adapter(hidden_states) # here !hidden_states = self.dropout(hidden_states)hidden_states = self.LayerNorm(hidden_states + input_tensor)return hidden_states

冻结参数

print('----------------------')
for n, p in self.global_encoder.named_parameters():p.requires_grad = False

解冻adapter模块

for name, sub_module in self.global_encoder.named_modules():# self.global_encoder 可以是模型也可以是某个模块# print(sub_module)if isinstance(sub_module,(Adapter)):print(f"{name} is trainable...")# if len(name.split(".")) < 7: # this will not consider layer norms inside adapters then.for param_name, param in sub_module.named_parameters():param.requires_grad = True

打印可训练的参数

    def print_trainable_params_percentage(self, model):orig_param_size = sum(p.numel() for p in model.parameters())def count_parameters(model):return sum(p.numel() for p in model.parameters() if p.requires_grad)trainable_size = count_parameters(model)percentage = trainable_size / orig_param_size * 100print(f"Trainable param percentage: {percentage:.2f}%")print(trainable_size)return percentage

http://www.ppmy.cn/news/823092.html

相关文章

PyTorch中,.contiguous()的作用

在PyTorch中&#xff0c;.contiguous()是一个用于确保张量存储连续性的方法。当对张量进行某些操作后&#xff0c;其内存布局可能会变得不连续&#xff0c;即不满足按行连续存储的要求。在这种情况下&#xff0c;可以使用.contiguous()方法来重新调整张量的内存布局&#xff0c…

Vue2和vue3中双向数据绑定的原理,ES6的Proxy对象代理和JavaScript的Object.defineProperty,使用详细

简介&#xff1a;Object.defineProperty大家都知道&#xff0c;是vue2中双向数据绑定的原理&#xff0c;它是 JavaScript 中一个强大且常用的方法&#xff0c;用于定义对象属性&#xff0c;允许我们精确地控制属性的行为&#xff0c;包括读取、写入和删除等操作&#xff1b; 而…

windows下iPad插上电脑iTunes没反应

判断是驱动没安装 首先打开设备管理器查看是否安装了苹果驱动 windowsr命令框输入 devmgmt.msc 查看有没有“苹果移动设备USB驱动”选项&#xff0c;如果没有就安装&#xff0c;有的话就自己百度去&#xff0c;绝对有教程了。 在这下载这个驱动并解压 链接: https://pan.b…

打印机经常没反应的一个解决办法

首先我使用的是网络打印机D-LINK DP-301U1 最近打印机总是无缘无故的不好用&#xff0c;常常是不能打印&#xff0c;重启OK&#xff0c;反复无常。检查了好几次都没有找到问题 今天偶尔看一下监控日志 2010-11-18 10:14:15 用户IP改变 MAC&#xff1a;00:22:B0:6A:47:AE 原IP&a…

自然语言处理从入门到应用——LangChain:代理(Agents)-[基础知识]

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 有些应用程序不仅需要预先确定的LLM或其他工具调用链&#xff0c;而且可能需要根据用户输入的不同而产生不同的链条。在这些类型的链条中&#xff0c;有一个“代理”可以访问一套工具。根据用户输入&#xff0c;代理可…

电脑连打印机不打印,是怎么回事?

打印机打印不出来的问题还是有很多原因的。 想知道是什么原因造成的&#xff0c;要一步一步查。 本文是uu诊所为大家带来的如何解决打印机正常但无法打印的教程。 (1)检查打印机的连接电缆是否插好&#xff0c;如打印机的电源线和数据线&#xff1b; (2)检查打印机是否已经打…

黑暗幽灵(DCM)木马详细分析

腾讯电脑管家 2016/04/13 9:14 0x00 背景 只要插上网线或连上WIFI&#xff0c;无需任何操作&#xff0c;不一会儿电脑就被木马感染了&#xff0c;这可能吗&#xff1f;近期&#xff0c;腾讯反病毒实验室拦截到一个“黑暗幽灵”木马的新变种&#xff0c;该木马功能强大&#xf…

0305kali linux配置运行-docker-macos aarm64

文章目录 1 下载运行2 配置2.1 配置系统环境2.2 配置SSH服务2.3 安装工具 3 问题总结结语 1 下载运行 拉取kali linux镜像 docker pull kalilinux/kali-rolling该镜像为“纯净版”系统&#xff0c;没有任何工具&#xff0c;体积小。下面当我们运行起来之后&#xff0c;到容器中…