Skip to content

使用路线图和 Colab 笔记本进入大型语言模型 (LLM) 的课程。

License

Notifications You must be signed in to change notification settings

yuanzhongqiao/llm-course-cn

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

83 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🗣️ 大型语言模型课程

🐦 在 X 上关注我 • 🤗 HugingFace • 💻 博客 • 📙 动手 GNN


LLM 课程分为三个部分:

  1. 🧩 LLM Fundamentals 涵盖有关数学、Python 和神经网络的基本知识。
  2. 🧑 🔬 LLM Scientist 专注于使用最新技术构建最好的 LLM。
  3. 👷 LLM 工程师专注于创建基于 LLM 的应用程序并部署它们。

对于本课程的交互式版本,我创建了两个 LLM 助手,它们将以个性化的方式回答问题并测试您的知识:

📝 笔记本

与大型语言模型相关的笔记本和文章的列表。

工具

笔记本 描述 笔记本
🧐 大语言模型LLM AutoEval 使用 RunPod 自动评估您的 LLM 在 Colab 中打开
🥱 懒惰的 Mergekit 使用 MergeKit 一键轻松合并模型。 在 Colab 中打开
🦎 懒蝾螈 使用 Axolotl 一键微调云中的模型。 在 Colab 中打开
⚡ 自动量化 一键量化 GGUF、GPTQ、EXL2、AWQ 和 HQQ 格式的 LLM。 在 Colab 中打开
🌳 模型家谱 可视化合并模型的族树。 在 Colab 中打开
🚀 零空间 使用免费的 ZeroGPU 自动创建 Gradio 聊天界面。 在 Colab 中打开

微调

笔记本 描述 笔记本
使用 QLoRA 微调 Llama 2 在 Google Colab 中监督微调 Llama 2 的分步指南。 在 Colab 中打开
使用 Axolotl 微调 CodeLlama 用于微调的最先进工具的端到端指南。 在 Colab 中打开
使用 QLoRA 微调 Mistral-7b 在带有 TRL 的免费套餐 Google Colab 中监督微调 Mistral-7b。 在 Colab 中打开
使用 DPO 微调 Mistral-7b 使用 DPO 提高受监督的微调模型的性能。 在 Colab 中打开
使用 ORPO 微调 Llama 3 使用 ORPO 在单个阶段进行更便宜、更快速的微调。 在 Colab 中打开
使用 Unsloth 微调 Llama 3.1 Google Colab 中的超高效监督微调。 在 Colab 中打开

量化

笔记本 描述 笔记本
量化简介 使用 8 位量化优化大型语言模型。 在 Colab 中打开
使用 GPTQ 的 4 位量化 量化您自己的开源 LLM,以便在消费类硬件上运行它们。 在 Colab 中打开
使用 GGUF 和 llama.cpp 进行量化 使用 llama.cpp 量化 Llama 2 模型,并将 GGUF 版本上传到 HF Hub。 在 Colab 中打开
ExLlamaV2:运行 LLM 的最快库 量化并运行 EXL2 模型,并将其上传到 HF Hub。 在 Colab 中打开

其他

笔记本 描述 笔记本
大型语言模型中的解码策略 从光束搜索到原子核采样的文本生成指南 在 Colab 中打开
使用知识图谱改进 ChatGPT 用知识图谱增强 ChatGPT 的答案。 在 Colab 中打开
使用 MergeKit 合并 LLM 轻松创建自己的模型,无需 GPU! 在 Colab 中打开
使用 MergeKit 创建 MoE 将多个专家合并为一个 frankenMoE 在 Colab 中打开
取消审查任何 LLM 并删除 无需重新训练即可进行微调 在 Colab 中打开

🧩 LLM 基础

本节介绍有关数学、Python 和神经网络的基本知识。您可能不想从这里开始,但需要参考它。

Toggle 部分

1. 机器学习数学

