详细摘要 摘要

生成:2025-05-31 19:51

摘要详情

音频文件
Trelis Research | Fine tune Gemma 3, Qwen3, Llama 4, Phi 4 and Mistral Small with Unsloth and Transformers
摘要类型
详细摘要
LLM 提供商
openai
LLM 模型
gemini-2.5-pro-exp-03-25
已创建
2025-05-31 19:51:19

概览/核心摘要 (Executive Summary)

该内容详细介绍了如何使用 Unsloth 和 Transformers 对 Gemma 3、Qwen3、Llama 4、Phi 4 和 Mistral Small 等最新开源大语言模型进行微调。演讲者首先阐述了微调的适用场景,如改善答案结构、工具调用能力、答案风格一致性、提升RAG效果及特定领域推理能力,并强调微调通常是最后的手段。数据准备被认为是微调成功的关键,建议花费80-90%以上的时间,推荐使用LLM生成包含问题、评估标准和答案的合成数据进行后训练,而非持续预训练。

内容重点对比了 Unsloth(Transformers的封装器)和 Transformers 在微调方面的优劣:Unsloth 速度快2倍、统一加载多模态模型,但目前仅支持单GPU且高级修改较难;Transformers 支持多GPU、更易高级修改但模型加载函数各异。评估方面,推荐使用 vLLM 进行快速评估,其速度远超 Unsloth 和 Transformers,但需重新加载模型。

针对模型选择,演讲者给出了建议顺序:Mistral Small (Apache 2)、Gemma 3 (自定义许可证)、Phi 4 (MIT, 适合推理)、Llama 4 (自定义许可证, 过大)、Qwen3 (Apache 2, 性能强但有审查和后门风险)。通用微调技巧包括准备训练集和评估集(含部分训练数据)以监控过拟合,并在微调前后进行评估,同时注意检查和修改聊天模板。

演示环节详细展示了使用 Unsloth 和 Transformers(针对 Phi 4 Mini 模型)进行微调和评估的完整流程,包括环境设置 (RunPod)、依赖安装、使用 vLLM 进行基线评估、模型加载、LoRA 适配器配置、数据格式化、训练器设置、仅针对模型回答部分进行训练,以及解决实际操作中遇到的问题(如 Phi 4 Mini 与 Unsloth/vLLM 的兼容性问题,通过禁用 torch compile 或切换到 Transformers 解决)。最终,通过微调,Phi 4 Mini 模型在特定问答任务上的表现得到了提升。

为何进行微调?

微调通常是在尝试了提示工程 (prompt engineering) 和检索增强生成 (RAG) 等方法后,仍需提升模型性能时的最后手段。主要目的包括:

  • 改善答案结构和格式:使模型能按特定方式回顾信息、处理、推理并给出结构化答案。
  • 改进工具调用能力:生成结构化响应以调用辅助工具。
  • 提升答案风格或格式的一致性:让模型更稳定地以特定风格输出。
  • 提高超越单纯RAG的答案准确性:结合微调与RAG可以获得更优性能。
  • 改进特定领域的推理能力:例如使用 GRPO (Group Relative Policy Optimization) 等技术,尤其在2024年末和2025年初成为趋势。

演讲者提到,本次主要关注通用微调以增强知识,而非结构化输出(如JSON响应或函数调用,有其他视频专门介绍)。

如何准备微调数据?

数据准备被强调为微调过程中最耗时的部分(建议投入80-90%以上时间)。

  • 两种训练类型
    • 持续预训练 (Continued Pre-training):使用原始数据(如杂志、书籍)。不推荐直接在现有指令微调模型上进行,除非数据量巨大且后续会进行后训练 (post-training),因为它可能破坏模型已有的指令遵循能力。
    • 后训练 (Post-training):使用问答或任务型数据。推荐此方法,尤其在数据量较少时(如最多百万词级别)。
  • 准备合成数据
    • 使用大型语言模型 (LLM) 从文档生成广泛的问答对。
    • 理想情况下,应生成:问题、评估标准(正确答案的标准)、高质量答案
    • 可选择性地增强问答数据以生成思维链 (Chain-of-Thought) 或推理数据。
  • 重要注意事项
    • 演讲者有约75%的把握认为:“随着模型变得越来越强大,微调可能会变得更加困难,因为您可能会无意中破坏模型已有的‘良好’训练。”
    • 例如,对一个推理能力强的模型进行不含推理数据的微调,可能会降低其原有的推理性能。
    • 在口头表达领域进行推理微调尤其棘手,若无合适的推理数据集,可能导致性能倒退。

Unsloth 与 Transformers 对比

Unsloth 是 Transformers 的一个封装器,带来了显著改进,但也各有优劣。

