adapter-transformers的用法

文章介绍了如何在Python环境中安装和使用adapter-transformers库,特别是如何在已有代码中添加adapter。通过调用`add_adapter`和`train_adapter`方法,可以在预训练模型上激活和训练新的adapter,而无需手动管理参数冻结。
摘要由CSDN通过智能技术生成

安装环境

首先,还是需要先安装,目前只支持python3.8及以上和pytorch1.12.1及以上的编译环境。

亲测,python3.7确实会导致环境不兼容用不了。还是按照官方文档来吧。以下是官方的安装方法:

pip install -U adapter-transformers

或者获取源码安装:

git clone https://github.com/adapter-hub/adapter-transformers.git
cd adapter-transformers
pip install .

使用教程

官方也有给怎么使用提供的adapter的教程,但是如果想要嵌入自己的代码中还是会有些迷糊。

官方教程

下面给大家说一下自己要用的话怎么去加入自己的代码中,其实很简单,代码不需要做太多修改。

比如我原来的代码是这样的,其他的就省略了:

    encoder = AutoModel.from_pretrained(args.bert_name)
 
    classify = Classify(args.hidden_size, 1)

    encoder_optimizer = AdamW(params=encoder.parameters(),
                    lr = args.learning_rate_bert, # args.learning_rate - default is 5e-5
                    eps = 1e-8, # args.adam_epsilon  - default is 1e-8.
                    correct_bias = False
                    )

 只需要加两行就搞定了,rotten_tomatoes是adapter的名字,也可以换成其他的。

    encoder = AutoModel.from_pretrained(args.bert_name)
    
    # Add a new adapter
    encoder.add_adapter("rotten_tomatoes")

    # Activate the adapter
    encoder.train_adapter("rotten_tomatoes")

    classify = Classify(args.hidden_size, 1)

    encoder_optimizer = AdamW(params=encoder.parameters(),
                    lr = args.learning_rate_bert, # args.learning_rate - default is 5e-5
                    eps = 1e-8, # args.adam_epsilon  - default is 1e-8.
                    correct_bias = False
                    )

 有一些小伙伴可能会疑惑,那训练参数可以直接放进去整一个吗?

答案是可以的,因为用adapter的时候就已经将其他参数冻结了。

看源码,调用train_adapter()的时候会调用freeze_model(),这一步将所有的参数的requires_grad 都设置为False了。

然后后面又会把adapter部分的解冻,param.requires_grad = True。因此,使用的时候可以放心直接用就好了,不用考虑自己去冻结参数。

    def freeze_model(self, freeze=True):
        """Freezes all weights of the model."""
        # first freeze/ unfreeze all model weights
        for param in self.base_model.parameters():
            param.requires_grad = not freeze
        self.model_frozen = freeze

    def train_adapter(self, adapter_setup: Union[list, AdapterCompositionBlock], train_embeddings=False):
        """Sets the model into mode for training the given adapters."""
        self.train()
        self.freeze_model(True)
        adapter_setup = parse_composition(adapter_setup)
        self.apply_to_adapter_layers(lambda i, layer: layer.enable_adapters(adapter_setup, True, False))
        for adapter_name in adapter_setup:
            if adapter_name in self.base_model.shared_parameters:
                for param in self.base_model.shared_parameters[adapter_name].values():
                    param.requires_grad = True

        if isinstance(self, InvertibleAdaptersMixin) or isinstance(self, InvertibleAdaptersWrapperMixin):
            self.enable_invertible_adapters(adapter_setup.flatten())
        # use the adapters to be trained by default in every forward pass
        self.set_active_adapters(adapter_setup)
        if train_embeddings:
            self.get_input_embeddings().train()

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值