Skip to content

FSDP 高级配置与性能调优

FSDP(FullyShardedDataParallel)是 PyTorch 原生的全分片数据并行方案。本文介绍 FSDP 的高级配置选项和生产环境性能调优策略。

FSDP高级配置与性能调优

分片策略

python
from torch.distributed.fsdp import ShardingStrategy

# FULL_SHARD: 完全分片(ZeRO-3),最省显存
model = FSDP(model, sharding_strategy=ShardingStrategy.FULL_SHARD)

# SHARD_GRAD_OP: 仅分片梯度和优化器状态(ZeRO-2)
model = FSDP(model, sharding_strategy=ShardingStrategy.SHARD_GRAD_OP)

# NO_SHARD: 不分片(标准 DDP)
model = FSDP(model, sharding_strategy=ShardingStrategy.NO_SHARD)

包装策略

FSDP 的包装策略决定了分片粒度,直接影响性能:

python
from torch.distributed.fsdp import MixedPrecision
from torch.distributed.fsdp.wrap import transformer_auto_wrap_policy

# 基于 Transformer 层的自动包装
auto_wrap_policy = transformer_auto_wrap_policy(
    transformer_layer_cls={LlamaDecoderLayer}
)

# BF16 混合精度
mp_policy = MixedPrecision(
    param_dtype=torch.bfloat16,
    reduce_dtype=torch.bfloat16,
    buffer_dtype=torch.bfloat16,
)

model = FSDP(
    model,
    auto_wrap_policy=auto_wrap_policy,
    mixed_precision=mp_policy,
    sharding_strategy=ShardingStrategy.FULL_SHARD,
    device_id=torch.cuda.current_device(),
)

包装粒度影响

包装粒度通信次数每次通信量总通信量推荐
整个模型2全部参数2×参数
Transformer 层2×层数层参数2×参数推荐
单个算子2×算子数算子参数2×参数过细

最优包装

基于 Transformer 层的包装是最优粒度:通信次数适中,每次通信量可被 NCCL 优化,与计算重叠效果好。

激活检查点

FSDP 支持激活检查点,用计算换显存:

python
from torch.distributed.algorithms._checkpoint.checkpoint_wrapper import (
    apply_activation_checkpointing,
    checkpoint_wrapper,
)

# 对每层应用激活检查点
def check_fn(submodule):
    return isinstance(submodule, LlamaDecoderLayer)

apply_activation_checkpointing(model, checkpoint_wrapper_fn=checkpoint_wrapper, check_fn=check_fn)

预取优化

python
from torch.distributed.fsdp import CPUOffload

model = FSDP(
    model,
    # 参数预取:在前向传播计算当前层时预取下一层参数
    forward_prefetch=True,

    # CPU Offload
    cpu_offload=CPUOffload(offload_params=True),
)

性能对比

配置显存 (7B)吞吐 (tok/s)相对速度
DDP (8GPU)28GB5200100%
FSDP ZeRO-218GB480092%
FSDP ZeRO-34GB400077%
FSDP ZeRO-3 + ActCkpt3GB320062%

显存与速度权衡

激进的分片和检查点策略节省显存但降低速度。建议优先使用 ZeRO-2(最佳平衡),仅在显存不足时升级到 ZeRO-3。

相关资源

最近更新