1、环境简介
环境:
系统:Ubuntu
torch:2.2.1
python:3.10
gpu:V100 16g
peft:0.9.0
使用PEFT中的lora方式微调llama-2-7b-hf,项目地址:alpaca-lora
2、混合精度训练Tensor相互计算会报错
报错内容:
解决方法:
修改 finetune.py 内容
# 修改前 trainer.train(resume_from_checkpoint=resume_from_checkpoint) # 修改后 with torch.autocast("cuda"): # 加上这行代码,精度自动转换 trainer.train(resume_from_checkpoint=resume_from_checkpoint)
3、推理加载lora报错:SafetensorError: Error while deserializing header: InvalidHeaderDeserialization
- peft(版本0.9.0) save_pretrained() 仅保存lora权重(不保存原模型权重)
- huggingface博客:peft使用
- huggingface文档:peft参数
推理时,加载lora权重时报错,报错内容为:
SafetensorError: Error while deserializing header: InvalidHeaderDeserialization
删除 finetune.py 中部分代码内容
# 删除原因:该代码是为了将原模型的state_dict替换成仅仅包含lora的权重,新版本peft会自动仅保存lora权重,不会保存原本模型的权重 old_state_dict = model.state_dict model.state_dict = ( lambda self, *_, **__: get_peft_model_state_dict( self, old_state_dict() ) ).__get__(model, type(model)) # 删除原因:torch.compile 与 peft(0.9.0版本)目前似乎不兼容,开启此代码会导致lora权重文件保存的是空字典,推理时加载lora权重会报错 if torch.__version__ >= "2" and sys.platform != "win32": model = torch.compile(model)
4、peft(版本0.9.0) save_pretrained 不保存 adapter_model.bin
lora权重保存结果:
修改 finetune.py 内容,加入参数, safe_serialization=False
# 修改前 model.save_pretrained("保存目录") # 修改后 model.save_pretrained("保存目录",safe_serialization=False)