"""Distributed-training config builders — Accelerate FSDP + DeepSpeed ZeRO. Pure-Python: returns plain dicts that the caller writes to YAML/JSON for `accelerate launch --config_file ` or `deepspeed --deepspeed_config `. Hard invariant: MI300X xGMI permits only 1- or 8-GPU FSDP. The 2/4-GPU configurations have a known bandwidth bug; this module rejects them. """ from __future__ import annotations from typing import Literal def build_fsdp_config( num_gpus: Literal[1, 8], *, shard_size: Literal["FULL_SHARD", "SHARD_GRAD_OP", "NO_SHARD"] = "FULL_SHARD", transformer_layer_class: str = "Qwen3DecoderLayer", mixed_precision: Literal["no", "fp16", "bf16"] = "bf16", ) -> dict[str, object]: """Return an Accelerate FSDP config dict for `num_gpus`.""" if num_gpus not in (1, 8): msg = f"MI300X xGMI permits only 1 or 8 GPUs; got {num_gpus}." raise ValueError(msg) return { "compute_environment": "LOCAL_MACHINE", "distributed_type": "FSDP" if num_gpus > 1 else "NO", "downcast_bf16": "no", "machine_rank": 0, "main_training_function": "main", "mixed_precision": mixed_precision, "num_machines": 1, "num_processes": num_gpus, "rdzv_backend": "static", "same_network": True, "tpu_env": [], "tpu_use_cluster": False, "tpu_use_sudo": False, "use_cpu": False, "fsdp_config": { "fsdp_auto_wrap_policy": "TRANSFORMER_BASED_WRAP", "fsdp_backward_prefetch_policy": "BACKWARD_PRE", "fsdp_forward_prefetch": False, "fsdp_offload_params": False, "fsdp_sharding_strategy": shard_size, "fsdp_state_dict_type": "FULL_STATE_DICT", "fsdp_sync_module_states": True, "fsdp_transformer_layer_cls_to_wrap": transformer_layer_class, "fsdp_use_orig_params": True, }, } def build_deepspeed_config( *, zero_stage: Literal[1, 2, 3] = 3, offload_optimizer: bool = False, offload_param: bool = False, overlap_comm: bool = True, ) -> dict[str, object]: """Return a DeepSpeed ZeRO config dict at the given stage.""" if zero_stage not in (1, 2, 3): msg = f"zero_stage must be 1/2/3; got {zero_stage}" raise ValueError(msg) return { "bf16": {"enabled": True}, "zero_optimization": { "stage": zero_stage, "offload_optimizer": {"device": "cpu" if offload_optimizer else "none"}, "offload_param": {"device": "cpu" if offload_param else "none"}, "overlap_comm": overlap_comm, "contiguous_gradients": True, "reduce_bucket_size": "auto", "stage3_prefetch_bucket_size": "auto", "stage3_param_persistence_threshold": "auto", }, "gradient_accumulation_steps": "auto", "gradient_clipping": "auto", "steps_per_print": 100, "train_batch_size": "auto", "train_micro_batch_size_per_gpu": "auto", "wall_clock_breakdown": False, } __all__ = ["build_deepspeed_config", "build_fsdp_config"]