以下,让我们来勾勒一些重要的技术性的内容。
1. LLM 架构
虽然不需要深入了解 Transformer 架构,但重要的是要很好地理解其输入(token)和输出(logits)。原始注意力机制是另一个需要掌握的关键组件,因为它的改进版本将在后面介绍。
- 高级视图:重新审视编码器-解码器 Transformer 架构,更具体地说,重新审视每个现代 LLM 中所使用的仅解码器 GPT 架构。
- 标记化:了解如何将原始文本数据转换为模型可以理解的格式,这涉及将文本拆分为标记(通常是单词或子词)。
- 注意力机制:掌握注意力机制背后的理论,包括自我注意力和缩放点积注意力,这使得模型在产生输出时能够关注输入的不同部分。
- 文本生成:了解模型生成输出序列的不同方式。常见策略包括贪婪解码、波束搜索、top-k 采样和核采样。
📚参考文献:
- Jay Alammar 的《图解 Transformer》:对 Transformer 模型进行视觉和直观的解释。
- Jay Alammar 撰写的图解 GPT-2:比上一篇文章更重要的是,它专注于 GPT 架构,它与 Llama 的架构非常相似。
- 3Blue1Brown 的Transformers 视觉介绍:简单易懂的 Transformers 视觉介绍
- Brendan Bycroft 的LLM 可视化:以令人难以置信的 3D 可视化方式展示 LLM 内部发生的情况。
- Andrej Karpathy 的nanoGPT:一段时长 2 小时的 YouTube 视频,从头开始重新实现 GPT(针对程序员)。
- 注意?注意!作者:Lilian Weng:以更正式的方式介绍注意的必要性。
- LLM 中的解码策略:提供代码和对生成文本的不同解码策略的视觉介绍。
2. 构建指令数据集
虽然从维基百科和其他网站找到原始数据很容易,但很难在野外收集指令和答案。与传统机器学习一样,数据集的质量将直接影响模型的质量,这就是为什么它可能是微调过程中最重要的组成部分。
- 类似羊驼的数据集:使用 OpenAI API (GPT) 从头开始生成合成数据。您可以指定种子和系统提示来创建多样化的数据集。
- 高级技术:了解如何使用Evol-Instruct改进现有数据集,如何生成像Orca和phi-1论文中那样的高质量合成数据。
- 过滤数据:传统技术涉及正则表达式、删除近似重复项、关注具有大量标记的答案等。
- 提示模板:没有真正的标准方式来格式化指令和答案,这就是为什么了解不同的聊天模板(例如ChatML、Alpaca等)非常重要。
📚参考文献:
- 由 Thomas Capelle准备用于指令调整的数据集:探索 Alpaca 和 Alpaca-GPT4 数据集以及如何格式化它们。
- Solano Todeschini 撰写的《生成临床指导数据集》:有关如何使用 GPT-4 创建合成指导数据集的教程。
- Kshitiz Sahay 使用GPT 3.5 进行新闻分类:使用 GPT 3.5 创建指令数据集来对 Llama 2 进行微调以进行新闻分类。
- 用于微调 LLM 的数据集创建:笔记本包含一些用于过滤数据集和上传结果的技术。
- Matthew Carrigan 的聊天模板:Hugging Face 的提示模板页面
3. 预训练模型
预训练是一个非常漫长且成本高昂的过程,因此这不是本课程的重点。最好对预训练期间发生的事情有一定程度的了解,但不需要实际经验。
- 数据管道:预训练需要庞大的数据集(例如,Llama 2接受了 2 万亿个标记的训练),这些数据集需要进行过滤、标记化并与预定义的词汇进行整理。
- 因果语言建模:了解因果语言建模和掩码语言建模之间的区别,以及本案例中使用的损失函数。为了实现高效的预训练,请了解有关Megatron-LM或gpt-neox的更多信息。
- 缩放定律:缩放定律根据模型大小、数据集大小和用于训练的计算量描述预期的模型性能。
- 高性能计算:超出了这里的范围,但如果您打算从头开始创建自己的 LLM(硬件、分布式工作负载等),那么有关 HPC 的更多知识是至关重要的。
📚参考文献:
- Junhao Zhao 的LLMDataHub:预训练、微调和 RLHF 的数据集精选列表。
- 通过 Hugging Face从头开始训练因果语言模型:使用 transformers 库从头开始预训练 GPT-2 模型。
- Zhang 等人的TinyLlama:查看此项目可以很好地了解如何从头开始训练 Llama 模型。
- Hugging Face 的因果语言建模:解释因果语言建模和掩蔽语言建模之间的区别以及如何快速微调 DistilGPT-2 模型。
- 怀旧代数学家Chinchilla 的狂野暗示:讨论缩放定律并解释它们对(LLM) 的一般意义。
- BigScience 的BLOOM:Notion 页面描述了如何构建 BLOOM 模型,其中包含大量有关工程部分和遇到的问题的有用信息。
- Meta 的OPT-175 日志:研究日志,显示哪些地方出错了,哪些地方做对了。如果您计划预先训练一个非常大的语言模型(在本例中为 175B 个参数),这将非常有用。
- LLM 360:带有训练和数据准备代码、数据、指标和模型的开源 LLM 框架。
4. 监督微调
预训练模型仅针对下一个标记预测任务进行训练,这就是它们不是有用助手的原因。SFT 允许您调整它们以响应指令。此外,它还允许您在任何数据(私有、GPT-4 未看到等)上微调模型并使用它,而无需为 OpenAI 之类的 API 付费。
- 完全微调:完全微调是指训练模型中的所有参数。这不是一种有效的技术,但它能产生稍好的结果。
- LoRA:基于低秩适配器的参数高效技术 (PEFT)。我们只训练这些适配器,而不是训练所有参数。
- QLoRA:另一个基于 LoRA 的 PEFT,它也将模型的权重量化为 4 位,并引入分页优化器来管理内存峰值。将其与Unsloth结合使用,即可在免费的 Colab 笔记本上高效运行。
- Axolotl:一种用户友好且功能强大的微调工具,被用于许多最先进的开源模型中。
- DeepSpeed:针对多 GPU 和多节点设置对 LLM 进行高效的预训练和微调(在 Axolotl 中实现)。
📚参考文献:
- Alpin 编写的新手 LLM 培训指南:概述了微调 LLM 时需要考虑的主要概念和参数。
- Sebastian Raschka 的LoRA 见解:有关 LoRA 的实用见解以及如何选择最佳参数。
- 微调您自己的 Llama 2 模型:有关如何使用 Hugging Face 库微调 Llama 2 模型的实践教程。
- Benjamin Marie 撰写的《填充大型语言模型》:填充因果 LLM 训练样本的最佳实践
- LLM 微调初学者指南:有关如何使用 Axolotl 微调 CodeLlama 模型的教程。
5. 偏好调整
在监督微调之后,RLHF 是用于使 LLM 的答案与人类期望保持一致的一个步骤。其理念是从人类(或人工)反馈中学习偏好,这可用于减少偏差、审查模型或使其以更有用的方式运行。它比 SFT 更复杂,通常被视为可选的。
- 偏好数据集:这些数据集通常包含具有某种排名的几个答案,这使得它们比指令数据集更难生成。
- 近端策略优化:该算法利用奖励模型来预测给定文本是否被人类高度评价。然后,该预测用于优化 SFT 模型,并基于 KL 散度施加惩罚。
- 直接偏好优化:DPO 通过将流程重新定义为分类问题来简化流程。它使用参考模型而不是奖励模型(无需训练),并且只需要一个超参数,从而使其更加稳定和高效。
📚参考文献:
- Argilla 的Distilabel:创建您自己的数据集的绝佳工具。它专为偏好数据集而设计,但也可以进行 SFT。
- Ayush Thakur 撰写的使用 RLHF 培训 LLM 的简介:解释为什么 RLHF 有助于减少偏见并提高 LLM 的绩效。
- Hugging Face 的插图 RLHF:通过奖励模型训练和强化学习进行微调的 RLHF 简介。
- 通过 Hugging Face进行偏好调整 LLM:比较 DPO、IPO 和 KTO 算法以执行偏好调整。
- LLM 培训:Sebastian Rashcka 撰写的 RLHF 及其替代方案:RLHF 流程和 RLAIF 等替代方案的概述。
- 使用 DPO 微调 Mistral-7b:使用 DPO 微调 Mistral-7b 模型并重现NeuralHermes-2.5 的教程。
6. 评估
评估LLM是流程中被低估的一个部分,它耗时且可靠性一般。你的后续任务应该决定你想要评估什么,但要始终记住古德哈特定律:“当一个衡量标准成为目标时,它就不再是一个好的衡量标准了。”
- 传统指标:困惑度和 BLEU 分数等指标不再像以前那么受欢迎,因为它们在大多数情况下存在缺陷。了解它们以及何时应用它们仍然很重要。
- 通用基准:基于Language Model Evaluation Harness,Open LLM Leaderboard是通用 LLM(如 ChatGPT)的主要基准。还有其他流行的基准,如BigBench、MT-Bench等。
- 特定任务的基准:总结、翻译和问答等任务有专门的基准、指标甚至子领域(医学、金融等),例如用于生物医学问答的PubMedQA 。
- 人工评估:最可靠的评估是用户的接受率或人工的比较。除了聊天记录外,记录用户反馈(例如,使用LangSmith)有助于确定潜在的改进领域。
📚参考文献:
- Hugging Face 的固定长度模型的困惑度:困惑度概述以及使用 transformers 库实现它的代码。
- Rachael Tatman 撰写的BLEU 风险自负:BLEU 分数概述及其诸多问题以及示例。
- Chang 等人撰写的关于LLM评估的调查:关于评估什么、在哪里评估以及如何评估的综合论文。
- lmsys 的Chatbot Arena 排行榜:基于人类的比较,对通用 LLM 进行 Elo 评级。
7.量化
量化是使用较低精度转换模型权重(和激活)的过程。例如,使用 16 位存储的权重可以转换为 4 位表示。这种技术对于降低与 LLM 相关的计算和内存成本越来越重要。
- 基础技术:了解不同精度级别(FP32、FP16、INT8 等)以及如何使用 absmax 和零点技术执行简单量化。
- GGUF 和 llama.cpp : llama.cpp和 GGUF 格式最初设计用于在 CPU 上运行,现已成为在消费级硬件上运行 LLM 最流行的工具。
- GPTQ 和 EXL2:GPTQ和EXL2格式速度惊人,但只能在 GPU 上运行。模型量化也需要很长时间。
- AWQ:这种新格式比 GPTQ 更准确(困惑度更低),但使用了更多的 VRAM,而且速度不一定更快。
📚参考文献:
- 量化简介:量化概述、绝对最大量化和零点量化以及带有代码的 LLM.int8()。
- 使用 llama.cpp 量化 Llama 模型:有关如何使用 llama.cpp 和 GGUF 格式量化 Llama 2 模型的教程。
- 使用 GPTQ 进行 4 位 LLM 量化:有关如何使用带有 AutoGPTQ 的 GPTQ 算法量化 LLM 的教程。
- ExLlamaV2:运行 LLM 的最快库:有关如何使用 EXL2 格式量化 Mistral 模型并使用 ExLlamaV2 库运行它的指南。
- 了解 FriendliAI 的激活感知权重量化:AWQ 技术及其优势的概述。
8.新趋势
- 位置嵌入:了解 LLM 如何编码位置,尤其是像RoPE这样的相对位置编码方案。实现YaRN(将注意力矩阵乘以温度因子)或ALiBi(基于标记距离的注意力惩罚)以扩展上下文长度。
- 模型合并:合并经过训练的模型已成为一种无需微调即可创建高性能模型的流行方法。流行的mergekit库实现了最流行的合并方法,例如SLERP、DARE和TIES。
- 专家混合:Mixtral凭借其出色的性能重新普及了 MoE 架构。与此同时,OSS 社区中出现了一种通过合并Phixtral等模型而形成的 frankenMoE ,这是一种更便宜、性能更高的选择。
- 多模态模型:这些模型(如CLIP、稳定扩散或LLaVA)使用统一的嵌入空间处理多种类型的输入(文本、图像、音频等),从而解锁文本转图像等强大的应用程序。
📚参考文献:
- EleutherAI扩展了 RoPE :总结了不同的位置编码技术的文章。
- Rajat Chawla 撰写的《理解 YaRN》:YaRN 简介。
- 使用mergekit 合并LLM:有关使用mergekit 合并模型的教程。
- Hugging Face解释的专家混合:关于 MoE 及其工作原理的详尽指南。
- Chip Huyen 著《大型多模式模型》:多模式系统概述以及该领域的近期历史。
👷 LLM工程师
本课程的这一部分重点介绍如何构建可用于生产的 LLM 驱动的应用程序,重点是增强模型并部署它们。
由于硬件要求较高,运行 LLM 可能很困难。根据您的用例,您可能只想通过 API(如 GPT-4)使用模型或在本地运行它。无论如何,额外的提示和指导技术可以改善和限制应用程序的输出。
1. 运行LLM
- LLM API:API 是部署 LLM 的便捷方式。该领域分为私有 LLM(OpenAI、Google、Anthropic、Cohere等)和开源 LLM(OpenRouter、Hugging Face、Together AI等)。
- 开源 LLM:Hugging Face Hub是寻找 LLM 的好地方。您可以直接在Hugging Face Spaces中运行其中一些,也可以下载并在LM Studio等应用程序中本地运行它们,或者通过 CLI 使用llama.cpp或Ollama运行它们。
- 提示工程:常用技术包括零样本提示、少样本提示、思路链和 ReAct。它们更适用于较大的模型,但也可以适用于较小的模型。
- 结构化输出:许多任务需要结构化输出,例如严格的模板或 JSON 格式。可以使用LMQL、Outlines、Guidance等库来指导生成并遵循给定的结构。
📚参考文献:
- 使用 Nisha Arya 的 LM Studio 在本地运行 LLM:有关如何使用 LM Studio 的简短指南。
- DAIR.AI 的提示工程指南:带有示例的提示技术详尽列表
- 大纲 – 快速入门:大纲支持的引导生成技术列表。
- LMQL – 概述:LMQL 语言简介。
2. 构建向量存储
创建向量存储是构建检索增强生成 (RAG) 管道的第一步。加载、拆分文档并使用相关块来生成向量表示(嵌入),这些向量表示将存储起来以供将来在推理期间使用。
- 提取文档:文档加载器是方便的包装器,可以处理多种格式:PDF、JSON、HTML、Markdown 等。它们还可以直接从一些数据库和 API(GitHub、Reddit、Google Drive 等)检索数据。
- 拆分文档:文本拆分器将文档拆分成更小、语义上有意义的块。与在n 个字符后拆分文本相比,按标题或递归拆分以及添加一些附加元数据通常更好。
- 嵌入模型:嵌入模型将文本转换为向量表示。它允许对语言有更深入、更细致的理解,这对于执行语义搜索至关重要。
- 向量数据库:向量数据库(如Chroma、Pinecone、Milvus、FAISS、Annoy等)旨在存储嵌入向量。它们能够根据向量相似性高效检索与查询“最相似”的数据。
📚参考文献:
- LangChain – 文本分割器:LangChain 中实现的不同文本分割器的列表。
- 句子转换器库:流行的嵌入模型库。
- MTEB 排行榜:嵌入模型的排行榜。
- Moez Ali 的5 大矢量数据库:最佳和最流行的矢量数据库的比较。
3. 检索增强生成
借助 RAG,LLM 可以从数据库中检索上下文文档,以提高答案的准确性。RAG 是一种无需进行任何微调即可增强模型知识的流行方法。
- 编排器:编排器(如LangChain、LlamaIndex、FastRAG等)是流行的框架,可将您的 LLM 与工具、数据库、内存等连接起来并增强其功能。
- 检索器:用户指令未针对检索进行优化。可以应用不同的技术(例如,多查询检索器、HyDE等)来重新表述/扩展它们并提高性能。
- 记忆:为了记住之前的指令和答案,LLM 和 ChatGPT 等聊天机器人会将这些历史记录添加到其上下文窗口中。可以通过汇总(例如,使用较小的 LLM)、向量存储 + RAG 等来改进此缓冲区。
- 评估:我们需要评估文档检索(上下文准确率和召回率)和生成阶段(忠实度和答案相关性)。可以使用Ragas和DeepEval工具来简化。
📚参考文献:
- Llamaindex – 高级概念:构建 RAG 管道时需要了解的主要概念。
- Pinecone – 检索增强:检索增强过程的概述。
- LangChain – RAG 问答:构建典型 RAG 管道的分步教程。
- LangChain – 记忆类型:列出不同类型的记忆及其相关用途。
- RAG 管道 – 指标:用于评估 RAG 管道的主要指标概述。
4. 高级 RAG
实际应用可能需要复杂的管道,包括 SQL 或图形数据库,以及自动选择相关工具和 API。这些高级技术可以改进基线解决方案并提供附加功能。
- 查询构造:传统数据库中存储的结构化数据需要特定的查询语言,如SQL、Cypher、元数据等。我们可以直接将用户指令转换为查询,通过查询构造来访问数据。
- 代理和工具:代理通过自动选择最相关的工具来提供答案,从而增强 LLM。这些工具可以像使用 Google 或 Wikipedia 一样简单,也可以像 Python 解释器或 Jira 一样复杂。
- 后处理:处理输入到 LLM 的输入的最后一步。它通过重新排序、RAG 融合和分类来增强检索到的文档的相关性和多样性。
- 程序 LLM :像DSPy这样的框架允许您以编程方式根据自动评估优化提示和权重。
📚参考文献:
- LangChain – 查询构造:关于不同类型查询构造的博客文章。
- LangChain – SQL:有关如何使用 LLM 与 SQL 数据库交互的教程,涉及文本到 SQL 和可选的 SQL 代理。
- Pinecone – LLM 代理:介绍不同类型的代理和工具。
- 由 Lilian Weng 撰写的LLM 驱动的自主代理:更多关于 LLM 代理的理论文章。
- LangChain – OpenAI 的 RAG:概述 OpenAI 采用的 RAG 策略,包括后期处理。
- 8 步学会 DSPy:DSPy 通用指南,介绍模块、签名和优化器。
5. 推理优化
文本生成是一个成本高昂的过程,需要昂贵的硬件。除了量化之外,还提出了各种技术来最大化吞吐量并降低推理成本。
- Flash Attention:优化注意力机制,将其复杂度从二次方转变为线性,从而加快训练和推理速度。
- 键值缓存:了解键值缓存以及多查询注意(MQA)和分组查询注意(GQA)中引入的改进。
- 推测解码:使用小模型生成草稿,然后由更大的模型进行审查,以加快文本生成速度。
📚参考文献:
- Hugging Face 的GPU 推理:解释如何优化 GPU 上的推理。
- Databricks 的LLM 推理:如何在生产中优化 LLM 推理的最佳实践。
- Hugging Face对 LLM 的速度和内存进行优化:解释优化速度和内存的三种主要技术,即量化、Flash Attention 和架构创新。
- Hugging Face 的辅助生成:HF 版本的推测解码,这是一篇关于如何与代码协同实现它的有趣的博客文章。
6. 部署 LLM
大规模部署 LLM 是一项工程壮举,可能需要多个 GPU 集群。在其他情况下,可以以更低的复杂度实现演示和本地应用程序。
- 本地部署:隐私是开源 LLM 相对于私有 LLM 的一个重要优势。本地 LLM 服务器(LM Studio、Ollama、oobabooga、kobold.cpp等)利用这一优势为本地应用提供支持。
- 演示部署: Gradio和Streamlit等框架有助于创建应用程序原型并共享演示。您还可以轻松地在线托管它们,例如使用Hugging Face Spaces。
- 服务器部署:大规模部署 LLM 需要云(另请参阅SkyPilot)或内部部署基础设施,并且通常利用优化的文本生成框架,如TGI、vLLM等。
- 边缘部署:在受限环境中, MLC LLM和mnn-llm等高性能框架可以在 Web 浏览器、Android 和 iOS 中部署 LLM。
📚参考文献:
- Streamlit – 构建一个基本的 LLM 应用程序:使用 Streamlit 制作类似 ChatGPT 的基本应用程序的教程。
- HF LLM 推理容器:使用 Hugging Face 的推理容器在 Amazon SageMaker 上部署 LLM。
- Philipp Schmid 的Philschmid 博客:有关使用 Amazon SageMaker 部署 LLM 的高质量文章集。
- Hamel Husain 的优化延迟:在吞吐量和延迟方面对 TGI、vLLM、CTranslate2 和 mlc 进行比较。
7. 安全化LLM
除了与软件相关的传统安全问题之外,LLM 因其培训和提示方式而具有独特的弱点。
- 提示黑客:与提示工程相关的不同技术,包括提示注入(劫持模型答案的附加指令)、数据/提示泄露(检索其原始数据/提示)和越狱(制作提示以绕过安全功能)。
- 后门:攻击媒介可以针对训练数据本身,通过毒害训练数据(例如,使用虚假信息)或创建后门(在推理过程中改变模型行为的秘密触发器)。
- 防御措施:保护您的 LLM 应用程序的最佳方法是针对这些漏洞进行测试(例如,使用红队和garak等检查)并在生产中观察它们(使用langfuse等框架)。
📚参考文献:
- HEGO Wiki 列出的OWASP LLM Top 10:LLM 应用程序中最常见的 10 个漏洞列表。
- 由 Joseph Thacker 撰写的《快速注入入门》:专为工程师提供的快速注入简短指南。
- @llm_sec的LLM Security:与 LLM 安全相关的大量资源列表。
- 微软的红队 LLM:有关如何使用 LLM 进行红队测试的指南。
RA/SD 衍生者AI训练营。发布者:chris,转载请注明出处:https://www.shxcj.com/archives/8420