在掌握机器学习之前,了解为这些算法提供动力的基本数学概念非常重要。

  • 线性代数:这对于理解许多算法至关重要,尤其是深度学习中使用的算法。关键概念包括向量、矩阵、行列式、特征值和特征向量、向量空间和线性变换。
  • 微积分:许多机器学习算法涉及连续函数的优化,这需要了解导数、积分、极限和级数。多变量微积分和梯度的概念也很重要。
  • 概率和统计:这些对于理解模型如何从数据中学习和进行预测至关重要。关键概念包括概率论、随机变量、概率分布、期望、方差、协方差、相关性、假设检验、置信区间、最大似然估计和贝叶斯推理。

📚 资源:


2. 用于机器学习的 Python

Python 是一种功能强大且灵活的编程语言,由于其可读性、一致性和强大的数据科学库生态系统,特别适合机器学习。

  • Python 基础知识:Python 编程需要对基本语法、数据类型、错误处理和面向对象编程有很好的理解。
  • 数据科学库: 它包括熟悉用于数值运算的 NumPy、用于数据操作和分析的 Pandas、用于数据可视化的 Matplotlib 和 Seaborn。
  • 数据预处理:这涉及特征扩展和归一化、处理缺失数据、异常值检测、分类数据编码以及将数据拆分为训练集、验证集和测试集。
  • 机器学习库:熟练使用 Scikit-learn(一个提供多种监督和无监督学习算法的库)至关重要。了解如何实现线性回归、逻辑回归、决策树、随机森林、k 最近邻 (K-NN) 和 K-means 聚类等算法非常重要。PCA 和 t-SNE 等降维技术也有助于可视化高维数据。

📚 资源:


3. 神经网络

神经网络是许多机器学习模型的基本组成部分,尤其是在深度学习领域。为了有效地利用它们,必须全面了解它们的设计和机制。

  • 基础知识:这包括了解神经网络的结构,例如层、权重、偏差和激活函数(sigmoid、tanh、ReLU 等)。
  • 训练和优化:熟悉反向传播和不同类型的损失函数,如均方误差 (MSE) 和交叉熵。了解各种优化算法,如 Gradient Descent、Stochastic Gradient Descent、RMSprop 和 Adam。
  • 过拟合:了解过拟合的概念(模型在训练数据上表现良好,但在看不见的数据上表现不佳),并学习各种正则化技术(dropout、L1/L2 正则化、早期停止、数据增强)来防止它。
  • 实施多层感知器 (MLP):使用 PyTorch 构建 MLP,也称为全连接网络。

📚 资源:


4. 自然语言处理 (NLP)

NLP 是人工智能的一个迷人分支,它弥合了人类语言和机器理解之间的差距。从简单的文本处理到理解语言的细微差别,NLP 在许多应用程序中发挥着至关重要的作用,例如翻译、情感分析、聊天机器人等等。

  • 文本预处理:了解各种文本预处理步骤,如分词(将文本拆分为单词或句子)、词干提取(将单词减少为根形式)、词形还原(类似于词干提取,但要考虑上下文)、停用词删除等。
  • 特征提取技术: 熟悉将文本数据转换为机器学习算法可以理解的格式的技术。主要方法包括词袋 (BoW)、词频逆文档频率 (TF-IDF) 和 n-grams。
  • 单词嵌入:单词嵌入是一种单词表示形式,它允许具有相似含义的单词具有相似的表示形式。主要方法包括 Word2Vec、GloVe 和 FastText。
  • 递归神经网络 (RNN):了解 RNN 的工作原理,RNN 是一种旨在处理序列数据的神经网络。探索 LSTM 和 GRU,这两种 RNN 变体能够学习长期依赖关系。

📚 资源:

🧑 🔬 LLM科学家

本课程的这一部分侧重于学习如何使用最新技术构建最好的 LLM。

1. LLM 架构

虽然不需要对 Transformer 架构有深入的了解,但对其输入 (token) 和输出 (logits) 有很好的理解是很重要的。原版注意力机制是另一个需要掌握的关键组件,因为稍后会介绍它的改进版本。

  • 高级视图:重新审视编码器-解码器 Transformer 架构,更具体地说,是每个现代 LLM 中使用的仅解码器 GPT 架构。
  • 分词:了解如何将原始文本数据转换为模型可以理解的格式,这涉及将文本拆分为分词(通常是单词或子词)。
  • 注意力机制:掌握注意力机制背后的理论,包括自我注意和缩放点积注意力,这使模型在产生输出时能够专注于输入的不同部分。
  • 文本生成:了解模型生成输出序列的不同方式。常见的策略包括贪婪解码、波束搜索、top-k 采样和原子核采样。

