Views
No views yet
LinkSoul/Chinese-Llama-2-7b 进行 LoRA 微调的模型。NekoQA-10K 进行微调,适合中文问答和对话场景。NekoQA-10K 数据集进行微调。lora_r=32, lora_alpha=32, max_steps=1501# 步骤 1: 导入所有需要的库
2import torch
3from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
4from peft import PeftModel
5import os
6
7# --- 打印一下 PyTorch 和 GPU 的信息,确保环境正常 ---
8print("PyTorch Version:", torch.__version__)
9print("CUDA is available:", torch.cuda.is_available())
10if torch.cuda.is_available():
11 print("CUDA Version:", torch.version.cuda)
12 print("Current GPU:", torch.cuda.get_device_name(torch.cuda.current_device()))
13
14# 步骤 2: 定义模型路径
15# !!! 请务必确认这两个路径是正确的 !!!
16# 基础模型的路径,即原始的、未微调的Llama-2模型
17base_model_path = "LinkSoul/Chinese-Llama-2-7b"
18# 你微调后得到的 LoRA 适配器路径
19peft_adapter_path = "zanyyan/Chinese-Llama-2-7b-finetuned-NekoQA"
20
21print(f"基础模型路径: {base_model_path}")
22print(f"PEFT适配器路径: {peft_adapter_path}")
23
24
25# 步骤 3: 配置 4-bit 量化
26# 这一步必须和你的训练脚本保持一致,以确保模型能被正确加载
27quantization_config = BitsAndBytesConfig(
28 load_in_4bit=True,
29 bnb_4bit_quant_type="nf4",
30 bnb_4bit_compute_dtype=torch.bfloat16,
31 bnb_4bit_use_double_quant=True,
32)
33print(">>> 量化配置加载完毕。")
34
35# 步骤 4: 加载基础模型
36# 首先,加载原始的 Llama-2 模型,并应用量化配置
37# device_map="auto" 会自动将模型加载到可用的GPU上
38print(">>> 正在加载基础模型 (可能需要一些时间)...")
39base_model = AutoModelForCausalLM.from_pretrained(
40 base_model_path,
41 quantization_config=quantization_config,
42 device_map="auto",
43 torch_dtype=torch.bfloat16, # 使用 bfloat16 以提高效率
44 trust_remote_code=True # 如果模型定义在远端仓库,需要加上这个
45)
46print(">>> 基础模型加载完毕。")
47
48# 步骤 5: 加载分词器 (Tokenizer)
49# 分词器应该从你的适配器文件夹中加载,以确保它包含了所有你在微调时可能添加的特殊词元(tokens)
50print(">>> 正在加载分词器...")
51tokenizer = AutoTokenizer.from_pretrained(peft_adapter_path)
52print(">>> 分词器加载完毕。")
53
54# 步骤 6: 将 LoRA 适配器融合到基础模型中
55# 这是最关键的一步,我们使用 PeftModel 类来完成这个“附加”操作
56print(">>> 正在融合 LoRA 适配器...")
57model = PeftModel.from_pretrained(base_model, peft_adapter_path)
58print(">>> LoRA 适配器融合完毕。")
59
60# 步骤 7: 准备模型进行推理
61# model.eval() 会将模型切换到评估(推理)模式
62# 在这个模式下,像 Dropout 这样的层会被禁用
63model.eval()
64print(">>> 模型已切换到推理模式。")
65
66
67# 步骤 8: 进行对话测试
68print("\n" + "="*20 + " 开始对话测试 " + "="*20)
69
70# 准备一个输入
71prompt = "你好,请介绍一下你自己"
72# Llama-2 使用特定的聊天模板,我们用 apply_chat_template 来自动格式化输入
73# add_generation_prompt=True 会在末尾添加提示,让模型知道轮到它说话了
74messages = [
75 {"role": "user", "content": prompt},
76]
77input_tensor = tokenizer.apply_chat_template(messages, add_generation_prompt=True, return_tensors="pt").to(model.device)
78
79# 使用 model.generate() 函数进行推理
80with torch.no_grad(): # 在推理时,我们不需要计算梯度
81 outputs = model.generate(
82 input_ids=input_tensor,
83 max_new_tokens=512, # 定义模型最多可以生成多少个新的词元
84 do_sample=True, # 开启采样,让回答更具多样性
85 temperature=0.7, # 温度系数,越小回答越确定,越大越随机
86 top_p=0.9, # Top-p 采样
87 )
88
89# 解码生成的词元ID,并跳过输入的提示部分,只打印模型的回答
90response = tokenizer.decode(outputs[0][input_tensor.shape[-1]:], skip_special_tokens=True)
91
92print(f"用户输入: {prompt}")
93print(f"模型回答: {response}")
94print("\n" + "="*20 + " 对话测试结束 " + "="*20)