一、先确认本地模型文件结构(关键前提)
首先检查你下载的 Llama 模型文件夹结构是否正确,必须包含以下核心文件(缺一不可):
plaintext
你的本地模型文件夹/ ├── config.json # 模型核心配置(Unsloth必须读取) ├── tokenizer.json # 分词器配置 ├── tokenizer_config.json ├── special_tokens_map.json ├── model.safetensors # 模型权重文件(可能分多个,如model-00001-of-00002.safetensors) └── adapter_config.json # 如果是4bit量化版,会有这个文件(Unsloth的bnb-4bit模型必备)如果缺少config.json,Unsloth 会直接报 “无配置文件” 错误,需要确认下载完整。
二、核心步骤:Unsloth 加载本地 Llama 模型
步骤 1:修改模型路径为本地绝对路径
把代码中model_name从 HF 在线地址替换为你本地模型文件夹的绝对路径(不要用相对路径,避免识别失败),示例如下:
# 第一步:配置环境(避免中文/路径问题) import os os.environ["HF_ENDPOINT"] = "https://hf-mirror.com" # 保留,防止依赖下载失败 os.environ["TOKENIZERS_PARALLELISM"] = "false" # 避免分词器并行警告 # 第二步:导入库 from unsloth import FastLanguageModel import torch from trl import SFTTrainer from transformers import TrainingArguments from datasets import load_dataset # ====================== # 核心修改:替换为本地模型的绝对路径 # ====================== # 示例(Linux/Mac):"/home/你的用户名/llama_models/llama-3.1-8b-bnb-4bit" # 示例(Windows WSL2):"/mnt/d/llama_models/llama-3.1-8b-bnb-4bit" # 替换成你实际的本地模型文件夹路径! model_name = "/home/xxx/llama_models/llama-3.1-8b-bnb-4bit" # 第三步:加载本地模型(关键:路径必须正确) model, tokenizer = FastLanguageModel.from_pretrained( model_name = model_name, # 本地模型路径 max_seq_length = 4096, # Llama 3.1支持4096上下文 dtype = torch.float16, # 混合精度 load_in_4bit = True, # 必须和你下载的模型量化版本匹配(4bit/8bit) trust_remote_code = True, # 本地模型建议开启,避免配置解析错误 device_map = "auto", # 自动分配显存(低配GPU必备) ) # ====================== # 后续步骤:加载自定义数据集(和之前一致) # ====================== # 替换为你的本地数据集路径 dataset = load_dataset( "csv", data_files="你的自定义数据集.csv", split="train", encoding="utf-8" ) # 格式化Prompt(替换为你的字段名) def format_prompt(sample): return f"""<|begin_of_text|> <|start_header_id|>user<|end_header_id|> {sample['question']} <|start_header_id|>assistant<|end_header_id|> {sample['answer']} <|end_of_text|>""" dataset = dataset.map(lambda x: {"text": format_prompt(x)}) # ====================== # LoRA配置+训练配置(无需改,适配本地模型) # ====================== model = FastLanguageModel.get_peft_model( model, r = 24, target_modules = ["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"], lora_alpha = 24, lora_dropout = 0.05, bias = "none", use_gradient_checkpointing = "unsloth", random_state = 42, use_rslora = False, loftq_config = None, ) trainer = SFTTrainer( model = model, train_dataset = dataset, dataset_text_field = "text", max_seq_length = 4096, tokenizer = tokenizer, args = TrainingArguments( per_device_train_batch_size = 1, # 根据显存调整 gradient_accumulation_steps = 8, warmup_steps = 10, max_steps = 100, learning_rate = 1.8e-4, fp16 = not torch.cuda.is_bf16_supported(), bf16 = torch.cuda.is_bf16_supported(), logging_steps = 5, output_dir = "unsloth-local-llama3.1-custom", # 输出到本地 optim = "adamw_8bit", ), ) # 开始训练 trainer.train() # 推理测试 FastLanguageModel.for_inference(model) inputs = tokenizer( """<|begin_of_text|> <|start_header_id|>user<|end_header_id|> 介绍一下Unsloth <|start_header_id|>assistant<|end_header_id|> """, return_tensors = "pt" ).to("cuda") outputs = model.generate(**inputs, max_new_tokens = 300, temperature = 0.6) print(tokenizer.decode(outputs[0], skip_special_tokens = False))步骤 2:关键适配说明(针对本地模型)
路径格式:
- Linux/Mac:用绝对路径,如
/home/xxx/llama-3.1-8b-bnb-4bit; - Windows WSL2:用
/mnt/d/xxx/llama-3.1-8b-bnb-4bit(D 盘),不要用D:\xxx格式; - 路径中不要包含中文 / 空格,否则会触发加载失败。
- Linux/Mac:用绝对路径,如
量化版本匹配:
- 如果你下载的是 4bit 量化版,必须设置
load_in_4bit = True; - 如果是 8bit 量化版,设置
load_in_8bit = True; - 如果是原生 16bit 模型,设置
load_in_4bit = False且dtype = torch.float16。
- 如果你下载的是 4bit 量化版,必须设置
权重文件识别:如果模型权重是分多个文件(如
model-00001-of-00002.safetensors),Unsloth 会自动识别,无需额外配置。
三、常见本地模型加载问题及解决
问题 1:提示 “找不到 model.safetensors”
- 原因:权重文件命名不符合 HF 规范,或路径错误;
- 解决:确认权重文件以
model.safetensors开头,且放在模型根目录(不是子文件夹)。
问题 2:提示 “CUDA out of memory”(显存溢出)
- 原因:本地模型未量化(原生 16bit),8B 模型需要 16GB + 显存;
- 解决:
- 确保开启
load_in_4bit = True(必须是 4bit 量化版模型); - 降低
max_seq_length到 2048; - 设置
per_device_train_batch_size = 1。
- 确保开启
问题 3:提示 “tokenizer 配置错误”
- 原因:缺少分词器文件(
tokenizer.json/tokenizer_config.json); - 解决:重新下载完整的分词器文件,放在模型根目录。
四、验证本地模型加载是否成功
在加载模型后,添加以下代码验证:
# 加载模型后执行 print(f"✅ 模型加载成功,模型类型:{model.config.model_type}") print(f"✅ 分词器加载成功,词汇量:{tokenizer.vocab_size}")如果能输出以上信息,说明本地模型已正确识别。
总结
- 核心操作:将
model_name替换为本地模型文件夹的绝对路径,确保路径无中文 / 空格; - 关键匹配:
load_in_4bit/8bit必须和你下载的模型量化版本一致; - 必备文件:本地模型文件夹必须包含
config.json、tokenizer.json、model.safetensors核心文件。