给定 7B 模型,如何计算 LoRA 参数及优化器显存分配?
未标记
考查重点:低秩参数量与训练显存分项。逐注入层算 r(din+dout) 的 LoRA 参数,按训练精度加梯度/优化器状态;冻结7B权重仍占显存,激活另算
本题目录
参考答案
核心回答
先明确模型的层数、每个目标线性层的输入输出维度、LoRA 的秩和训练精度;只有“7B”不能算出唯一的适配器参数量或训练显存。对权重形状为 d_out × d_in 的一层,两个低秩矩阵共需 r × (d_in + d_out) 个参数,逐层求和,再加上实际解冻的偏置、输出层等参数。
显存要分开计算:冻结的基座权重仍占空间;只有可训练参数需要相应的梯度与优化器状态,此外还有激活、临时计算缓冲和框架开销。LoRA 主要节省梯度与优化器状态,不能把基座的70亿参数全部按适配器精度和优化器配置重算,也不能只算适配器就声称模型放得下。
给定条件后怎样手算
用一个便于核算的示例:32层,每层只在两个输入、输出均为4096的投影上加 r=8 的分支,不训练其他参数。这里假设两个投影均为方阵,不代表所有7B架构;使用分组查询注意力时,部分投影的输出维度会不同。
单个投影:8 × (4096 + 4096) = 65,536
全部适配器:32 × 2 × 65,536 = 4,194,304 参数
假设基座确有70亿参数,以 BF16 保存,其裸权重约14GB,即13.04GiB。若某实现把适配器权重、梯度均存为每参数2字节,并把 Adam 的两个状态各存为4字节,则适配器相关部分约为:
权重:4,194,304 × 2 = 8MiB
梯度:4,194,304 × 2 = 8MiB
两个优化器状态:4,194,304 × 8 = 32MiB
合计:48MiB
若另保留FP32主权重,再增加16MiB,合计64MiB。
这是声明了存储方式的示例预算。有的实现将适配器参数或梯度保留为 FP32,有的采用低位优化器、状态分片或卸载,不能固定套用48MiB。
还缺哪些显存
激活主要受序列长度、微批量、模型结构和检查点策略影响,冻结基座也不意味着反向传播无需经过它。还要预留输出概率、矩阵计算、注意力和通信等临时缓冲。若同时训练词嵌入或输出层,其参数和优化器状态可能远大于适配器,必须计入。
实际核对时,先列出 requires_grad=True 的参数及其数据类型,再检查优化器实际接收了哪些参数,最后测量训练步的峰值显存。优化器状态常在首次更新时才创建,因此只测模型加载或前向不能代表训练峰值。
常见追问
换成 QLoRA 怎么算? 主要改变冻结基座的存储预算,需加量化元数据和计算时的缓冲;适配器梯度、优化器状态及激活仍分别计算。
梯度累积会让显存按批次数增加吗? 累积通常避免同时保留多个完整微批次的激活,但会保留梯度;峰值仍要看实现和实际微批量,不能把有效批量直接当单步驻留样本数。
对应教程
- 《模型训练原理与高效微调》:回看第6节的冻结权重、低秩分支与参数设置;本文补充计算条件和工程取舍。
参考资料
- 国内:wdndev:LoRA技术原理:采用低秩分支的矩阵形状,展开每层适配器参数量。
- 国内:WeThinkIn:后训练:微调与对齐:采用权重、梯度、优化器状态与激活分别计算的解释,限定显存节省范围。
- 国内:adongwanai:SFT实战经验分享:对照训练硬件与显存估算问题,本文用明确精度和状态分项代替固定倍数预算。
- 国内:ModelScope:预训练与微调:参考状态分片与量化训练的不同配置,说明同一参数量不对应唯一峰值显存。
- 国外:Microsoft:LoRA: Low-Rank Adaptation of Large Language Models:根据原论文低秩参数化核对参数公式与冻结基座的含义。
- 国外:University of Washington等:QLoRA: Efficient Finetuning of Quantized LLMs:根据论文的内存分项,区分冻结权重、激活、量化元数据与优化器峰值。
相关面经
1 篇同花顺
大模型算法工程师(金融)LoRA参数计算 比如给你一个7B的模型 在优化器这块如何分配