GPU显存计算、加载

GPU显存计算、加载

1. 模型参数精度与量化

1.1 精度-字节对照表

精度通常指的是参数的数据类型,它决定了模型在内存中存储和计算参数时所使用的位数。以下是一些常见的模型参数精度及其含义,以及它们在内存中所占用的字节数。

精度

含义

字节数

双精度浮点数

float64

双精度浮点数提供更高的精度,适用于需要更高数值精度的应用,但会占用更多的内存。

8 字节(64 位)

单精度浮点数

float32

单精度浮点数用于表示实数,具有较高的精度,适用于大多数深度学习应用。

4 字节(32 位)

半精度浮点数

FP16/BF16

半精度浮点数用于表示实数,但相对于单精度浮点数,它的位数较少,因此精度稍低。然而,它可以在某些情况下显著减少内存占用并加速计算。

2 字节(16 位)

8 位整数

int8

int8 使用 8 位二进制来表示整数。在量化过程中,浮点数参数将被映射到一个有限的范围内的整数,然后使用 8 位来存储这些整数。

1 字节(8 位)

各种参数存储表现形式如下

image1

1.2 量化原理与权衡

参数量化指的是通过将浮点数参数映射到较低位数的整数,从而在一定程度上降低了模型的计算和存储成本。

image2

在量化过程中,模型参数的值被量化为最接近的可表示整数,这可能会导致一些信息损失。因此,在使用量化技术时,需要平衡压缩效果和模型性能之间的权衡,并根据具体任务的需求来选择合适的量化精度。

 

映射方式:浮点值→线性/对数量化→8位整数。

收益:显存-75 %,吞吐+2×~3×。

风险:精度下降1–2 %,需校准数据集重调。

 

2. 模型大小计算

2.1 核心公式

神经网络模型由多个层组成,每一层都包含权重(weight)和偏置(bias),这些统称为模型参数。而模型的参数量一般直接影响它的学习和表示能力。

模型大小计算公式:

模型大小(字节)= 参数数量 × 每个参数的字节数

2.2 示例

对于一个拥有 10 亿(1B / 1,000,000,000) 参数的模型,使用 32 位浮点数(float32, 简称 FP32) 表示,每个参数占用 32÷8=4 字节,即:

模型大小=1,000,000,000×4字节=4GB

由此可得,1B (十亿) FP32 参数约等于 4 GB 显存。

以meta-llama/Meta-Llama-3.1-70B-Instruct 这个拥有 700 亿(70B) 参数的大模型为例,仅考虑模型参数,它的显存需求就已经超过了大多数消费级 GPU(如 RTX 4090 最高 48G):

70×109×4字节=280GB

 

3. 训练时显存占用分析

3.1 显存构成

训练时的显存占用主要由以下部分组成:

模型参数:模型的权重和偏置。

优化器状态:如动量和二阶矩估计等,取决于优化器的类型,单纯的 SGD 不占显存。

梯度:每个参数对应一个梯度,数据类型与模型参数相同。

中间激活值:前向传播过程中产生的激活值,需要在反向传播中使用,其显存占用与 Batch Size、序列长度以及模型架构相关。

临时缓冲区 :用于存储计算过程中的中间结果,这些通常是短时占用,但峰值可能很高。

框架开销:CUDA 上下文、显存碎片等。

image3

3.2 估算公式

以 1B 参数的模型为例,假设训练时使用 Adam优化器,精度使用 FP32,仅考虑与模型参数挂钩的显存计算

  • 模型参数:4 GB
  • 梯度:4 GB
  • 优化器状态(Adam:一阶和二阶动量):8 GB(2 × 4 GB)
  • 激活峰值:batch=8, seq=2048 → ≈4 GB

总计:≈20 GB

 

4. 推理时显存占用分析

4.1 显存构成

推理时的显存占用主要包括:

  • 模型参数:同训练阶段一致。
  • 中间激活值:仅保留当前步的激活值,相较于训练阶段,小非常多。
  • Batch Size:一次处理的数据样本数量。

4.2 估算公式

以 1B 参数的模型为例,假设训练时使用 Adam优化器,精度使用 FP32,仅考虑与模型参数挂钩的显存计算

  • 模型参数:4 GB
  • 激活:batch=1, seq=2048 → ≈2 GB

总计:≈6 GB(仅为训练阶段1/3

 

5. 模型加载过程与优化技术

5.1 传统加载路径

主流框架(如 PyTorch、TensorFlow)的模型加载接口(如 torch.load()、tf.keras.models.load_model())默认将模型数据先读入内存,再通过 CUDA API 复制到显存。这是由底层数据流的设计决定的:

磁盘 → 内存(CPU)→ 显存(GPU)。

GPU 无法直接访问磁盘数据,必须通过内存作为中介。

image4

缺点:双倍内存峰值,大模型易OOM。

5.2 优化加载路径对比

部分框架支持跳过内存,直接从磁盘加载到显存:数据从磁盘读取到内存缓冲区后,立即转移到显存,完成后释放内存缓冲区。仅在加载过程中短暂占用内存,完成后自动释放。

image5

内存映射(Memory-Mapped)技术对超大模型使用分片加载,仅将当前需要的部分读入内存/显存:

image6

专用推理格式将模型转换为 TensorRT 优化后的 .engine 文件,支持直接从磁盘加载到显存。引擎文件已针对 GPU 显存布局优化,加载时通过 CUDA 直接初始化显存数据。

image7

 

参考文献

[1] https://github.com/Hoper-J/AI-Guide-and-Demos-zh_CN/blob/master/Guide/07.%20%E6%8E%A2%E7%A9%B6%E6%A8%A1%E5%9E%8B%E5%8F%82%E6%95%B0%E4%B8%8E%E6%98%BE%E5%AD%98%E7%9A%84%E5%85%B3%E7%B3%BB%E4%BB%A5%E5%8F%8A%E4%B8%8D%E5%90%8C%E7%B2%BE%E5%BA%A6%E9%80%A0%E6%88%90%E7%9A%84%E5%BD%B1%E5%93%8D.md

[2] https://cloud.tencent.com/developer/article/2403424

[3] https://blog.csdn.net/qq_15821487/article/details/146039457

[4] NVIDIA TensorRT Documentation, 2025-12. TensorRT Best Practices. https://docs.nvidia.com/tensorrt/

[5] Hugging Face Accelerate, 2025-11. Large Model Loading Guide. https://huggingface.co/docs/accelerate

posted on 2026-03-04 11:44  持续学习的小王子  阅读(0)  评论(0)    收藏  举报

导航