1. 强制升级冲突的底层依赖,并安装必备库
!pip install –upgrade torchao peft -q
!pip install transformers datasets accelerate tiktoken -q
import
os
import
torch
from transformers import
AutoModelForCausalLM, AutoTokenizer, Trainer, TrainingArguments
from transformers import
DataCollatorForLanguageModeling
from datasets import
load_dataset
from peft import
LoraConfig, get_peft_model, TaskType
2. 检查设备
device =
“cuda” if torch.cuda.is_available() else “cpu”
print(
f”当前使用的计算设备是: {device}”
)
3. 加载官方模型与分词器
model_name =
“Qwen/Qwen2.5-1.5B-Instruct”
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=
True
)
base_model = AutoModelForCausalLM.from_pretrained(
model_name,
trust_remote_code=
True
,
device_map=
“auto”
)
4. 配置 LoRA 参数
peft_config = LoraConfig(
task_type=TaskType.CAUSAL_LM,
inference_mode=
False
,
r=
8, # LoRA 的秩
lora_alpha=
32, # 缩放系数
lora_dropout=
0.1
,
target_modules=[
“q_proj”, “v_proj”] # 针对千问模型的注意力机制关键层进行微调
)
💡 这次依赖更新后,包装 LoRA 模型将不再报错
model = get_peft_model(base_model, peft_config)
print(
“可训练的模型参数占比详情:”
)
model.print_trainable_parameters()
5. 准备数据集
if not os.path.exists(“my_data.txt”
):
with open(“my_data.txt”, “w”, encoding=”utf-8″) as
f:
knowledge = [
“人工智能是引领未来的战略性技术,正在深刻改变人类社会的生产与生活方式。\n”
,
“大语言模型通过学习海量文本,掌握了人类语言的语法、逻辑和丰富的百科知识。\n”
,
“阿里千问(Qwen)是目前开源社区中对中文支持最好的大语言模型之一。\n”
,
“在本地或者云端微调小参数模型,是高性价比落地垂直领域AI助手的最佳方案。\n”
]
f.write(
“”.join(knowledge * 50
))
dataset = load_dataset(
“text”, data_files={“train”: “my_data.txt”
})
def tokenize_function(examples):
texts = []
for text in examples[“text”
]:
if len(text.strip()) == 0
:
continue
messages = [
{
“role”: “system”, “content”: “你是一个博学、专业的中文人工智能助手。”
},
{
“role”: “user”, “content”: “请告诉我关于大模型或人工智能的行业知识。”
},
{
“role”: “assistant”, “content”
: text.strip()}
]
formatted_text = tokenizer.apply_chat_template(messages, tokenize=
False, add_generation_prompt=False
)
texts.append(formatted_text)
return tokenizer(texts, truncation=True, max_length=512
)
tokenized_datasets = dataset.
map(tokenize_function, batched=True, remove_columns=[“text”
])
data_collator = DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=
False
)
6. 配置稳健的微调参数(不开启 fp16 避开 T4 的混合精度断言错误)
training_args = TrainingArguments(
output_dir=
“./qwen_lora_output”
,
num_train_epochs=
3
,
per_device_train_batch_size=
4
,
gradient_accumulation_steps=
4
,
save_steps=
100
,
logging_steps=
20
,
learning_rate=
1e-4
,
weight_decay=
0.01
,
fp16=
False
,
optim=
“adamw_torch”
,
report_to=
“none”
)
7. 启动微调
trainer = Trainer(
model=model,
args=training_args,
data_collator=data_collator,
train_dataset=tokenized_datasets[
“train”
],
)
print(
“🚀 依赖修复完毕!开始通过 LoRA 在 T4 GPU 上稳健微调阿里千问…”
)
trainer.train()
8. 保存 LoRA 权重与分词器
trainer.save_model(
“./my_tuned_qwen”
)
tokenizer.save_pretrained(
“./my_tuned_qwen”
)
print(
“🎉 恭喜!千问大模型已成功跨越所有环境暗坑,完成微调并成功保存!”
)
加载并测试微调后的模型?
import
torch
from transformers import
AutoModelForCausalLM, AutoTokenizer
from peft import
PeftModel
model_name =
“Qwen/Qwen2.5-1.5B-Instruct”
lora_path =
“./my_tuned_qwen” # 你刚刚保存的微调权重路径
print(
“正在加载基础模型与微调后的 LoRA 权重…”
)
1. 加载基础模型
base_model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype=torch.float16,
推理时使用 fp16 速度更快,且 T4 显存完全够用
device_map=
“auto”
)
2. 叠加上层 LoRA 权重
model = PeftModel.from_pretrained(base_model, lora_path)
tokenizer = AutoTokenizer.from_pretrained(lora_path)
3. 准备测试对话(测试它是否记住了注入的行业知识)
messages = [
{
“role”: “system”, “content”: “你是一个博学、专业的中文人工智能助手。”
},
{
“role”: “user”, “content”: “请告诉我关于大模型或人工智能的行业知识。”
}
]
运行结果
🤖 AI 的回答:
你好,很高兴为您服务。