
目录显存需求估算参数量经验法则基本计算激活内存激活占用显存 (VRAM)键值KV缓存关于权重 (weight)的考量推理 (inference)与训练的 FLOPS容量和速度都重要量化简介权衡准确性显存需求估算参数量经验法则估算运行大型语言模型LLM所需的硬件可能看起来很复杂。一个直接的估算方法可以简化这一过程。决定内存需求的最主要因素特别是图形处理单元GPU的显存VRAM是模型本身的规模由其参数 (parameter)数量衡量。可以把模型中的每个参数看作一个数字需要存储在某个可用于计算的位置。由于GPU是运行LLM的主要计算设备如第二章所述这些参数主要加载到GPU的专用内存——显存中。每个参数占用多少空间这取决于存储时使用的精度或数据类型。常见的精度类型包含FP32单精度浮点每个参数占用32位相当于4字节。这提供高精度但需要更多内存。FP16半精度浮点每个参数占用16位即2字节。这使得内存需求大约是FP32的一半通常对推理 (inference)性能影响很小。INT88位整数每个参数仅占用8位即1字节。这能进一步大幅减少内存使用但有时会导致模型准确性出现可察觉的下降。这通常通过一个称为量化 (quantization)的过程来实现我们在第三章简要介绍过。最常见的估算起点假设模型将使用FP16精度运行因为它在内存使用和性能之间提供了良好的平衡。基本计算基于此我们可以建立一个简单的经验法则来估算仅加载模型参数 (parameter)所需的最小显存 (VRAM)所需 显存 (GB)≈参数数量 (十亿)×每参数字节数10243 (字节/GB)所需显存(GB)≈10243(字节/GB)参数数量(十亿)×每参数字节数然而一个更简单的速算方法尤其是对于FP16常被使用所需 显存 (GB)≈参数数量 (十亿)×2 (FP16的字节数)所需显存(GB)≈参数数量(十亿)×2(FP16的字节数)来看几个例子一个70亿参数模型例如Llama 27B使用FP16精度2字节/参数 VRAM≈7 十亿×2 字节14 十亿 字节VRAM≈7十亿×2字节14十亿 字节 VRAM≈14×10910243≈13.04 GBVRAM≈1024314×109≈13.04GB 因此仅在FP16中容纳模型权重 (weight)您大约需要14 GB的显存。使用FP32精度4字节/参数 VRAM≈7 十亿×4 字节28 十亿 字节VRAM≈7十亿×4字节28十亿 字节 VRAM≈28×10910243≈26.07 GBVRAM≈1024328×109≈26.07GB 以完整精度加载相同模型将需要约28 GB的显存。使用INT8精度1字节/参数量化 (quantization)后 VRAM≈7 十亿×1 字节7 十亿 字节VRAM≈7十亿×1字节7十亿 字节 VRAM≈7×10910243≈6.52GBVRAM≈102437×109≈6.52GB 使用8位量化能大幅减少需求大约降至7 GB的显存。激活内存估算大型语言模型LLM的内存需求涉及多个因素。模型参数 (parameter)是此估算中的一个主要组成部分。此外另一个主要因素是激活所消耗的内存。当LLM处理您的输入例如一个问题并生成输出例如一个回答时它会逐层执行大量的计算。这些计算的中间结果被称为激活。可以把它想象成在白板上解决一个复杂的数学问题。模型参数就像您永久写下的已学公式和常数。而激活就像您在逐步计算最终答案时在工作区临时记下的数字和结果。正如您需要在白板上留出空间来放置这些临时笔记一样GPU在工作时也需要内存显存 (VRAM)来存储这些激活。激活占用显存 (VRAM)神经网络 (neural network)中的每一层都会接收输入可以是原始输入也可以是来自上一层的激活使用其参数 (parameter)进行处理并生成新的激活作为下一层的输出。这些激活必须保留在内存中直到它们在该特定处理步骤通常称为“前向传播”的后续计算中不再被需要为止。重要的是激活所需的显存量不像模型参数那样是固定不变的。它是动态的并且很大程度上取决于所执行任务的特点序列长度上下文 (context)长度更长的输入提示或生成更长的响应要求模型记录更多信息。这通常会导致激活尺寸更大从而需要更多显存。想象一下对于一个更长的问题您需要在白板上保留更多的中间步骤。批处理大小如果您同时处理多个输入序列一个“批次”以提高效率那么批次中每个序列的激活都需要存储。运行批处理大小为4将比批处理大小为1大约需要四倍的激活内存。模型架构大型语言模型的内部设计例如层数、这些层的“宽度”隐藏维度以及使用的注意力机制 (attention mechanism)直接影响所生成激活的大小和数量。键值KV缓存在文本生成过程中LLM通常顺序运行根据前面的词元 (token)一次生成一个词元。为避免对已处理词元的重复计算会使用一种名为键值KV缓存的技术。模型会为序列中的每个词元计算某些内部状态称为键和值这与你可能听说过的注意力机制 (attention mechanism)有关。KV缓存将这些状态存储在显存 (VRAM)中。生成下一个词元时模型会重复使用所有先前词元的缓存状态从而节省大量计算时间。然而这个缓存会占用内存。其大小取决于序列长度缓存大小与当前上下文 (context)中输入生成的词元数量呈线性增长。更长的序列意味着更大的缓存。批处理大小批处理中的每个序列都需要自己的KV缓存。模型配置模型的隐藏层大小和注意力头数量决定了每个词元存储的键和值的大小。对于长序列或大批处理KV缓存会变得相当大有时甚至能与模型权重 (weight)本身的大小相当。这是使用非常长的上下文窗口进行推理 (inference)时显存需求远超基础模型大小所暗示值的一个主要原因。关于权重 (weight)的考量请记住这些计算仅提供了模型权重的基准。您还需要额外的显存 (VRAM)用于激活值推理 (inference)过程中执行的中间计算。所需量很大程度上取决于上下文(context)长度模型一次处理的文本量和批处理大小同时处理的请求数量。KV缓存存储关于正在生成的序列的信息随生成文本的长度而增加。软件开销运行时环境、库如CUDA和操作系统都会占用一些显存。推理 (inference)与训练的 FLOPS需要注意的是从头开始训练LLM的计算需求比仅仅运行推理使用预训练 (pre-training)模型高出几个数量级。训练涉及反复处理大量数据集并调整所有模型参数 (parameter)需要长时间维持巨大的 FLOPS。对于大多数用户的重点——推理目标通常是获得足够快的响应以进行交互。虽然仍然是计算密集型任务特别是对于大型模型但所需的 FLOPS 远低于训练。然而对于大型模型而言拥有足够 FLOPS 能力的 GPU 对于流畅的用户体验仍然必不可少。容量和速度都重要LLM中的大量参数(parameter)需要存储在GPU的显存VRAM中。然而仅仅拥有足够的显存容量还不足够。数据在显存和GPU处理核心之间传输的速度也格外重要。这种速度被称为内存带宽。在评估用于运行LLM的硬件时显存 (VRAM)大小容量告诉您模型是否能装下但内存带宽速度则极大影响其运行速度。对于需要不断传输大量参数 (parameter)数据的大型语言模型更高的内存带宽通常直接转化为更好的性能体现在更快的响应时间或每秒生成更多词元(token)上。这两个因素在为您的LLM需求选择GPU时都是重要的考量。量化简介量化的主要优势是内存占用减少。 如果你将模型从 FP16FP1616位量化到 INT8INT88位你实际上可以将存储模型参数 (parameter)所需的显存 (VRAM)量减半。一个 FP16FP16 参数需要16位即2字节。一个 INT8INT8 参数需要8位即1字节。权衡准确性量化 (quantization)听起来几乎完美无缺那缺点是什么主要权衡是模型准确性或性能的潜在损失。通过降低参数(parameter)的精度你本质上是在近似原始模型。这种近似有时会导致输出质量略有下降、响应细节减少或在某些复杂任务上的能力下降。