为了账号安全,请及时绑定邮箱和手机立即绑定

大型语言模型课程:从零到高手的全方位指南

零基础入门,如何成为一名LLM科学家和工程师?

作者供图

大型语言模型(LLM)课程是一系列主题和教育资源,帮助人们了解和参与LLM。它有两个主要路线图:

  1. 🧑‍🔬 LLM科学家 专注于利用最新技术构建最优秀的LLM。
  2. 👷 LLM工程师 专注于开发基于LLM的应用程序并进行部署。

为了这个课程的互动版本,我创建了一个LLM助手来帮助你。你可以在HuggingChat(推荐)或ChatGPT上测试你的知识,它将以个性化的方式回答你的问题并根据你的需求进行个性化的测试。

🧑‍🔬 大模型科学家

本课程的部分内容主要讲授如何利用最新的技术来构建最优秀的大型语言模型。

作者的图片

1. 大规模语言模型架构

了解Transformer架构不需要很深入,但理解现代大型语言模型(LLM)的主要步骤是很重要的:通过分词将文本转换为数字,通过包含注意力机制的多层处理这些标记,最后通过不同的采样策略生成新文本。

  • 架构概览:了解从编码器-解码器Transformer到像GPT这样的纯解码器架构的演进,这些架构是现代大语言模型(LLM)的基础。重点关注这些模型如何在高层次上处理和生成文本。
  • 词元化:学习词元化的基本原理——文本如何被转换成语言模型可以处理的数字表示。探讨不同的词元化策略及其对模型性能和输出质量的影响。
  • 注意力机制:掌握注意力机制的核心概念,特别是自我注意及其变体。理解这些机制如何使大语言模型能够处理长距离依赖性,从而在整个序列中保持上下文。
  • 采样技术:探索各种文本生成方法及其权衡点。比较确定性方法(例如贪心搜索和束搜索)与概率方法(例如温度采样和核选择)。

📚 参考书目

  • Transformer的视觉介绍 由 3Blue1Brown:面向完全初学者的Transformer视觉介绍。
  • LLM可视化 由 Brendan Bycroft:交互式3D LLM可视化。
  • nanoGPT 由 Andrej Karpathy:长达2小时的YouTube视频,从零开始实现GPT(面向程序员)。他还制作了一个关于分词的视频。
  • 注意?注意! 由 Lilian Weng:介绍注意力机制的历史。
  • LLM中的解码策略 由 Maxime Labonne:提供代码和可视化不同解码策略以生成文本的介绍。
2. 预训练模型

预训练是一个计算密集型且成本高昂的过程。虽然这不是本课程的重点,但是了解如何进行预训练,尤其是在数据和参数方面,是非常重要的。业余爱好者也可以在小规模上进行预训练,使用少于10亿个参数的模型。

  • 数据准备:预训练需要大量的数据集(例如,Llama 3.1 使用了 15 万亿个 token 进行训练),这些数据集需要精心整理、清洗、去重和分词化。现代预训练流程会实现复杂的筛选以移除低质量或有问题的内容。
  • 分布式训练:结合不同的并行化策略:数据并行(批次分配)、管道并行(层分配)和张量并行(操作拆分)。这些策略需要优化网络通信和 GPU 集群中的内存管理。
  • 训练优化:使用带有预热、梯度裁剪和归一化的自适应学习率以防止梯度爆炸,使用混合精度训练以提高内存使用效率,并使用经过调优的超参数的现代优化器(如 AdamW、Lion)。
  • 监控:使用仪表板跟踪关键指标(损失、梯度、GPU 状态),针对分布式训练中的问题实施定向日志记录,并设置性能分析来识别计算和通信在设备间存在的瓶颈。

📚 参考书目

  • FineWeb by Penedo et al.: 用于LLM预训练的大规模数据集(15T)的重现,包括高质量子集FineWeb-Edu。
  • RedPajama v2 by Weber et al.: 另一篇关于大规模预训练数据集的文章和论文,该数据集包含许多有趣的质量过滤器。
  • nanotron by Hugging Face: 一个简洁的LLM训练代码库,用于制作SmolLM2
  • 并行训练方法 by 陈彦雄: 介绍优化和并行技术的概述。
  • 分布式训练 by Duan et al.: 关于在分布式架构上高效训练LLM的研究。
  • OLMo 2 by AI2: 一个开源语言模型,提供模型、数据、训练及评估的代码。
  • LLM360 by LLM360: 一个开源LLM的框架,提供训练和数据准备代码、数据、指标和模型。
