Unsloth框架实战指南从LoRA微调到全量微调与继续预训练一、LoRA微调实战1.1 环境准备与模型加载首先安装必要的依赖并加载预训练模型!pip install unsloth !pip install swanlab from unsloth import FastLanguageModel import torch # 模型配置 max_seq_length 2048 dtype None # 自动检测 load_in_4bit True # 4位量化节省显存 # 加载DeepSeek-R1-Distill-Qwen-1.5B模型 model, tokenizer FastLanguageModel.from_pretrained( model_name deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B, max_seq_length max_seq_length, dtype dtype, load_in_4bit load_in_4bit, )1.2 创建LoRA适配器为模型添加LoRA适配层显著减少可训练参数model FastLanguageModel.get_peft_model( model, r 16, # LoRA秩 target_modules [ q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj, ], lora_alpha 16, lora_dropout 0, bias none, use_gradient_checkpointing unsloth, # 节省30%显存 random_state 3407, use_rslora False, loftq_config None, )1.3 数据准备与格式化准备训练数据集并格式化from datasets import load_from_disk # 加载清洗后的数据集 train_dataset load_from_disk(cleaned_dataset_v4.0.0) def formatting_prompts_func(examples): 格式化训练数据 texts [] for instruction, question, response in zip( examples[instruction], examples[question], examples[response] ): text f以下是一个任务说明配有提供更多背景信息的输入。 请写出一个恰当的回答来完成该任务。 在回答之前请仔细思考问题并按步骤进行推理确保回答逻辑清晰且准确。 ### Instruction: {instruction} ### Question: {question} ### Response: {response} texts.append(text) return {text: texts} # 应用格式化 formatted_dataset train_dataset.map(formatting_prompts_func, batchedTrue)1.4 配置训练参数设置训练参数和SwanLab回调from trl import SFTTrainer, SFTConfig from swanlab.integration.transformers import SwanLabCallback # 配置SwanLab回调 swanlab_callback SwanLabCallback( projecttrl_integration, experiment_nameDeepSeek-R1-Distill-Qwen-1.5B-SFT, descriptionLoRA微调实验, config{framework: TRL}, ) # 配置训练器 trainer SFTTrainer( model model, tokenizer tokenizer, train_dataset formatted_dataset, args SFTConfig( dataset_text_field text, per_device_train_batch_size 2, gradient_accumulation_steps 4, warmup_steps 5, max_steps 30, # 小批量测试 learning_rate 2e-4, logging_steps 1, optim adamw_8bit, weight_decay 0.01, lr_scheduler_type linear, seed 3407, report_to none, ), callbacks[swanlab_callback], )1.5 执行微调训练开始LoRA微调trainer_stats trainer.train() print(f训练完成: {trainer_stats})1.6 模型推理测试微调后进行推理测试# 启用推理模式 FastLanguageModel.for_inference(model) # 测试函数 def test_model(question, temperature0.6, top_p0.95): prompt f以下是一个任务说明配有提供更多背景信息的输入。 请写出一个恰当的回答来完成该任务。 在回答之前请仔细思考问题并按步骤进行推理确保回答逻辑清晰且准确。 ### Instruction: 您是一位具有高级电气系统分析、机械动力学和运动控制规划知识的工程专家。 请回答以下电气机械运动领域的技术问题。 ### Question: {question} ### Response: inputs tokenizer([prompt], return_tensorspt).to(cuda) outputs model.generate( input_idsinputs.input_ids, attention_maskinputs.attention_mask, max_new_tokensmax_seq_length, temperaturetemperature, top_ptop_p, use_cacheFalse, ) response tokenizer.batch_decode(outputs) return response[0].split(### Response:)[1] # 测试示例 test_response test_model(输送机械动力电机选择首推哪类) print(test_response)1.7 模型保存保存微调后的模型# 保存为FP16精度 model.save_pretrained_merged( save_directoryDeepSeekR1-1.5B-finetuned-fp16, tokenizertokenizer, save_methodmerged_16bit ) # 保存为4位量化节省存储 model.save_pretrained_merged( save_directoryDeepSeekR1-1.5B-finetuned-4bit, tokenizertokenizer, save_methodmerged_4bit ) # 导出为GGUF格式适用于Ollama model.save_pretrained_gguf(DeepSeekR1-1.5B-Q8_0, tokenizer)二、全量微调实战2.1 全量微调配置全量微调更新所有参数需要更多显存# 加载模型关闭量化 model, tokenizer FastLanguageModel.from_pretrained( model_namedeepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B, load_in_4bitFalse, load_in_8bitFalse, device_mapauto, max_seq_length2048, dtypeNone, full_finetuningTrue # 开启全量微调 )2.2 训练参数配置from transformers import TrainingArguments training_args TrainingArguments( per_device_train_batch_size2, gradient_accumulation_steps4, warmup_steps10, num_train_epochs1, learning_rate2e-5, fp16not torch.cuda.is_bf16_supported(), bf16torch.cuda.is_bf16_supported(), logging_steps1, output_diroutputs, optimadamw_8bit, save_strategysteps, save_steps20, )2.3 执行全量微调from trl import SFTTrainer trainer SFTTrainer( modelmodel, tokenizertokenizer, train_datasetformatted_dataset, dataset_text_fieldtext, max_seq_length2048, argstraining_args, callbacks[swanlab_callback], ) trainer.train()三、继续预训练实战3.1 继续预训练配置# 设置环境变量 import os os.environ[UNSLOTH_RETURN_LOGITS] 1 # 加载模型并添加LoRA适配器 model, tokenizer FastLanguageModel.from_pretrained( model_namedeepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B, max_seq_length2048, dtypeNone, load_in_4bitTrue, ) # 创建LoRA适配器包含embedding层 model FastLanguageModel.get_peft_model( model, r16, target_modules[ q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj, embed_tokens, lm_head, # 添加embedding层 ], lora_alpha32, lora_dropout0, biasnone, use_gradient_checkpointingunsloth, random_state2507, use_rsloraTrue, )3.2 准备领域数据# 定义EOS标记 EOS_TOKEN tokenizer.eos_token # 创建继续预训练数据格式 cpt_prompt ### question{} ### answer{} domain_data [ {q: 在机械臂的x、y轴运动场景中应选择哪种电机机械臂的x、y轴运动需要高精度位置控制和快速响应能力。, a: 答案}, {q: 输送线的动力电机选型应优先考虑什么类型, a: 答案}, ] # 格式化数据 dataset [] for item in domain_data: dataset.append(cpt_prompt.format(item[q], item[a]) EOS_TOKEN)3.3 执行继续预训练from unsloth import UnslothTrainer, UnslothTrainingArguments trainer UnslothTrainer( modelmodel, tokenizertokenizer, train_datasetdataset, dataset_text_fieldtext, max_seq_lengthmax_seq_length, argsUnslothTrainingArguments( per_device_train_batch_size2, gradient_accumulation_steps4, warmup_ratio0.1, num_train_epochs70, learning_rate5e-5, embedding_learning_rate1e-5, # embedding层使用更小的学习率 logging_steps1, optimadamw_8bit, weight_decay0.01, lr_scheduler_typelinear, seed2507, output_diroutputs, report_tonone, ), callbacks[swanlab_callback], ) trainer.train()3.4 指令微调继续预训练后进行指令微调trainer UnslothTrainer( modelmodel, tokenizertokenizer, train_datasetformatted_dataset, # 使用指令微调数据 dataset_text_fieldtext, max_seq_lengthmax_seq_length, argsUnslothTrainingArguments( per_device_train_batch_size2, gradient_accumulation_steps4, warmup_ratio0.1, num_train_epochs5, learning_rate5e-5, embedding_learning_rate1e-5, logging_steps1, optimadamw_8bit, weight_decay0.00, lr_scheduler_typelinear, seed3407, output_diroutputs, report_tonone, ), callbacks[swanlab_callback], ) trainer.train()四、关键参数说明4.1 训练参数参数说明推荐值max_seq_length控制输出长度避免冗余推文生成128报告摘要512temperature控制生成随机性医疗诊断0.2创意写作0.9top_p动态选择概率累积词汇代码生成0.7广告文案0.95top_k限制候选词数量事实核查3研究综述10learning_rate学习率大小LoRA2e-4全量微调2e-54.2 推理参数调整# 不同场景的推理参数配置 inference_configs { 严谨回答: {temperature: 0.2, top_p: 0.8}, 创意生成: {temperature: 0.9, top_p: 0.95}, 代码生成: {temperature: 0.3, top_p: 0.7}, 对话系统: {temperature: 0.7, top_p: 0.9}, }五、实验经验总结5.1 炼丹火候把控初始阶段使用较低学习率5e-5进行文火暖鼎中期阶段待loss下降后适当增大batch size进行武火急炼后期阶段经过多个epoch建议7个后转为FP16量化退阴符固形最终阶段获得高精度模型九转灵砂5.2 常见问题解决问题1训练时loss不下降原因模型容量不足、学习率不当、batch size问题、数据集质量解决方案尝试2e-4到2e-5之间的学习率调整batch size1-4之间检查数据集质量和数据打乱问题2显存不足解决方案使用4位量化load_in_4bitTrue启用梯度检查点use_gradient_checkpointingunsloth减小batch size和序列长度问题3过拟合解决方案增加dropout率使用权重衰减weight_decay0.01早停策略5.3 平衡内存与效率保持小Batch Size单GPU场景推荐1-2配合梯度累积分阶段调试先用小模型、短序列跑通流程启用优化器分页全量微调时显著降低显存峰值5.4 实用技巧代码训练提升推理混合代码和数学数据进行训练CPTLoRAGRPO组合继续预训练LoRA微调强化学习优化渐进式训练先领域适应再指令微调多阶段学习率embedding层使用更小的学习率六、最佳实践建议6.1 数据准备确保数据质量清洗噪声数据数据格式统一符合模型输入要求适当的数据增强提高泛化能力6.2 训练策略从小规模实验开始逐步扩大监控训练过程及时调整参数使用SwanLab等工具记录实验6.3 模型评估定期在验证集上测试人工评估生成质量对比不同参数配置的效果6.4 部署优化选择合适的量化方案优化推理速度考虑模型蒸馏进一步压缩通过本指南您可以系统掌握使用Unsloth框架进行大语言模型微调的完整流程从LoRA微调到全量微调再到继续预训练每个步骤都有详细的代码示例和最佳实践建议。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。
新手必看:Unsloth框架快速上手指南,从安装到微调一气呵成
Unsloth框架实战指南从LoRA微调到全量微调与继续预训练一、LoRA微调实战1.1 环境准备与模型加载首先安装必要的依赖并加载预训练模型!pip install unsloth !pip install swanlab from unsloth import FastLanguageModel import torch # 模型配置 max_seq_length 2048 dtype None # 自动检测 load_in_4bit True # 4位量化节省显存 # 加载DeepSeek-R1-Distill-Qwen-1.5B模型 model, tokenizer FastLanguageModel.from_pretrained( model_name deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B, max_seq_length max_seq_length, dtype dtype, load_in_4bit load_in_4bit, )1.2 创建LoRA适配器为模型添加LoRA适配层显著减少可训练参数model FastLanguageModel.get_peft_model( model, r 16, # LoRA秩 target_modules [ q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj, ], lora_alpha 16, lora_dropout 0, bias none, use_gradient_checkpointing unsloth, # 节省30%显存 random_state 3407, use_rslora False, loftq_config None, )1.3 数据准备与格式化准备训练数据集并格式化from datasets import load_from_disk # 加载清洗后的数据集 train_dataset load_from_disk(cleaned_dataset_v4.0.0) def formatting_prompts_func(examples): 格式化训练数据 texts [] for instruction, question, response in zip( examples[instruction], examples[question], examples[response] ): text f以下是一个任务说明配有提供更多背景信息的输入。 请写出一个恰当的回答来完成该任务。 在回答之前请仔细思考问题并按步骤进行推理确保回答逻辑清晰且准确。 ### Instruction: {instruction} ### Question: {question} ### Response: {response} texts.append(text) return {text: texts} # 应用格式化 formatted_dataset train_dataset.map(formatting_prompts_func, batchedTrue)1.4 配置训练参数设置训练参数和SwanLab回调from trl import SFTTrainer, SFTConfig from swanlab.integration.transformers import SwanLabCallback # 配置SwanLab回调 swanlab_callback SwanLabCallback( projecttrl_integration, experiment_nameDeepSeek-R1-Distill-Qwen-1.5B-SFT, descriptionLoRA微调实验, config{framework: TRL}, ) # 配置训练器 trainer SFTTrainer( model model, tokenizer tokenizer, train_dataset formatted_dataset, args SFTConfig( dataset_text_field text, per_device_train_batch_size 2, gradient_accumulation_steps 4, warmup_steps 5, max_steps 30, # 小批量测试 learning_rate 2e-4, logging_steps 1, optim adamw_8bit, weight_decay 0.01, lr_scheduler_type linear, seed 3407, report_to none, ), callbacks[swanlab_callback], )1.5 执行微调训练开始LoRA微调trainer_stats trainer.train() print(f训练完成: {trainer_stats})1.6 模型推理测试微调后进行推理测试# 启用推理模式 FastLanguageModel.for_inference(model) # 测试函数 def test_model(question, temperature0.6, top_p0.95): prompt f以下是一个任务说明配有提供更多背景信息的输入。 请写出一个恰当的回答来完成该任务。 在回答之前请仔细思考问题并按步骤进行推理确保回答逻辑清晰且准确。 ### Instruction: 您是一位具有高级电气系统分析、机械动力学和运动控制规划知识的工程专家。 请回答以下电气机械运动领域的技术问题。 ### Question: {question} ### Response: inputs tokenizer([prompt], return_tensorspt).to(cuda) outputs model.generate( input_idsinputs.input_ids, attention_maskinputs.attention_mask, max_new_tokensmax_seq_length, temperaturetemperature, top_ptop_p, use_cacheFalse, ) response tokenizer.batch_decode(outputs) return response[0].split(### Response:)[1] # 测试示例 test_response test_model(输送机械动力电机选择首推哪类) print(test_response)1.7 模型保存保存微调后的模型# 保存为FP16精度 model.save_pretrained_merged( save_directoryDeepSeekR1-1.5B-finetuned-fp16, tokenizertokenizer, save_methodmerged_16bit ) # 保存为4位量化节省存储 model.save_pretrained_merged( save_directoryDeepSeekR1-1.5B-finetuned-4bit, tokenizertokenizer, save_methodmerged_4bit ) # 导出为GGUF格式适用于Ollama model.save_pretrained_gguf(DeepSeekR1-1.5B-Q8_0, tokenizer)二、全量微调实战2.1 全量微调配置全量微调更新所有参数需要更多显存# 加载模型关闭量化 model, tokenizer FastLanguageModel.from_pretrained( model_namedeepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B, load_in_4bitFalse, load_in_8bitFalse, device_mapauto, max_seq_length2048, dtypeNone, full_finetuningTrue # 开启全量微调 )2.2 训练参数配置from transformers import TrainingArguments training_args TrainingArguments( per_device_train_batch_size2, gradient_accumulation_steps4, warmup_steps10, num_train_epochs1, learning_rate2e-5, fp16not torch.cuda.is_bf16_supported(), bf16torch.cuda.is_bf16_supported(), logging_steps1, output_diroutputs, optimadamw_8bit, save_strategysteps, save_steps20, )2.3 执行全量微调from trl import SFTTrainer trainer SFTTrainer( modelmodel, tokenizertokenizer, train_datasetformatted_dataset, dataset_text_fieldtext, max_seq_length2048, argstraining_args, callbacks[swanlab_callback], ) trainer.train()三、继续预训练实战3.1 继续预训练配置# 设置环境变量 import os os.environ[UNSLOTH_RETURN_LOGITS] 1 # 加载模型并添加LoRA适配器 model, tokenizer FastLanguageModel.from_pretrained( model_namedeepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B, max_seq_length2048, dtypeNone, load_in_4bitTrue, ) # 创建LoRA适配器包含embedding层 model FastLanguageModel.get_peft_model( model, r16, target_modules[ q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj, embed_tokens, lm_head, # 添加embedding层 ], lora_alpha32, lora_dropout0, biasnone, use_gradient_checkpointingunsloth, random_state2507, use_rsloraTrue, )3.2 准备领域数据# 定义EOS标记 EOS_TOKEN tokenizer.eos_token # 创建继续预训练数据格式 cpt_prompt ### question{} ### answer{} domain_data [ {q: 在机械臂的x、y轴运动场景中应选择哪种电机机械臂的x、y轴运动需要高精度位置控制和快速响应能力。, a: 答案}, {q: 输送线的动力电机选型应优先考虑什么类型, a: 答案}, ] # 格式化数据 dataset [] for item in domain_data: dataset.append(cpt_prompt.format(item[q], item[a]) EOS_TOKEN)3.3 执行继续预训练from unsloth import UnslothTrainer, UnslothTrainingArguments trainer UnslothTrainer( modelmodel, tokenizertokenizer, train_datasetdataset, dataset_text_fieldtext, max_seq_lengthmax_seq_length, argsUnslothTrainingArguments( per_device_train_batch_size2, gradient_accumulation_steps4, warmup_ratio0.1, num_train_epochs70, learning_rate5e-5, embedding_learning_rate1e-5, # embedding层使用更小的学习率 logging_steps1, optimadamw_8bit, weight_decay0.01, lr_scheduler_typelinear, seed2507, output_diroutputs, report_tonone, ), callbacks[swanlab_callback], ) trainer.train()3.4 指令微调继续预训练后进行指令微调trainer UnslothTrainer( modelmodel, tokenizertokenizer, train_datasetformatted_dataset, # 使用指令微调数据 dataset_text_fieldtext, max_seq_lengthmax_seq_length, argsUnslothTrainingArguments( per_device_train_batch_size2, gradient_accumulation_steps4, warmup_ratio0.1, num_train_epochs5, learning_rate5e-5, embedding_learning_rate1e-5, logging_steps1, optimadamw_8bit, weight_decay0.00, lr_scheduler_typelinear, seed3407, output_diroutputs, report_tonone, ), callbacks[swanlab_callback], ) trainer.train()四、关键参数说明4.1 训练参数参数说明推荐值max_seq_length控制输出长度避免冗余推文生成128报告摘要512temperature控制生成随机性医疗诊断0.2创意写作0.9top_p动态选择概率累积词汇代码生成0.7广告文案0.95top_k限制候选词数量事实核查3研究综述10learning_rate学习率大小LoRA2e-4全量微调2e-54.2 推理参数调整# 不同场景的推理参数配置 inference_configs { 严谨回答: {temperature: 0.2, top_p: 0.8}, 创意生成: {temperature: 0.9, top_p: 0.95}, 代码生成: {temperature: 0.3, top_p: 0.7}, 对话系统: {temperature: 0.7, top_p: 0.9}, }五、实验经验总结5.1 炼丹火候把控初始阶段使用较低学习率5e-5进行文火暖鼎中期阶段待loss下降后适当增大batch size进行武火急炼后期阶段经过多个epoch建议7个后转为FP16量化退阴符固形最终阶段获得高精度模型九转灵砂5.2 常见问题解决问题1训练时loss不下降原因模型容量不足、学习率不当、batch size问题、数据集质量解决方案尝试2e-4到2e-5之间的学习率调整batch size1-4之间检查数据集质量和数据打乱问题2显存不足解决方案使用4位量化load_in_4bitTrue启用梯度检查点use_gradient_checkpointingunsloth减小batch size和序列长度问题3过拟合解决方案增加dropout率使用权重衰减weight_decay0.01早停策略5.3 平衡内存与效率保持小Batch Size单GPU场景推荐1-2配合梯度累积分阶段调试先用小模型、短序列跑通流程启用优化器分页全量微调时显著降低显存峰值5.4 实用技巧代码训练提升推理混合代码和数学数据进行训练CPTLoRAGRPO组合继续预训练LoRA微调强化学习优化渐进式训练先领域适应再指令微调多阶段学习率embedding层使用更小的学习率六、最佳实践建议6.1 数据准备确保数据质量清洗噪声数据数据格式统一符合模型输入要求适当的数据增强提高泛化能力6.2 训练策略从小规模实验开始逐步扩大监控训练过程及时调整参数使用SwanLab等工具记录实验6.3 模型评估定期在验证集上测试人工评估生成质量对比不同参数配置的效果6.4 部署优化选择合适的量化方案优化推理速度考虑模型蒸馏进一步压缩通过本指南您可以系统掌握使用Unsloth框架进行大语言模型微调的完整流程从LoRA微调到全量微调再到继续预训练每个步骤都有详细的代码示例和最佳实践建议。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。