在使用FSDP进行分布式训练时,内存优化是提升训练效率的关键环节。本文总结了几个实用的内存优化技巧。
首先,合理设置sharding_strategy参数。对于内存受限的环境,可以采用FULL_SHARD策略而非SHARD_GRAD_OP,虽然会增加通信开销,但能有效降低单卡显存占用。
其次,通过调整forward_prefetch和backward_prefetch参数来优化内存使用。例如:
from torch.distributed.fsdp import FullyShardedDataParallel as FSDP
fsdp_model = FSDP(model,
sharding_strategy="FULL_SHARD",
forward_prefetch=True,
backward_prefetch=True)
此外,建议在训练前对模型进行内存分析:
from torch.distributed.fsdp.flop_count import FlopCountAnalyzer
flop_count = FlopCountAnalyzer(fsdp_model, example_input)
flop_count.report()
最后,通过设置use_orig_params=True可以避免FSDP在参数初始化时产生额外的内存副本,从而节省约10-20%的显存。
这些优化技巧已在多个大规模模型训练场景中验证有效。

讨论