3. 训练后的数据集

经过训练的数据集具有明确的结构,包含指令和答案(监督下的微调)或指令和选择/拒绝的答案(偏好对齐)。对话结构比用于预训练的原始文本要少见得多,这就是为什么我们经常需要处理和优化种子数据,以提高样本的准确性、多样性和复杂度。更多信息和示例在我的仓库中可找到。

  • 存储和聊天模板:由于对话结构,经过训练的数据集以特定格式存储,如ShareGPT或OpenAI/HF。然后,这些格式映射到ChatML或Alpaca等聊天模板,生成模型最终训练的样本。
  • 合成数据生成:使用前沿模型如GPT-4基于种子数据创建指令-响应对。这种方法允许灵活且可扩展地创建高质量的回答数据集。关键考虑包括设计多样化的种子任务和有效的系统提示。
  • 数据增强:使用经过验证的输出(使用单元测试或求解器)、多个答案和拒绝采样、Auto-Evol、链式思维、分支-求解-合并、角色设定等技术增强现有样本。
  • 质量过滤:传统技术包括基于规则的过滤、删除重复项或近重复项(使用MinHash或嵌入)和n-gram去污染处理。奖励模型和评估大语言模型(LLM)在此步骤中提供了细粒度且可定制的质量控制措施。

📚 参考资料

  • 合成数据生成器 由 Argilla 提供:一种适合初学者使用自然语言在 Hugging Face 空间中构建数据集的简便方式。
  • LLM 数据集 由 Maxime Labonne 提供:一份整理过的数据集和工具列表,用于训练后的处理和评估。
  • NeMo-Curator 由 Nvidia 提供:一个用于预训练和后训练数据准备与整理的框架。
  • Distilabel 由 Argilla 提供:一个生成合成数据的框架。它还包括一些有趣的论文复现,比如 UltraFeedback。
  • Semhash 由 MinishLab 提供:一个轻量级库,用于近似去重和去污染,使用精简的嵌入模型,支持高效处理。
  • 聊天模板 由 Hugging Face 提供:Hugging Face 的聊天模板文档。
4. 监督微调训练

SFT将基础模型转化为有用的助手,能够回答问题并执行指令。在这个过程中,它们学会了如何组织答案,并重新激活了在预训练阶段学到的一部分知识。虽然可以灌输新的知识,但这种新知识比较表面:无法用来学习一种全新的语言。始终优先考虑数据质量而不是参数优化。

  • 训练技术:全量微调会更新所有模型参数,但需要大量的计算资源。参数高效微调技术如LoRA和QLoRA通过训练少量适配器参数并冻结基础权重来减少内存需求。QLoRA结合了4位量化与LoRA,以降低VRAM占用。
  • 训练参数:关键参数包括学习率及调度器、批量大小、梯度累积、训练轮数、优化器(如8位AdamW)、用于正则化的权重衰减以及训练稳定性的预热步骤。LoRA还添加了三个参数:一般16-128的秩、阿尔法(秩的1-2倍)和目标模块。
  • 分布式训练:使用DeepSpeed或FSDP在多个GPU上扩展训练规模。DeepSpeed提供了三个ZeRO优化阶段,通过状态分区逐步提高内存效率。这两种方法都支持梯度检查点以节约内存。
  • 监控:跟踪包括损失曲线、学习率计划和梯度范数在内的训练指标。监控常见的问题,比如损失峰值、梯度爆炸或性能下降。

📚 参考资料

5. 偏好一致化

