参数高效微调、有监督微调(指令微调)、强化学习微调、上下文学习
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