数据集合:
conversational
{"messages": [{"role": "system", "content": "You are..."}, {"role": "user", "content": "..."}, {"role": "assistant", "content": "..."}]}
{"messages": [{"role": "system", "content": "You are..."}, {"role": "user", "content": "..."}, {"role": "assistant", "content": "..."}]}
{"messages": [{"role": "system", "content": "You are..."}, {"role": "user", "content": "..."}, {"role": "assistant", "content": "..."}]}
instruction
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
trlunslothlightning微调 LLM 可以定制其行为,深化其领域专业知识,并优化其针对特定任务的性能。 通过使用专门数据对预训练模型(例如 Llama-3.1-8B)进行精炼,你可以:
将微调想象成将通用模型转化为专业专家。有人争论是否应该使用检索增强生成(RAG)而不是微调, 但微调可以将知识和行为直接整合到模型中,这是 RAG 无法做到的。 在实践中,结合这两种方法能取得最佳效果——带来更高的准确性、更好的可用性和更少的幻觉。
微调可以应用于各种领域和需求。以下是它带来差异的几个实际例子:
微调与检索增强生成:有何不同?
微调几乎可以做检索增强生成能做的一切——但反过来就不行了。在训练过程中,微调将外部知识直接嵌入模型中。 这使得模型能够处理专业查询、总结文档,并在不依赖外部检索系统的情况下保持上下文。 但这并不意味着检索增强生成没有优势,因为它擅长从外部数据库获取最新信息。 事实上,通过微调也可以检索最新数据,但将检索增强生成与微调结合使用效率更高。
微调提供了基础模型或纯检索系统无法提供的若干显著优势:
微调将领域知识深度整合到模型中。这使得它在处理结构化、重复性或细微查询方面非常有效, 而单独使用检索增强生成的系统往往难以应对。换句话说,经过微调的模型成为其训练任务或内容的专家。
经过微调的模型在推理时无需依赖外部数据源。即使连接的检索系统失效或不完整,它仍然可靠, 因为所有所需信息都已经在模型的参数内部。这种自给自足意味着在生产中故障点更少。
经过微调的模型在生成时无需调用外部知识库。跳过检索步骤意味着它们可以更快地生成答案。 这种速度使经过微调的模型成为对时间敏感的应用的理想选择,在这些应用中每一秒都至关重要。
微调允许精确控制模型的沟通方式。这确保模型的响应与品牌的声音保持一致,遵守监管要求,或符合特定的语气偏好。 您将获得一个不仅知道该说什么,而且知道如何以期望的风格表达的模型。
即使在同时使用微调和检索增强生成(RAG)的混合设置中,微调后的模型也能提供可靠的备用方案。 如果检索组件未能找到正确信息或返回错误数据,模型的内置知识仍然可以生成有用的回答。 这保证了您的系统更加一致和稳健的性能。
尽管微调有许多优势,但仍有一些误解存在。让我们来探讨关于微调的两个最常见的误解:
是的,绝对可以。一个常见的误解是微调不会引入新的知识,但实际上它确实会。 如果你的微调数据集包含新的特定领域信息,模型在训练过程中会学习这些内容,并将其纳入其响应中。 实际上,微调可以而且确实能从零开始教会模型新的事实和模式。
许多人认为 RAG 将始终优于微调模型,但在微调得当的情况下,情况并非如此。 事实上,一个经过良好微调的模型在专业任务上往往能与基于 RAG 的系统匹敌,甚至超越它们。 声称“RAG 总是更好”的说法通常源于未正确配置的微调尝试:例如,使用了不正确的 LoRA 参数或训练不足。 这里有一份 Unsloth 关于 LoRA 超参数调优 的指南。
尽管完整微调或预训练可能成本高昂,但这些并非必要(预训练尤其不是必要的)。在大多数情况下,LoRA 或 QLoRA 微调成本极低。
与其在 RAG 和微调之间做选择,不如将两者结合起来以获得最佳效果。将检索系统与微调模型结合能发挥每种方法的优点。原因如下:
在实施微调方面,有两种流行的技术可以显著降低计算和内存需求:LoRA 和 QLoRA。 以下是每种技术的简要比较:
推荐从 QLoRA 开始,因为它是最高效且最易获取的方法之一。得益于 Unsloth 的动态 4 位量化技术, 与标准 16 位 LoRA 微调相比,精度损失现在可以忽略不计。
没有单一的“最佳”微调方法——只有适用于不同场景的最佳实践。重要的是尝试不同的方法和配置, 以找到最适合您的数据集和使用场景的方案。一个很好的起点是 QLoRA(4 位), 它提供了一种非常经济、资源友好的方式来微调模型,而无需复杂的计算要求。
微调没有唯一的“最佳”方法,只有最佳实践。实验是找到适合你需求的关键。
指令模型(Instruct Model)还是基础模型(Base Model)?
在准备微调时,您将面临的一个早期决策是是否使用指令模型或基础模型。
我们建议从 Instruct 模型开始,因为它们允许使用对话式聊天模板(如 ChatML、ShareGPT 等)进行直接微调, 并且与 Base 模型(使用 Alpaca、Vicuna 等)相比,所需数据更少。
"unsloth-bnb-4bit" 结尾的模型名称表示它们是 Unsloth 动态 4 位量化模型。
这些模型比标准的 BitsAndBytes 4 位模型消耗稍多一些 VRAM,但提供了显著更高的准确性。"bnb-4bit" 结尾,且不包含 "unsloth",则表示它是指标准的 BitsAndBytes 4 位量化。指令模型是预先使用内置指令进行训练的,因此无需微调即可直接使用。 这些模型包括 GGUF 和其他常见模型,它们针对直接使用进行了优化,能够立即有效地响应提示。 指令模型可与 ChatML 或 ShareGPT 等对话式聊天模板配合使用。
另一方面,基础模型是未经指令微调的原始预训练版本。这些模型专门设计用于通过微调进行定制, 允许您根据独特需求进行调整。基础模型兼容 Alpaca 或 Vicuna 等指令式模板, 但通常不支持开箱即用的对话式聊天模板。
这个决定通常取决于你的数据数量、质量和类型:
如果你是初学者,最好从 Llama 3.1(8B)等小型指令模型开始,并在此基础上进行实验。 你还需要在 QLoRA 和 LoRA 训练之间做出选择:
还有其他可以切换的设置:
max_seq_length = 2048:控制上下文长度。
dtype = None:默认为 None;对于较新的 GPU,请使用 torch.float16 或 torch.bfloat16。load_in_4bit = True:启用 4 位(4-bit)量化,将内存使用减少 4 倍以进行微调。
禁用它允许启用 LoRA 16 位微调。full_finetuning = True。对于 8 位(8-bit)微调,
请设置 load_in_8bit = True。注意:一次只能将一种训练方法设置为 True。我们推荐从 QLoRA 开始,因为它是最易于使用且最有效的模型训练方法之一。 我们动态的 4 位量化技术,现在已基本恢复了 QLoRA 相比 LoRA 的精度损失。
您也可以使用 Unsloth 进行文本到语音(TTS)、推理(GRPO)、视觉、强化学习(DPO、ORPO、KTO)、 持续预训练、文本补全以及其他训练方法。
对于 LLMs,数据集是可用于训练我们模型的数据集合。为了能用于训练,文本数据需要是可分词的格式。
Learning Rate: 定义模型权重每一步训练的调整量。
1e-4(0.0001) 至 5e-5(0.00005)。Epochs: 模型完整看到训练数据集的次数。
过于专业
模型记住了训练数据,无法泛化到未见过的输入。解决方案:
过于泛化
尽管不常见,欠拟合是指低秩模型由于缺乏可学习参数而无法泛化,因此您的模型可能无法从训练数据中学习。解决方案:
rank 和 alpha。alpha 应至少等于 rank 数,而 rank 对于较小的模型/更复杂的数据集应更大;
它通常在 4 到 64 之间。一旦所有设置完成,就可以开始训练了!如果遇到问题,记得你可以随时调整超参数、数据集等。
训练过程中你会看到一些数字的日志!这是训练损失,你的任务是调整参数使它尽可能接近 0.5! 如果你的微调没有达到 1、0.8 或 0.5,你可能需要调整一些数值。如果损失变为 0,那可能也不是一个好迹象!
我们通常建议保持默认设置,除非你需要更长时间的训练或更大的批量大小。
per_device_train_batch_size = 2:增加以提升 GPU 利用率,但需注意因填充导致的训练速度变慢。
相反,增加 gradient_accumulation_steps 以实现更平滑的训练。gradient_accumulation_steps = 4:模拟更大的批处理大小,而不会增加内存使用。max_steps = 60:加速训练。对于完整运行,替换为 num_train_epochs = 1 (建议 1-3 个 epoch 以避免过拟合)。learning_rate = 2e-4:降低以实现更慢但更精确的微调。尝试 1e-4、5e-5 或 2e-5 等值。为了评估,你可以通过直接与模型聊天来进行手动评估,看看是否符合你的喜好。
你也可以启用 Unsloth 的评估功能,但要注意,这可能会根据数据集的大小而耗时。
为了加快评估速度,你可以:减少评估数据集的大小或设置 evaluation_steps = 100。
对于测试,你也可以取你训练数据的 20% 来用于测试。如果你已经用完了所有训练数据,那么你就需要手动评估它。 你也可以使用自动评估工具,如 EleutherAI 的 lm-evaluation-harness。 要注意的是,自动化工具可能无法完全符合你的评估标准。
现在让我们在完成训练过程后运行模型!你可以编辑黄色下划线部分!实际上, 因为我们创建了一个多轮聊天机器人,我们现在也可以像它过去看到一些对话那样调用模型,如下所示:
提醒 Unsloth 本身也提供了原生 2 倍的推理速度,所以永远不要忘记调用 FastLanguageModel.for_inference(model)。
如果你想让模型输出更长的响应,将 max_new_tokens = 128 设置为 256 或 1024 等更大的数字。
请注意,你也需要等待更长时间才能得到结果!
为了在 Ollama、vLLM、Open WebUI 等期望的推理引擎中保存和使用您的模型,我们这里可以提供更多信息:
现在我们可以将微调后的模型保存为一个名为 LoRA 适配器的 100MB 小文件,如下所示。 如果您想上传您的模型,也可以将其推送到 Hugging Face Hub! 记得通过 https://huggingface.co/settings/tokens 获取 Hugging Face 令牌并添加您的令牌!
保存模型后,我们再次可以使用 Unsloth 来运行模型!使用 FastLanguageModel 再次调用它进行推理!
大模型参数高效微调技术原理综述
模型参数高效微调技术实战
$ uv pip install llama-stack
$ uv pip install llama-stack -U
$ llama model list
$ llama model list --show all
$ llama model download --source meta --model-id MODEL_ID
当脚本需要输入唯一的字定义 URL 时,粘贴 URL .env/Llama_model_url。
数据集合:
conversational
{"messages": [{"role": "system", "content": "You are..."}, {"role": "user", "content": "..."}, {"role": "assistant", "content": "..."}]}
{"messages": [{"role": "system", "content": "You are..."}, {"role": "user", "content": "..."}, {"role": "assistant", "content": "..."}]}
{"messages": [{"role": "system", "content": "You are..."}, {"role": "user", "content": "..."}, {"role": "assistant", "content": "..."}]}
instruction
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
trlunslothlightning微调 LLM 可以定制其行为,深化其领域专业知识,并优化其针对特定任务的性能。 通过使用专门数据对预训练模型(例如 Llama-3.1-8B)进行精炼,你可以:
将微调想象成将通用模型转化为专业专家。有人争论是否应该使用检索增强生成(RAG)而不是微调, 但微调可以将知识和行为直接整合到模型中,这是 RAG 无法做到的。 在实践中,结合这两种方法能取得最佳效果——带来更高的准确性、更好的可用性和更少的幻觉。
微调可以应用于各种领域和需求。以下是它带来差异的几个实际例子:
微调与检索增强生成:有何不同?
微调几乎可以做检索增强生成能做的一切——但反过来就不行了。在训练过程中,微调将外部知识直接嵌入模型中。 这使得模型能够处理专业查询、总结文档,并在不依赖外部检索系统的情况下保持上下文。 但这并不意味着检索增强生成没有优势,因为它擅长从外部数据库获取最新信息。 事实上,通过微调也可以检索最新数据,但将检索增强生成与微调结合使用效率更高。
微调提供了基础模型或纯检索系统无法提供的若干显著优势:
微调将领域知识深度整合到模型中。这使得它在处理结构化、重复性或细微查询方面非常有效, 而单独使用检索增强生成的系统往往难以应对。换句话说,经过微调的模型成为其训练任务或内容的专家。
经过微调的模型在推理时无需依赖外部数据源。即使连接的检索系统失效或不完整,它仍然可靠, 因为所有所需信息都已经在模型的参数内部。这种自给自足意味着在生产中故障点更少。
经过微调的模型在生成时无需调用外部知识库。跳过检索步骤意味着它们可以更快地生成答案。 这种速度使经过微调的模型成为对时间敏感的应用的理想选择,在这些应用中每一秒都至关重要。
微调允许精确控制模型的沟通方式。这确保模型的响应与品牌的声音保持一致,遵守监管要求,或符合特定的语气偏好。 您将获得一个不仅知道该说什么,而且知道如何以期望的风格表达的模型。
即使在同时使用微调和检索增强生成(RAG)的混合设置中,微调后的模型也能提供可靠的备用方案。 如果检索组件未能找到正确信息或返回错误数据,模型的内置知识仍然可以生成有用的回答。 这保证了您的系统更加一致和稳健的性能。
尽管微调有许多优势,但仍有一些误解存在。让我们来探讨关于微调的两个最常见的误解:
是的,绝对可以。一个常见的误解是微调不会引入新的知识,但实际上它确实会。 如果你的微调数据集包含新的特定领域信息,模型在训练过程中会学习这些内容,并将其纳入其响应中。 实际上,微调可以而且确实能从零开始教会模型新的事实和模式。
许多人认为 RAG 将始终优于微调模型,但在微调得当的情况下,情况并非如此。 事实上,一个经过良好微调的模型在专业任务上往往能与基于 RAG 的系统匹敌,甚至超越它们。 声称“RAG 总是更好”的说法通常源于未正确配置的微调尝试:例如,使用了不正确的 LoRA 参数或训练不足。 这里有一份 Unsloth 关于 LoRA 超参数调优 的指南。
尽管完整微调或预训练可能成本高昂,但这些并非必要(预训练尤其不是必要的)。在大多数情况下,LoRA 或 QLoRA 微调成本极低。
与其在 RAG 和微调之间做选择,不如将两者结合起来以获得最佳效果。将检索系统与微调模型结合能发挥每种方法的优点。原因如下:
在实施微调方面,有两种流行的技术可以显著降低计算和内存需求:LoRA 和 QLoRA。 以下是每种技术的简要比较:
推荐从 QLoRA 开始,因为它是最高效且最易获取的方法之一。得益于 Unsloth 的动态 4 位量化技术, 与标准 16 位 LoRA 微调相比,精度损失现在可以忽略不计。
没有单一的“最佳”微调方法——只有适用于不同场景的最佳实践。重要的是尝试不同的方法和配置, 以找到最适合您的数据集和使用场景的方案。一个很好的起点是 QLoRA(4 位), 它提供了一种非常经济、资源友好的方式来微调模型,而无需复杂的计算要求。
微调没有唯一的“最佳”方法,只有最佳实践。实验是找到适合你需求的关键。
指令模型(Instruct Model)还是基础模型(Base Model)?
在准备微调时,您将面临的一个早期决策是是否使用指令模型或基础模型。
我们建议从 Instruct 模型开始,因为它们允许使用对话式聊天模板(如 ChatML、ShareGPT 等)进行直接微调, 并且与 Base 模型(使用 Alpaca、Vicuna 等)相比,所需数据更少。
"unsloth-bnb-4bit" 结尾的模型名称表示它们是 Unsloth 动态 4 位量化模型。
这些模型比标准的 BitsAndBytes 4 位模型消耗稍多一些 VRAM,但提供了显著更高的准确性。"bnb-4bit" 结尾,且不包含 "unsloth",则表示它是指标准的 BitsAndBytes 4 位量化。指令模型是预先使用内置指令进行训练的,因此无需微调即可直接使用。 这些模型包括 GGUF 和其他常见模型,它们针对直接使用进行了优化,能够立即有效地响应提示。 指令模型可与 ChatML 或 ShareGPT 等对话式聊天模板配合使用。
另一方面,基础模型是未经指令微调的原始预训练版本。这些模型专门设计用于通过微调进行定制, 允许您根据独特需求进行调整。基础模型兼容 Alpaca 或 Vicuna 等指令式模板, 但通常不支持开箱即用的对话式聊天模板。
这个决定通常取决于你的数据数量、质量和类型:
如果你是初学者,最好从 Llama 3.1(8B)等小型指令模型开始,并在此基础上进行实验。 你还需要在 QLoRA 和 LoRA 训练之间做出选择:
还有其他可以切换的设置:
max_seq_length = 2048:控制上下文长度。
dtype = None:默认为 None;对于较新的 GPU,请使用 torch.float16 或 torch.bfloat16。load_in_4bit = True:启用 4 位(4-bit)量化,将内存使用减少 4 倍以进行微调。
禁用它允许启用 LoRA 16 位微调。full_finetuning = True。对于 8 位(8-bit)微调,
请设置 load_in_8bit = True。注意:一次只能将一种训练方法设置为 True。我们推荐从 QLoRA 开始,因为它是最易于使用且最有效的模型训练方法之一。 我们动态的 4 位量化技术,现在已基本恢复了 QLoRA 相比 LoRA 的精度损失。
您也可以使用 Unsloth 进行文本到语音(TTS)、推理(GRPO)、视觉、强化学习(DPO、ORPO、KTO)、 持续预训练、文本补全以及其他训练方法。
对于 LLMs,数据集是可用于训练我们模型的数据集合。为了能用于训练,文本数据需要是可分词的格式。
Learning Rate: 定义模型权重每一步训练的调整量。
1e-4(0.0001) 至 5e-5(0.00005)。Epochs: 模型完整看到训练数据集的次数。
过于专业
模型记住了训练数据,无法泛化到未见过的输入。解决方案:
过于泛化
尽管不常见,欠拟合是指低秩模型由于缺乏可学习参数而无法泛化,因此您的模型可能无法从训练数据中学习。解决方案:
rank 和 alpha。alpha 应至少等于 rank 数,而 rank 对于较小的模型/更复杂的数据集应更大;
它通常在 4 到 64 之间。一旦所有设置完成,就可以开始训练了!如果遇到问题,记得你可以随时调整超参数、数据集等。
训练过程中你会看到一些数字的日志!这是训练损失,你的任务是调整参数使它尽可能接近 0.5! 如果你的微调没有达到 1、0.8 或 0.5,你可能需要调整一些数值。如果损失变为 0,那可能也不是一个好迹象!
我们通常建议保持默认设置,除非你需要更长时间的训练或更大的批量大小。
per_device_train_batch_size = 2:增加以提升 GPU 利用率,但需注意因填充导致的训练速度变慢。
相反,增加 gradient_accumulation_steps 以实现更平滑的训练。gradient_accumulation_steps = 4:模拟更大的批处理大小,而不会增加内存使用。max_steps = 60:加速训练。对于完整运行,替换为 num_train_epochs = 1 (建议 1-3 个 epoch 以避免过拟合)。learning_rate = 2e-4:降低以实现更慢但更精确的微调。尝试 1e-4、5e-5 或 2e-5 等值。为了评估,你可以通过直接与模型聊天来进行手动评估,看看是否符合你的喜好。
你也可以启用 Unsloth 的评估功能,但要注意,这可能会根据数据集的大小而耗时。
为了加快评估速度,你可以:减少评估数据集的大小或设置 evaluation_steps = 100。
对于测试,你也可以取你训练数据的 20% 来用于测试。如果你已经用完了所有训练数据,那么你就需要手动评估它。 你也可以使用自动评估工具,如 EleutherAI 的 lm-evaluation-harness。 要注意的是,自动化工具可能无法完全符合你的评估标准。
现在让我们在完成训练过程后运行模型!你可以编辑黄色下划线部分!实际上, 因为我们创建了一个多轮聊天机器人,我们现在也可以像它过去看到一些对话那样调用模型,如下所示:
提醒 Unsloth 本身也提供了原生 2 倍的推理速度,所以永远不要忘记调用 FastLanguageModel.for_inference(model)。
如果你想让模型输出更长的响应,将 max_new_tokens = 128 设置为 256 或 1024 等更大的数字。
请注意,你也需要等待更长时间才能得到结果!
为了在 Ollama、vLLM、Open WebUI 等期望的推理引擎中保存和使用您的模型,我们这里可以提供更多信息:
现在我们可以将微调后的模型保存为一个名为 LoRA 适配器的 100MB 小文件,如下所示。 如果您想上传您的模型,也可以将其推送到 Hugging Face Hub! 记得通过 https://huggingface.co/settings/tokens 获取 Hugging Face 令牌并添加您的令牌!
保存模型后,我们再次可以使用 Unsloth 来运行模型!使用 FastLanguageModel 再次调用它进行推理!
大模型参数高效微调技术原理综述
模型参数高效微调技术实战
$ uv pip install llama-stack
$ uv pip install llama-stack -U
$ llama model list
$ llama model list --show all
$ llama model download --source meta --model-id MODEL_ID
当脚本需要输入唯一的字定义 URL 时,粘贴 URL .env/Llama_model_url。