如何解决加载自定义微调LLaMA 3-8B模型时的OSError报错?
如何加载QLoRA微调后的LLaMA 3-8B模型?
问题背景
我是NLP模型实现领域的新手,已用QLoRA完成LLaMA 3-8B变体的微调并上传至HuggingFace,模型目录包含以下文件:
- .gitattributes - adapter_config.json - adapter_model.safetensors - special_tokens_map.json - tokenizer.json - tokenizer_config.json - training_args.bin
尝试过的方法及报错
- 直接加载adapter目录的代码:
model_id_1 = "ferguso/llama-8b-pcl-v3" tokenizer_1 = AutoTokenizer.from_pretrained(model_id_1) quantization_config = BitsAndBytesConfig( load_in_8bit=True, ) model_1 = AutoModelForCausalLM.from_pretrained( model_id_1, quantization_config=quantization_config, )
报错:OSError: ferguso/llama-8b-pcl-v3 does not appear to have a file named config.json. Checkout 'https://huggingface.co/ferguso/llama-8b-pcl-v3/tree/main' for available files.
- 尝试从原始模型加载config后再加载:
original_model = "meta-llama/Meta-Llama-3-8B" model_id_1 = "ferguso/llama-8b-pcl-v3" tokenizer_1 = AutoTokenizer.from_pretrained(model_id_1) quantization_config = BitsAndBytesConfig( load_in_8bit=True, ) original_config = AutoConfig.from_pretrained(original_model) original_config.save_pretrained(model_id_1) model_1 = AutoModelForCausalLM.from_pretrained( model_id_1, quantization_config=quantization_config, config = original_config )
报错:OSError: Error no file named pytorch_model.bin, model.safetensors, tf_model.h5, model.ckpt.index or flax_model.msgpack found in directory ferguso/llama-8b-pcl-v3.
解决方案
QLoRA微调仅保存了适配器(Adapter)权重,并未存储完整的模型权重,因此必须先加载原始LLaMA 3-8B基础模型,再加载适配器才能得到完整的微调后模型。正确代码如下:
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig from peft import PeftModel, PeftConfig # 基础模型与适配器模型ID base_model_id = "meta-llama/Meta-Llama-3-8B" adapter_model_id = "ferguso/llama-8b-pcl-v3" # 定义量化配置(与微调时一致) quantization_config = BitsAndBytesConfig(load_in_8bit=True) # 加载基础模型 base_model = AutoModelForCausalLM.from_pretrained( base_model_id, quantization_config=quantization_config, device_map="auto" # 自动分配设备 ) # 加载Tokenizer(若微调时修改过Tokenizer,可从适配器模型目录加载) tokenizer = AutoTokenizer.from_pretrained(base_model_id) # tokenizer = AutoTokenizer.from_pretrained(adapter_model_id) # 微调后修改过Tokenizer时用这行 # 加载适配器并合并到基础模型 model = PeftModel.from_pretrained(base_model, adapter_model_id) # (可选)若需要将适配器与基础模型合并并保存为完整模型 # model = model.merge_and_unload() # model.save_pretrained("merged_llama_model") # tokenizer.save_pretrained("merged_llama_model")
关键说明
- 必须依赖
peft库加载适配器,需确保已安装:pip install peft - 加载基础模型时需要访问meta-llama的原始模型,需提前完成HuggingFace的权限申请并登录(
huggingface-cli login) - 适配器仅存储微调带来的权重增量,因此必须结合基础模型才能正常运行
内容的提问来源于stack exchange,提问作者sempraEdic
相关产品推荐
相关产品推荐