📚 参考资料

  • Jay Alammar 的 The Illustrated Transformer:对 Transformer 模型的直观直观解释。
  • Jay Alammar 的 GPT-2 图解:比上一篇文章更重要的是,它侧重于 GPT 架构,这与 Llama 的架构非常相似。
  • 3Blue1Brown 的《变形金刚》视觉介绍:简单易懂的《变形金刚》视觉介绍
  • Brendan Bycroft 的 LLM 可视化:令人难以置信的 LLM 内部发生的 3D 可视化。
  • Andrej Karpathy 的 nanoGPT:一个长达 2 小时的 YouTube 视频,从头开始重新实现 GPT(面向程序员)。
  • 注意力?注意力!作者:Lilian Weng:以更正式的方式介绍关注的必要性。
  • LLM 中的解码策略:提供代码和可视化介绍以生成文本的不同解码策略。

2. 构建指令数据集

虽然很容易从 Wikipedia 和其他网站找到原始数据,但很难在野外收集成对的说明和答案。与传统机器学习一样,数据集的质量将直接影响模型的质量,这就是为什么它可能是微调过程中最重要的组成部分。

  • 类似 Alpaca 的数据集:使用 OpenAI API (GPT) 从头开始生成合成数据。您可以指定种子和系统提示来创建多样化的数据集。
  • 高级技术:了解如何使用 Evol-Inform 改进现有数据集,如何生成高质量的合成数据,如 Orcaphi-1 论文中所示。
  • 筛选数据:涉及正则表达式、删除近乎重复项、专注于具有大量标记的答案等的传统技术。
  • 提示模板:没有真正的标准方法来格式化说明和答案,这就是为什么了解不同的聊天模板(例如 ChatML、Alpaca 等)很重要的原因。

📚 参考资料


3. 预训练模型

预培训是一个非常漫长且昂贵的过程,这就是为什么这不是本课程的重点。对培训前发生的情况有一定程度的了解是件好事,但不需要实践经验。

  • 数据管道:预训练需要庞大的数据集(例如,Llama 2 在 2 万亿个令牌上进行训练),这些数据集需要使用预定义的词汇表进行过滤、标记化和整理。
  • 因果语言建模:了解因果语言建模和掩蔽语言建模之间的区别,以及在这种情况下使用的损失函数。为了进行高效的预训练,请了解有关 Megatron-LMgpt-neox 的更多信息。
  • 缩放定律定标定律根据模型大小、数据集大小和用于训练的计算量来描述预期的模型性能。
  • 高性能计算:此处不在讨论范围之内,但如果您打算从头开始创建自己的 LLM(硬件、分布式工作负载等),则了解有关 HPC 的更多知识是必不可少的。

📚 参考资料

  • Junhao Zhao 的 LLMDataHub:用于预训练、微调和 RLHF 的精选数据集列表。
  • 使用 Hugging Face 从头开始训练因果语言模型:使用 transformers 库从头开始预训练 GPT-2 模型。
  • Zhang et al.的TinyLama:查看此项目,以更好地了解如何从头开始训练Lama模型。
  • Hugging Face 的因果语言建模:解释因果语言建模和掩码语言建模之间的区别,以及如何快速微调 DistilGPT-2 模型。
  • 怀旧作家对 Chinchilla 的狂野影响:讨论缩放法则并解释它们对 LLM 的一般意义。
  • BIGScience 的 BLOOM:概念页面,描述了 BLOOM 模型的构建方式,其中包含有关工程部分和遇到的问题的大量有用信息。
  • Meta 的 OPT-175 日志:研究日志显示哪里出错了,什么做对了。如果您计划预先训练一个非常大的语言模型(在本例中为 175B 参数),则非常有用。
  • LLM 360:一个开源 LLM 框架,包含训练和数据准备代码、数据、指标和模型。

