2026/3/1 15:54:14
网站建设
项目流程
asp.net怎么做登录网站,网站内建设的发展,做做网,网站开发分站前言
随着 Llama、Qwen、ChatGLM 等开源大语言模型#xff08;LLM#xff09;的普及#xff0c;如何在有限算力下高效微调模型成为开发者关注的核心问题。全参数微调#xff08;Full Fine-tuning#xff09;动辄需要数十 GB 显存#xff0c;而 LoRA#xff08;Low-Rank…前言随着 Llama、Qwen、ChatGLM 等开源大语言模型LLM的普及如何在有限算力下高效微调模型成为开发者关注的核心问题。全参数微调Full Fine-tuning动辄需要数十 GB 显存而LoRALow-Rank Adaptation作为一种参数高效微调PEFT方法仅需训练极少量参数即可达到接近全微调的效果。本文将带你深入理解 LoRA 的数学原理使用 Hugging Face PEFT 库实战微调 Qwen-1.8B对比 LoRA 与全微调的显存占用、训练速度与生成质量环境要求Python 3.9、PyTorch 2.0、transformers ≥4.35、peft ≥0.8、bitsandbytes用于量化一、为什么需要 LoRA1.1 全参数微调的痛点显存爆炸Llama-7B 全微调需 80GB GPU 显存存储成本高每个任务需保存完整模型副本13GB训练慢大量参数更新导致收敛慢1.2 LoRA 的核心思想“冻结原始权重用低秩矩阵近似权重更新”假设原始权重矩阵为 $ W_0 \in \mathbb{R}^{d \times k} $微调后变为 $ W_0 \Delta W $。LoRA 假设 $ \Delta W $ 是低秩的即Δ W A ⋅ B , A ∈ R d × r , B ∈ R r × k , r ≪ min ( d , k ) \Delta W A \cdot B, \quad A \in \mathbb{R}^{d \times r},\ B \in \mathbb{R}^{r \times k},\ r \ll \min(d, k)ΔWA⋅B,A∈Rd×r,B∈Rr×k,r≪min(d,k)训练时只更新 A 和 B推理时合并 $ W W_0 AB $零延迟优势参数量减少 90%可插拔同一基础模型支持多个 LoRA 适配器推理无额外开销二、LoRA 实战微调 Qwen-1.8B 进行中文对话我们将使用Qwen-1.8B-Chat模型在自定义对话数据集上微调使其学会特定风格的回答。2.1 安装依赖pipinstalltorch transformers accelerate peft datasets bitsandbytes2.2 准备数据集模拟客服问答# dataset.pyfromdatasetsimportDataset data{instruction:[如何重置密码,订单多久能发货,支持哪些支付方式],input:[,,],output:[请在登录页面点击忘记密码按提示操作即可。,一般下单后24小时内发货。,支持支付宝、微信和银联信用卡。]}datasetDataset.from_dict(data)2.3 加载模型4-bit 量化节省显存# model.pyfromtransformersimportAutoTokenizer,AutoModelForCausalLM,BitsAndBytesConfigimporttorch model_nameQwen/Qwen1.5-1.8B-Chat# 4-bit 量化配置bnb_configBitsAndBytesConfig(load_in_4bitTrue,bnb_4bit_quant_typenf4,bnb_4bit_compute_dtypetorch.float16)tokenizerAutoTokenizer.from_pretrained(model_name,trust_remote_codeTrue)modelAutoModelForCausalLM.from_pretrained(model_name,quantization_configbnb_config,device_mapauto,trust_remote_codeTrue)tokenizer.pad_tokentokenizer.eos_token2.4 配置 LoRA# lora_config.pyfrompeftimportLoraConfig,get_peft_model lora_configLoraConfig(r8,# 秩ranklora_alpha16,# 缩放因子target_modules[q_proj,k_proj,v_proj,o_proj],# Qwen 的注意力层lora_dropout0.1,biasnone,task_typeCAUSAL_LM)modelget_peft_model(model,lora_config)model.print_trainable_parameters()# 输出示例trainable params: 2,097,152 || all params: 1,800,000,000 || trainable%: 0.1165target_modules 说明不同模型名称不同Qwen 使用q_proj/k_proj/v_proj/o_projLlama 使用q_proj/v_proj。2.5 训练脚本# train.pyfromtransformersimportTrainingArguments,TrainerfromdatasetsimportDatasetdefformatting_prompts_func(example):output_texts[]foriinrange(len(example[instruction])):textf### 用户{example[instruction][i]}\n### 助手{example[output][i]}output_texts.append(text)returnoutput_texts# 使用 SFTSupervised Fine-TuningfromtrlimportSFTTrainer trainerSFTTrainer(modelmodel,argsTrainingArguments(per_device_train_batch_size2,gradient_accumulation_steps4,warmup_steps5,max_steps100,learning_rate2e-4,fp16True,logging_steps1,output_diroutputs,optimpaged_adamw_8bit,# 8-bit 优化器进一步省显存),train_datasetdataset,formatting_funcformatting_prompts_func,data_collatorNone,)trainer.train()技巧使用paged_adamw_8bit来自bitsandbytes可避免 OOM。三、效果评估与对比3.1 显存与训练速度对比RTX 4090方法可训练参数量显存占用训练 100 步耗时全参数微调1.8B40 GBOOM无法运行LoRA (r8)~2M (0.12%)~12 GB~8 分钟3.2 生成效果测试# inference.pymodel.eval()prompt### 用户如何重置密码\n### 助手inputstokenizer(prompt,return_tensorspt).to(cuda)outputsmodel.generate(**inputs,max_new_tokens100)print(tokenizer.decode(outputs[0],skip_special_tokensTrue))输出结果用户如何重置密码助手请在登录页面点击“忘记密码”然后按照提示操作即可完成密码重置。模型成功学会了客服话术四、进阶建议调整 rank ®r4极低资源适合快速验证r8~64平衡性能与效果推荐起点 r8多适配器切换model.load_adapter(path/to/lora_adapter_v2,adapter_namev2)model.set_adapter(v2)合并 LoRA 权重用于部署model.merge_and_unload()# 合并到主模型model.save_pretrained(merged_model)五、总结项目说明LoRA 优势低显存、快训练、可插拔、推理无损适用场景垂直领域微调、多任务适配、边缘设备部署局限性对超大规模任务如复杂推理可能略逊于全微调总结LoRA 让普通开发者也能玩转大模型微调六、参考资料与扩展LoRA 原论文Hugging Face PEFT 文档Qwen 官方 GitHubTRL 库简化 SFT 训练如果你觉得本文有帮助欢迎点赞、收藏、关注也欢迎留言讨论你的 LoRA 实践经验