高效微调 fine tuning代码实战

参数高效微调、有监督微调(指令微调)、强化学习微调、上下文学习

BitFit

原理:选择模型的bias部分微调

1.在任务管理器中查看一开始加载模型的时候需要的显存,同时利用如下语句查看模型的参数量:

sum(param.numel() for param in model.parameters())#查看模型的参数数量

可以计算模型的需要的显存:

model size: 1.3B

model: 1.3G * 4 ~= 5.2G# float32占4个字节

gradient: 1.3G * 4 ~= 5.2G

optimizer: 1.3G * 4 * 2 ~= 10.4G# 优化器通常需要存储模型参数的当前值以及相应的梯度值

sum: 20.8G

2.确定Bitfit方法需要训练的参数

 bitfit
# 选择模型参数里面的所有bias部分
#将非bias设置成false
num_param = 0
for name, param in model.named_parameters():
    if "bias" not in name:
        param.requires_grad = False#不进行梯度更新
    else:
        num_param += param.numel()

num_param#表示可以进行参数更新的数量

关注修改后需要的显存、损失是否收敛、微调前后的推理输出结果的变化。 

Lora

1.微调

确定模型类型、确定微调模型哪里的参数、确定还想不以lora训练的参数位置。

查看模型可以调整的参数名称确定lora的target_modules,target_modules可以是一个列表

for name, parameter in model.named_parameters():
    print(name)

models_to_save:不以lora方式希望还训练的参数部分。 查看模型可训练的参数量:

model.print_trainable_parameters()
from peft import LoraConfig, TaskType, get_peft_model

config = LoraConfig(task_type=TaskType.CAUSAL_LM, target_modules=".*\.1.*query_key_value", modules_to_save=["word_embeddings"])#因果模型,在权重矩阵,保存模型的word_embeddings层
model = get_peft_model(model, config)

2.合并模型

(1)加载原始模型

(2)加载微调后的模型

p_model = PeftModel.from_pretrained(model, model_id="./chatbot/checkpoint-500/")#加载原始模型和训练好的权重
p_model

 (3)模型合并

merge_model = p_model.merge_and_unload()

(4)保存完整模型

merge_model.save_pretrained

Prompt Tuning

(1)Prompt配置

from peft import PromptTuningConfig, get_peft_model, TaskType, PromptTuningInit

# Soft Prompt
# config = PromptTuningConfig(task_type=TaskType.CAUSAL_LM, num_virtual_tokens=10)
# config
# Hard Prompt
config = PromptTuningConfig(task_type=TaskType.CAUSAL_LM,
                            prompt_tuning_init=PromptTuningInit.TEXT,
                            prompt_tuning_init_text="下面是一段人与机器人的对话。",
                            num_virtual_tokens=len(tokenizer("下面是一段人与机器人的对话。")["input_ids"]),
                            tokenizer_name_or_path="Langboat/bloom-1b4-zh")

(2)创建模型

model = get_peft_model(model, config)

soft prompt可学习的参数很少且参数随机初始化因此训练的次数需要很多。 

(3)加载训练好的PEFT模型

model = AutoModelForCausalLM.from_pretrained("Langboat/bloom-1b4-zh")
peft_model = PeftModel.from_pretrained(model=model, model_id="./chatbot/checkpoint-20/")

P-Tuning

from peft import PromptEncoderConfig, TaskType, get_peft_model, PromptEncoderReparameterizationType

config = PromptEncoderConfig(task_type=TaskType.CAUSAL_LM, num_virtual_tokens=10,
                             encoder_reparameterization_type=PromptEncoderReparameterizationType.MLP,
                             encoder_dropout=0.1, encoder_num_layers=5, encoder_hidden_size=1024)

Prefix-Tuning

from peft import PrefixTuningConfig, get_peft_model, TaskType

config = PrefixTuningConfig(task_type=TaskType.CAUSAL_LM, num_virtual_tokens=10, prefix_projection=True)

模型创建后查看多了哪一部分

model.prompt_encoder

如何为自定义的模型适配参数高效微调

一个主模型,多个适配器如何使用

如何获取原始模型的输出结果(禁用适配器)

参考说明

【手把手带你实战HuggingFace Transformers-高效微调篇】PEFT 进阶操作_哔哩哔哩_bilibili

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值