4. 监督微调

预先训练的模型仅在 next-token 预测任务上进行训练,这就是为什么它们不是有用的助手。SFT 允许您调整它们以响应说明。此外,它允许您在任何数据(私有、GPT-4 看不到等)上微调您的模型并使用它,而无需为像 OpenAI 这样的 API 付费。

  • 完全微调:完全微调是指训练模型中的所有参数。这不是一种有效的技术,但它会产生稍微好一点的结果。
  • LoRA:一种基于低秩适配器的参数高效技术 (PEFT)。我们只训练这些适配器,而不是训练所有参数。
  • QLoRA:另一个基于 LoRA 的 PEFT,它也以 4 位量化模型的权重,并引入分页优化器来管理内存峰值。将其与 Unsloth 结合使用,可在免费的 Colab 笔记本上高效运行。
  • Axolotl:一个用户友好且功能强大的微调工具,用于许多最先进的开源模型。
  • DeepSpeed:针对多 GPU 和多节点设置(在 Axolotl 中实现)的 LLM 进行高效的预训练和微调。

📚 参考资料


5. 首选项对齐

在监督微调之后,RLHF 是用于将 LLM 的答案与人类期望保持一致的一个步骤。这个想法是从人类(或人工)反馈中学习偏好,这可用于减少偏见、审查模型或使它们以更有用的方式运行。它比 SFT 更复杂,通常被视为可选。

  • 偏好数据集:这些数据集通常包含多个具有某种排名的答案,这使得它们比指令数据集更难生成。
  • 近端策略优化: 该算法利用奖励模型来预测给定文本是否被人类高度排名。然后,此预测用于优化 SFT 模型,并根据 KL 散度进行惩罚。
  • Direct Preference Optimization: DPO 通过将 DPO 重新定义为分类问题来简化流程。它使用参考模型而不是奖励模型(无需训练),并且只需要一个超参数,使其更加稳定和高效。

📚 参考资料


6. 评估

评估 LLM 是管道中被低估的部分,它既耗时又适度可靠。你的下游任务应该决定你想要评估什么,但永远记住古德哈特定律:“当一个度量成为目标时,它就不再是一个好的度量。

  • 传统指标:困惑度和 BLEU 分数等指标不像以前那样受欢迎,因为它们在大多数情况下都存在缺陷。了解它们以及何时可以应用它们仍然很重要。
  • 一般基准Open LLM 排行榜基于语言模型评估工具,是通用 LLM(如 ChatGPT)的主要基准。还有其他流行的基准测试,如 BigBenchMT-Bench 等。
  • 特定于任务的基准:摘要、翻译和问答等任务具有专用的基准、指标,甚至子域(医疗、财务等),例如用于生物医学问答的 PubMedQA
  • 人工评价:最可靠的评价是用户的接受率或人工的比较。除了聊天跟踪之外(例如,使用 LangSmith)之外,记录用户反馈有助于确定潜在的改进领域。

📚 参考资料


7. 量化

量化是使用较低精度转换模型的权重(和激活)的过程。例如,使用 16 位存储的权重可以转换为 4 位表示。这种技术对于降低与 LLM 相关的计算和内存成本变得越来越重要。

  • 基本技术:了解不同级别的精度(FP32、FP16、INT8 等)以及如何使用 absmax 和零点技术执行朴素量化。
  • GGUF 和 llama.cppllama.cpp 和 GGUF 格式最初设计为在 CPU 上运行,现已成为在消费级硬件上运行 LLM 的最流行工具。
  • GPTQ 和 EXL2GPTQ,更具体地说,EXL2 格式提供了令人难以置信的速度,但只能在 GPU 上运行。模型也需要很长时间才能被量化。
  • AWQ:这种新格式比 GPTQ 更准确(更低的困惑度),但使用的 VRAM 要多得多,而且不一定更快。

📚 参考资料


