当前位置: 首页 > news >正文

大模型高效微调(Finetune)实战教程

Unsloth是一个开源工具,专门用来加速大语言模型(LLMs)的微调过程。它的主要功能和优势包括:

  • 🔭 高效微调:Unsloth 的微调速度比传统方法快 2-5 倍,内存占用减少 50%-80%。这意味着你可以用更少的资源完成微调任务。
  • ⚡ 低显存需求:即使是消费级 GPU(如 RTX 3090),也能轻松运行 Unsloth。例如,仅需 7GB 显存就可以训练 1.5B 参数的模型。
  • 🎯 支持多种模型和量化:Unsloth 支持 Llama、Mistral、Phi、Gemma 等主流模型,并且通过动态 4-bit 量化技术,显著降低显存占用,同时几乎不损失模型精度。
  • 🎁 开源与免费:Unsloth 提供免费的 Colab Notebook,用户只需添加数据集并运行代码即可完成微调。

微调的基本流程如下:

image

 

# 定义提示风格的字符串模板,用于格式化问题
prompt_style = """
Below is an instruction that describes a task, paired with an input that provides further context.
Write a response that appropriately completes the request.
Before answering, think carefully about the question and create a step-by-step chain of thoughts to ensure a logical and accurate response.### Instruction:
You are a medical expert with advanced knowledge in clinical reasoning, diagnostics, and treatment planning.
Please answer the following medical question.### Question:
{}### Response:
<think>{}
"""# 定义具体的医学问题
question = "一个患有急性阑尾炎的病人已经发病5天,腹痛稍有减轻但仍然发热,在体检时发现右下腹有压痛的包块,此时应如何处理?"
# 将大模型设置为推理模式
FastLanguageModel.for_inference(model)# 使用 tokenizer 对格式化后的问题进行编码,并移动到 GPU
inputs = tokenizer([prompt_style.format(question, "")], return_tensors="pt").to("cuda")# 使用模型生成回答
outputs = model.generate(input_ids=inputs.input_ids,attention_mask=inputs.attention_mask,max_new_tokens=1200,use_cache=True,
)
# 解码模型生成的输出为可读文本
response = tokenizer.batch_decode(outputs)# 打印生成的回答部分
print(response[0].split("### Response:")[1])

 

# 将大模型设置为训练模式
FastLanguageModel.for_training(model)# 使用参数高效微调(PEFT)中的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 的超参数,影响可训练参数的训练方式lora_dropout = 0,  # 设置防止过拟合的参数,这里设置为 0 表示不丢弃任何参数bias = "none",    # 设置是否添加偏置项,这里设置为 "none" 表示不添加use_gradient_checkpointing = "unsloth",  # 使用优化技术节省显存并支持更大的批量大小random_state = 3407,  # 设置随机种子,确保每次运行代码时模型的初始化方式相同use_rslora = False,  # 设置是否使用 Rank Stabilized LoRA 技术,这里设置为 False 表示不使用loftq_config = None,  # 设置是否使用 LoftQ 技术,这里设置为 None 表示不使用
)
from trl import SFTTrainer  # 导入 SFTTrainer,用于监督式微调
from transformers import TrainingArguments  # 导入 TrainingArguments,用于设置训练参数
from unsloth import is_bfloat16_supported  # 导入函数,检查是否支持 bfloat16 数据格式

trainer = SFTTrainer(  # 创建一个 SFTTrainer 实例model=model,  # 传入要微调的模型tokenizer=tokenizer,  # 传入 tokenizer,用于处理文本数据train_dataset=dataset,  # 传入训练数据集dataset_text_field="text",  # 指定数据集中文本字段的名称max_seq_length=max_seq_length,  # 设置最大序列长度dataset_num_proc=2,  # 设置数据处理的并行进程数packing=False,  # 是否启用打包功能(这里设置为 False,打包可以让训练更快,但可能影响效果)args=TrainingArguments(  # 定义训练参数per_device_train_batch_size=2,  # 每个设备(如 GPU)上的批量大小gradient_accumulation_steps=4,  # 梯度累积步数,用于模拟大批次训练warmup_steps=5,  # 预热步数,训练开始时学习率逐渐增加的步数max_steps=100,  # 最大训练步数learning_rate=2e-4,  # 学习率,模型学习新知识的速度fp16=not is_bfloat16_supported(),  # 是否使用 fp16 格式加速训练(如果环境不支持 bfloat16)bf16=is_bfloat16_supported(),  # 是否使用 bfloat16 格式加速训练(如果环境支持)logging_steps=1,  # 每隔多少步记录一次训练日志optim="adamw_8bit",  # 使用的优化器,用于调整模型参数weight_decay=0.01,  # 权重衰减,防止模型过拟合lr_scheduler_type="linear",  # 学习率调度器类型,控制学习率的变化方式seed=3407,  # 随机种子,确保训练结果可复现output_dir="outputs",  # 训练结果保存的目录report_to="none",  # 是否将训练结果报告到外部工具(如 WandB),这里设置为不报告
    ),
)
# 执行训练
trainer_stats = trainer.train()

