Skip to navigation
Advanced TrainingDistributed Setup (Python API)

Distributed Setup (Python API)

View as Markdown

When you use the YAML recipes or the automodel CLI, distributed training is configured from the distributed: section of your config (see Configuration). When you call the NeMoAutoModel* loaders directly from Python, you describe the same topology and execution policies with a single typed object: DistributedSetup.

Quickstart

Build a DistributedSetup and pass it to from_pretrained (or from_config):

import torch
from nemo_automodel import NeMoAutoModelForCausalLM
from nemo_automodel.components.distributed import (
DistributedSetup,
FSDP2Config,
ParallelismSizes,
initialize_distributed,
)
dist_env = initialize_distributed("nccl")
distributed_setup = DistributedSetup.build(
strategy=FSDP2Config(sequence_parallel=True),
parallelism_sizes=ParallelismSizes(tp_size=2),
activation_checkpointing=True,
world_size=dist_env.world_size,
)
model = NeMoAutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-3.2-1B",
distributed_setup=distributed_setup,
)

The same distributed_setup= keyword works on every NeMo AutoModel loader, including NeMoAutoModelForImageTextToText, NeMoAutoModelForSequenceClassification, and NeMoAutoModelForTokenClassification.

DistributedSetup.build

DistributedSetup.build resolves a device mesh and the execution policies from your requested parallelism sizes. It is intentionally forgiving about input types: strategy accepts a string or a configuration object, and the pipeline or MoE configurations accept either a dataclass or a plain dictionary.

Argument / FieldTypeDefaultPurpose
strategystr | DistributedStrategyConfig"fsdp2"Sharding strategy: "fsdp2", "ddp", or "megatron_fsdp" (or a config object such as FSDP2Config/DDPConfig).
parallelism_sizesParallelismSizes | NoneNoneRequested parallel dimensions (tp_size, pp_size, cp_size, ep_size, dp_size, dp_replicate_size). dp_replicate_size is FSDP2-only.
pipeline_configPipelineConfig | dict | NoneNonePipeline-parallel options; requires pp_size > 1.
moe_parallel_configMoEParallelizerConfig | dict | NoneNoneExpert-parallel options; requires ep_size > 1.
activation_checkpointingbool | "full" | "selective"FalseTrue or "full" enables full activation checkpointing; "selective" enables selective AC for FSDP2 or DDP.
activation_checkpointing_scopestr | list[str]"all"FSDP2/DDP strategy field that limits generic AC to model parts such as language, vision, audio, or multimodal. Expert-parallel MoE configs use a separate MoE AC path. In Python, set it on FSDP2Config or DDPConfig; in YAML, place it under distributed:. See Use Gradient (Activation) Checkpointing.
world_sizeint | NoneNoneTotal ranks; auto-detected from the process group when omitted.

YAML distributed: sections also forward strategy-specific fields to FSDP2 or DDP.

ParallelismSizes is durable user intent (what you requested). The resolved runtime topology lives on DistributedSetup.mesh_context (MeshContext), which derives its sizes from the live DeviceMesh after build.

Validation happens at construction time, so invalid combinations fail fast instead of deep inside training. For example, passing a pipeline_config without pp_size > 1, or a moe_parallel_config without ep_size > 1, raises a ValueError.

Plain Device Mesh Shortcut

If you only need a topology and no NeMo-specific policies, you can pass a pre-created Hugging Face-style DeviceMesh directly as device_mesh=. NeMo wraps it in a topology-only DistributedSetup internally:

from torch.distributed.device_mesh import init_device_mesh
mesh = init_device_mesh("cuda", mesh_shape=(2,), mesh_dim_names=("tp",))
model = NeMoAutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-3.2-1B",
device_mesh=mesh,
)

Pass either distributed_setup or device_mesh, not both. Use distributed_setup whenever you need strategy, pipeline, MoE, or activation-checkpointing policies.

Migrate From the Per-Keyword API

Earlier releases accepted a flat set of distributed keywords on from_pretrained or from_config. These are now consolidated into the single distributed_setup object.

Before:

model = NeMoAutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-3.2-1B",
distributed_config=FSDP2Config(activation_checkpointing=True),
tp_size=2,
pipeline_config=pp_cfg,
moe_config=moe_cfg,
moe_mesh=moe_mesh,
activation_checkpointing=True,
)

After:

distributed_setup = DistributedSetup.build(
strategy=FSDP2Config(),
parallelism_sizes=ParallelismSizes(tp_size=2),
pipeline_config=pp_cfg,
moe_parallel_config=moe_cfg,
activation_checkpointing=True,
)
model = NeMoAutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-3.2-1B",
distributed_setup=distributed_setup,
)

The following keywords are no longer accepted directly on the loaders and raise a TypeError if passed: distributed_config, moe_config, moe_mesh, pipeline_config, tp_plan, and activation_checkpointing. Move them onto DistributedSetup.build. Note the rename moe_config → moe_parallel_config, and that flat size keywords (e.g. tp_size) now live on ParallelismSizes.

See Also