8. 新趋势

  • 位置嵌入:了解 LLM 如何对位置进行编码,尤其是 RoPE 等相对位置编码方案。实现 YaRN (将注意力矩阵乘以温度因子) 或 ALiBi (基于标记距离的注意力惩罚)以延长上下文长度。
  • 模型合并:合并经过训练的模型已成为无需任何微调即可创建高性能模型的流行方法。流行的 mergekit 库实现了最流行的合并方法,如 SLERP、DARETIES
  • 专家混合Mixtral 凭借其出色的性能重新普及了 MoE 架构。与此同时,通过合并 Phixtral 等模型,OSS 社区中出现了一种 frankenMoE,这是一种更便宜且性能更高的选择。
  • 多模态模型:这些模型(如 CLIPStable DiffusionLLaVA)使用统一的嵌入空间处理多种类型的输入(文本、图像、音频等),从而解锁文本到图像等强大的应用程序。

📚 参考资料

👷 LLM工程师

本课程的这一部分侧重于学习如何构建可在生产中使用的 LLM 驱动的应用程序,重点是增强模型和部署它们。

1. 运行 LLM

由于硬件要求较高,运行 LLM 可能很困难。根据您的使用案例,您可能只想通过 API(如 GPT-4)使用模型或在本地运行它。在任何情况下,其他提示和指导技术都可以改进和限制应用程序的输出。

  • LLM API:API 是部署 LLM 的一种便捷方式。这个空间分为私有 LLM(OpenAIGoogleAnthropicCohere 等)和开源 LLM(OpenRouterHugging FaceTogether AI 等)。
  • 开源 LLMHugging Face Hub 是查找 LLM 的好地方。您可以直接在 Hugging Face Spaces 中运行其中一些,也可以在 LM Studio 等应用程序中或通过 CLI 下载并运行它们llama.cppOllama
  • 提示工程:常见的技术包括 zero-shot prompting、few-shot prompting、chain of thought 和 ReAct。它们更适合较大的模型,但可以适应较小的模型。
  • 结构化输出:许多任务需要结构化输出,例如严格模板或 JSON 格式。LMQL、OutlinesGuidance 等库可用于指导生成并遵循给定的结构。

📚 参考资料


2. 构建 Vector Storage

创建矢量存储是构建检索增强生成 (RAG) 管道的第一步。文档被加载、拆分,并使用相关块来生成矢量表示(嵌入),这些向量表示(嵌入)被存储起来以备将来在推理期间使用。

  • 摄取文档:文档加载器是方便的包装器,可以处理多种格式:PDF、JSON、HTML、Markdown 等。他们还可以直接从一些数据库和 API(GitHub、Reddit、Google Drive 等)中检索数据。
  • 拆分文档:文本拆分器将文档分解为更小的、语义上有意义的块。与其在 n 个字符后拆分文本,不如按标题或递归方式拆分,并带有一些额外的元数据。
  • 嵌入模型:嵌入模型将文本转换为矢量表示。它允许对语言进行更深入、更细致的理解,这对于执行语义搜索至关重要。
  • 向量数据库:向量数据库(如 ChromaPineconeMilvusFAISS、Annoy 等)旨在存储嵌入向量。它们能够根据向量相似性高效检索与查询“最相似”的数据。

📚 参考资料


3. 检索增强一代

借助 RAG,LLM 可以从数据库中检索上下文文档,以提高其答案的准确性。RAG 是一种无需任何微调即可增强模型知识的流行方法。

  • 编排器:编排器(如 LangChainLlamaIndexFastRAG 等)是流行的框架,用于将 LLM 与工具、数据库、内存等连接起来并增强其功能。
  • 检索器:用户说明未针对检索进行优化。可以应用不同的技术(例如,多查询检索器、HyDE 等)来改写/扩展它们并提高性能。
  • 记忆:为了记住以前的说明和答案,LLM 和 ChatGPT 等聊天机器人将此历史记录添加到其上下文窗口中。该缓冲液可以通过汇总(例如,使用较小的 LLM)、载体存储 + RAG 等来改进。
  • 评估:我们需要评估文档检索(上下文精度和召回率)和生成阶段(忠实度和答案相关性)。它可以通过 RagasDeepEval 工具进行简化。

📚 参考资料


4. 高级 RAG

