如何在Hugging Face Transformers中合并微调Adapter与预训练模型并推送至Hub
解决方案:Llama-2微调后模型合并与分别推送指南
目标1:合并预训练模型与Adapter并推送至Hugging Face Hub
要将预训练模型与Adapter权重合并为完整模型文件并推送,核心是通过merge_and_unload()方法把Adapter权重整合到主模型中,具体操作如下:
加载完整精度的预训练模型与Adapter
注意:合并操作不能用8bit加载模型,必须加载完整精度版本:import torch from transformers import LlamaForCausalLM, LlamaTokenizer model_id = "./models_hf/7B" adapter_id = "./tmp/llama-output" tokenizer = LlamaTokenizer.from_pretrained(model_id) model = LlamaForCausalLM.from_pretrained( model_id, load_in_8bit=False, device_map='auto', torch_dtype=torch.float16 ) # 加载Adapter权重 model.load_adapter(adapter_id)合并权重并保存/推送
调用merge_and_unload()完成权重整合,之后可选择本地备份或推送至Hub:# 合并Adapter与主模型权重 model = model.merge_and_unload() # 可选:保存合并后的模型到本地 model.save_pretrained("./merged-llama-2-7B") tokenizer.save_pretrained("./merged-llama-2-7B") # 推送至Hugging Face Hub model.push_to_hub("myrepo/llama-2-7B-ft-summarization") tokenizer.push_to_hub("myrepo/llama-2-7B-ft-summarization")合并后的模型结构与原始预训练模型一致,推送后可像普通大模型直接加载使用。
目标2:分别推送预训练模型与Adapter,并组合加载推理
步骤1:分别推送至Hub
推送预训练模型
直接将本地预训练模型推送到你的Hub仓库:
from transformers import LlamaForCausalLM, LlamaTokenizer model_id = "./models_hf/7B" hub_base_repo = "myrepo/llama-2-7B-base" tokenizer = LlamaTokenizer.from_pretrained(model_id) model = LlamaForCausalLM.from_pretrained(model_id) tokenizer.push_to_hub(hub_base_repo) model.push_to_hub(hub_base_repo)
推送Adapter权重
借助PEFT库将Adapter推送到独立的Hub仓库:
from peft import PeftModel from transformers import LlamaForCausalLM model_id = "./models_hf/7B" adapter_id = "./tmp/llama-output" hub_adapter_repo = "myrepo/llama-2-7B-summarization-adapter" # 加载预训练模型与Adapter base_model = LlamaForCausalLM.from_pretrained(model_id) peft_model = PeftModel.from_pretrained(base_model, adapter_id) # 推送Adapter到Hub peft_model.push_to_hub(hub_adapter_repo)
步骤2:从Hub组合加载并推理
用Hub仓库地址替换本地路径,即可实现和本地一致的组合加载:
import torch from transformers import LlamaForCausalLM, LlamaTokenizer from peft import PeftModel # Hub仓库地址 model_id = "myrepo/llama-2-7B-base" adapter_id = "myrepo/llama-2-7B-summarization-adapter" # 加载预训练模型与tokenizer tokenizer = LlamaTokenizer.from_pretrained(model_id) model = LlamaForCausalLM.from_pretrained( model_id, load_in_8bit=True, device_map='auto', torch_dtype=torch.float16 ) # 加载Adapter model = PeftModel.from_pretrained(model, adapter_id) # 推理示例 inputs = tokenizer("请输入你的测试文本", return_tensors="pt").to("cuda") outputs = model.generate(**inputs, max_new_tokens=150) print(tokenizer.decode(outputs[0], skip_special_tokens=True))
内容的提问来源于stack exchange,提问作者Aun Zaidi
相关产品推荐
相关产品推荐

