LLM 学习笔记
Github(中文版)分享:https://github.com/WSake/LLM
Large Language Model Course分享的学习课程,整理出来的中文版,希望对您有帮助~😀
🧑💻 大模型学习课程
📙 GitHub
Mlabonne大佬推荐以及贡献的课程分为三个部分:
- 🧩 LLM Fundamentals 涵盖有关数学、Python 以及神经网络的基本知识
- 🧑🔬 The LLM Scientist 专注于使用最新技术构建最好的 LLM
- 👷 The LLM Engineer 重点介绍如何创建基于 LLM 的应用程序并进行部署
有意思的,对于课程的交互式版本,Mlabonne微调了两个 LLM 助手,它们将以个性化的方式回答你的问题:
- 🤗 HuggingChat Assistant: Mixtral-8x7B版本
- 🤖 ChatGPT Assistant: ChatGPT版本
学习路线
🧩 第一部分 LLM 基础
介绍有关数学、Python 和神经网络的基本知识。您可能不需要从这里开始,但您可以参考它的学习路线,或者推荐给您的朋友。
1、机器学习与数学
✍ 如果你是初学者,在掌握机器学习之前,了解为这些算法提供动力的基本数学概念非常重要
- 线性代数: 这对于理解许多算法至关重要,尤其是深度学习中使用的算法。关键概念包括向量、矩阵、行列式、特征值和特征向量、向量空间和线性变换。
- 微积分: 许多机器学习算法涉及连续函数的优化,这需要了解导数、积分、极限和级数。多变量微积分和梯度的概念也很重要。
- 概率与统计: 这些对于理解模型如何从数据中学习和进行预测至关重要。关键概念包括概率论、随机变量、概率分布、期望、方差、协方差、相关性、假设检验、置信区间、最大似然估计和贝叶斯推理。
🔖 推荐课程:
- 3Blue1Brown - 线性代数的本质: 从基础开始线性代数系列
- StatQuest with Josh Starmer - 统计学基础: 简单明了的统计学
- AP 统计直觉 by Ms Aerin: 提供每种概率统计的详细信息
- 沉浸式线性代数: 沉浸式学习线性代数
- Khan Academy - 线性代数: 非常适合初学者,因为它以非常直观的方式解释了概念
- Khan Academy - 微积分: 一门涵盖微积分所有基础的课程
- Khan Academy - 概率论: 易于理解的概率统计课程
2、Python
Python 是一种功能强大且灵活的编程语言,由于其可读性、一致性和强大的数据科学库生态系统,特别适合机器学习
- Python 基础知识: Python 编程需要对基本语法、数据类型、错误处理和面向对象编程有很好的理解
- 常用的库s: 包括熟悉用于数值运算的 NumPy、用于数据操作和分析的 Pandas、用于数据可视化的 Matplotlib 和 Seaborn
- 数据预处理: 这涉及特征扩展和归一化、处理缺失数据、异常值检测、分类数据编码以及将数据拆分为训练集、验证集和测试集
- 机器学习: 熟练使用 Scikit-learn(一个提供多种监督和无监督学习算法的库)至关重要。了解如何实现线性回归、逻辑回归、决策树、随机森林、k 最近邻 (K-NN) 和 K-means 聚类等算法非常重要。PCA 和 t-SNE 等降维技术也有助于可视化高维数据。
📚 推荐课程:
- Real Python: 一个全面的资源,包含适用于初学者和高级 Python 概念的文章和教程
- freeCodeCamp - 学习Python: 详细介绍了 Python 中的所有核心概念
- Python Data Science 学习手册: 免费电子书,是学习 pandas、NumPy、Matplotlib 和 Seaborn 的绝佳资源
- freeCodeCamp - 机器学习: 为初学者提供不同机器学习算法的实用介绍
- Udacity - 机器学习简介: 涵盖 PCA 和其他几个机器学习概念的免费课程
3、神经网络
神经网络是许多机器学习模型的基本组成部分,尤其是在深度学习领域。为了有效地利用它们,必须全面了解它们的设计和机制
-
基础知识: 包括了解神经网络的结构,例如层、权重、偏差和激活函数(sigmoid、tanh、ReLU 等)
-
训练及优化: 熟悉反向传播和不同类型的损失函数,如均方误差 (MSE) 和交叉熵。了解各种优化算法,如 Gradient Descent、Stochastic Gradient Descent、RMSprop 和 Adam
-
过拟合: 了解过拟合的概念(模型在训练数据上表现良好,但在无标签的测试数据上表现不佳),并学习各种正则化技术(dropout、L1/L2 正则化、early stopping、数据增强)来防止过拟合
-
实现多层感知器 (MLP): 使用 PyTorch 构建 MLP,也称为全连接层
-
📚 推荐课程:
-
3Blue1Brown - 什么是神经网络?: 直观地解释了神经网络及其内部工作原理
-
freeCodeCamp - 深度学习速成课程: 高效地介绍了深度学习中所有重要的概念
-
Fast.ai - 实用深度学习: 为有编程经验并想学习深度学习的人设计的免费课程
-
Patrick Loeber - PyTorch 教程: 系列视频,适合完全初学者学习PyTorch
4、自然语言处理(NLP)
NLP 是人工智能的一个迷人分支,它弥合了人类语言和机器理解之间的差距。
从简单的文本处理到理解语言的细微差别,NLP 在许多应用程序中发挥着至关重要的作用,例如翻译、情感分析、聊天机器人🤖等等
- 文本预处理: 了解各种文本预处理步骤,如分词(将文本拆分为单词或句子)、词干提取(将单词减少为根形式)、词形还原(类似于词干提取,但要考虑上下文)、停用词删除等
- 特征提取: 熟悉将文本数据转换为机器学习算法可以理解的格式的技术。主要方法包括词袋 (BoW)、词频逆文档频率 (TF-IDF) 和 n-grams。
- 文本嵌入: 文本嵌入是一种单词表示形式,它允许具有相似含义的单词具有类似的表示形式。主要方法包括 Word2Vec、GloVe 和 FastText。
- 递归神经网络(RNN): 了解 RNN 的工作原理,RNN 是一种旨在处理序列数据的神经网络。探索 LSTM 和 GRU,这两种 RNN 变体能够学习长期依赖关系
📚 Resources:
- RealPython - NLP with spaCy in Python: 有关 Python 中用于 NLP 任务的 spaCy 库的详尽指南
- Kaggle - NLP 指南: 一些笔记本和资源,用于 Python 中 NLP 的动手解释
- Jay Alammar - The Illustration Word2Vec: 帮助你了解著名的 Word2Vec 架构
- Jake Tae - 从零开始构建PyTorch RNN: 在 PyTorch 中实用简单地实现 RNN、LSTM 和 GRU 模型
- colah’s blog - 理解LSTM: 一篇关于 LSTM 网络的文章
第二部分 🧑🔬 The LLM Scientist
这一部分课程侧重于学习如何使用最新技术构建 LLM
1. 大模型架构
虽然不需要对 Transformer 架构有深入的了解,但对其输入 (token) 和输出 (logits) 有很好的理解是很重要的
原版注意力机制是另一个需要掌握的关键组件,因为会介绍它的改进版本
- 高级视图: 重新审视编码器-解码器 Transformer 架构,更具体地说是每个现代 LLM 中使用的仅解码器 GPT 架构
- 分词化: 了解如何将原始文本数据转换为模型可以理解的格式,这涉及将文本拆分为标记(通常是单词或子词)
- 注意力机制: 掌握注意力机制背后的理论,包括自注意力和缩放点积注意力,这使模型在产生输出时能够专注于输入的不同部分
- 文本生成:了解模型生成输出序列的不同方式。常见的策略包括贪心解码、束搜索、top-k 采样和原子核采样。
📚 推荐课程:
- 图解 Transformer by Jay Alammar: 对 Transformer 模型的直观解释
- 图解 GPT-2 by Jay Alammar: 侧重于 GPT 架构,与 Llama 的架构非常相似
- Transformers 的视觉介绍 by 3Blue1Brown: 简单易懂的 Transformers 视觉介绍
- LLM 可视化 by Brendan Bycroft: 令人难以置信的 LLM 内部情况的 3D 可视化
- nanoGPT by Andrej Karpathy: 一个 2 小时的 YouTube 视频,从头开始重新实现 GPT(面向程序员)
- Attention? Attention! by Lilian Weng: 以更正式的方式介绍注意力机制
- LLM 中的解码策略: 提供代码和用于生成文本的不同解码策略的直观介绍
2. 构建指令数据集
虽然很容易从 Wikipedia 和其他网站找到原始数据,但自己制作高质量的QA对还是有些困难
与传统机器学习一样,数据集的质量将直接影响模型的质量,这就是为什么它可能是微调过程中最重要的组成部分
- Alpaca-like dataset: 使用 OpenAI API (GPT) 从头开始生成合成数据。您可以指定种子和系统提示来创建多样化的数据集。
- Advanced techniques: 学习如何使用 Evol-Instruct 改进现有数据集,如何生成高质量的合成数据,就像 Orca 和 phi-1 论文一样。
- 筛选数据: 传统技术涉及正则表达式、删除重复的数据、专注于具有大量标记的答案等
- 提示词模板: 没有真正的标准方法来格式化说明和答案,这就是为什么了解不同的prompt模板很重要的原因,例如 ChatML, Alpaca, 等.
📚 推荐课程:
- 准备用于指令调优的数据集 by Thomas Capelle: 探索 Alpaca 和 Alpaca-GPT4 数据集以及如何格式化它们。
- 生成 Clinical Instruction 数据集 by Solano Todeschini: 有关如何使用 GPT-4 创建合成指令数据集的教程
- GPT 3.5 用于新闻分类 by Kshitiz Sahay: 使用 GPT 3.5 创建指令数据集,以微调 Llama 2 以进行新闻分类
- 创建用于微调 LLM 的数据集: 包含一些用于筛选数据集并上传结果的方法的笔记
- 聊天模板 by Matthew Carrigan: Hugging Face 关于提示模板的页面
3. 预训练模型
预训练是一个非常漫长且昂贵的过程,这不是本课程的重点
对训练前发生的情况有一定程度的了解是件好事,但不需要实践经验
-
Data pipeline: 预训练需要庞大的数据集(例如,Llama 2 在 2 万亿个token上进行训练),这些数据集需要使用预定义的词汇表进行过滤、标记化和整理。
-
Causal language 建模: 了解因果语言建模和掩码语言建模之间的区别。为了进行高效的预训练,请详细了解 Megatron-LM 或 gpt-neox
-
Scaling laws: 缩放定律根据模型大小、数据集大小和用于训练的计算量来描述预期的模型性能
-
High-Performance Computing: 此处不在讨论范围之内,但如果您打算从头开始创建自己的 LLM(硬件、分布式工作负载等),那么了解有关 HPC 的更多知识是必不可少的
-
📚 推荐课程:
-
LLMDataHub by Junhao Zhao: 用于预训练、微调和 RLHF 的精选数据集列表
-
从头开始训练因果语言模型 by Hugging Face: 使用 transformers 库从头开始预训练 GPT-2 模型
-
TinyLlama by Zhang et al.: 更好地了解如何从头开始训练 Llama 模型
-
Causal language modeling by Hugging Face: 解释因果语言建模和掩码语言建模之间的区别,以及如何快速微调 DistilGPT-2 模型
-
Chinchilla’s wild implications by nostalgebraist: 讨论缩放定律并解释它们对 LLM 的一般意义
-
BLOOM by BigScience: 描述 BLOOM 模型构建方式的 Notion 页面,其中包含有关工程部分和遇到的问题的大量有用信息
-
OPT-175 Logbook by Meta: 研究日志显示哪里出了问题,什么做对了。如果您计划预先训练一个非常大的语言模型(在本例中为 175B 参数),则非常有用
-
LLM 360: 一个开源 LLM 框架,包含训练和数据准备代码、数据、指标和模型
4. 监督微调(SFT)
预先训练的模型仅在 next-token 预测任务上进行训练
SFT 允许您调整它们以响应说明。此外,它允许您在任何数据上微调您的模型并使用它,而无需为像 OpenAI 这样的 API 付费
- 全参微调: 全参微调是指训练模型中的所有参数。这不是一种有效的技术,但它会产生稍微好一点的结果
- LoRA微调: 一种基于低秩适配器的参数高效技术 (PEFT)。我们只训练这些适配器,而不是训练所有参数
- QLoRA微调: 另一个基于 LoRA 的 PEFT,以 4 位量化模型的权重,并引入分页优化器来管理内存峰值。将其与 Unsloth 结合使用,即可在免费的 Colab 笔记本上高效运行
- Axolotl: 一个对用户友好且功能强大的微调工具,用于许多最先进的开源模型
- DeepSpeed: 针对多 GPU 和多节点设置(在 Axolotl 中实现)的 LLM 进行高效的预训练和微调
📚 推荐课程:
- The Novice’s LLM Training Guide by Alpin: 微调 LLM 时要考虑的主要概念和参数概述
- LoRA insights by Sebastian Raschka: 有关 LoRA 以及如何选择最佳参数的实用见解
- 微调您自己的 Llama 2 模型: 有关如何使用 Hugging Face 库微调 Llama 2 模型的动手实践教程
- Padding Large Language Models by Benjamin Marie: 填充因果 LLM 训练示例的最佳实践
- LLM 微调初学者指南: 有关如何使用 Axolotl 微调 CodeLlama 模型的教程
5.偏好对齐
在监督微调之后,RLHF 是用于将 LLM 的答案与人类期望保持一致的一个步骤
从人类(或人工)反馈中学习偏好,这可用于减少偏见、审查模型或使它们以更有用的方式运行。它比 SFT 更复杂,通常被视为可选。
- Preference datasets: 这些数据集通常包含多个具有某种排名的答案,这使得它们比指令数据集更难生成
- Proximal Policy Optimization: PPO 利用奖励模型来预测给定文本是否被人类高度排名。然后,此预测用于优化 SFT 模型,并根据 KL 散度进行惩罚
- Direct Preference Optimization: DPO 通过将流程重新定义为分类问题来简化流程。它使用参考模型而不是奖励模型(无需训练),并且只需要一个超参数,使其更加稳定和高效
📚 推荐课程:
- Distilabel by Argilla: 创建您自己的数据集的绝佳工具。它是专为偏好数据集设计的,但也可以执行 SFT
- 使用 RLHF 训练 LLM by Ayush Thakur: 解释为什么 RLHF 需要减少 LLM 中的偏差并提高性能
- Illustration RLHF by Hugging Face: RLHF 简介,包括奖励模型训练和强化学习微调
- Preference Tuning LLMs by Hugging Face: 比较 DPO、IPO 和 KTO 算法以执行首选项对齐
- LLM 训练:RLHF 及其替代方案 by Sebastian Rashcka: RLHF 流程和 RLAIF 等替代方案概述
- 使用 DPO 微调 Mistral-7b: 使用 DPO 微调 Mistral-7b 模型并重现 NeuralHermes-2.5 的教程。
6. 评估
评估 LLM 是整个流程中被低估的部分,这虽然耗时但相对可靠
你的下游任务应该决定你想要评估什么,但永远记住古德哈特定律:“当一个度量成为目标时,它就不再是一个好的度量。
- 传统指标: 困惑度和 BLEU 分数等指标并不像以前那样受欢迎,因为它们在大多数情况下都存在缺陷。但了解它们以及何时可以应用它们仍然很重要。
- General 基准: 基于 语言模型评估工具,Open LLM Leaderboard 是通用 LLM(如 ChatGPT)的主要基准。还有其他流行的基准测试,如 BigBench、MT-Bench 等。
- 特定于任务的基准测试: 摘要、翻译和问答等任务有专门的基准、指标,甚至子领域(医疗、金融等),例如用于生物医学问答的 PubMedQA
- 人工评估: 最可靠的评估是用户的接受率或人类的比较。除了聊天跟踪之外,记录用户反馈(例如,使用 LangSmith) 有助于确定需要改进的潜在领域
📚 推荐课程:
- Perplexity of fixed-length models by Hugging Face: 使用 transformers 库实现
- BLEU at your own risk by Rachael Tatman: BLEU 分数概述及其许多问题,并附有示例
- LLM 评估调查 by Chang et al.: 关于评估内容、评估位置和评估方法的综合论文
- Chatbot Arena 排行榜 by lmsys: 通用 LLM 的 Elo 评级,基于人类的比较
7. 量化
量化是使用较低精度转换模型的权重(和激活)的过程
例如,使用 16 位存储的权重可以转换为 4 位表示。这种技术对于降低与 LLM 相关的计算和内存成本变得越来越重要。
- 基本技术: 了解不同级别的精度(FP32、FP16、INT8 等)以及如何使用 absmax 和零点技术执行朴素量化
- GGUF and llama.cpp: llama.cpp 和 GGUF 格式最初设计为在 CPU 上运行,现已成为在消费级硬件上运行 LLM 的最流行工具
- GPTQ and EXL2: GPTQ 更具体地说, EXL2 格式提供了令人难以置信的速度,但只能在 GPU 上运行,模型也需要很长时间才能被量化
- AWQ: 这种新格式比 GPTQ 更准确(更低的困惑度),但使用的 VRAM 要多得多,而且不一定更快
📚 推荐课程:
- 量化简介: 量化、绝对最大值和零点量化以及带有代码的 LLM.int8() 概述
- 使用 llama.cpp 量化 Llama 模型: 有关如何使用 llama.cpp 和 GGUF 格式量化 Llama 2 模型的教程
- 使用 GPTQ 进行 4 位 LLM 量化: 有关如何使用 GPTQ 算法和 AutoGPTQ 量化 LLM 的教程
- ExLlamaV2:运行 LLM 的最快库:有关如何使用 EXL2 格式量化 Mistral 模型并使用 ExLlamaV2 库运行模型的指南
- 了解激活感知权重量化 by FriendliAI: AWQ 技术及其优势概述
8.新趋势
未来趋势
- Positional embeddings: 学习大型语言模型如何编码位置,特别是像相对位置编码方案RoPE这样的方法。实现YaRN(将注意力矩阵乘以一个温度因子)或ALiBi(基于标记距离的注意力惩罚)以扩展上下文长度
- Model merging: 合并训练模型已成为在不进行任何微调的情况下创建高性能模型的流行方法。流行的 mergekit 库实现了最流行的合并方法,如 SLERP、DARE 和 TIES
- Mixture of Experts: Mixtral 因其出色的性能重新普及了 MoE 架构。与此同时,一种称为 frankenMoE 的模型在 OSS 社区中出现,通过合并像 Phixtral 这样的模型,它成为了一种更便宜且性能良好的选择
- Multimodal models: 这些模型(如CLIP、Stable Diffusion或LLaVA)通过统一的嵌入空间处理多种类型的输入(文本、图像、音频等),这解锁了强大的应用,如文本到图像
📚 推荐课程:
- 扩展 RoPE by EleutherAI: 总结不同位置编码技术的文章
- 了解 YaRN by Rajat Chawla: YaRN 简介
- 使用 mergekit 合并 LLM: 有关使用 mergekit 进行模型合并的教程
- 混合专家模型 by Hugging Face: 有关 MoE 及其工作原理的详尽指南
- 大型多模态模型 by Chip Huyen: 多模态系统概述和该领域的近期历史
第三部分👷 The LLM Engineer
这部分课程侧重于学习如何构建可在实际生活中使用的 LLM 驱动的Agent,重点是增强模型并且部署
1. 运行 LLMs
这一部分侧重于学习如何构建可在生产中使用的 LLM 驱动的应用程序,重点是强化模型然后进行部署,由于硬件要求较高,运行 LLM 可能很困难
但如果只想通过 API(如 GPT-4)使用模型或在本地运行它。在任何情况下,修改prompt可以改进和限制应用程序的输出
- LLM APIs:API 是部署大型语言模型(LLM)的一种便捷方式。(如 OpenAI、Google、Anthropic、Cohere 等)和开源 LLM(如 OpenRouter、Hugging Face、Together AI 等)
- 开源 LLMs: Hugging Face Hub 是寻找大型语言模型的绝佳去处。你可以在 Hugging Face Spaces 中直接运行其中一些模型,或者下载并在像 LM Studio 这样的应用程序中本地运行它们,也可以通过命令行界面使用 llama.cpp 或 Ollama 运行它们。
- Prompt 工程: 常用技术包括零样本提示、少样本提示、思维链和ReAct。这些技术在更大模型上效果更好,但也可以适应较小的模型
- 结构化输出: 许多任务需要结构化的输出,例如严格的模板或JSON格式。像LMQL、Outlines、Guidance等库可以用于指导生成并遵守给定的结构
📚 推荐课程:
- Run an LLM locally with LM Studio by Nisha Arya: 简短的LM Studio使用指南
- Prompt engineering guide by DAIR.AI: 带有示例的prompt技术详细指南
- Outlines - Quickstart: 大纲启用的引导生成技术列表
- LMQL - Overview: 介绍LMQL语言
2.构建 Vector Storage
创建向量存储是构建检索增强生成(RAG)的第一步
文档被加载、拆分,并使用相关块来生成向量表示(嵌入),这些向量表示(嵌入)被存储起来以备将来在推理期间使用。
- 提取文档: 文档处理器是便捷的包装器,可以处理许多格式:PDF、JSON、HTML、Markdown等。它们还可以直接从一些数据库和API(GitHub、Reddit、Google Drive等)检索数据
- 拆分文档: 文本拆分器将文档分解为更小的、语义上有意义的部分。与其在n个字符后分割文本,不如按标题或递归地进行分割,并附带一些额外的元数据
- 嵌入模型: 嵌入模型将文本转换为向量表示。它允许对语言进行更深入和更细致的理解,这对于执行语义搜索是必不可少的
- 向量数据库: 向量数据库(如 Chroma、Pinecone、Milvus、FAISS、Annoy 等)旨在存储嵌入向量。它们能够基于向量相似性高效检索与查询“最相似”的数据
📚 推荐课程:
- LangChain - Text splitters: 不同的文本拆分器在LangChain中的实现列表
- Sentence Transformers library: 常用的嵌入模型库
- MTEB Leaderboard: 嵌入模型的排行榜
- The Top 5 Vector Databases by Moez Ali: 最佳和最受欢迎的向量数据库比较
3.检索增强生成(RAG)
使用RAG,大型语言模型从数据库中检索上下文文档以提高其答案的准确性
RAG是一种在不进行任何微调的情况下增强模型知识的流行方法
- Orchestrators: 编排器(如LangChain、LlamaIndex、FastRAG等)是流行的框架,用于将您的LLM与工具、数据库、记忆等连接起来,并增强其能力
- Retrievers: 用户指令不适合检索。可以应用不同的技术(例如,多查询检索器、HyDE等)来改写/扩展它们,从而提高性能
- Memory: 为了记住之前的指令和答案,像ChatGPT这样的大型语言模型和聊天机器人会将这一历史添加到它们的上下文窗口中。这个缓冲区可以通过总结(例如使用较小的语言模型)、向量存储+RAG等方法得到改进
- Evaluation: 我们需要评估文档检索(上下文精确度和召回率)和生成阶段(忠实度和答案相关性)。可以使用工具Ragas和DeepEval来简化这一过程
📚 推荐课程:
- Llamaindex - High-level concepts: 构建RAG需要了解的主要概念
- Pinecone - Retrieval Augmentation: 检索增强过程概述
- LangChain - Q&A with RAG: 逐步教程构建典型的RAG管道
- LangChain - Memory types: 不同类型的记忆及其相关用途列表
- RAG pipeline - Metrics: 概述用于评估RAG管道的主要指标
4.高级RAG
实际应用可能需要复杂的流程,包括SQL或图数据库,以及自动选择相关工具和API
这些高级技术可以改进基础解决方案并提供额外的功能
- Query construction: 存储在传统数据库中的结构化数据需要特定的查询语言,如SQL、Cypher、元数据等。我们可以直接将用户指令翻译成查询语句来访问数据,进行查询构建
- Agents and tools: 智能体通过自动选择最相关的工具来为LLM提供答案。这些工具可以像使用Google或Wikipedia一样简单,也可以像Python解释器或Jira一样复杂
- Post-processing: 最终步骤处理输入到LLM的内容。它通过重新排序、RAG融合和分类,增强检索到的文档的相关性和多样性
- Program LLMs: 像DSPy这样的框架允许你根据自动评估以编程方式优化提示和权重
📚 推荐课程:
- LangChain - Query Construction: 关于不同类型的构造查询
- LangChain - SQL: 关于如何使用LLM与SQL数据库交互的教程,涉及文本到SQL的转换和可选的SQL代理
- Pinecone - LLM agents: 介绍具有不同类型Agent
- LLM Powered Autonomous Agents by Lilian Weng: 关于LLM代理的理论文章
- LangChain - OpenAI’s RAG: OpenAI采用的RAG策略概述,包括后处理
- DSPy in 8 Steps: 通用DSPy指南,介绍模块、签名和优化器
5. 推理优化
文本生成是一个昂贵的过程,需要昂贵的硬件,除了量化之外,还提出了各种技术来最大化吞吐量和减少推理成本
- Flash Attention: 优化注意力机制,将其复杂度从二次变为线性,从而加速训练和推理
- Key-value cache: 理解键值缓存以及在多查询注意力机制(MQA)和分组查询注意力机制(GQA)中引入的改进
- Speculative decoding: 使用小型模型生成草稿,然后由较大模型进行审查以加速文本生成
📚 推荐课程:
- GPU Inference by Hugging Face: 解释如何优化GPU上的推理
- LLM Inference by Databricks: 如何优化生产环境中LLM推理的最佳实践
- Optimizing LLMs for Speed and Memory by Hugging Face: 解释三种优化速度和内存的主要技术,即量化、Flash Attention(闪存注意力)和架构创新
- Assisted Generation by Hugging Face: HF版本的推测解码,这是一篇有趣的博客文章,介绍了它是如何工作的以及实现它的代码
6. 部署大型语言模型
大规模部署LLM是一个可能需要多个GPU集群的工程
在其他情况下,演示和本地应用程序可以以低得多的复杂度实现
-
Local deployment: 隐私是开源大型语言模型相较于私有模型的重要优势。本地LLM服务器(如LM Studio、Ollama、oobabooga、kobold.cpp等)利用这一优势为本地应用程序提供支持
-
Demo deployment: 像Gradio和Streamlit这样的框架有助于原型设计应用程序和分享演示。您还可以轻松地将它们托管在线上,例如使用Hugging Face Spaces
-
Server deployment: 大规模部署LLM需要云(另见SkyPilot)或本地基础设施,并经常利用优化的文本生成框架,如TGI、vLLM等
-
Edge deployment: 在受限环境下,高性能框架如MLC LLM和mnn-llm可以在网页浏览器、Android和iOS上部署大型语言模型
-
📚 推荐课程:
-
Streamlit - Build a basic LLM app: 使用Streamlit创建基本的类似ChatGPT应用程序的教程
-
HF LLM Inference Container: 在Amazon SageMaker上使用Hugging Face的推理容器部署LLM
-
Philschmid blog by Philipp Schmid: 关于使用Amazon SageMaker部署大型语言模型的高质量文章集合
-
Optimizing latence by Hamel Husain: 在吞吐量和延迟方面的TGI、vLLM、CTranslate2和mlc的比较
7.确保大型语言模型的安全性
除了与软件相关的传统安全问题外,LLM由于其训练和提示方式具有独特的弱点
- Prompt hacking: 与提示工程相关的不同技术,包括提示注入(附加指令以确保模型的答案)、数据/提示泄露(检索其原始数据/提示)和越狱(设计提示以绕过安全功能)
- Backdoors: 攻击向量可以针对训练数据本身,通过污染训练数据(例如,使用虚假信息)或创建后门(秘密触发器以在推理期间改变模型的行为)
- Defensive measures: 保护你的大型语言模型应用的最佳方式是通过针对这些漏洞进行测试(例如,使用红队测试和像garak这样的检查工具),并在生产环境中观察它们(使用像langfuse这样的框架)
📚 推荐课程:
- OWASP LLM Top 10 by HEGO Wiki: LLM应用程序中出现的10个最关键漏洞列表
- Prompt Injection Primer by Joseph Thacker: 简短指南致力于为工程师提供prompt注入
- LLM Security by @llm_sec: 与LLM安全相关的大量资源列表
- Red teaming LLMs by Microsoft: 使用LLM进行演练的指南
📝 分享有关学习笔记与文章
一些工具
Notebook | Description | Notebook |
---|---|---|
🧐 LLM AutoEval | 使用 RunPod 自动评估您的 LLM | Open In Colab |
🥱 LazyMergekit | 使用 MergeKit 一键轻松合并模型 | Open In Colab |
🦎 LazyAxolotl | 使用 Axolotl 一键微调模型 | Open In Colab |
⚡ AutoQuant | 一键量化 GGUF、GPTQ、EXL2、AWQ 和 HQQ 格式的 LLM | Open In Colab |
🌳 Model Family Tree | 可视化合并模型的family tree | Open In Colab |
🚀 ZeroSpace | 使用免费的 ZeroGPU 自动创建 Gradio 聊天界面 | Open In Colab |
微调教程
Notebook | Description | Article | Notebook |
---|---|---|---|
Fine-tune Llama 2 with QLoRA | 在 Google Colab 中监督微调 Llama 2 的分步指南 | Article | Open In Colab |
Fine-tune CodeLlama using Axolotl | 用于微调的最先进工具的端到端指南 | Article | Open In Colab |
Fine-tune Mistral-7b with QLoRA | 在带有 TRL 的 Google Colab 中监督微调 Mistral-7b | Open In Colab | |
Fine-tune Mistral-7b with DPO | 使用 DPO 提高受监督的微调模型的性能 | Article | Open In Colab |
Fine-tune Llama 3 with ORPO | 使用 ORPO 在单个阶段进行更便捷、更快速的微调 | Article | Open In Colab |
Fine-tune Llama 3.1 with Unsloth | Google Colab 中的超高效监督微调 | Article | Open In Colab |
量化教程
Notebook | Description | Article | Notebook |
---|---|---|---|
Introduction to Quantization | 使用 8 位量化优化大型语言模型 | Article | Open In Colab |
4-bit Quantization using GPTQ | 量化您自己的开源 LLM,以便在消费类硬件上运行它们 | Article | Open In Colab |
Quantization with GGUF and llama.cpp | 使用 llama.cpp 量化 Llama 2 模型,并将 GGUF 版本上传到 HF Hub | Article | Open In Colab |
ExLlamaV2: The Fastest Library to Run LLMs | 量化并运行 EXL2 模型,并将其上传到 HF Hub | Article | Open In Colab |
其他教程
Notebook | Description | Article | Notebook |
---|---|---|---|
Decoding Strategies in Large Language Models | 从光速搜索到深度采样的文本生成指南 | Article | Open In Colab |
Improve ChatGPT with Knowledge Graphs | 用知识图谱增强 ChatGPT 的回答 | Article | Open In Colab |
Merge LLMs with MergeKit | 轻松创建你自己的模型,无需 GPU! | Article | Open In Colab |
Create MoEs with MergeKit | 将多个专家合并为一个 frankenMoE | Article | Open In Colab |
Uncensor any LLM with abliteration | 无需重新训练即可进行微调 | Article | Open In Colab |
Acknowledgements
目前这还是不完整的学习笔记,推荐课程链接来自于Large Language Model Course,后续会持续补充具体的学习内容~~🎄
关注一下:https://github.com/WSake/LLM
Disclaimer: I am not affiliated with any sources listed here.