We configure end-to-end distributed training for models of any size — from millions to hundreds of billions of parameters. We will assess your project and propose the optimal parallelism strategy, guaranteeing GPU utilization >85% and MFU up to 50% on A100/H100 clusters. Our experience spans 5+ years training large models on clusters of up to 256 GPUs, with over 30 successful projects for AI startups and enterprises.
Why Distributed Training Is Critical for Large Models
A core problem: the model does not fit in a single GPU memory. For instance, LLaMA 3 70B requires about 140GB for weights alone in FP16, exceeding even the H100 80GB capacity. Distributing across several GPUs is the only option. Additionally, training on a single GPU would take weeks; parallelism cuts time by orders of magnitude. In practice, we achieved an 8x speedup on an 8-H100 cluster for a 13B parameter model — with the right configuration. Proper distributed training can reduce GPU costs by 30-50% compared to naive single-GPU approaches. Our clients typically save $5k+ per month on cloud bills through optimized parallelism.
Main Parallelism Strategies
- Data Parallelism — each GPU holds a full model copy and processes different parts of the batch. Gradients are aggregated (all-reduce) after each step. Suitable for models that fit into a single GPU memory.
- Model Parallelism (Tensor Parallelism) — the model is split across layers or tensors among GPUs. Necessary when the model is too large for one GPU. Used in Megatron-LM and DeepSpeed.
- Pipeline Parallelism — model layers are distributed across GPUs sequentially. Different GPUs process different micro-batches simultaneously. Used in GPipe, PipeDream.
- 3D Parallelism — a combination of all three strategies. Used by DeepSpeed and Megatron-LM for training LLMs with hundreds of billions of parameters. DDP (Data Parallel) outperforms naive all-reduce by 30-40% in speed for batches >128 per GPU, and with ZeRO-3 efficiency approaches Model Parallel on large models.
How to Choose a Parallelism Strategy
| Model Size | Recommended Strategy |
|---|---|
| < 1B parameters | DDP (Data Parallel) |
| 1B - 10B parameters | DDP + ZeRO-2/3 (DeepSpeed) |
| 10B - 100B parameters | Tensor + Pipeline Parallel (Megatron) |
| > 100B parameters | 3D Parallelism (DeepSpeed + Megatron) |
For most projects, the optimal choice is to start with DDP and DeepSpeed ZeRO, and only move to Model/Pipeline Parallel if the model does not fit in memory. More details on DeepSpeed ZeRO (https://www.deepspeed.ai/tutorials/zero/) can be found in the official documentation.
What Is 3D Parallelism and When to Use It?
3D Parallelism combines Data, Model, and Pipeline parallelism. It is the only way to train models with hundreds of billions of parameters (e.g., GPT-4 or LLaMA 3 405B). It requires careful tuning: balancing the number of micro-batches, tensor sizes, and pipeline stages. In DeepSpeed and Megatron-LM, this is automated through JSON configs. We use 3D Parallelism on clusters of 64+ GPUs. Typical configuration: 8-way tensor, 4-way pipeline, 8-way data (ZeRO-1). Proper 3D parallelism can achieve up to 2x higher MFU compared to naive DDP for models >10B parameters.
Comparison of Parallelism Methods
| Parameter | DDP | DeepSpeed ZeRO | Megatron-LM |
|---|---|---|---|
| Memory overhead | Low | Medium (ZeRO-3 offloads) | High (extra buffers) |
| Communication overhead | All-reduce each step | All-gather/reduce-scatter | P2P and all-reduce |
| Configuration complexity | Low | Medium | High |
| Max model size | Up to 1B | Up to 10B | >100B |
Data Parallel with PyTorch DDP
DistributedDataParallel (DDP) — the recommended approach for data parallelism in PyTorch. PyTorch DDP Documentation (https://pytorch.org/docs/stable/distributed.html)
import torch
import torch.distributed as dist
from torch.nn.parallel import DistributedDataParallel as DDP
def setup(rank, world_size):
dist.init_process_group(
backend='nccl', # nccl for GPU, gloo for CPU
rank=rank,
world_size=world_size
)
torch.cuda.set_device(rank)
def train(rank, world_size, model, dataset):
setup(rank, world_size)
model = model.to(rank)
ddp_model = DDP(model, device_ids=[rank])
sampler = DistributedSampler(dataset, num_replicas=world_size, rank=rank)
loader = DataLoader(dataset, sampler=sampler, batch_size=32)
optimizer = torch.optim.AdamW(ddp_model.parameters(), lr=1e-4)
for epoch in range(num_epochs):
sampler.set_epoch(epoch)
for batch in loader:
optimizer.zero_grad()
loss = ddp_model(batch)
loss.backward()
optimizer.step()
Running on a single node (8 GPUs):
torchrun --nproc_per_node=8 train.py
Running on multiple nodes:
# On node 0 (master):
torchrun --nnodes=4 --nproc_per_node=8 \
--node_rank=0 \
--master_addr="10.0.0.1" --master_port=29500 \
train.py
# On nodes 1-3 (worker):
torchrun --nnodes=4 --nproc_per_node=8 \
--node_rank=1 \ # 2, 3 respectively
--master_addr="10.0.0.1" --master_port=29500 \
train.py
Accelerate from Hugging Face
For simpler configuration with support for mixed precision, gradient accumulation, and various distributed backends:
from accelerate import Accelerator
accelerator = Accelerator(
mixed_precision='bf16',
gradient_accumulation_steps=4
)
model, optimizer, train_dataloader = accelerator.prepare(
model, optimizer, train_dataloader
)
for batch in train_dataloader:
with accelerator.accumulate(model):
outputs = model(**batch)
loss = outputs.loss
accelerator.backward(loss)
optimizer.step()
optimizer.zero_grad()
Step-by-Step Guide to Setting Up Distributed Training
- Analyze model size and memory requirements.
- Select parallelism strategy (use the table above).
- Configure network: NCCL backend, InfiniBand or RoCE, master node.
- Prepare training script with DDP, DeepSpeed or Megatron.
- Launch with torchrun or slurm on the cluster.
- Monitor GPU utilization and MFU, adjust batch size and gradient accumulation.
Deliverables
- Detailed documentation of the parallelism strategy and configuration.
- Configuration files for DDP, DeepSpeed, or Megatron.
- Monitoring dashboard (W&B or MLflow) with key metrics.
- Training session (2 hours) to walk through the setup.
- 1 month of post-launch support.
What Is Included in Distributed Training Setup
- Analysis of model architecture and selection of parallelism strategy.
- Configuration of distributed environment (NCCL, InfiniBand, MPI).
- Setup of DDP/DeepSpeed/Megatron tailored to your hardware.
- Hyperparameter optimization (batch size, learning rate, gradient accumulation).
- Integration of monitoring (W&B, MLflow) and logging.
- Deployment documentation and post-launch support.
Common Mistakes in Distributed Training
- CUDA out of memory when starting DDP: reduce batch size or enable gradient checkpointing.
- Low GPU utilization (<50%): check I/O bottleneck, increase num_workers, use NVMe.
- Slow all-reduce: use gradient compression or increase batch size.
- Unsynchronized seeds: set one seed for all processes via torch.manual_seed.
Our Experience and Guarantees
We guarantee:
- GPU utilization >85% and MFU no lower than 40% for typical configurations.
- Support for all popular frameworks: PyTorch DDP, DeepSpeed ZeRO-2/3, Megatron-LM, Hugging Face Accelerate.
- Experience with clusters on AWS, GCP, On-premise (NVIDIA DGX, Supermicro).
- Individual approach: we do not propose template solutions but adapt to your model and hardware.
Trusted by 15+ AI startups, with 5+ years in distributed training and 30+ completed projects. Typical setup fee starts at $3,000. Contact us for an assessment of your project. Get a consultation on strategy selection and configuration.