第六步:微调后测试

 

# 打印前面的问题
print(question)
#测试同一个问题的答案
# 将模型切换到推理模式,准备回答问题
FastLanguageModel.for_inference(model)# 将问题转换成模型能理解的格式,并发送到 GPU 上
inputs = tokenizer([prompt_style.format(question, "")], return_tensors="pt").to("cuda")# 让模型根据问题生成回答,最多生成 10000 个新词
outputs = model.generate(input_ids=inputs.input_ids,  # 输入的数字序列attention_mask=inputs.attention_mask,  # 注意力遮罩,帮助模型理解哪些部分重要max_new_tokens=10000,  # 最多生成 4000 个新词use_cache=True,  # 使用缓存加速生成
)# 将生成的回答从数字转换回文字
response = tokenizer.batch_decode(outputs)# 打印回答
print(response[0].split("### Response:")[1])

第七步:本地保存模型

 

#保存Lora权重
model.save_pretrained("ckpts/lora_model")
tokenizer.save_pretrained("ckpts/lora_model")
# 加载模型
model, tokenizer = FastLanguageModel.from_pretrained(model_name = "ckpts/lora_model",max_seq_length = max_seq_length,load_in_4bit = True,
)
FastLanguageModel.for_inference(model)
inputs = tokenizer([prompt_style.format(question)], return_tensors='pt', max_length=max_seq_length).to("cuda")
outputs = model.generate(inputs['input_ids'], attention_mask=inputs['attention_mask'], max_length=max_seq_length, use_cache=True)
answer = tokenizer.batch_decode(outputs, skip_special_tokens=True)[0]
print(answer)

 

 

出处:https://www.cnblogs.com/boreas-pxl/p/18797698

http://www.jsqmd.com/news/52691/

相关文章:

  • 【转载】Qt QCustomPlot 使用整理
  • Windows实用小工具使用教程!OFGB专治 Windows 11 广告的神器+自动滚屏小工具!
  • 八数码难题
  • 趣睡科技与强脑合作:AI算法赋能睡眠健康
  • 【转载】Qt QCustomPlot 使用教程
  • 2025年11月营销智能体选择指南:权威榜单与用户评价深度分析
  • 2025年11月营销智能体推荐榜单:主流平台综合对比与选择指南
  • 2025年11月营销智能体推荐榜单:主流平台列表与权威选择指南
  • 2025年11月营销智能体推荐榜单:五大主流平台深度对比与选择指南
  • HarmonyOS游戏开发入门:用ArkTS打造经典五子棋
  • 详细介绍:【论文阅读】AAAI 2025 | 面向精确分割式联邦学习的多模型聚合与知识重放
  • HarmonyOS文件操作进阶:上传/下载/解压全场景实战(含封装工具类)
  • Harmony ArkTS 并发编程全攻略:从基础概念到多线程实战,彻底搞懂性能优化
  • HarmonyOS 文件操作不用愁:沙箱机制解析 + 可抄代码,零基础上手
  • HarmonyOS ArkTS 状态管理 V2 全解析:新装饰器 + 实战示例 + 面试题(简述方便新手快速了解使用)
  • 2025最新机械密封件制造厂家实力榜!国内顶尖机械密封品牌权威发布,技术与服务双重保障,机械密封/机械密封件/釜用机械密封/双端面机械密封/机械密封维修品质与专业深度剖析,选择指南
  • 八皇后
  • 【日记】买了几个手办(270 字)
  • Tunee指导
  • linux系统下独立声卡继电器总是自动反复吸合
  • 2025年有实力便携式烟灰缸定制/迷你便携式烟灰缸品牌厂家排行榜
  • 2025年3200度石墨化炉、卧式石墨化炉、碳纤维石墨化炉品
  • 2025年度空调减震器制造企业排名:空调减震器制造企业选择哪
  • 2025最新机械密封企业推荐!行业标杆企业权威榜单发布,技术与服务双优助力工业密封安全
  • 2025褪黑素哪个牌子好?7大品牌实测排行榜:入睡困难、失眠多梦人群必选
  • 2025年11月建设工程律所评测榜:十家优质律所多维度对比分析
  • 2025年11月休闲食品品牌推荐榜:权威评测与消费者口碑全面解析
  • 2025年11月休闲食品品牌评价推荐:从健康指标到消费场景的全维度排行
  • 2025年如何购买台式环形绕线机/全自动环形绕线机厂家选购指南与推荐
  • 2025年口碑好的铝方通隔断最新TOP厂家排名