特性 Unsloth (Transformers 封装器) Transformers
速度 通常比 Transformers 快2倍 (通过多种技巧累积实现)。 相对较慢。
多模态模型加载 提供统一的函数加载模型 (如 Gemma 3)。 加载不同模型(尤其多模态)可能需要不同的导入函数。
GPU 支持 目前仅限单 GPU。 支持多 GPU (默认使用模型并行,效率不高但简单鲁棒;也支持 FSDP)。
高级修改 由于是封装器,进行某些晦涩功能的修改可能更困难。 更容易进行高级修改,因其非封装器,文档和AI辅助编码资源更丰富。
更新/兼容性 可能滞后于 Transformers 的更新。 -
特定模型问题 曾提及 Gemma 3 的配置文件问题导致无法在 vLLM 上运行推理 (预计会修复)。 -
易用性 简化了使用。 相对复杂。
量化微调 支持8位量化微调 (演讲者不推荐4位QMoRA,因合并适配器时性能差异难预测)。 - (未直接对比,但Transformers生态支持多种量化)
  • GPU备注:演讲者提到像 NVIDIA B200 (192GB VRAM,视频中口误为180GB) 这样的大显存GPU,即使单卡也能容纳非常大的模型(如8位量化下1500亿参数模型,或16位量化下700-800亿参数模型)。Llama 4 Maverick 版可能无法单卡容纳,但 Scout 版 (约1000亿参数) 8位量化可以。DeepSeek 这类巨型模型微调本身就困难。

演讲者通常推荐16位微调,其次是8位。

如何进行快速评估 (vLLM)

评估应在微调前、中、后进行。

  • 评估工具选项
    • Transformers/Unsloth 直接推理:速度慢,因为它们不是为推理优化的,不进行连续批处理 (continuous batching)。
    • vLLM (或 SGLang):速度快得多,可能比 Unsloth 快4倍以上,支持连续批处理。
  • 建议
    • 如果评估集较大,强烈建议使用 vLLM 进行评估
    • 脚本中通常包含两部分:使用 vLLM 的评估部分,和使用 Unsloth/Transformers 的微调部分。
  • 缺点
    • 使用 vLLM 评估需要在 Unsloth/Transformers 微调后重新加载模型到 vLLM。对于大模型,加载可能耗时,但单GPU情况下此约束不大。

选择哪个模型进行微调?

演讲者按偏好顺序列出并评论了几个模型:

  1. Mistral Small (<30B 参数)
    • 许可证: Apache 2.0
    • 评价: 推荐。性能强劲,客户反馈良好。
  2. Gemma 3
    • 许可证: 自定义许可证 (可能给大公司带来审批流程上的额外麻烦)。
    • 评价: 非常强大的模型,第二选择。
  3. Phi 4 (Microsoft)
    • 许可证: MIT (宽松许可证)。
    • 评价: 支持推理。若要微调推理能力,是不错的选择。 (视频中演示了 Phi 4 Mini Instruct)
  4. Llama 4
    • 许可证: 自定义许可证。
    • 评价: 模型过大 (Scout版100B参数),其质量提升相较于 Gemma 3 (27B) 或 Mistral 可能不成比例。不优先推荐
  5. Qwen3
    • 许可证: Apache 2.0
    • 评价: 性能可能强于上述所有模型,适合微调推理。
    • 担忧: 存在较强的审查机制和潜在的后门风险 (尤其考虑到模型可能用于控制智能体)。微调非推理任务可能较困难。

通用微调技巧

  • 数据准备是核心:花费 80%或90%以上 的时间在数据准备上。
  • 定义两个评估数据集
    • 一个具有代表性且未在训练中使用的数据集 (可通过改写问题等方式确保与训练集不同)。
    • 一个具有代表性且已在训练中使用的数据集 (部分训练数据的逐字副本)。
  • 监控过拟合:在微调期间,使用训练集和评估集的损失 (loss) 来监控模型是否过拟合。比较两个评估数据集的表现差异也有助于判断。
  • 微调前后评估:确保在微调前后都进行性能评估。
  • 检查聊天模板:仔细检查所使用的聊天模板。有些模板可能包含日期等动态信息,微调时不应固定为当前日期,可能需要移除或修改,以免影响微调质量。

微调实践与演示 (Phi 4 Mini Instruct)

演讲者通过 Jupyter Notebook 演示了微调流程,脚本位于 trellis.com/advanced-fine-tuning (GitHub 仓库 unslothai/unslothmain 分支下 clean/fine_tuning 目录)。

环境与设置
* 使用 RunPod 上的 H100 (80GB VRAM) GPU。
* Cuda 12.1, PyTorch 2.2。
* 数据集:Trellis Research 的 touch_rugby_comprehensive (Hugging Face Hub),包含问答对和评估标准,由 Gemini Pro 2.5 生成。
* 评估LLM (Judge LLM):Gemini Flash 2.0。