实际应用程序可能需要复杂的管道,包括 SQL 或图形数据库,以及自动选择相关工具和 API。这些高级技术可以改进基线解决方案并提供其他功能。

  • 查询构建:存储在传统数据库中的结构化数据需要特定的查询语言,如 SQL、Cypher、元数据等。我们可以直接将用户指令翻译成查询,通过查询构造来访问数据。
  • 代理和工具:代理通过自动选择最相关的工具来提供答案来增强 LLM。这些工具可以像使用 Google 或 Wikipedia 一样简单,也可以像 Python 解释器或 Jira 一样复杂。
  • Post-processing(后处理):处理馈送到 LLM 的输入的最后一步。它通过重新排序、RAG 融合和分类增强了检索到的文档的相关性和多样性。
  • 程序 LLMDSPy 等框架允许您以编程方式基于自动评估优化提示和权重。

📚 参考资料


5. 推理优化

文本生成是一个成本高昂的过程,需要昂贵的硬件。除了量化之外,还提出了各种技术来最大限度地提高吞吐量并降低推理成本。

  • Flash Attention:优化注意力机制,将其复杂度从二次转换为线性,从而加快训练和推理速度。
  • 键值缓存:了解键值缓存以及多查询注意力 (MQA) 和分组查询注意力 (GQA) 中引入的改进。
  • 推测性解码:使用小型模型生成草稿,然后由大型模型进行审查,以加快文本生成速度。

📚 参考资料

  • 通过 Hugging Face 进行 GPU 推理:说明如何在 GPU 上优化推理。
  • Databricks 的 LLM 推理:如何在生产中优化 LLM 推理的最佳实践。
  • 通过 Hugging Face 优化 LLM 的速度和内存:解释优化速度和内存的三种主要技术,即量化、Flash Attention 和架构创新。
  • Assisted Generation by Hugging Face:HF 的推测解码版本,这是一篇有趣的博客文章,介绍了它如何使用代码来实现它。

6. 部署 LLM

大规模部署 LLM 是一项工程壮举,可能需要多个 GPU 集群。在其他场景中,可以以低得多的复杂度实现演示和本地应用程序。

  • 本地部署:隐私是开源 LLM 相对于私有 LLM 的重要优势。本地 LLM 服务器(LM StudioOllamaoobaboogakobold.cpp 等)利用这一优势来支持本地应用程序。
  • 演示部署GradioStreamlit 等框架有助于构建应用程序原型和共享演示。您还可以轻松地在线托管它们,例如使用 Hugging Face Spaces
  • 服务器部署:大规模部署 LLM 需要云(另请参阅 SkyPilot)或本地基础设施,并且通常利用优化的文本生成框架,如 TGIvLLM 等。
  • 边缘部署:在受限环境中,MLC LLMmnn-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 由于训练和提示的方式也存在独特的弱点。

  • Prompt hacking:与提示工程相关的不同技术,包括提示注入(劫持模型答案的额外指令)、数据/提示泄漏(检索其原始数据/提示)和越狱(制作提示以绕过安全功能)。
  • 后门:攻击媒介可以通过毒害训练数据(例如,使用虚假信息)或创建后门(在推理过程中改变模型行为的秘密触发器)来针对训练数据本身。
  • 防御措施:保护 LLM 应用程序的最佳方法是针对这些漏洞测试它们(例如,使用红队和 garak 等检查),并在生产环境中观察它们(使用像 langfuse 这样的框架)。

📚 参考资料


确认

该路线图的灵感来自于 Milan Milanović 和 Romano Roth 的优秀 DevOps 路线图

特别鸣谢:

  • Thomas Thelen 激励我制定路线图
  • André Frade 对初稿的意见和审查
  • Dino Dunn 提供有关 LLM 安全性的资源
  • Magdalena Kuhn 改进了“人工评估”部分
  • Odoverdose 推荐 3Blue1Brown 关于变形金刚的视频

免责声明:我不隶属于此处列出的任何来源。


Star 历史图表

About

使用路线图和 Colab 笔记本进入大型语言模型 (LLM) 的课程。

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Jupyter Notebook 100.0%