偏好对齐是训练后流程的第二个阶段,专注于让生成的答案更符合人类的偏好。这一阶段旨在调整LLM的语气,使它们更符合人类的标准,减少毒性和幻觉的发生。然而,提升它们的性能和实用性也越来越重要。与SFT不同,偏好对齐有许多不同的算法。在这里,我们将重点介绍两个常用的算法:DPO和PPO。

  • 拒绝采样:对于每个提示,使用训练好的模型生成多个响应,并对其打分以推断被选择或拒绝的答案。这会产生在策略的数据,其中所有响应都来自正在训练的模型,从而提高对齐的稳定性。
  • 直接偏好优化:直接优化策略以最大化选择响应相对于拒绝响应的似然,不需要奖励建模,因此在计算效率上比PPO更高,但在质量上略逊一筹。
  • 近似策略优化:迭代更新策略以最大化奖励,同时保持接近初始行为。它使用奖励模型对响应进行评分,并需要仔细调整包括学习率、批量大小和PPO截断范围在内的超参数。
  • 监控:除了SFT指标之外,还希望最大化选择和被拒绝答案之间的差异。准确率应逐渐增加,直至达到稳定状态。

📚 参考资料

6 评估

可靠地评估大型语言模型是一项复杂但至关重要的任务,它指导数据生成和训练。它提供了关于改进领域的宝贵反馈,这些反馈可以用来调整数据的组合、质量和训练参数。不过,记住古德哈特定律总是很重要的:“当一个指标成为目标时,它就不再是好的衡量标准了。”

  • 自动化基准测试:通过使用经过整理的数据集和指标(如MMLU)在特定任务上评估模型。这在具体任务上效果良好,但在评估抽象性和创造性能力方面存在困难,并且容易受到数据污染问题的影响。
  • 人工评估:涉及人类向模型提问并评分其回答。方法从感受检查到系统性的注释,再到大规模社区投票(比如竞技场)。这种方法更适合处理主观性任务,但在保证事实准确性方面不太可靠。
  • 基于模型的评估:使用评判模型和奖励模型来评估模型输出。这种方法与人类偏好高度相关,但容易偏向评判模型自身的输出结果,并且评分不一致。
  • 反馈信号:通过分析错误模式来识别特定的弱点,例如,无法很好地遵循复杂指令、缺乏特定知识或对抗性提示的敏感性。这可以通过改进数据生成和训练参数来改善。

📚 参考资料

  • 评估指南,由 Clémentine Fourrier 编写:关于 LLM 评估的实际见解和理论知识。
  • 开放 LLM 排行榜 由 Hugging Face:以开放和可重现的方式比较 LLM(自动化基准测试)。
  • 语言模型评估框架 由 EleutherAI:使用自动化基准测试评估 LLM 的流行工具。
  • Lighteval 由 Hugging Face:替代评估框架,包括基于模型的评估功能。
  • 聊天机器人竞技场 由 LMSYS:基于人类比较的一般用途 LLM 的 Elo 等级(人工评估)。
7. 量化

量化是指将模型的参数和激活转换为更低精度的过程。将使用16位存储的权重转换为4位表示。这种技术变得越来越重要,因为它能减少与大规模语言模型(LLMs)相关的计算和内存成本。

  • 基础技术:学习不同的精度级别(FP32、FP16、INT8 等)以及如何使用 absmax 和零点技术进行朴素量化。
  • GGUF & llama.cpp:最初设计用于在 CPU 上运行的 llama.cpp 和 GGUF 格式已经成为在消费级硬件上运行大规模语言模型的最受欢迎的工具。它支持将特殊标记、词汇表和元数据存储在一个文件中。
  • GPTQ & AWQ:像 GPTQ/EXL2AWQ 这样的技术引入了逐层调整,以在极低位宽下保持性能。它们通过动态缩放来减少灾难性异常值,选择性地跳过或重新调整最重要的参数。
  • SmoothQuant & ZeroQuant:新的量化友好的转换(SmoothQuant)和基于编译器的优化(ZeroQuant)有助于在量化之前减轻异常值。它们通过融合某些操作和优化数据流来减少硬件开销。

📚 参考书目

8. 新潮流:

