Meta不久前刚发布了Llama 3.1的一系列开源模型,在多项基准测试中,超越了GPT-4o和Claude 3.5 Sonnet等闭源的商业大模型。开源大模型性能越来越强,可以满足很多私有化部署的业务场景。不同于商业模式的服务调用模式,需要自己搭建环境,部署模型。有些时候还要自己微调模型,以更好适应特有的场景。
LLM 的特点是计算要求非常高,具有数十亿个参数,并且需要对数 TB 的数据进行训练。这得益于过去十年计算能力的最新进步以及新的优化技术和架构。尽管取得了这些进步,但由于计算限制和专有模型,LLM 仍远未普及。例如,训练 GPT-4 的成本估计约为 1 亿美元。
虽然微调 700 亿个参数的模型可能仍需要大量计算资源,但成本已大幅降低,让像我这样的技术爱好者可以在本地运行其中一些模型。
本文用简单的方式总结LLM对部署环境的GPU显存的要求,以及大致的计算原理。面向那些想要在本地使用 LLM 且通常没有强大的 GPU 或不想在添加优化技术上浪费太多时间的人。介绍在本地运行 LLM 的基本内存要求,仅提及可以进行的基本优化。
简单总结原则,粗略的预估
推理:参数数量 * 精度(通常为 2 或 4 个字节)
训练:4-6倍推理资源
10亿个参数则将占用20亿个字节,或者说10亿个字节等于1GB,那么1B个参数占用2GB的内存。100B参数就需要占用200GB内存。这是一个近似值,因为1 KB不等于1,000字节,而是1,024字节。我们通过这种简单的方法可以大概评估内存的占用。
以Huggingface上meta-llama/Meta-Llama-3.1-70B-Instruct为例,70.6B,16位精度,那大概是130多G的GPU内存,也就是说两个80G的H100就可以。
推理
执行推理需要资源来加载模型权重并存储 KV 缓存和激活内存。模型大小是最主要的参数,比其他参数要大得多。
`总推理内存 = 模型大小 + KV 缓存 + 激活`
下面我们看看 模型大小、KV 缓存、激活 这些内存计算怎么得到
模型大小
第一个也是最重要的内存需求是加载模型所需的内存。这取决于模型的参数数量和所需的精度。一种常见的优化技术称为量化。量化包括以较低的精度加载模型权重。虽然它会影响性能,但效果并不明显,而且比选择具有更高精度的较小模型更可取。
`模型大小 = 参数数量 * 精度`
单一模型参数,在 32 位全精度下,由 4 个字节表示。因此,一个 10 亿参数的模型需要 4 GB 的 GPU RAM,才能以全精度将模型加载到 GPU RAM 中。通过将模型权重从 32 位全精度量化为 16 位或 8 位精度,您可以快速将 10 亿参数模型的内存需求减少 50% 至仅 2 GB,甚至减少 75% 至仅 1 GB 的加载内存需求。
精度计算
-
4 个字节: FP32 / 全精度 / float32 / 32 位
-
2 个字节: FP16 / float16 / bfloat16 / 16 位
-
1 字节: int8/8 位
-
0.5 字节: int4/4 位
KV 缓存
在 Transformer 中,解码阶段会在每个时间步骤生成一个 token,具体取决于之前的 token 张量(tensors)。为了避免重新计算这些张量,它们被缓存在 GPU 内存中。
`KV 缓存 = 2 * 批次大小 * 序列长度 * 层数 * 隐藏大小 * 精度`
批次大小、序列长度 、层数 、隐藏大小、精度包括后面需要用来计算内存的, 这些参数大部分情况下都可以从模型的Model card看到,如果Model card没有展示,就要从其他地方去查找,一般都是可以找到的。
激活
在模型的前向传递过程中,必须存储中间激活值。这些激活值表示数据在模型中向前传播时神经网络中每一层的输出。它们必须保存在 FP32 中,以避免数值爆炸并确保收敛。
`激活内存 = 批次大小 * 序列长度 * 隐藏大小 * (34 + (5 * 序列长度 * 注意力头数量) / (隐藏大小))`
并发
对于并发调用的情况,需要同时运行多个模型实例,那么总的内存需求将是单个模型层的内存需求乘以并发调用的数量。这是因为每个并发调用都需要独立的模型实例来处理,而这些实例将共享或占用相同的内存资源。
此外,需要注意的是,实际的内存消耗可能会因为推理框架的优化而有所不同。例如,一些优化得更好的框架可能会减少内存消耗,而使用高级技术如FlashAttention、Alibi或RoPE等也可以显著减少处理长序列时的内存消耗
训练
由于优化器和梯度状态,训练所需的资源比推理多。这些是训练模型所必需的,并且会显著增加所需的内存资源。
`总内存 = 模型大小 + KV 缓存 + 激活 + (优化器状态 + 梯度)* 可训练参数数量`
这些附加组件导致每个模型参数需要大约 12-20 字节的额外 GPU 内存。例如,要训练一个 10 亿参数的模型,您将需要大约 24 GB 的 32 位全精度 GPU RAM,这是模型推理所需的 4 GB GPU RAM 的六倍。
微调
由于优化器和梯度状态的计算,训练需要额外的内存资源。为了减少可训练参数的数量,通常采用参数高效微调 (PEFT) 技术,例如低秩自适应 (LoRA) 和量化低秩自适应 (QLoRA)。
优化器状态
优化算法需要资源来存储参数和辅助变量。这些变量包括 Adam(2 个状态)或 SGD(1 个状态)等优化算法使用的动量和方差等参数。这取决于优化状态的数量及其精度。
-
AdamW(2 个状态):每个参数 8 个字节
-
AdamW(bitsandbytes 量化):每个参数 2 个字节
-
SGD(1 个状态):每个参数 4 个字节
梯度优化
梯度值是在模型反向传递过程中计算的。它们表示损失函数相对于每个模型参数的变化率,对于在优化过程中更新参数至关重要。作为激活,它们必须存储在 FP32 中以保持数值稳定性。
减少微调内存消耗
由于优化器状态消耗大量内存,因此已经进行了大量的研究来减少它们的内存占用,例如:
-
LoRA:冻结整个模型,并添加一个具有数百万个参数的可训练适配器。使用LoRA,我们只存储适配器参数的优化器状态。
-
QLoRA: LoRA,但模型量化为4位或更低精度。
-
AdaFactor和AdamW-8bit:更高效的内存优化器,提供接近AdamW的性能。但AdaFactor在训练期间可能不稳定。
-
GaLore:将梯度投影到低秩子空间中,这可以将优化器状态的大小减少80%。
内存的另一个重要部分被激活所消耗。为了减少它通常采用梯度检查点。当需要计算梯度时,它会重新计算一些激活。它减少了内存消耗但也减慢了微调速度。
还有一些框架,如Unsloth,在使用LoRA和QLoRA进行微调方面进行了极大的优化。
LLM内存需求计算器
Github:https://github.com/manuelescobar-dev/LLM-System-Requirements
只需要选择模型,系统就可以根据默认参数和上面的公式计算出推理和微调所需的内存。也可以修改默认参数,按自己的实际情况填写。如果没有所需的模型可选,可以参考项目的默认模型的参数格式提供自己的参数就好。模型参数需要自己想办法查找到。
{` `"model_size":8,` `"architectures": [` `"LlamaForCausalLM"` `],` `"attention_bias": false,` `"attention_dropout": 0.0,` `"bos_token_id": 128000,` `"eos_token_id": 128001,` `"hidden_act": "silu",` `"hidden_size": 4096,` `"initializer_range": 0.02,` `"intermediate_size": 14336,` `"max_position_embeddings": 8192,` `"model_type": "llama",` `"num_attention_heads": 32,` `"num_hidden_layers": 32,` `"num_key_value_heads": 8,` `"pretraining_tp": 1,` `"rms_norm_eps": 1e-05,` `"rope_scaling": null,` `"rope_theta": 500000.0,` `"tie_word_embeddings": false,` `"torch_dtype": "bfloat16",` `"transformers_version": "4.40.0.dev0",` `"use_cache": true,` `"vocab_size": 128256``}
例如Llama3 70B,推理需要142.51GB
训练需要924.82GB, Percentage of trainable parameters 表示可训练参数的数量占模型中参数总数的比例。不同优化器所需内存差异还是比较大的。
了解一下量化
量化通过降低模型权重的精度来减少加载和训练模型所需的内存。量化将模型参数从 32 位精度转换为 16 位精度,甚至是 8 位或 4 位。量化将一组较高精度的浮点数源投影到一组较低精度的目标数中。量化机制利用源和目标范围,首先计算缩放因子,进行投影,然后以较低的精度存储结果,这样需要的内存更少,最终提高训练性能并降低成本。
投影后精度有所损失,因为现在小数点后只有六位。`fp16`的值`pi`现在是3.140625,通过将值存储在 中就已经损失了精度。
LLM的量化技术在减少内存需求和提高推理速度方面具有显著优势,但也需要权衡其对性能和效果的影响。通过采用合适的量化策略和优化方法,可以在保证模型精度的同时实现高效的推理性能。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。