如何用Huggingface加载基于Llama的PEFT/LoRa微调模型?加载报错求助
问题描述
本地加载微调模型失败
执行代码:
model = AutoModelForCausalLM.from_pretrained("finetuned_model")
返回 Killed。
从Hub加载模型报错
执行以下代码:
import torch from peft import PeftModel, PeftConfig from transformers import AutoModelForCausalLM, AutoTokenizer peft_model_id = "lucas0/empath-llama-7b" config = PeftConfig.from_pretrained(peft_model_id) model = AutoModelForCausalLM.from_pretrained(config.base_model_name_or_path, return_dict=True, load_in_8bit=True, device_map='auto') tokenizer = AutoTokenizer.from_pretrained(cwd+"/tokenizer.model") # Load the Lora model model = PeftModel.from_pretrained(model, peft_model_id)
返回错误:
AttributeError: /home/ubuntu/empath/lora/venv/lib/python3.10/site-packages/bitsandbytes/libbitsandbytes_cpu.so: undefined symbol: cget_col_row_stats
模型微调背景
使用PEFT和LoRa微调decapoda-research/llama-7b-hf模型,核心流程代码如下:
模型初始化
model = AutoModelForCausalLM.from_pretrained( "decapoda-research/llama-7b-hf", torch_dtype=torch.float16, device_map='auto', )
Tokenizer设置
tokenizer = LlamaTokenizer(cwd+"/tokenizer.model") tokenizer.pad_token = tokenizer.eos_token
LoRa配置与训练
from peft import LoraConfig, get_peft_model config = LoraConfig( r=8, lora_alpha=16, target_modules=["q_proj", "k_proj", "v_proj", "o_proj"], lora_dropout=0.05, bias="none", task_type="CAUSAL_LM" ) model = get_peft_model(model, config) data = pd.read_csv("my_csv.csv") dataset = Dataset.from_pandas(data) tokenized_dataset = dataset.map(lambda samples: tokenizer(samples["text"])) trainer = transformers.Trainer( model=model, train_dataset=tokenized_dataset, args=transformers.TrainingArguments( per_device_train_batch_size=4, gradient_accumulation_steps=4, warmup_steps=100, max_steps=100, learning_rate=1e-3, fp16=True, logging_steps=1, output_dir='outputs', ), data_collator=transformers.DataCollatorForLanguageModeling(tokenizer, mlm=False) ) model.config.use_cache = True # silence the warnings. Please re-enable for inference! trainer.train()
模型保存与推送
# 本地保存 trainer.save_model(cwd+"/finetuned_model") print("saved trainer locally") # 推送到Hub model.push_to_hub("lucas0/empath-llama-7b", create_pr=1)
解决方案
一、本地加载Killed问题
Killed是内存/显存不足导致的:7B模型以float16加载需要约13GB显存,CPU加载则需要约26GB内存。解决方法:
- 启用8bit量化加载,大幅降低资源占用(仅需约7GB显存),正确加载LoRa模型的代码如下:
from peft import PeftModel, PeftConfig from transformers import AutoModelForCausalLM, LlamaTokenizer # 加载LoRa配置 config = PeftConfig.from_pretrained("finetuned_model") # 加载基础模型并启用8bit量化 base_model = AutoModelForCausalLM.from_pretrained( config.base_model_name_or_path, load_in_8bit=True, device_map='auto', torch_dtype=torch.float16 ) # 加载LoRa增量权重 model = PeftModel.from_pretrained(base_model, "finetuned_model") # 加载tokenizer tokenizer = LlamaTokenizer(cwd+"/tokenizer.model") tokenizer.pad_token = tokenizer.eos_token
- 优先使用GPU加载模型,若用CPU则确保机器有足够内存。
二、Hub加载的bitsandbytes错误
该错误由bitsandbytes版本不兼容或CPU环境支持不足导致,解决步骤:
- 重装兼容版本的bitsandbytes:
- 若使用CUDA环境,安装对应CUDA版本的bitsandbytes(以CUDA 11.8为例):
pip uninstall bitsandbytes -y pip install bitsandbytes==0.41.1 --index-url https://download.pytorch.org/whl/cu118 - 若为纯CPU环境,安装CPU兼容分支:
pip uninstall bitsandbytes -y pip install bitsandbytes-cpu
- 若使用CUDA环境,安装对应CUDA版本的bitsandbytes(以CUDA 11.8为例):
- 修正tokenizer加载逻辑:Llama tokenizer需用
LlamaTokenizer而非AutoTokenizer加载,修改代码中tokenizer部分:tokenizer = LlamaTokenizer(cwd+"/tokenizer.model") tokenizer.pad_token = tokenizer.eos_token - 确保PyTorch与bitsandbytes版本匹配(建议PyTorch 2.0+搭配bitsandbytes 0.40+)。
通用注意事项
- LoRa仅保存增量权重,不能直接用
AutoModelForCausalLM.from_pretrained加载LoRa保存的文件夹,必须先加载基础模型,再挂载LoRa权重。 - 训练和加载时保持
device_map、torch_dtype参数一致,避免数据类型不匹配报错。
内容的提问来源于stack exchange,提问作者Lucas Azevedo
相关产品推荐
相关产品推荐