这里有一些值得一提但不符合其他类别的话题。有些是已经确立的技术(如模型融合、多模态技术),而其他则是更为实验性的(如可解释性、测试时计算缩放),并且在许多研究论文中得到了探讨。

  • 模型合并 :合并训练完成的模型已成为创建高性能模型而不进行微调的一种流行方式。流行的mergekit库实现了最受欢迎的合并方法,如SLERP、DARETIES
  • 多模态模型 :这些模型(如CLIPStable DiffusionLLaVA)可以处理多种类型的输入(文本、图像、音频等),并在统一的嵌入空间中处理,从而解锁了强大的应用,如文本到图像。
  • 可解释性 :机制性可解释技术如稀疏自动编码器(Sparse Autoencoders,SAE)在提供关于大规模语言模型内部工作的见解方面取得了显著进展。这也应用了诸如删除分析等技术,这些技术允许你在不进行训练的情况下修改模型的行为。
  • 推理时计算 :在推理过程中增加计算预算需要大量调用,并涉及过程奖励模型(Process Reward Model,PRM)等专门模型。通过精确评分的迭代步骤显著提高了复杂推理任务的性能。

📚 参考资料

👷 大模型工程师

这一部分课程专注于学习如何构建可在生产环境中使用的由LLM驱动的应用程序,重点在于增强和部署这些模型。

作者提供图片

1. #运行大语言模型

运行大型语言模型可能由于硬件要求较高而变得困难。根据您的使用案例,您可能只想通过API(如GPT-4)使用模型,或者自己运行它在当地。在任何情况下,额外的提示和引导技术可以优化并控制您的应用程序的输出。

  • LLM API:API是部署LLM的一种便捷方式。这部分可以分为私人LLM(如OpenAIGoogleAnthropicCohere等)和开源LLMs(如OpenRouterHugging FaceTogether AI等)。
  • 开源LLMsHugging Face Hub是一个寻找LLM的好地方。你可以在Hugging Face Spaces直接运行一些模型,也可以通过Lm Studio等应用程序下载并在本地运行,或者通过命令行工具如llama.cppOllama运行。
  • 提示工程:常用的技术包括零样本提示、少样本提示、链式思考和ReAct。这些技术在较大的模型中效果更好,但对于较小的模型也可以进行调整和适应。
  • 结构化输出:许多任务需要结构化的输出,比如严格的模板或JSON格式。可以使用LMQLOutlinesGuidance等库来指导生成并遵循给定的格式。

📚 参考资料

2. 构建向量存储系统:

解释如下:

  • 将“向量存储”改为“向量存储系统”,使短语更加完整,并与技术文档的风格一致。
  • 在“2.”后添加冒号,以匹配英文中的标点符号,增强可读性。
  • “构建”在技术指南中使用是合适的,因此保留该词。
  • 由于“构建”已经适合技术文档的风格,不需要更改成“搭建”。
    2. 构建向量存储系统

创建一个向量存储是构建检索增强生成(RAG)管道的第一步。首先加载并分割文档,然后使用相关片段生成向量表示(嵌入),这些嵌入将存储起来供后续推理时使用。

  • 文档加载:文档加载器是方便的包装,可以处理多种格式:PDF、JSON、HTML、Markdown 等。它们还可以直接从某些数据库和 API(如 GitHub、Reddit、Google 驱动器等)获取数据。
  • 拆分文档:文本拆分器将文档分解为更小、在语义上更相关的片段。与其在 n 个字符后拆分文本,通常更合适的是通过标题或使用递归方法进行拆分,并添加一些元数据。
  • 嵌入模型:嵌入模型将文本转换成向量表示。这允许对语言进行更深入和更细致的理解,这对执行语义搜索非常重要。
  • 向量数据库:向量数据库(如 ChromaPineconeMilvusFAISSAnnoy 等)设计用于存储向量嵌入。它们能够高效地检索与查询最相似的向量,基于向量相似性。

📚 参考

3. 检索增强生成模型

