大模型的显存占用计算方法

参数的数量和量化决定了模型的大小,这是使用LLM的一个主要限制。

要使用 LLM,我们必须将模型放入内存中。使用 32 位浮点 (FP32),1 个参数需要 4 字节 RAM。

使用 16 位量化(BFLOAT16 或 FP16),我们可以将其减少到 1 个参数的 2 字节 RAM。

对于 8 位整数 (INT8),我们需要 1 字节的 RAM 用于 1 个参数。

因此,在内存中存储 10 亿 (1B) 个 LLM 参数需要大约 4GB 内存(32 位全精度)、2GB 内存(16 位半精度)和 1GB 内存(8 位精度)。

举例来说,我的 GeForce 2060 显卡有 6 GB 的内存,可以容纳大约 1.5B 参数@32 位,或 3B 参数@16 位,或 6B 参数@8 位。

但是,仅加载 CUDA 内核就会消耗 1-2GB 的内存。因此,实际上,您无法仅使用参数填满整个 GPU 内存。

训练 LLM 需要更多的 GPU RAM,因为优化器状态、梯度和前向激活每个参数都需要额外的内存 [3]。

选择 LLM 时,请查看 GPU 有多少 GB 的内存,然后选择合适的模型。使用 1B 参数 = 2GB@16 位或 1GB@8 位作为经验法则。


欢迎你分享你的作品到我们的平台上. http://www.shxcj.com 或者 www.2img.ai 让更多的人看到你的才华。

创作不易,觉得不错的话,点个赞吧!!!

### 大模型训练时显存占用量的计算方法大模型训练期间,显存主要被以下几个方面占据: - **模型参数**:这是指网络权重和其他可学习变量所需的内存空间。对于不同的数据类型,每种类型的字节数有所不同[^4]。 对于浮点数表示法而言,在单精度(`fp32`)下每个数值需4个字节;而在半精度(`fp16` 或 `bf16`)则只需2个字节;整型量化至8位(`int8`)仅需1个字节来表达一个值。因此,当采用较低的数据精度时能够有效减少显存量的需求。 - **激活函数产生的中间结果**:这些是在前向传播过程中由各层运算所产生的临时张量,它们会在反向传播阶段用于梯度计算并最终释放掉。这部分显存消耗取决于批次大小(batch size)以及输入序列长度等因素的影响。 - **梯度信息**:针对全量参数训练模式下的情形,整个神经网络的所有参数都会参与到梯度更新之中,这意味着除了原本就存在的模型参数外还需要额外相同体积的空间用来保存对应的梯度值。然而,在应用低秩自适应(LoRA)[^2]或其他特定策略的情况下,则无需为原生模型分配相应的梯度存储区域,因为只有新增加的小规模模块才会经历实际意义上的调整过程。 - **优化器状态**:像Adam这样的高级优化算法会维护一些辅助性的统计量比如一阶矩估计(mean of gradients) 和二阶矩估计(uncentered variance of the gradients),这同样增加了总的GPU RAM负担。不过值得注意的是,在某些简化版或者定制化的场景里可能不会涉及到此类开销项。 综上所述,为了更精确地评估一次完整的迭代周期内的总显存需求,可以按照以下公式进行粗略估算: \[ \text{Total GPU Memory} = (\text{Model Parameters Size}) + (Batch\,Size × Sequence\,Length × Hidden\,Dimension × Precision) + (\text{Gradient Storage for Full Training or Only LoRA Part}) + (\text{Optimizer States if any}) \] 其中,“隐藏维度”指的是每一时刻处理单元内部特征的数量;而“精度”则是指上述提到的不同数值格式所带来的差异性影响因素之一。 ```python def estimate_gpu_memory_usage( model_params_size: int, batch_size: int, seq_length: int, hidden_dim: int, precision_bytes: float, full_training=True): activation_mem = batch_size * seq_length * hidden_dim * precision_bytes gradient_mem = model_params_size * precision_bytes \ if full_training else 0 optimizer_state_mem = model_params_size * 1.2 * precision_bytes \ if not isinstance(optimizer_states_multiplier, type(None)) else 0 total_memory = sum([ model_params_size * precision_bytes, # Model parameters memory activation_mem, # Activation memory during forward pass gradient_mem, # Gradient storage optimizer_state_mem # Optimizer states memory ]) return total_memory / (1024 ** 3) # Convert bytes to GBs ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值