github:https://github.com/mlabonne/llm-course
一、LLM 架构(The LLM architecture)
不需要对 Transformer 架构有深入的了解,但了解现代 LLM 的主要步骤很重要:通过分词化将文本转换为数字,通过包括注意力机制在内的层处理这些分词,最后通过各种采样策略生成新文本。
-
架构概述:了解从编码器-解码器 Transformer 到仅解码器架构(如 GPT)的演变,这些架构构成了现代 LLM 的基础。
-
分词化:了解分词化的原则 - 如何将文本转换为 LLM 可以处理的数字表示形式。探索不同的分词化策略及其对模型性能和输出质量的影响。
-
注意力机制:掌握注意力机制的核心概念,特别是自我注意及其变体。了解这些机制如何使 LLM 能够处理长距离依赖关系并在整个序列中维护上下文。
-
采样技术:探索各种文本生成方法及其权衡。将确定性方法(如贪婪搜索和光束搜索)与概率方法(如温度采样和Top-p采样)进行比较。
二、预训练模型(Pre-training models)
预训练是一个计算密集型且昂贵的过程。虽然这不是重点,但重要的是要深入了解模型的预训练方式,尤其是在数据和参数方面。可以使用 <1B 模型进行小规模的预训练。
-
数据准备:预训练需要大量数据集(例如,Llama 3.1 在 15 万亿个令牌上进行训练),这些数据集需要仔细管理、清理、去重和标记化。现代预训练管道实施复杂的筛选,以删除低质量或有问题的内容。
-
分布式训练:结合不同的并行化策略:数据并行(批量分配)、流水线并行(层分布)和 Tensor 并行(作拆分)。这些策略需要跨 GPU 集群优化网络通信和内存管理。
-
训练优化:使用自适应学习率与预热、梯度裁剪和归一化来防止爆炸,使用混合精度训练来提高内存效率,以及使用优化超参数的现代优化器(AdamW、Lion)。
-
监控:使用监控器跟踪关键指标(损失、梯度、GPU 统计数据),针对分布式训练问题实施有针对性的日志记录,并设置性能分析以识别设备间计算和通信的瓶颈。
三、训练后数据集(Post-training datasets)
训练后数据集具有精确的结构,包括指令和答案(监督微调)或指令和选择/拒绝的答案(偏好对齐)。对话结构比用于预训练的原始文本要罕见得多,这就是为什么我们经常需要处理种子数据并对其进行优化,以提高样本的准确性、多样性和复杂性。
-
存储和聊天模板:由于对话结构,训练后数据集以特定格式存储,如ShareGPT或OpenAI/HF。然后,这些格式被映射到 ChatML 或 Alpaca 等聊天模板,以生成模型训练的最终样本。
-
合成数据生成:使用 GPT-4o 等前沿模型根据种子数据创建指令-响应对。这种方法允许灵活且可扩展的数据集创建并获得高质量的答案。关键考虑因素包括设计不同的种子任务和有效的系统提示。
-
数据增强:使用经过验证的输出(使用单元测试或求解器)、带有拒绝抽样的多个答案、Auto-Evol、Chain-of-Thought、Branch-Solve-Merge、角色等技术来增强现有样本。
-
质量过滤:传统技术涉及基于规则的过滤、删除重复项或接近重复项(使用 MinHash 或嵌入)以及 n-gram 去污。奖励模型和评判 LLM 通过精细和可定制的质量控制来补充此步骤。
四、监督微调(Supervised Fine-Tuning)
SFT 将基本模型变成有用的助手,能够回答问题并遵循说明。在此过程中,他们将学习如何构建答案并重新激活在预培训中学到的知识子集。灌输新知识是可能的,但很肤浅:它不能用于学习一门全新的语言。始终将数据质量置于参数优化之上。
-
训练技术:完全微调会更新所有模型参数,但需要大量计算。LoRA 和 QLoRA 等参数高效的微调技术通过训练少量适配器参数同时保持基本权重冻结来降低内存要求。QLoRA 将 4 位量化与 LoRA 相结合,以减少 VRAM 的使用。这些技术都是在最流行的微调框架中实现的:TRL、Unsloth 和 Axolotl。
-
训练参数:关键参数包括计划程序的学习率、批量大小、梯度累积、epoch 数、优化器(如 8 位 AdamW)、正则化的权重衰减以及训练稳定性的预热步骤。LoRA 还添加了三个参数:排名(通常为 16-128)、alpha(1-2 倍排名)和目标模块。
-
分布式训练:使用 DeepSpeed 或 FSDP 跨多个 GPU 扩展训练。DeepSpeed 提供三个 ZeRO 优化阶段,通过状态分区提高内存效率。这两种方法都支持梯度检查点以提高内存效率。
-
监控:跟踪训练指标,包括损失曲线、学习率计划和梯度规范。监控损失峰值、梯度爆炸或性能下降等常见问题。
五、偏好对齐(Preference Alignment)
偏好对齐是训练后管道的第二个阶段,专注于使生成的答案与人类偏好保持一致。这个阶段旨在调整 LLM 的基调并减少毒性和幻觉。然而,提高其性能和提高实用性也变得越来越重要。与 SFT 不同,有许多首选项对齐算法。在这里,我们将重点介绍三个最重要的:DPO、GRPO 和 PPO。
-
拒绝抽样:对于每个提示,使用经过训练的模型生成多个响应,并对它们进行评分以推断选择/拒绝的答案。这将创建策略数据,其中两个响应都来自正在训练的模型,从而提高对齐稳定性。
-
直接首选项优化(DPO)直接优化策略,以最大限度地提高所选响应而不是被拒绝响应的可能性。它不需要奖励建模,这使得它的计算效率比 RL 技术更高,但在质量方面略差。非常适合创建聊天模型。
-
奖励模型:使用人工反馈训练奖励模型,以预测人类偏好等指标。它可以利用 TRL、verl 和 OpenRLHF 等框架进行可扩展的训练。
-
强化学习:GRPO 和 PPO 等 RL 技术迭代更新策略,以最大限度地提高奖励,同时保持接近初始行为。他们可以使用奖励模型或奖励函数对响应进行评分。它们的计算成本往往很高,并且需要仔细调整超参数,包括学习速率、批量大小和剪辑范围。非常适合创建推理模型。
六、评估(Evaluation)
可靠地评估 LLM 是一项复杂但必不可少的任务,指导数据生成和训练。它提供了有关改进领域的宝贵反馈,可用于修改数据混合、质量和训练参数。然而,记住古德哈特定律总是好的:“当一项措施成为目标时,它就不再是一个好的措施。
-
自动基准测试:使用精选数据集和指标(如 MMLU)评估特定任务的模型。它适用于具体任务,但在抽象和创造性功能方面遇到困难。它也容易受到数据污染。
-
人工评估:它涉及人工提示模型和对响应进行评分。方法范围从氛围检查到具有特定指南的系统注释和大规模社区投票 (arena)。它更适合主观任务,而事实准确性不太可靠。
-
基于模型的评估:使用判断和奖励模型来评估模型输出。它与人类的偏好高度相关,但存在对自身输出的偏见和不一致的评分。
-
反馈信号:分析错误模式以识别特定的弱点,例如遵循复杂指令的限制、缺乏特定知识或容易受到对抗性提示的影响。这可以通过更好的数据生成和训练参数来改善。
七、量化(Quantization)
量化是使用较低精度转换模型的参数和激活的过程。例如,使用 16 位存储的权重可以转换为 4 位表示。这种技术对于降低与 LLM 相关的计算和内存成本变得越来越重要。
-
基本技术:了解不同级别的精度(FP32、FP16、INT8 等)以及如何使用 absmax 和零点技术执行朴素量化。
-
GGUF & llama.cpp:最初设计用于在CPU上运行的llama.cpp和GGUF格式已成为在消费级硬件上运行LLMs的最受欢迎工具。它支持将特殊标记、词汇和元数据存储在单个文件中。
-
GPTQ & AWQ:像GPTQ / EXL2和AWQ这样的技术引入了逐层校准,可以在极低的位宽下保持性能。它们使用动态缩放来减少灾难性的异常值,选择性地跳过或重新居中最重的参数。
-
SmoothQuant & ZeroQuant:新的量化友好变换(SmoothQuant)和基于编译器的优化(ZeroQuant)有助于在量化之前减少异常值。它们还通过融合某些运算和优化数据流来减少硬件开销。