通过RAG,大型语言模型(LLM)可以从数据库中检索相关文档以提高其回答的准确性。RAG是一种无需微调即可增强模型能力的流行方法。

  • 编排工具:编排工具(如LangChainLlamaIndexFastRAG等)是连接你的LLM与工具、数据库、记忆等并增强其能力的流行框架。
  • 检索器:用户指令未经优化,无法有效检索。可以应用不同的技术(如多查询检索技术,HyDE等)来重新表述/扩展这些指令,从而提高性能。
  • 记忆:为了记住之前的指令和答案,LLM和聊天机器人(如ChatGPT)将这些历史记录添加到上下文窗口中。可以通过总结(例如使用更小的LLM)、向量存储和RAG等方法来改进这个缓冲区。
  • 评估:我们需要评估文档检索(上下文准确性和召回率)和生成内容(答案的忠实度和相关性)。这可以通过工具RagasDeepEval来简化。

📚 参考书目

4. 高级RAG提示

实际应用可能需要复杂的处理流程,包括SQL或图数据库。此外,系统还能自动选择相关的工具和API。这些高级技术不仅可以让基础方案更上一层楼,还能增加更多功能。

  • 查询构建:存储在传统数据库中的结构化数据需要特定的查询语言,如SQL、Cypher、元数据等。我们可以通过构建查询,直接将用户的指令转换成访问数据的查询语句。
  • 代理和工具:代理通过自动选择最相关的工具来增强这些大型语言模型(LLMs),以提供答案。这些工具可以简单到使用Google或维基百科,也可以复杂到使用Python解释器或Jira。
  • 后处理:处理输入的最终步骤,通过重新排序、RAG-fusion以及分类来增强相关性和多样性。
  • 编程语言模型:框架如DSPy允许你以编程方式根据自动化评估来优化提示和权重。

📚 参考资料

5. 推理改进

文本生成是一个需要昂贵硬件的高成本任务。除此之外,除了量化之外,还提出了各种技术来提高吞吐量并降低推理成本。

  • Flash Attention :优化注意力机制,使其复杂度从二次变为线性,从而加速了训练和推理过程。
  • 键值缓存机制 :理解键值缓存机制以及在多查询注意力论文(MQA)和分组查询注意力论文(GQA)中引入的改进。
  • 投机解码法 :利用小型模型生成初稿,经由大型模型校验,以此加快文本生成速度。

📚 参考资料

  • GPU 上的推理 由 Hugging Face 提供:解释如何在 GPU 上进行推理优化。
  • LLM 推理 由 Databricks 提供:最佳实践指南,介绍如何在生产环境中优化 LLM 推理。
  • 优化 LLM 的速度与内存 由 Hugging Face 提供:解释三种主要的优化技术,即量化、Flash Attention 和架构创新。
  • 辅助生成技术 由 Hugging Face 提供:Hugging Face 版本的推测性解码,这是一篇有趣的博客文章,介绍了如何使用代码来实现它。
6. 部署大语言模型

在大规模部署 LLM 时,这是一项工程壮举,可能需要多个 GPU 集群。在其他情况下,演示和本地应用可以用更低的复杂度实现。

📚 参考资料

7. 保障 LLMs (大型语言模型)

除了传统软件安全问题之外,大型语言模型由于训练和提示的方式,还具有独特的弱点。

  • 提示破解:不同技术相关的提示工程,包括提示注入(附加指令以改变模型的回答)、数据/提示泄露(检索其原始数据/提示)和逃逸(构造提示以绕过安全机制)。
  • 后门:攻击可以针对训练数据本身,通过污染训练数据(例如,使用虚假信息)或创建后门(秘密触发器以在推断期间改变模型的行为)。
  • 防御措施:保护您的LLM应用的最佳方式是测试它们,以检查这些漏洞(例如,使用红队测试和如garak这样的检查),并在实际环境中监控它们(例如,使用langfuse这样的框架)。

📚 参考

最终结论

我的主要建议是做你喜欢的事情。在 Google Colab 笔记本中安装库,玩转它们,将模型部署到 Hugging Face Spaces,修改或优化一个应用程序,量化一个大规模语言模型,或者为 RAG 微调它。找到自己感兴趣的领域并不断探索,阅读论文,并实践自己的想法。这是一个研究和资金都非常广泛的领域。在整个课程中,成为某一方面的专家,你将变得非常有价值! 😊

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消