DSA 一阶段(dense warm-up,dsa_indexer_use_sparse_loss: False)训练时,显存占用随 Transformer 层数线性增长。1M 序列 128 卡实测跑到第 4 层即 OOM,峰值 54.26 GiB。
dsa_indexer_use_sparse_loss: False
开启或关闭 DSA indexer Top-K 共享都会复现,两者峰值构成相近。
一阶段的显存占用不应随层数线性增长——主干在该阶段是冻结的,其激活无需保留。
每层留下约 8 GiB 的 indexer 中间量且直到训练步结束都不释放。memory_tracker 中 「采集结束仍未释放」的块(1M 序列,4 层合计 50.78 GiB):
一阶段整层跳过 activation checkpoint wrapper:
# mindformers/pynative/transformers/experimental_attention_variant/dsa_transformer_layer.py self.disable_activation_recompute = self.dsa_warmup
该行为由 !8692 引入,意图正确——主干被 _DSAWarmupLayerBoundary 切断反向,重放它没有意义。 但一阶段唯一在训练的 indexer 也位于同一层内,被一并豁免后,其全部中间量不再参与重算, 按层驻留并线性累积。
_DSAWarmupLayerBoundary
!8692 的显存验证是单卡 12 GiB 量级、npu-smi 秒级粒度,该规模下 indexer 中间量很小, 因此当时未暴露;1M 序列下问题才显现。
npu-smi
问题描述 (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)
dsa_indexer_use_sparse_loss: False(一阶段 dense warm-up);期望行为 (Expected behavior)
一阶段的显存占用不应随层数线性增长——主干在该阶段是冻结的,其激活无需保留。
实际行为 (Actual behavior)
每层留下约 8 GiB 的 indexer 中间量且直到训练步结束都不释放。memory_tracker 中
「采集结束仍未释放」的块(1M 序列,4 层合计 50.78 GiB):
根因分析 (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)