Transformers 多卡训练统一配置:基于 Accelerate 的 FSDP、DeepSpeed 与 DDP 接入指南
Transformers 多卡训练统一配置基于 Accelerate 的 FSDP、DeepSpeed 与 DDP 接入指南【免费下载链接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers本文基于 Transformers 仓库的 Accelerate 官方文档 展开讲解 Accelerate 如何作为Trainer的统一分布式训练后端并给出两条完整的配置路径其一通过accelerate config生成的 YAML 配置文件直接驱动训练其二通过TrainingArguments中的fsdp_config、deepspeed、ddp_*等参数在代码内配置。文中结合 Trainer 源码 与 TrainingArguments 源码 剖析配置的实际生效位置读完你可以掌握从 1 卡 DDP 到 8 卡 FSDP 的完整训练环境搭建方案。Accelerate 在 Trainer 中扮演什么角色Accelerate 为 FSDP、DeepSpeed 等分布式训练后端提供统一接口。它会自动检测运行环境GPU 数量、分布式后端、混合精度设置等并据此完成训练配置——无论你是在单卡上跑 DDP还是在 8 卡上跑 FSDP。具体来说Accelerate 会完成三件核心工作用合适的分布式包装器wrapper包装模型将模型移动到正确的设备device上创建与之兼容的优化器optimizer。训练过程中Accelerate 使用自身的backward()方法处理混合精度下的梯度缩放gradient scaling。Trainer本身并不直接触碰这些分布式细节而是调用相应的 Accelerate API把所有分布式机制的委托交给 Accelerate。从源码结构看这一“委托”关系在 src/transformers/trainer.py 的Trainer.create_accelerator_and_postprocess()方法中得到印证该方法读取TrainingArguments中的 Accelerate 相关设置构造Accelerator实例并在创建后执行 FSDP / DeepSpeed 的后置配置与冲突校验。原文档指出“Trainercalls the appropriate Accelerate APIs and delegates all distributed mechanics to Accelerate”即TrainingArguments是用户侧的入口Accelerate 是实际执行者。TrainingArguments支持两种配置方式Accelerate 配置文件或TrainingArguments参数下文分别介绍。方式一使用 Accelerate 配置文件适合脚本化启动运行accelerate config命令按提示回答关于硬件与训练设置的问题它会在你的缓存目录中生成default_config.yaml文件。原文档给出的是一个 FSDP 场景的示例完整配置如下compute_environment: LOCAL_MACHINE distributed_type: FSDP fsdp_config: fsdp_version: 2 fsdp_reshard_after_forward: true fsdp_cpu_offload: false fsdp_auto_wrap_policy: TRANSFORMER_BASED_WRAP fsdp_cpu_ram_efficient_loading: true fsdp_activation_checkpointing: false fsdp_state_dict_type: SHARDED_STATE_DICT fsdp_transformer_layer_cls_to_wrap: LlamaDecoderLayer mixed_precision: bf16 num_machines: 1 num_processes: 4各字段的含义结合 TrainingArguments 中 FSDP 参数文档 对照distributed_type: FSDP声明使用 FSDP 作为分布式类型num_processes: 4表示 4 个进程通常对应 4 卡fsdp_version: 2使用 FSDP2fsdp_reshard_after_forward前向之后重新分片参数true省显存false则在前反向之间保持参数已收集状态省去 re-all-gather 但峰值显存更高fsdp_cpu_offload是否将参数/梯度卸载到 CPU 以节省显存fsdp_auto_wrap_policy: TRANSFORMER_BASED_WRAP按 Transformer 层自动包装配合fsdp_transformer_layer_cls_to_wrap: LlamaDecoderLayer指定要包装的层类名区分大小写fsdp_cpu_ram_efficient_loading: true只在第一个进程加载预训练权重其余进程以空权重启动并接收广播fsdp_state_dict_type: SHARDED_STATE_DICT按 rank 分片保存检查点每个 rank 一个文件对大模型更快mixed_precision: bf16bfloat16 混合精度fsdp_activation_checkpointingFSDP 侧的激活重计算注意它与TrainingArguments的gradient_checkpointing不能同时为True源码中会直接抛出ValueError见 trainer.py。配置完成后用accelerate launch启动基于Trainer的脚本accelerate launch train.pyAccelerate 会读取该配置文件来完成训练环境的搭建。此时TrainingArguments.fsdp_config和TrainingArguments.deepspeed参数是多余的因为 Accelerate 配置文件已经覆盖了相同的设置。用 accelerator_config 补充无专用参数的选项TrainingArguments.accelerator_config接受那些没有专门顶层参数的设置。例如将non_blockingTrue与dataloader_pin_memory一起设置可以让数据传输与计算重叠提高 GPU 吞吐from transformers import TrainingArguments TrainingArguments( ..., dataloader_pin_memoryTrue, accelerator_config{ non_blocking: True, }, )源码印证了这一建议的必要性在 Trainer.create_accelerator_and_postprocess() 中如果开启了non_blocking却没有开启dataloader_pin_memoryTrainer 会主动打印告警——“non_blockingis enabled butdataloader_pin_memoryis not. For the best performance, its recommended to enable both.” 两个开关需配合使用才能发挥异步数据搬运的收益。accelerator_config支持的完整键值来自 TrainingArguments 参数文档选项默认值说明split_batchesFalse是否将批跨设备切分。True时所有设备上的实际批大小相同总数需能被进程数整除False时每设备各自获得指定批大小dispatch_batchesIterableDataset为True否则FalseTrue时仅主进程迭代 dataloader 并向各设备分发批次even_batchesTrue从数据集头部复制样本保证所有 worker 批大小一致use_seedable_samplerTrue使用完全可播种的随机采样器以保证可复现性use_configured_stateFalse复用已初始化的AcceleratorState/PartialState而非新建可能与超参调优冲突accelerator_config本身支持三种传入形式JSON 配置文件路径如accelerator_config.json、字典、或AcceleratorConfig实例定义于 src/transformers/trainer_pt_utils.py。规范化逻辑见 training_args.pyNone时使用默认AcceleratorConfig()字典通过AcceleratorConfig(**dict)实例化字符串路径调用AcceleratorConfig.from_json_file()加载直接传未实例化的类会被明确拒绝。方式二通过 TrainingArguments 配置后端适合纯 Python 脚本如果不想依赖accelerate config生成的 YAML也可以直接把后端专属配置传给TrainingArguments。Trainer.create_accelerator_and_postprocess()方法会读取这些设置并配置训练。按后端不同有三种写法FSDPfsdp fsdp_config向TrainingArguments.fsdp_config传入 JSON 配置文件或字典fsdp置True开启from transformers import TrainingArguments TrainingArguments( ..., fsdpTrue, fsdp_configpath/to/fsdp.json, )fsdp_config支持的键与默认值摘自 training_args.py 参数文档version默认22为 FSDP21为旧版 FSDP1reshard_after_forward默认True前向后重新分片False可避免 re-all-gather 但峰值显存更高cpu_offload默认False将参数与梯度卸载到 CPUactivation_checkpointing默认False反向时重计算激活以省显存使用 FSDP 时优先于gradient_checkpointing后者会在反向中引入冗余的 all-gathercpu_ram_efficient_loading默认False仅首进程加载检查点后广播state_dict_type默认FULL_STATE_DICTFULL_STATE_DICT为单个 HF 兼容文件SHARDED_STATE_DICT为每 rank 一个文件auto_wrap_policy默认TRANSFORMER_BASED_WRAP可选TRANSFORMER_BASED_WRAP、SIZE_BASED_WRAP、NO_WRAPtransformer_layer_cls_to_wrap要包装的 Transformer 层类名通常可省略——包装策略会回退到模型的_no_split_modules覆盖绝大多数 transformers 模型min_num_params默认0SIZE_BASED_WRAP策略下每个模块的最小参数量xla/xla_fsdp_settings/xla_fsdp_grad_ckptPyTorch/XLA FSDP 实验选项。注意save_only_model与SHARDED_STATE_DICT检查点格式不兼容同时设置会在 trainer.py 触发ValueError。完整 FSDP 指南可参阅 FSDP 文档。DeepSpeeddeepspeed 参数向TrainingArguments.deepspeed传入 JSON 配置文件或字典from transformers import TrainingArguments TrainingArguments( ..., deepspeedpath/to/ds_config.json, )使用 ZeRO 初始化时需要在初始化TrainingArguments之后而非之前实例化模型否则 ZeRO 不会生效见 参数文档中的提示。另外源码中校验auto_find_batch_size尚不支持 DeepSpeed ZeRO-3需改用 ZeRO-1/2 或 FSDPtrainer.pysave_only_model也不能与load_best_model_at_end同时用于 DeepSpeed/FSDP。完整 DeepSpeed 指南见 DeepSpeed 文档。DDPddp_* 顶层字段DDP 通过TrainingArguments的顶层字段直接配置from transformers import TrainingArguments TrainingArguments( ..., ddp_backendnccl, ddp_find_unused_parametersFalse, ddp_bucket_cap_mb25, ddp_timeout1800, )各字段的定义与默认值见 training_args.pyddp_backend分布式后端可选值包括nccl、gloo、mpi、xccl、hccl以及源码 choices 中列出的cncl、mcclddp_find_unused_parameters传给DistributedDataParallel的find_unused_parameters默认在使用梯度检查点时为False否则为Trueddp_bucket_cap_mb传给DistributedDataParallel的bucket_cap_mbddp_broadcast_buffers传给DistributedDataParallel的broadcast_buffers使用梯度检查点时默认Falseddp_static_graph传给DistributedDataParallel的static_graphddp_timeouttorch.distributed.init_process_group的超时时间秒默认1800用于避免分布式运行中慢操作导致的 GPU 套接字超时。DDP 适用于模型能装入单卡的数据并行场景详见 DDP 文档。源码深潜create_accelerator_and_postprocess 做了什么Trainer在初始化阶段调用 create_accelerator_and_postprocess()其内部流程可以概括为梯度累积接管Trainer 自己管理梯度累积gradient accumulation steps因此显式把 Accelerate 的gradient_accumulation_kwargs中num_steps置为 1避免二次除法若AcceleratorConfig的num_steps与TrainingArguments的gradient_accumulation_steps 1冲突会直接报错trainer.py#L773-L795。构建 DataLoader 配置从accelerator_config中弹出split_batches、dispatch_batches、even_batches、use_seedable_sampler四个键构造DataLoaderConfiguration并把data_seed注入其中non_blocking也被弹出并写入 dataloader 配置trainer.py#L797-L812。构建插件与 Accelerator若fsdp_plugin_args非空则实例化FullyShardedDataParallelPlugin随后通过_build_accelerator_args()汇总 dataloader 配置、FSDP 插件、梯度累积插件以及可选的TorchDynamoPlugin创建Accelerator对象trainer.py#L816-L829。能力标记与后置校验根据accelerator.state中是否存在fsdp_plugin/deepspeed_plugin设置is_fsdp_enabled/is_deepspeed_enabled并执行前文提到的几项兼容性校验激活检查点冲突、ZeRO-3 与auto_find_batch_size、save_only_model与分片状态字典等。这一调用链印证了原文档的主张用户只需在配置层表达意图YAML 或TrainingArguments设备移动、包装、优化器创建、梯度缩放等机制全部由 Accelerate 经由该方法落地。适用前提与版本约束Accelerate 是可选依赖TrainingArguments在 Accelerate 缺失或版本过低时会要求安装accelerate1.1.0版本下限定义于 src/transformers/utils/import_utils.pytorch_compile相关插件功能则要求 Accelerate1.2.0trainer.py。两种方式配置文件 /TrainingArguments参数覆盖相同的配置面按原文档建议使用accelerate launch时不必再重复设置fsdp_config/deepspeed参数避免配置来源不一致。accelerator_config的split_batchesTrue会覆盖per_device_train_batch_size总批大小被均分到所有进程设置前请确认数据集大小可被进程数整除。延伸阅读DDP 文档模型能装入单卡时的数据并行训练FSDP 文档将参数、梯度与优化器状态分片到多张 GPUDeepSpeed 文档ZeRO 优化与参数/优化器状态卸载Trainer 文档Trainer的整体使用方式与本文的分布式配置互补。【免费下载链接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考