给定 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 怎么算? 主要改变冻结基座的存储预算,需加量化元数据和计算时的缓冲;适配器梯度、优化器状态及激活仍分别计算。

梯度累积会让显存按批次数增加吗? 累积通常避免同时保留多个完整微批次的激活,但会保留梯度;峰值仍要看实现和实际微批量,不能把有效批量直接当单步驻留样本数。

对应教程

参考资料

相关面经

1 篇

同花顺

大模型算法工程师(金融)
一面
查看原面经 →
LoRA参数计算 比如给你一个7B的模型 在优化器这块如何分配

收录题集

2 个来源,共2 份题集

模型微调与适配

AMIT SHEKHAR · ai-engineering-interview-questions · 1 条原题

查看题集 →

滴滴高频面试题

Rocky Ding · AIGC-Interview-Book · 1 条原题

查看题集 →

相关题目

4 题