简介:本文围绕大模型微调中两类主流显存优化策略——参数全量驻留的“阶段二”与参数进一步分片的“阶段三”展开对比,从分片原理、显存与CPU内存占用、通信开销、检查点保存行为等维度系统分析差异,并结合返回码-9与-11两类典型故障的排查经验,给出不同显存、内存条件下的选型建议与环境迁移注意事项,帮助读者快速定位问题并做出合适的方案选择。
大模型微调是对算力与内存高度敏感的工作负载。以一个典型过程为例:当训练样本积累到约1.2万条后,通常希望做控制变量实验,观察不同超参与不同并行优化配置对模型效果和训练效率的影响。此时一个常见做法是参考业界实践文章的建议——在显存充裕的前提下,尽量使用分片程度更低的优化等级(即阶段二),以换取更高的训练吞吐;而在显存吃紧时退回分片程度更高的等级(即阶段三)。
问题往往出在“切换”这个动作上:优化等级从阶段三改成阶段二后,训练过程本身可能一切正常,却在保存模型检查点(checkpoint)时被系统直接终止,返回码-9,且没有任何详细堆栈;而重建一套全新环境后,又可能遇到返回码-11的段错误。这两类故障恰好分别暴露了两种策略在资源占用模型上的差异,以及它们共同依赖的环境版本匹配前提。
因此,本文明确的对比对象有两组:其一是大模型微调中两类主流显存优化策略——参数全量驻留的“策略A(阶段二)”与参数进一步分片的“策略B(阶段三)”;其二是微调过程中两类高频错误——返回码-9(进程被系统强制终止)与返回码-11(段错误)。前者决定“怎么选”,后者决定“出问题怎么查”。
两者都源自“零冗余优化”这一通用思想,由主流分布式训练加速框架提供,按切分程度划分为多个等级,最常用的是下面两档:
策略A只切分优化器状态与梯度,单卡显存大致等于“完整模型参数 + 1/N的优化器状态与梯度 + 激活值”;策略B把参数也切分,单卡显存大致等于“1/N参数 + 1/N优化器状态与梯度 + 激活值 + 计算时临时聚合参数的缓冲区”。业界常用的粗估方法是:混合精度全参微调下,参数、梯度与自适应优化器状态合计通常达到“参数量×12字节”以上的量级,再叠加与批次大小、序列长度相关的激活值开销(该估算仅供量级参考,实际受框架实现与精度配置影响)。由此可见,两种策略对单卡显存的需求可能相差数倍,这直接决定了多大的模型能在什么样的卡上训起来。
这是原文案例中-9错误的根因,也是两种策略最隐蔽的差异:
结论很明确:显存优化策略的选择不只影响显存,还会显著改变CPU内存的峰值曲线。很多团队只监控GPU显存而忽视节点内存,这正是-9类问题难以定位的常见原因。
策略B在每次前向与反向计算时都需要临时聚合参数,通信量明显高于策略A,吞吐通常相对更低;策略A通信少、速度快,但单卡显存压力大,可能被迫缩小批次或序列长度。这也是业界实践普遍建议的原因:显存够用时优先选择分片程度更低的阶段二,把省下来的通信开销转化为训练速度;只有当单卡确实装不下完整参数时,才退让到阶段三。
新版微调框架默认拉取的依赖可能“超前”于本地硬件:框架发布节奏快,默认安装的深度学习库往往面向较新的运行时版本编译,而本地驱动受硬件与驱动版本限制,支持的最高运行时版本可能明显更低。安装时应显式选择与驱动匹配的构建,而不是无条件接受默认最新版本。
| 对比维度 | 策略A(阶段二) | 策略B(阶段三) |
|---|---|---|
| 分片对象 | 优化器状态、梯度 | 优化器状态、梯度、模型参数 |
| 单卡参数驻留 | 完整副本 | 约1/N |
| 单卡显存占用 | 较高 | 显著更低 |
| 通信开销 | 较低 | 较高(前向/反向需临时聚合参数) |
| 训练吞吐 | 较高 | 相对较低 |
| CPU内存峰值 | 保存checkpoint时构造全量权重副本,峰值高 | 参数分片存储与写出,峰值相对可控 |
| 对节点内存的要求 | 高(需预留全量副本空间) | 相对较低 |
| 适用模型规模 | 单卡可容纳完整参数副本的模型 | 更大规模模型、小显存多卡场景 |
| 典型故障 | 内存不足导致返回码-9 | 显存不足导致OOM;对通信带宽更敏感 |
| 配置与运维复杂度 | 相对简单 | 略高(需更多关注通信与聚合行为) |
# 示意性决策流程(伪代码)def 选择优化策略(模型参数量, 单卡显存, 卡数, 节点内存):if 单卡显存 >= 完整参数 + 1/N优化器状态与梯度 + 激活值:策略 = 策略A # 吞吐优先# 追加检查:保存checkpoint的内存峰值应明显小于节点内存if 保存时内存峰值 > 节点内存安全水位:扩容节点内存 或 调整保存策略else:策略 = 策略B # 显存优先return 策略
配套的故障排查清单:
需要强调的是,两类策略没有绝对优劣:策略A的优势来自“少通信”,代价是显存与内存峰值;策略B的优势来自“分得更碎”,代价是通信与吞吐。选型应基于模型规模、显存与内存水位、吞吐要求和团队运维能力做条件化判断。
策略A与策略B的本质差异在于“分片到哪一层”:阶段二止步于优化器状态与梯度,吞吐高,但要求单卡驻留完整参数,且保存checkpoint时的CPU内存峰值显著;阶段三把参数也切分,显存友好、对节点内存更宽容,但通信开销更大、吞吐相对更低。返回码-9与-11则分别指向“资源不足被系统终止”与“环境版本不匹配引发段错误”两条排查路径,前者看内存与显存水位和复现环节,后者看版本匹配与依赖环境。选型上没有放之四海皆准的答案:显存与内存充裕时优先追求吞吐,资源紧张时优先保可行性与稳定性;每次切换优化等级或重建环境时,把显存、内存、版本匹配三项自检纳入固定流程,就能规避文中这两类最常见的故障。