https://www.substratus.ai/blog/calculating-gpu-memory-for-llm 这里提供了一个公式可以计算加载一个模型需要多少GPU内存?

M = \frac{(P * 4B)} {(32/{Q}) } * 1.2

这个公式首先计算模型的全精度大小\((P * 4B)\),再根据量化位宽(\(Q\))对精度进行缩减,然后再乘以\(1.2\)(考虑到加载模型时通常会有20%左右的额外开销)。

参数详解:

  • \(M\)
  • \(P\) (参数数量):模型的参数数量,比如对于Llama 70B模型,\(P\)
  • \(4B\)
  • \(Q\)
  • \(32\):用于将4字节转换为位的转换因子。
  • \(1.2\)

这个估算方法帮助开发者根据模型的大小和量化方法来确定所需的GPU内存量,使得在部署时更容易确定所需的硬件资源。

示例

假设以16位精度加载Llama 70B模型:

  1. 模型的参数数量 P = 70B(700亿)。
  2. 加载位数 Q = 16位。
  3. 每个参数占用 4B = 4个字节。

将这些值代入公式:

\[M = \frac{(70 * 4)} { (32 / 16)} * 1.2 = 168GB \]

所以需要168GB的GPU内存加载模型。

如何减少所需 GPU 内存?

可以看出,减少所需的GPU内存有以下几种方法:

减少模型的参数数量 (P)

减小模型的规模:降低模型的参数数量是减少GPU内存需求最直接的方法。选择较小的模型,例如从更大的模型(如GPT-3 175B)转向较小的模型(如GPT-2 1.5B),可以显著减少内存需求。

模型压缩:通过模型剪枝、蒸馏等技术减少参数数量,同时保持模型的性能。

降低量化位宽 (Q)

使用更低的量化精度:量化模型可以减少每个参数占用的内存。通过将参数从32位或16位浮点数降低到8位甚至4位,可以大幅减少内存占用。

例如,将精度从16位(Q=16)降低到8位(Q=8),GPU内存需求将近乎减半。

更高效的量化策略:使用自适应量化策略,在不影响性能的前提下,进一步降低内存需求。

使用内存优化技术

梯度检查点(Gradient Checkpointing):该技术可以通过在反向传播过程中保存部分中间梯度,而不是全部保存,从而减少内存需求。

分布式计算:将模型分布在多个GPU或节点上,可以有效地减小单个GPU的内存压力。

比如: https://github.com/exo-explore/exo 把现有的设备整合成一个强大的 GPU 中:iPhone、iPad、Android、Mac、Linux,几乎任何设备都可以。最新看到的一个玩法是23台Mac mini跑Meta的Llama3.1 405B。

总结

加载一个大型模型到GPU中所需的内存可以下面几项组成的公式计算:

  • 考虑模型参数的数量(P)
  • 量化位宽(Q)
  • 以及额外的20%开销。

要减少GPU内存需求,常见方法包括:减少模型参数数量(通过选择较小模型或进行模型压缩)、降低量化位宽(如从16位降到8位或4位),以及采用内存优化技术(如梯度检查点和分布式计算)。这些策略能够在模型性能和资源需求之间取得平衡,优化硬件资源的使用。