使用 Unsloth 高效微调 LLAMA-3.1:优化数据、速度和成本
使用Unsloth的高效微调技术优化您的LLAMA-3.1模型。了解如何利用LoRA和QLoRA实现更快的训练、更低的VRAM需求和更出色的模型性能。探索超参数对您的微调模型的影响。体验Unsloth的聊天界面,与您的定制LLM进行无缝交互。
2025年2月15日

利用LLAMA-3.1的强大功能进行微调,这是适应您特定需求的最简单方法。发现如何使用Unsloth的尖端技术(包括LoRa和QLoRa)高效训练您自己的LLAMA-3.1模型,并仅使用最少的GPU资源即可取得出色的结果。本博客文章提供了一步一步的指南,帮助您最大限度地发挥数据的潜力,并创建一个满足您独特需求的定制语言模型。
训练的不同阶段:预训练、有监督微调和偏好对齐
有监督微调技术:完全微调、LoRA和QLoRA
设置LoRA采用者:秩、LoRA Alpha和LoRA Dropout
数据准备:提示模板和序列结束标记
使用SFT Trainer训练模型
推理和流式处理
保存、加载和微调模型
Unsloth的新聊天界面
训练的不同阶段:预训练、有监督微调和偏好对齐
训练的不同阶段:预训练、有监督微调和偏好对齐
大型语言模型的训练通常有三个不同的阶段:
-
预训练: 在这个阶段,模型被训练在大量的原始文本数据上,学习如何预测下一个词或标记。结果是一个基础模型,已经从文本中获得了大量的一般知识,但还不太适用于特定任务。
-
监督微调: 为了使基础模型更有用,第二个阶段是监督微调。在这个阶段,模型被训练在问答对或指令-答案对上。输入是一个问题或指令,输出是所需的响应或答案。这个阶段允许模型学习任务特定的知识和能力。
-
偏好对齐: 可选的第三个阶段是偏好对齐,在这里模型被训练去学习用户偏好的响应,或者将模型对准某些原则。这通常使用强化学习从人类反馈(RLHF)或辩论策略优化(DPO)等技术完成。
这个视频的目标是集中在监督微调阶段,特别是如何使用Unsloth库微调Llama 3.1模型。视频将涵盖不同的微调技术,如全面微调、LoRA和QLoRA,并讨论它们在性能和内存需求方面的权衡。
有监督微调技术:完全微调、LoRA和QLoRA
有监督微调技术:完全微调、LoRA和QLoRA
监督微调有三种流行的选择:
-
全面微调: 在这种方法中,你会取原始模型并用指令微调数据集更新权重。这将给你最好的性能,但VRAM需求会很高。
-
LoRA (低秩自适应): 不直接更新权重,而是向模型添加外部适配器。这些外部适配器的参数数量可以控制。这些适配器的权重更新以16位精度进行,然后合并回原始模型权重。这种方法提供了快速训练,但由于16位操作仍然代价高昂。
-
QLoRA (量化LoRA): 这与LoRA类似,但权重更新以4位精度进行,模型权重也保持在4位。这需要更少的VRAM,但性能可能不如LoRA或全面微调。
Unsloth支持LoRA和QLoRA进行微调。LoRA适配器的秩、LoRA alpha和LoRA dropout是控制参数数量和适配器对最终模型权重贡献的重要超参数。
设置LoRA采用者:秩、LoRA Alpha和LoRA Dropout
设置LoRA采用者:秩、LoRA Alpha和LoRA Dropout
设置LoRA适配器需要考虑几个关键参数:
-
秩: LoRA适配器的秩控制在微调期间将被更新的参数数量。较低的秩意味着更少的参数,这减少了VRAM需求,但也可能限制模型的适应能力。相反,较高的秩允许更大的灵活性,但需要更多的VRAM。
-
LoRA Alpha: 这个参数控制LoRA适配器对最终模型权重的贡献。较高的LoRA Alpha值意味着LoRA适配器将有更强的影响力,而较低的值意味着它们将有更弱的影响力。
-
LoRA Dropout: 这个参数控制训练期间应用于LoRA适配器的dropout率。增加dropout率可以帮助防止过拟合,但也可能降低模型的性能。
通过调整这些参数,你可以为你的特定用例找到VRAM需求、训练速度和模型性能之间的平衡。
数据准备:提示模板和序列结束标记
数据准备:提示模板和序列结束标记
为了准备微调数据,我们需要设置提示模板并指定序列结束标记。
提示模板是关键,因为它定义了模型将被训练的输入数据的格式。对于Llama 3.1系列,我们将使用Alpaca提示模板,其中包括一个指令和一个提供更多上下文的输入。模型然后被期望生成一个合适的响应。
# Alpaca提示模板
prompt_template = "Below is an instruction that describes a task paired with an input that provides further context. Respond with a relevant output.\n\nInstruction: {instruction}\nInput: {input}\nOutput:"
此外,我们需要指定序列结束标记,以防止模型无限期地生成文本。这是一个重要的步骤,许多人在使用量化版本的模型与LamaCPP时都遇到过问题。
# 设置序列结束标记
end_token = "</s>"
通过设置提示模板和序列结束标记,我们确保数据格式正确,这是实现良好结果的关键步骤。
使用SFT Trainer训练模型
使用SFT Trainer训练模型
为了训练模型,我们将使用Hugging Face创建和维护的TRL包中的SFT(监督微调)训练器。
首先,我们向SFT训练器提供我们的模型、分词器和数据集。在这种情况下,我们使用数据集的text
列,因为我们已经设置了使用这个字段的提示模板。
我们还设置了最大序列长度,这应该基于训练数据中的示例。请记住,较高的序列长度将增加VRAM需求。
接下来,我们配置训练参数,如设备(在这种情况下是Google Colab上的T4 GPU,约15GB VRAM)和训练步数。
最后,我们运行训练器,你可以观察到损失的下降,这是训练进度的良好指标。
训练大约需要8分钟,峰值保留内存约为8GB,占T4 GPU可用VRAM的53%左右。这展示了Unsloth方法的效率,允许使用相对较低的VRAM要求进行微调。
推理和流式处理
推理和流式处理
为了进行推理,我们可以使用FastLanguageModel
类上的for_inference
类或方法。我们需要提供训练好的模型和Alpaca格式的输入提示。我们也可以设置生成的最大新标记数。
# 执行推理
input_prompt = alpaca_prompt(instruction, input)
output = model.for_inference(input_prompt, max_new_tokens=256)
print(output)
要启用流式传输,我们可以创建一个Streamer
对象并将其传递给for_inference
方法。这将逐个令牌地显示响应。
# 启用流式传输
streamer = Streamer()
output = model.for_inference(input_prompt, max_new_tokens=256, streamer=streamer)
有了这些,你现在可以对你微调的模型进行推理,甚至启用流式传输以获得更加互动的体验。
保存、加载和微调模型
保存、加载和微调模型
要保存微调后的模型和分词器,你可以使用模型和分词器上的save_pretrained()
函数:
model.save_pretrained("path/to/save/model")
tokenizer.save_pretrained("path/to/save/tokenizer")
这将把模型权重和分词器保存到指定的目录中,格式为一组JSON文件。
要加载保存的模型和分词器,你可以使用同样的FastLanguageModel
类,并提供本地目录:
model = FastLanguageModel.from_pretrained("path/to/save/model")
tokenizer = FastLanguageModel.from_pretrained("path/to/save/tokenizer")
这将从保存的文件中加载模型和分词器。
Unsloth的另一个很棒的功能是能够以不同的格式保存模型,如16位浮点精度的VLLM或直接的GGUF格式用于LamaCPP。这允许轻松部署和集成到各种平台和框架中。
Unsloth还引入了一个基于Gradio的新UI,允许你运行使用Unsloth训练的模型并进行交互式聊天会话。你可以克隆Unsloth Studio存储库并运行提供的Colab笔记本来体验这个功能。
Unsloth的新聊天界面
Unsloth的新聊天界面
Unsloth引入了一个基于Radish库的新聊天UI,允许你轻松地与使用Unsloth训练的语言模型进行交互。这个聊天UI提供了一个用户友好的界面,用于与模型聊天并探索其功能。
要使用聊天UI,你可以克隆Unsloth studio存储库并运行提供的Google Colab笔记本。这将设置必要的环境并启动聊天UI,在那里你可以开始与语言模型对话。
聊天UI支持流式响应等功能,允许你在生成时观察模型的输出。这对于观察模型的思维过程和响应生成很有用。
此外,Unsloth的聊天UI使你能够保存和加载微调的模型,方便你继续使用定制的语言模型。你还可以以各种格式导出模型,如16位浮点精度的VLLM或GGUF格式的LamaCPP,提供灵活性来使用和部署你的模型。
总的来说,Unsloth的新聊天UI是一个有价值的工具,用于与使用Unsloth框架训练的语言模型进行交互和探索其功能。
FAQ
FAQ