已关闭
[Bug]: DSA 一阶段显存随层数线性增长,长序列下 OOM #2586
wei_zhuoyi创建于  9月8日关闭于  27 天前
wei_zhuoyi成员
9月8日 创建

问题描述 (Describe the bug)

DSA 一阶段(dense warm-up,dsa_indexer_use_sparse_loss: False)训练时,显存占用随
Transformer 层数线性增长。1M 序列 128 卡实测跑到第 4 层即 OOM,峰值 54.26 GiB。

开启或关闭 DSA indexer Top-K 共享都会复现,两者峰值构成相近。

复现步骤 (To Reproduce)

  1. DSA 模型,配置 dsa_indexer_use_sparse_loss: False(一阶段 dense warm-up);
  2. 序列长度取 1M 量级,层数 >= 8;
  3. 启动训练,采集 memory_tracker。

期望行为 (Expected behavior)

一阶段的显存占用不应随层数线性增长——主干在该阶段是冻结的,其激活无需保留。

实际行为 (Actual behavior)

每层留下约 8 GiB 的 indexer 中间量且直到训练步结束都不释放。memory_tracker 中
「采集结束仍未释放」的块(1M 序列,4 层合计 50.78 GiB):

驻留 来源
16.00 G indexer 的 q/k 投影 Concat
12.00 G CP AllGather
8.00 G Hadamard 输出
6.75 G indexer loss 融合算子的预算梯度
4.25 G AllGather
3.00 G Contiguous

根因分析 (Root cause)

一阶段整层跳过 activation checkpoint wrapper:

# mindformers/pynative/transformers/experimental_attention_variant/dsa_transformer_layer.py
self.disable_activation_recompute = self.dsa_warmup

该行为由 !8692 引入,意图正确——主干被 _DSAWarmupLayerBoundary 切断反向,重放它没有意义。
但一阶段唯一在训练的 indexer 也位于同一层内,被一并豁免后,其全部中间量不再参与重算,
按层驻留并线性累积。

!8692 的显存验证是单卡 12 GiB 量级、npu-smi 秒级粒度,该规模下 indexer 中间量很小,
因此当时未暴露;1M 序列下问题才显现。

环境 (Environment)

  • MindSpore 2.10 / PyNative
  • DSA 一阶段,128 卡,1M 序列
likedislike
Wwei_zhuoyi成员
9月11日 关联了pull request:【r2.1.0-beta1】【feature】DSA 一阶段逐层反向:峰值显存不再随层数增长
MindSpore-BotMindSpore-Bot成员
27 天前 关闭了 issue
MindSpore-BotMindSpore-Bot成员
27 天前 issue状态由 TODO 改变为 DONE