趋近智
全参数微调虽然直接,但面临明显的计算难题,主要在于GPU内存占用和训练时间。更新一个拥有数十亿参数的模型的每个参数,需要大量资源。提出了管理这些需求的实用策略,使得即使在资源受限的情况下,也能实现全参数微调。
微调过程中的主要资源限制是GPU内存(VRAM)和计算时间。理解这些资源消耗在何处,是进行优化的第一步。
GPU内存: 所需总内存可以大致估计为以下各项所需内存的总和:
该图表显示了激活值如何相比参数、梯度和优化器状态,在内存使用中占据主导地位,尤其是在典型的微调批次大小和序列长度下。
计算时间: 训练时长取决于每次迭代所需的浮点运算(FLOPs)数量和总迭代次数。这受模型大小、批次大小、序列长度、数据集大小以及硬件计算吞吐量(GPU每秒FLOPs)的影响。
由于GPU内存常是最紧张的限制,有几种技术专门用于减少VRAM使用量。
这项技术使您能够模拟一个比GPU内存单次前向/反向传播能够实际容纳的批次更大的有效批次大小。并非在处理每个小“微批次”后就更新模型权重,而是将多个微批次的梯度进行累积。只有在处理完指定数量的微批次后,才会执行优化器步骤(更新模型权重)并清除梯度。
机制:
optimizer.step(),而是将计算出的梯度添加到累加缓冲区。暂不调用optimizer.zero_grad()。accumulation_steps次数。accumulation_steps个微批次后,使用累积的梯度执行optimizer.step()。optimizer.zero_grad()以清除梯度,准备下一次累积循环。优点: 达到更大批次大小的梯度统计效果(例如,有效批次大小 = micro_batch_size * accumulation_steps),而只需单个微批次激活值所需的内存。
代价: 增加了每个有效训练步所需的时间,因为在每次权重更新前,它涉及多次顺序的前向/反向传播。
前向传播过程中存储的激活值会消耗大量内存。激活检查点以计算时间换取内存节省。并非存储指定层(如Transformer块)的所有中间激活值,它只存储这些设置检查点的段的输入。在反向传播过程中,当需要梯度时,这些段内的激活值会即时重新计算。
torch.utils.checkpoint.checkpoint)。您通常使用检查点函数封装特定模块(如Transformer层)。这涉及使用较低精度浮点格式进行部分计算,主要指16位格式,如FP16(半精度)或BF16(bfloat16),而非标准的32位(FP32)。
torch.cuda.amp)和TensorFlow等框架提供自动混合精度(AMP)工具,以最少的代码改动处理类型转换和损失缩放。虽然AdamW是标准选择,但由于它为每个参数存储两个状态(动量、方差),通常是FP32格式,因此其内存占用相当大。存在替代方案:
bitsandbytes等库提供了AdamW等优化器的8位实现。它们对优化器状态进行量化,大幅减少其内存占用,通常对收敛影响极小。这常与QLoRA(稍后讲解)结合使用,但也可应用于全参数微调。虽然内存常是第一个瓶颈,但计算时间也是一个主要因素。
有效管理资源需要结合这些技术并监控其效果。
Accelerate等库简化了梯度累积、混合精度和分布式训练在各种硬件配置(单GPU、多GPU、TPU)上的应用设置。nvidia-smi或框架特定的内存分析工具)和训练吞吐量(每秒样本数)。这有助于找出瓶颈并调整batch_size、gradient_accumulation_steps等参数,并确定是否需要激活检查点。通过策略性地应用这些资源管理技术,您可以使全参数微调这一计算要求较高的过程更易于处理,使得即使面对硬件限制也能调整大型模型。请记住,大多数技术都涉及权衡,通常是牺牲增加的计算时间以换取减少的内存使用,这需要根据您的具体限制和目标进行仔细考量。
简洁的语法。内置调试功能。从第一天起就可投入生产。
为 ApX 背后的 AI 系统而构建
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造