A. 使用 vLLM 进行基线评估
1. 安装依赖:包括 vllm。如果使用 Qwen3 并需禁用推理,可能需从源码安装最新版 vLLM。
2. 加载模型:使用 vLLM 加载 Phi 4 Mini Instruct 基础模型。vLLM 会使用 FlashInfer (若已安装,比 FlashAttention 更快)。
3. 准备评估数据:加载问答数据集。
4. 设置评估器 (Judge):使用 Gemini Flash 作为评估器,判断模型回答是否符合预设的评估标准,输出0或1分。
5. 批量评估:vLLM 并行处理多个问题,然后使用线程池并行调用 Gemini API 进行打分。
6. 多次运行取平均:由于温度 (temperature) 非零,结果有随机性,建议对评估集运行至少3次取平均分。
* Phi 4 Mini Instruct 基线得分约为 5.33/32。 (作为对比,Mistral Small 约13/32,Gemma 3 4B 约9/32,Qwen 1.7B 约5/32)

B. 使用 Unsloth 进行微调 (遇到问题后切换到 Transformers)
1. 环境清理与安装:卸载 vLLM,安装 unsloth。可选安装 flash-attention 加速 (但对Qwen有兼容问题)。
2. 加载模型与分词器 (Unsloth):使用 FastLanguageModel.from_pretrained 加载 Phi 4 Mini。Unsloth 会自动处理填充 (padding) Token。
3. LoRA 配置 (Unsloth)
* r (rank): 32
* lora_alpha: 演讲者通过检查模型各层矩阵维度(如MLP层维度约3000),估算 lora_alpha 约为50 (sqrt(3000) ≈ 54)。
* target_modules: Unsloth 提供了高级控制,如只训练 attention 或 MLP。对于 Phi 4 Mini,由于 QKV 可能是融合的,Unsloth 未能自动解耦并训练它们,主要训练了 MLP 和输出投影层。
* use_gradient_checkpointing: True
* use_rslora: True (自动缩放LoRA学习率)
4. 数据格式化:将问答对转换为模型期望的聊天格式 (如 user: ... assistant: ...)。
5. 训练参数设置
* 学习率 (learning rate): 1e-4 (适用于3B模型)
* 批大小 (batch size): 4
* 梯度累积步数 (gradient_accumulation_steps): 4 (虚拟批大小32)
* 轮次 (epochs): 2
* 学习率调度器 (scheduler): 自定义,先常量后线性衰减。
6. 仅训练模型回答部分 (Completion-only training):通过 Unsloth 的 prepare_model_for_kbit_training 和数据处理函数,确保损失函数只计算模型回答部分的 token,忽略用户问题部分的 token。
7. 启动训练与问题排查 (Unsloth for Phi 4 Mini)
* 遇到 torch.compile 相关错误。
* 解决方案:在脚本开头设置环境变量 TORCH_COMPILE_DISABLE=1 禁用 torch compile。
* 训练成功,模型保存并推送到 Hugging Face Hub。
8. 使用 vLLM 评估微调后的模型 (Unsloth-trained Phi 4 Mini)
* 卸载 Unsloth,重装 vLLM。
* 加载微调后的 Phi 4 Mini 模型时,vLLM 报错,提示模型配置问题。
* 尝试解决:对比原始 Phi 4 Mini 和微调后模型的 config.json,尝试将微调后模型的配置改为与原始模型一致,但未成功。此问题与之前 Gemma 3 在 Unsloth 微调后用 vLLM 推理遇到的问题类似。

C. 切换到 Transformers 进行微调 (针对 Phi 4 Mini)
由于 Unsloth 微调的 Phi 4 Mini 无法用 vLLM 评估,演讲者展示了使用纯 Transformers 脚本进行微调。
1. 加载模型与分词器 (Transformers):使用 AutoModelForCausalLM.from_pretrained
2. LoRA 配置 (Transformers)
* target_modules: 更细致地指定了 q_proj, v_proj, o_proj, gate_proj, up_proj, down_proj
* 重要差异:Transformers 脚本成功将 embed_tokenslm_head 设置为可训练,导致可训练参数比例远高于 Unsloth (24% vs 0.46%)。
3. 数据格式化与掩码 (Masking):在送入 Trainer 前,手动对数据集进行token化和掩码处理,确保只训练模型回答部分。
4. 训练与评估
* 训练过程顺利,未遇到 torch.compile 问题。
* 模型保存并推送到 Hugging Face Hub。
* 使用 vLLM 成功加载并评估了 Transformers 微调后的 Phi 4 Mini 模型。
* 评估结果:平均得分 7.33/32 (标准差0.47),相较于基线的 5.33 有明显提升。

TensorBoard 日志分析
* 对比 Unsloth 和 Transformers 的训练曲线:
* 训练和验证损失均下降,学习率按预期调度。
* Transformers 版本的梯度范数 (grad norm) 略高,评估损失 (eval loss) 也略高。演讲者推测这可能与 Transformers 版本训练了词嵌入层有关,但具体原因需进一步分析。

结论

演讲者总结了 Unsloth 和 Transformers 在微调方面的特点和实际操作中的取舍,强调了 vLLM 在评估阶段的效率优势。通过对 Phi 4 Mini 模型的实际微调演示,展示了解决兼容性问题和验证微调效果的过程。尽管数据准备未做深度优化,微调仍然带来了性能提升。演讲者计划未来继续探讨更难的口头表达型推理任务的微调方法。