2026/1/12 12:41:59
网站建设
项目流程
wordpress自定义字段不全站显示,网站中做背景图片位置咋写,网页模板版权申请,233小游戏Unsloth框架介绍1.1 Unsloth概览Unsloth是一款专为大语言模型微调与强化学习设计的开源框架#xff0c;致力于以更高的效率和更低的资源成本推动人工智能技术的普及。用户可在本地环境、Google Colab、Kaggle等平台上#xff0c;借助其运算加速与显存优化能力#xff0c;轻松…Unsloth框架介绍1.1 Unsloth概览Unsloth是一款专为大语言模型微调与强化学习设计的开源框架致力于以更高的效率和更低的资源成本推动人工智能技术的普及。用户可在本地环境、Google Colab、Kaggle等平台上借助其运算加速与显存优化能力轻松完成Qwen、DeepSeek等主流大模型的训练、评估、保存及推理优化。传统大语言模型微调往往面临硬件要求高、迭代速度慢和资源受限等挑战而Unsloth通过高效的底层实现和友好的接口设计显著降低了微调的技术门槛使更多人能够高效、低成本地训练属于自己的定制模型。https://www.codemajin.net/fine-tuning-llm-with-unsloth/核心优势特点 说明 适用场景/用户极致速度 相比Hugging FaceUnsloth训练模型更快 需快速实验与迭代的研发场景省内存 减少GPU显存占用 注重成本控制的用户✅无损精度 无需依赖近似计算 对精度要求极高的任务广泛兼容 支持主流Transformer类模型涵盖多模态、语音、文本及扩散模型支持全量微调、预训练及4/8/16位精度训练兼容Linux、Windows及主流云平台 使用多种架构的团队易于使用 提供简洁API兼容Hugging Face生态可导出GGUF、Ollama等格式 初学者、资源有限的小型团队⚡高效推理 支持INT4量化QLoRA推理阶段同步提速 需兼顾微调与推理效率的应用场景低成本 单张GPU如4090或8GB显存卡即可微调10B参数模型 个人开发者高效计算 基于TritonOpenAI开源的高性能GPU编程语言实现高效计算 对技术底层效率有要求的开发团队目前Unsloth支持借助Accelerate、DeepSpeed等库实现多GPU训练但实际配置过程较复杂需手动完成设置相关训练教程可参考Multi-GPU-UnslothUnsloth团队正积极优化多GPU训练功能。使用建议Unsloth与Meta、Google、Microsoft、Mistral、Qwen等主流模型团队深度合作持续修复关键漏洞提升框架的准确性与稳定性。该框架支持用户灵活调整聊天模板和数据集格式并提供涵盖视觉模型、TTS、BERT、强化学习等多样化示例Notebook助力用户快速上手详情可参考Unsloth Notebooks。快速上手建议从QLoRA起步4-bit量化是资源有限用户的理想选择调整关键参数如LoRA秩r和alpha建议从小值如16开始尝试以平衡模型能力与过拟合风险监控训练过程密切关注损失曲线借助Unsloth的快速迭代优势积极调参利用社区资源通过Discord聊天社区等渠道获取帮助、交流经验。1.2 微调技术概览什么是微调微调Fine-tuning是一种基于预训练大语言模型、利用特定领域数据进一步训练的技术其核心目标提升模型在特定场景下的性能表现。该技术主要包括两个层面一是对预训练模型进行持续的无监督预训练二是指令微调SFT即引导模型学习如何根据指令调用已有知识完成特定格式的任务或匹配特定风格。通过微调通用大模型能够逐步转化为专业化的领域专家。与检索增强生成RAG不同微调将知识直接内化至模型参数中实现更深层次的能力融合。本文聚焦于大语言模型的指令微调。那么为什么要进行微调知识增强向模型注入领域新知识扩展其认知边界行为定制调整模型的输出风格、语气及响应方式性能优化提升模型在特定任务上的准确性、相关性和可靠性利用Unsloth实现完整指令微调训练的教程见 How To Fine-tune Run LLMs。微调常见问题微调能否增加新知识可以。只要训练数据中包含新信息模型就能有效学习并掌握新的知识或模式。RAG是否一定优于微调并非如此。经过良好优化的微调模型在特定任务上可以媲美甚至超越RAG系统。借助如Unsloth等高效训练工具微调的技术门槛也显著降低。微调成本是否很高并非必然。采用LoRA/QLoRA等参数高效微调方法结合免费或低成本的算力资源完全能够实现低成本甚至零成本的微调。微调如何与其他技术结合微调与RAG具有互补优势微调赋予模型领域基础能力RAG则提供实时外部知识兼顾专业性与时效性。此外强化学习RL也可在微调后通过奖励机制进一步优化模型表现。https://medium.com/decodingml/8b-parameters-1-gpu-no-problems-the-ultimate-llm-fine-tuning-pipeline-f68ef6c359c21.3 Unsloth安装Unsloth安装命令Unsloth可直接在Linux、Windows、Google Colab等系统上运行直接安装命令如下pip install unsloth系统要求操作系统支持Linux与Windows显卡兼容2018年及之后发布的NVIDIA显卡需至少支持CUDA 7.0例如V100、T4、Titan V、RTX 20/30/40系列、A100、H100、L40等GTX 1070/1080可运行但性能较慢支持AMD与Intel的CPUApple Silicon版本目前仍在开发中软件兼容安装Unsloth时将自动更新已有环境中的torch、transformers等库至最新版本无需手动处理版本冲突依赖项需安装xformers、torch、BitsandBytes及triton微调显存要求在使用Unsloth对大语言模型进行微调时出现内存不足错误通常是由于批处理大小设置过高。将批处理大小调整为1、2或3可有效降低显存占用。下表列出了不同参数规模与微调方法下的显存需求其中QLoRA使用4位精度LoRA使用16位精度。所列数据为理论最低值部分模型实际可能需要更多显存。详见Unsloth-requirements。模型参数 QLoRA4位显存 LoRA16位显存3B 3.5GB 8GB7B 5GB 19GB8B 6GB 22GB9B 6.5GB 24GB11B 7.5GB 29GB14B 8.5GB 33GB27B 22GB 64GB32B 26GB 76GB40B 30GB 96GB70B 41GB 164GB81B 48GB 192GB90B 53GB 212GB405B 237GB 950GB2 Unsloth微调教程2.1 模型与训练方法选择优先选择指令模型大语言模型主要分为基座模型Base和指令模型Instruct两类两者均基于文本预测任务进行训练。基座模型通常仅经过预训练和少量通用指令微调指令模型则在基座模型基础上进一步通过大规模指令微调和人类反馈强化学习优化其理解和生成能力。常提到的对话模型Chat Model本质上属于指令模型。选择基座模型还是指令模型通常取决于数据规模、质量与类型1000行以上数据数据量较大时微调基座模型效果更佳。300–1000行高质量数据中等规模高质量数据下微调基座模型或指令模型均可。300行以下数据数据量较小时建议选择指令模型。微调后既能适配特定任务又可保留其内置的指令遵循能力无需额外提示即可响应一般指令除非需大幅改变模型行为。推荐优先从指令模型入手原因包括支持直接使用ChatML、ShareGPT等对话模板进行微调所需数据量更少基座模型需依赖Alpaca、Vicuna等特定模板对数据量要求相对更高。https://medium.com/data-science-in-your-pocket/unsloth-the-fastest-way-to-fine-tune-llms-041bb6a785acUnsloth模型格式在Hugging Face中Unsloth仓库不同后缀代表模型的量化格式或优化版本选择时可参考以下说明名称以unsloth-bnb-4bit 结尾为Unsloth动态4位量化模型。其显存占用略高于标准位量化模型但精度显著更高。名称仅以bnb-4bit 结尾不含unsloth为标准位量化模型。无后缀为原始16位或8位格式。这类模型是官方发布的原始版本但Unsloth会在部分版本中加入对话模板、分词器等重要修复。在此基础上在准备微调时首要决策之一就是选择合适的模型选择与用例匹配的模型例如若进行基于图像的训练可选择Llama 3.2 Vision等视觉模型针对代码数据集则适合选用Qwen Coder 2.5等专用模型。留意授权与要求不同模型可能有特定的授权条款和系统要求务必仔细查看。评估存储、计算能力和数据集可参考Unsloth的显存指南确定目标模型所需的显存配置。数据集的类型会影响模型的选择同时也会决定训练所需的时间。选定模型及参数建议选用最新模型以获得最佳性能和功能。可以通过浏览Unsloth的模型目录及时了解最新且相关的选项。可以将模型名称修改为任意名称只需使其与Hugging Face上Unsloth仓库的模型名称相匹配即可例如 “unsloth/llama-3.1-8b-unsloth-bnb-4bit”。对于初学者建议从诸如unsloth/llama-3.1-8b-unsloth-bnb-4bit之类的小型指令模型入手再逐步探索更多可能性。所有Unsloth支持的模型见Unsloth Models。训练方法的选择LoRA与QLoRA在实施微调时降低计算与内存需求的主流技术主要有以下两种LoRA低秩适配仅微调少量16位的适配器权重矩阵保持原始模型参数基本不变从而显著减少训练过程中需要更新的参数量。QLoRA量化LoRA在LoRA基础上引入模型权重的4位量化可在有限硬件资源下高效微调超大规模模型通过4位精度显著降低内存占用与计算开销。建议从QLoRA入手它是当前高效且易于使用的微调方法之一。借助如Unsloth所采用的动态4位量化技术其精度损失相较于标准的16位LoRA微调已几乎可忽略不计。https://towardsdatascience.com/fine-tune-llama-3-1-ultra-efficiently-with-unsloth-7196c7165bab/已微调的模型可再次多次微调但最佳做法是合并所有数据集一次性完成。若基于已微调模型续训可能改变其此前获得的质量与知识。需注意实验验证至关重要。微调无唯一最佳方法仅有适配不同场景的最佳实践需尝试多种方法与配置才能找到最契合自身数据集及需求的方案。2.2 LoRA和数据集2.2.1 LoRA介绍LoRA提供了众多超参数如学习率、训练轮次等其组合可能达数百万种。合理选择参数对微调至关重要直接影响模型的准确性、稳定性与输出质量。Unsloth基于数百篇研究论文与实验经验总结了这些参数的最佳实践并解析了它们对模型行为的影响。虽然建议直接使用其默认配置但理解这些概念将有助于更全面地掌控整个微调过程。超参数调整的目标是在提升模型准确率的同时避免过拟合或欠拟合。对于大型语言模型如Llama 70B其权重包含数百亿参数通常不会全部参与更新而是采用LoRA等参数高效微调方法。LoRA在每一层旁引入两个小型矩阵A和B仅优化这两个矩阵实际训练参数量通常仅占总量的1%左右。通过冻结原始权重、仅更新新增的适配器参数LoRA显著降低了计算与存储开销同时在多数任务中保持模型性能已成为当前大模型微调的主流方法之一。关于LoRA的详细介绍见LoRA Hyperparameters Guide。以下简要介绍相关参数学习率定义模型训练中每一步的权重更新幅度。较高学习率收敛快但过高易造成训练震荡可能错过最优解。较低学习率训练更稳定、精度高但收敛慢、耗时长虽常被认为易欠拟合实际也可能引发过拟合或阻碍有效学习。常用范围2e-40.0002至 5e-60.000005LoRA/QLoRA微调建议初始值2e-4强化学习推荐5e-6全量微调通常适用更低学习率训练次数Epochs指模型完整遍历训练数据集的次数。轮次过多可能提升训练集上的表现但也容易导致过拟合降低模型泛化能力。轮次过少训练时间短且不易过拟合但若模型未能充分学习数据规律可能造成欠拟合。建议多数指令微调任务建议训练1–3轮。超过3轮后收益递减过拟合风险显著增加。超参数设置其他常用参数如下Hyperparameter 功能说明 推荐值Rank(r) 控制可训练参数数量秩越高能力越强内存占用越大 8,16,32,64,128常用16或32LoRA Alpha(lora_alpha) 用于控制低秩矩阵的缩放系数 通常设为r或2rLoRA Dropout(lora_dropout) 训练时随机丢弃部分激活值防止过拟合 0默认0.1Target Modules(target_modules) 指定添加LoRA的模型模块 q_proj,k_proj,v_proj,o_proj,gate_proj,up_proj,down_proj推荐全部Weight Decay 抑制权重过大提升泛化能力 0.01至0.1Warmup Steps 训练初期逐步提高学习率稳定训练 总步数的5%–10%Scheduler Type 训练过程中调整学习率的方式 linear或cosineSeed 固定随机数种子保证结果可复现 任意整数如42关于LoRA超参数详细介绍可见LoRA、QLoRA、QA-LoRA 原理笔记。作用模块在QLoRA与LoRA的对比中QLoRA采用4-bit精度可降低超过75%的显存占用而LoRA16-bit在精度和速度上略优。根据论文及实验经验建议将LoRA同时作用于注意力层与MLP层如target_modules[q_proj,k_proj,v_proj,o_proj,gate_proj,up_proj,down_proj]以有效提升模型精度。下图对比了不同目标模块配置下LoRA与QLoRA的Rouge分数分数越高越好前三组分别为QLoRA-All将LoRA应用于所有FFN/MLP层和注意力层是本实验中表现最佳的配置。QLoRA-FFN仅在FFN层包括gate_proj, up_proj, down_proj上应用LoRA。QLoRA-Attention仅在注意力层包括q_proj, k_proj, v_proj, o_proj上应用LoRA。https://docs.unsloth.ai/get-started/fine-tuning-llms-guide/lora-hyperparameters-guide梯度累积与批次大小的等效关系较大的有效批次通常能稳定训练而较小的批次可能因梯度方差增大而影响收敛。有效批次大小由以下两个参数共同决定有效批次大小 batch_size × gradient_accumulation_steps以下为Unsloth推荐配置适用于多数微调场景参数 定义 影响 推荐值batch_size 单次前向或反向传播中各GPU处理的样本数 主要影响内存占用 2gradient_accumulation_steps 权重更新前累积梯度的步数 模拟更大批次以节省显存步数增加会延长每轮训练时间 8有效批次大小 实际用于梯度更新的样本总数 影响训练稳定性与性能 162×8https://huggingface.co/docs/trl/main/distributing_training2.2.2 避免过拟合和欠拟合过拟合深度学习模型容易过度记忆训练数据和噪声导致泛化能力下降。当训练损失低于0.2时常提示过拟合模型在未知任务上表现变差。一种简单的缓解方法是LoRA Alpha缩放将每个LoRA矩阵的alpha值乘以0.5。其原理类似于权重平均将基础模型与LoRA权重相加后除以2等同于alpha减半。该方法通过平均化机制抑制过拟合提升模型在未知任务上的泛化性能。其他常用解决方案包括调整学习率过高易引发过拟合训练周期短时尤需注意周期较长可适当提高。建议尝试不同取值以寻优。控制训练轮数通常1–3轮即可避免过度训练。增大权重衰减weight_decay初始建议设为0.01或0.1。启用LoRA Dropout可设为0.1以提高泛化能力。增大批次大小或梯度累积步数有助于提升训练稳定性。扩展数据集结合高质量开源数据与自有数据扩大样本规模。早停机制验证损失连续多轮上升时自动停止训练。权重平均将原始模型与微调后的模型权重相加取平均平滑输出表现。欠拟合过于泛化指模型未能充分学习训练数据中的特征通常因模型复杂度过低或训练不足导致。改进方法包括调整学习率初期可适当提高以加速收敛长期训练则需降低需实验确定最优值。增加训练轮次延长训练时间同时监控验证集损失以防过拟合。提高LoRA秩与alpha值秩建议不低于alpha模型越小或数据越复杂秩应越大通常设为4至64。使用领域相关数据集确保训练数据质量高且与目标任务相关。将批大小设为1增强每次参数更新的强度提高模型对数据的敏感度。2.2.3 训练数据集介绍构建大语言模型训练数据集的关键环节之一是设计恰当的对话模板以利于模型高效处理。关于数据集的详细介绍见Unsloth Datasets Guide。数据格式要求为进行分词处理数据集需采用可被分词器读取的格式。请注意每种数据类型对应不同的格式样式。格式类型 说明 训练类型原始语料 来自网站、书籍或文章等的原始文本 持续预训练CPT指令文本 包含指令及对应输出的示例 监督微调SFT对话记录 用户与AI助手之间的多轮对话 监督微调SFT强化学习数据 用户与AI助手的对话助手回复带有人工/模型/脚本的排序评分 强化学习RL格式化数据在明确数据筛选标准并完成收集后需将数据转换为机器可读的格式以适应不同阶段的模型训练需求。以下从四种核心训练场景出发分别介绍对应的主流数据格式及示例预训练数据格式在模型的继续预训练阶段通常无需对文本结构做特殊设计直接采用原始文本即可。这种无结构化的输入方式有助于模型从连续文本中自然学习语言规律与常识知识。text: 北京烤鸭是中国著名的京菜代表其制作需经过烫皮、挂色、风干、烤制等多道工序成品鸭皮酥脆...指令微调格式为让模型适应特定任务如问答、总结、创作可采用Alpaca风格的指令格式。该格式包含指令任务目标输入任务素材输出预期结果三部分结构清晰便于标注。{Instruction: 为以下城市写一句旅游宣传语,Input: 西安关键词兵马俑、古城墙、大唐不夜城,Output: 穿越秦唐梦回长安——西安等你来探秘}多轮对话格式针对多轮对话场景如客服、聊天助手需保留上下文逻辑常用ShareGPT格式。通过from字段标注角色human为用户gpt为模型value记录发言内容清晰呈现对话流程。{conversations: [{from: human, value: 推荐一道适合初学者的家常菜},{from: gpt, value: 番茄炒蛋简单易学需要我介绍具体步骤吗},{from: human, value: 好的请说明关键步骤和注意事项},{from: gpt, value: 步骤1. 番茄切块鸡蛋打散2. 热油炒蛋后盛出3. 炒番茄至出汁加糖调味4. 混入鸡蛋翻炒。注意火候避免蛋炒老。}]}ChatML格式ChatML格式由OpenAI提出是当前工业界广泛使用的对话格式也被Hugging Face等平台默认支持。它通过role字段定义角色如userassistantsystem用content记录内容结构清晰且兼容性强。{messages: [{role: system, content: 你是一位中文烹饪助手回答需简明实用},{role: user, content: 蒸鱼应该用大火还是小火},{role: assistant, content: 建议大火蒸制时间约8–10分钟这样鱼肉更鲜嫩。}]}合成数据生成为获得理想的微调效果建议数据集不少于100条若追求更优性能推荐使用1000条以上的数据。通常情况下数据量越大效果越好。若原始数据不足可引入合成数据或补充Hugging Face上的相关数据集以增强多样性。请注意微调效果高度依赖数据质量务必做好数据清洗和预处理。生成合成数据时可使用本地大语言模型如Llama 3.3 70B或OpenAI的GPT-4.5。通常更推荐使用参数规模更大的模型以保证生成质量。通过vLLM、Ollama或 llama.cpp等推理引擎可直接生成数据但需手动收集生成结果并优化提示词以扩展内容。合成数据的主要用途包括创造全新数据既可完全从头生成也可基于现有样本进行改写或扩展增强数据多样性避免模型过拟合提升泛化能力完善现有数据例如将文本自动转换为指定格式如将对话转为问答形式。2.3 Qwen3使用示例本文将以Qwen3为例进行模型训练演示。Qwen3由阿里通义千问推出在推理、指令遵循及多语言支持等核心能力上实现行业领先是大语言模型训练的优选架构。Unsloth已于2025年7月完成升级支持最新的Qwen-2507模型。在使用Unsloth运行或微调量化版Qwen模型时几乎无损精度。同时Unsloth为Qwen3原生支持128K上下文长度可一次性处理数万字的长文档或对话该扩展基于YaRN技术将模型原有的40K处理上限提升至128K。优化后模型训练速度提升2倍显存占用降低70%。https://docs.unsloth.ai/models/qwen3-how-to-run-and-fine-tune/qwen3-2507模型版本为帮助开发者根据模型运行、长上下文支持、微调与部署等场景需求选择合适规模的Qwen3模型Unsloth基于其技术能力围绕以下三个维度提供了多种参数规格的版本Dynamic 2.0 GGUF适用于模型运行涵盖0.6B至235B-A22B等多种参数规模支持用户直接运行Qwen3模型适用于常规推理与基础任务场景。128K Context GGUF适用于长上下文处理提供4B到235B-A22B等多个版本重点优化了128K上下文长度的处理能力适用于长文档分析、超长对话及对语义连贯性要求较高的复杂任务。Dynamic 4-bit Safetensor适用于微调与部署覆盖0.6B至32B参数规模采用4位量化的Safetensor格式在保持模型性能的同时显著降低存储与计算资源开销便于进行任务特定微调或生产环境部署。推理参数为达到每秒6个token以上的推理速度Unsloth建议总内存即显存、内存或两者总和不低于所使用模型的大小。即使总内存低于模型大小仍可运行模型但推理速度会降低。根据Qwen官方建议模型推理的推荐设置如下参数 非思考模式Non-ThinkingMode 思考模式ThinkingMode 解释温度Temperature 0.7 0.6 值越低输出越确定最小概率Min_P 0.0可选0.01效果更佳 0.0 仅考虑累积概率达到该值的候选词累积概率Top_P 0.8 0.95 从累积概率前百分之几的候选词中选取候选词数量TopK 20 20 每次只从概率最高的K个词中选择Qwen3对话模板Qwen3系列模型采用ChatML对话模板默认启用思考模式。请注意若使用贪婪解码可能导致模型性能下降或生成内容无限重复。基础对话格式如下|im_start|user\nWhat is 22?|im_end|\n|im_start|assistant\n如需关闭思考模式需插入一对空的think与/think标签格式如下|im_start|user\nWhat is 22?|im_end|\n|im_start|assistant\nthink\n\n/think\n\n示例推理代码下面代码展示通过Unsloth的FastModel类加载Qwen3-0.6B模型并启用4位量化from modelscope import snapshot_downloadfrom unsloth import FastModel# 定义要使用的模型名称这里使用的是Qwen3-0.6B模型model_name Qwen/Qwen3-0.6B# 利用modelscope加速下载模型model_dir snapshot_download(model_name)model, tokenizer FastModel.from_pretrained(model_name model_dir, # 指定模型所在的目录路径max_seq_length 2048, # 设置最大序列长度为2048可以根据需要调整以支持长文本load_in_4bit True, # 启用4位量化以减少内存占用load_in_8bit False, # 禁用8位量化新特性8位量化精度稍高但内存占用是4位的2倍full_finetuning False, # 禁用全参数微调新特性现在支持全参数微调)# 准备模型输入prompt 推荐一部搞笑的科幻电影。# 构造对话消息列表包含用户角色和内容messages [{role: user, content: prompt}]# 应用聊天模板处理消息转换为模型所需的输入格式text tokenizer.apply_chat_template(messages,tokenizeFalse, # 不直接进行token化add_generation_promptTrue, # 添加生成提示enable_thinkingTrue # 启用思考模式默认为True)# 将文本转换为模型输入张量并移动到模型所在设备model_inputs tokenizer([text], return_tensorspt).to(model.device)# 进行文本生成输出为tokengenerated_ids model.generate(**model_inputs, # 解包模型输入max_new_tokens2048 # 最大生成的新token数量)# 提取生成的部分排除输入部分output_ids generated_ids[0][len(model_inputs.input_ids[0]):].tolist()# 解析思考内容try:# 查找特殊标记151668表示思考内容结束的位置index len(output_ids) - output_ids[::-1].index(151668)# 这个结束符就是/think# tokenizer.decode(output_ids[index-1])except ValueError:# 如果未找到特殊标记索引设为0index 0# 解码思考内容特殊标记之前的部分thinking_content tokenizer.decode(output_ids[:index], skip_special_tokensTrue).strip(\n)# 解码回复内容特殊标记之后的部分content tokenizer.decode(output_ids[index:], skip_special_tokensTrue).strip(\n)# 打印思考内容和最终回复内容print(思考内容:, thinking_content)print(回复内容:, content)2.4 Unsloth训练Qwen3教程Qwen3能够同时进行数学推理和常识问答。但如果只用“天空是什么颜色蓝色”这类常识样本训练模型在微调后可能出现能力退化甚至无法正确解答“12×3”这类简单题目。为保持模型的推理能力建议在训练素材中混合使用推理类和非推理类样本。例如可组合75%的思维链样本。如“12×3先算乘法2×36再加1得7”以及25%的常识类样本如直接提供答案的问题。这样模型既能正确回答常识问题也能维持数学推理能力实现两类任务的平衡。https://medium.com/data-and-beyond/a-practical-guide-to-fine-tune-mistral-7b-with-unsloth-for-phishing-email-detection-2faa5b531e27下面将依次介绍如何使用Unsloth加载Qwen3模型并详细讲解数据预处理、模型训练、模型运行及模型保存的完整流程。2.4.1 预训练模型初始化以下代码演示了如何利用Unsloth库加载Qwen3-0.6B模型通过4位精度量化大幅减少内存使用并借助LoRA方法实现高效的参数微调。# 从modelscope库导入snapshot_download函数用于下载模型快照from modelscope import snapshot_download# 从unsloth库导入FastLanguageModel类用于高效加载语言模型from unsloth import FastLanguageModel# 定义要使用的模型名称这里使用的是Qwen3-0.6B模型model_name Qwen/Qwen3-0.6B# 利用modelscope的snapshot_download函数加速下载模型并返回模型保存的目录路径model_dir snapshot_download(model_name)# 使用FastLanguageModel的from_pretrained方法加载预训练模型和分词器model, tokenizer FastLanguageModel.from_pretrained(model_name model_dir, # 模型所在的目录路径max_seq_length 2048, # 上下文长度 - 可以设置更长但会占用更多内存load_in_4bit True, # 以4位精度加载使用更少内存load_in_8bit False, # 以8位精度加载会更准确但占用2倍内存full_finetuning False, # 是否使用全量微调当前设置为否)# 为模型配置LoRA方法model FastLanguageModel.get_peft_model(model,r 32, # LoRA注意力维度可选择任何大于0的值建议8, 16, 32, 64, 128target_modules [q_proj, k_proj, v_proj, o_proj, # 注意力模型和FFN模块gate_proj, up_proj, down_proj,], # 指定要微调的模块lora_alpha 32, # LoRA缩放参数建议设置为与rank相同或rank的2倍lora_dropout 0, # LoRA 层的 dropout 率这里设为 0 以优化性能bias none, # 是否训练偏置这里设为 none 表示不训练# [新特性] unsloth模式可减少30%的VRAM使用支持2倍大的批量大小use_gradient_checkpointing unsloth, # True或unsloth用于超长上下文random_state 0, # 随机种子确保结果可复现use_rslora False, # 是否使用RSLoRAloftq_config None, # 是否使用 LoftQ)2.4.2 数据集加载Qwen3包含推理和非推理两种模式本示例使用以下两个训练数据集推理数据Open Math Reasoning开放数学推理数据集从中采样了10%的可验证推理轨迹这些样本使用了DeepSeek R1且准确率超过95%。从这些数据里Unsloth仅筛出DeepSeek-R1回答、正确率≥95%且每一步都可验证的标准答案再从中随机抽取10%使用。用处专注于数学推理能力的微调数据集包含各种数学问题及其详细解答过程。来源unsloth/OpenMathReasoning-mini样本数量19,252格式包含数学问题、期望答案、问题类型、解答过程等字段特点增强模型的数学推理和思维链Chain-of-Thought能力通用对话数据Maxime Labonne的FineTome-100k数据集其格式为ShareGPT风格已转换为Hugging Face标准的多轮对话格式。用处高质量的指令遵循数据集专为大语言模型微调设计来源mlabonne/FineTome-100k样本数量100,000格式包含对话内容、来源和质量分数特点数据质量高覆盖广泛的指令类型和领域数据处理代码如下from datasets import load_dataset# 数据集下载链接# reasoning_dataset load_dataset(unsloth/OpenMathReasoning-mini, split cot)# non_reasoning_dataset load_dataset(mlabonne/FineTome-100k, split train)# 如果无法直接访问Hugging Face可以使用以下两个命令从镜像网站下载数据集到本地速度也很慢# git clone https://hf-mirror.com/datasets/unsloth/OpenMathReasoning-mini# git clone https://hf-mirror.com/datasets/mlabonne/FineTome-100k# 从本地加载数据集reasoning_dataset load_dataset(./OpenMathReasoning-mini, split cot)non_reasoning_dataset load_dataset(./FineTome-100k, split train)# 查看数据集结构# 特征包含预期答案、题目类型、题目来源、生成模型72B TIR模式下的通过率、题目本身、解答过程、推理模式print(reasoning_dataset)# 特征包含对话、来源、分数print(non_reasoning_dataset)# 将reasoning_dataset转换为对话格式def generate_conversation(examples):problems examples[problem]solutions examples[generated_solution]# 初始化一个空列表用于存储转换后的对话conversations []# 同时遍历问题和解决方案列表将它们配对成对话for problem, solution in zip(problems, solutions):# 为每对问题和解决方案创建一个对话结构# 每个对话包含两个角色的消息用户提问和助手回答conversations.append([{role : user, content : problem}, # 用户角色的消息内容是问题{role : assistant, content : solution}, # 助手角色的消息内容是解决方案])return { conversations: conversations, }# 使用tokenizer将推理数据集转换为模型可理解的对话模板格式# 参数tokenizeFalse表示只进行格式转换不进行分词处理reasoning_conversations tokenizer.apply_chat_template(reasoning_dataset.map(generate_conversation, batched True)[conversations],tokenize False,)print(reasoning_conversations[0])# 接下来处理处理非推理型数据集并同样将其转换为对话格式。# 使用standardize_sharegpt函数对该数据集的格式进行规范化处理。from unsloth.chat_templates import standardize_sharegptdataset standardize_sharegpt(non_reasoning_dataset)non_reasoning_conversations tokenizer.apply_chat_template(dataset[conversations],tokenize False,)print(non_reasoning_conversations[0])# 查看数据集尺寸print(len(reasoning_conversations))print(len(non_reasoning_conversations))# 非推理类数据集规模大的多。希望模型保留一定推理能力训练数据选取75%推理类数据搭配25%对话类数据chat_percentage 0.25import pandas as pdnon_reasoning_subset pd.Series(non_reasoning_conversations)non_reasoning_subset non_reasoning_subset.sample(int(len(reasoning_conversations)*(chat_percentage/(1 - chat_percentage))),random_state 0,)# 打印各类数据量及实际比例用于验证print(len(reasoning_conversations))print(len(non_reasoning_subset))print(len(non_reasoning_subset) / (len(non_reasoning_subset) len(reasoning_conversations)))# 合并推理类数据和抽样后的非推理类数据data pd.concat([pd.Series(reasoning_conversations),pd.Series(non_reasoning_subset)])data.name text # 为合并后的数据系列命名from datasets import Dataset# 将pandas DataFrame转换为Hugging Face数据集格式combined_dataset Dataset.from_pandas(pd.DataFrame(data))# 对数据集进行随机打乱确保数据分布均匀combined_dataset combined_dataset.shuffle(seed 0)2.4.3 模型训练为加快训练速度训练仅迭代30步。若需完整训练可将num_train_epochs设为1并将max_steps设为None以取消步数限制。# trl库是Hugging Face开发的用于通过强化学习来微调与对齐大型语言模型的工具# SFTTrainer用于监督微调训练SFTConfig用于配置训练参数from trl import SFTTrainer, SFTConfigimport torch# 初始化SFTTrainer训练器trainer SFTTrainer(modelmodel,tokenizertokenizer,train_datasetcombined_dataset, # 训练数据集eval_datasetNone, # 评估数据集argsSFTConfig(dataset_text_fieldtext, # 数据集中用于训练的文本字段名称per_device_train_batch_size2, # 每个设备的训练批次大小# 梯度累积步数通过累积梯度来模拟更大的批次大小# 实际等效批次大小 per_device_train_batch_size * gradient_accumulation_stepsgradient_accumulation_steps4,warmup_steps5, # 学习率预热步数逐步增加到设定的学习率# num_train_epochs 1, # 训练轮数注释掉表示不使用轮数限制max_steps30, # 最大训练步数达到后停止训练learning_rate2e-4, # 学习率长时间训练建议降低到2e-5logging_steps1, # 每多少步记录一次日志optimadamw_8bit, # 使用8位AdamW优化器节省内存weight_decay0.01, # 权重衰减系数用于防止过拟合lr_scheduler_typelinear, # 学习率调度器类型此处为线性衰减seed0,report_tonone, # 日志报告工具),)# 获取编号为0的GPU设备属性信息包括名称、总内存等gpu_stats torch.cuda.get_device_properties(0)# 计算当前程序已保留的最大GPU内存也就是PyTorch的CUDA分配器最高向操作系统申请了多少内存start_gpu_memory round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3)# 计算GPU的总内存容量max_memory round(gpu_stats.total_memory / 1024 / 1024 / 1024, 3)# 打印GPU名称和总内存信息print(fGPU {gpu_stats.name}. Max memory {max_memory} GB.)# 打印当前已保留的GPU内存信息print(f{start_gpu_memory} GB of memory reserved.)# 开始训练# resume_from_checkpoint是否从之前保存的检查点恢复训练trainer_stats trainer.train(resume_from_checkpointFalse)# 计算GPU的最大预留内存used_memory round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3)# 计算LoRA训练额外占用的GPU内存used_memory_for_lora round(used_memory - start_gpu_memory, 3)# 计算峰值内存占GPU总内存的百分比used_percentage round(used_memory / max_memory * 100, 3)# 计算LoRA训练占用内存占GPU总内存的百分比保留3位小数lora_percentage round(used_memory_for_lora / max_memory * 100, 3)# 打印训练总耗时print(f{trainer_stats.metrics[train_runtime]} seconds used for training.)# 打印GPU峰值预留内存print(fPeak reserved memory {used_memory} GB.)# 打印训练过程中额外占用的GPU峰值内存print(fPeak reserved memory for training {used_memory_for_lora} GB.)# 打印GPU峰值内存占总内存的百分比print(fPeak reserved memory % of max memory {used_percentage} %.)# 打印LoRA额外占用内存占GPU总内存的百分比print(fPeak reserved memory for training % of max memory {lora_percentage} %.)2.4.4 模型推理推理阶段据Qwen-3团队的建议若用于普通对话任务推荐参数设置为temperature0.7top_p0.8top_k20。若用于推理任务推荐参数设置为temperature0.6top_p0.95top_k20。以下代码对比这两种生成模式。前者直接给结果后者先思考解题步骤再给结果更适合需解释过程的数学问题场景。# 定义对话消息列表包含用户的问题# 这里问题是求解方程 (x 3)^2 0messages [{role: user, content: Solve (x 3)^2 0.}]# 使用tokenizer的聊天模板处理消息# 将消息转换为模型可以理解的格式text tokenizer.apply_chat_template(messages,tokenizeFalse,add_generation_promptTrue,enable_thinkingFalse,)# 导入TextStreamer用于实时流式输出模型生成的内容from transformers import TextStreamer_ model.generate(**tokenizer(text, return_tensorspt).to(cuda),max_new_tokens256, # 最大生成的新token数量控制回答长度temperature0.7,top_p0.8,top_k20,streamerTextStreamer(tokenizer, skip_promptTrue), # 流式输出器跳过提示部分只显示回答)# 再次定义相同的用户问题用于演示思考模式messages [{role: user, content: Solve (x 3)^2 0.}]# 使用聊天模板处理消息这次启用思考模式text tokenizer.apply_chat_template(messages,tokenizeFalse,add_generation_promptTrue,enable_thinkingTrue, # 启用思考模式模型会先思考再给出答案)# 在思考模式下生成回答_ model.generate(**tokenizer(text, return_tensorspt).to(cuda),max_new_tokens1024, # 思考模式需要更多token来容纳思考过程temperature0.6, # 稍低的温度使思考过程更集中top_p0.95, # 更高的核采样参数允许更多样化的思考top_k20, # 同样从概率最高的20个token中选择streamerTextStreamer(tokenizer, skip_promptTrue),)2.4.5 模型保存Unsloth支持两条互补的持久化路线保留LoRA适配器体积最小便于继续微调或增量更新合并并量化导出得到独立权重文件方便直接部署或上传到 Hub。保存LoRA适配器训练完成后只需把模型与分词器以save_pretrained写入同一目录即可model.save_pretrained(lora_model) # 仅保存 LoRA 参数tokenizer.save_pretrained(lora_model)后续加载时用from_pretrained接口指定本地路径Unsloth会自动把基础模型与LoRA权重重新组装from unsloth import FastLanguageModelmodel, tokenizer FastLanguageModel.from_pretrained(model_namelora_model, # 加载lora参数同时加载训练时的基础模型max_seq_length2048,load_in_4bitTrue,)合并后导出用于部署可将LoRA合并到基础模型中并支持将合并后的模型一次性导出为float16、int4或GGUFGPT-Generated Unified Format格式便于在GPU或CPU端侧进行高效推理。GGUF是一种高效的模型存储与交换格式将大模型封装为单一文件具备秒级加载能力。GGUF可直接用于llama.cpp系列工具实现快速部署与应用。# 导出float16完整权重model.save_pretrained_merged(model-f16, tokenizer, save_methodmerged_16bit)# 导出int4量化权重会有精度损失model.save_pretrained_merged(model-int4, tokenizer, save_methodmerged_4bit_forced)# 导出GGUF系列model.save_pretrained_gguf(model-q8, tokenizer) # 默认 Q8_0model.save_pretrained_gguf(model-f16, tokenizer,quantization_methodf16) # 16-bit GGUFmodel.save_pretrained_gguf(model-q4, tokenizer,quantization_methodq4_k_m) # 4-bit GGUF3 参考UnslothUnsloth DocsMulti-GPU-UnslothHow To Fine-tune Run LLMsUnsloth-requirementsUnsloth ModelsLoRA Hyperparameters GuideLoRA、QLoRA、QA-LoRA 原理笔记Unsloth Datasets GuideUnsloth Notebooks本文来自博客园作者落痕的寒假转载请注明原文链接https://www.cnblogs.com/luohenyueji/p/19122249分类: 深度学习, Python, 自然语言处理与语音识别好文要顶 关注我 收藏该文 微信分享落痕的寒假粉丝 - 50 关注 - 0加关注00升级成为会员« 上一篇 [能源化工] 面向锂电池RUL预测的开源项目全景速览» 下一篇 [python] 代码性能分析工具line_profiler使用指北posted 2025-10-01 11:18 落痕的寒假 阅读(566) 评论(0) 收藏 举报