This guide is the operational and engineering reference for DeepSpeed: architecture, the complete configuration reference, deployment across clusters, operations, performance tuning, security, and the codebase internals. It is written for ML platform engineers, infrastructure admins, and contributors. For installation and day-to-day usage, see the companion DeepSpeed User Guide.
DeepSpeed is a pure-Python library (with C++/CUDA extension ops) that wraps a user's PyTorch model and optimizer to provide memory-efficient, large-scale distributed training and inference. It introduces no standalone server or daemon — it is invoked in-process via deepspeed.initialize(...) and orchestrated across hosts by the deepspeed launcher.
1. Architecture Overview
DeepSpeed sits between the user's PyTorch training script and the accelerator/communication layer. The user calls deepspeed.initialize(...), which parses the JSON config into a DeepSpeedConfig, selects an engine implementation, and returns a wrapped engine that intercepts forward/backward/step.
user training script (train.py)
│
deepspeed.initialize(model, optimizer, config)
│
┌─────────────────────────────────────────────┐
│ DeepSpeedConfig │
│ (parses JSON/HJSON/dict/base64; pydantic v2 │
│ sub-configs: ZeRO, offload, fp16/bf16, │
│ optimizer, scheduler, comms, monitor, ...) │
└─────────────────────────────────────────────┘
│ selects engine
┌──────────────┬──────────────┬────────────────┐
▼ ▼ ▼ ▼
DeepSpeedEngine PipelineEngine HybridEngine InferenceEngine
(data-parallel (pipeline (RLHF train+ (init_inference;
+ ZeRO 0-3) parallel) inference) kernel inject, TP)
│
▼
ZeRO optimizer (stage_1_and_2 / stage3) ── offload (CPU/NVMe via swap_tensor + async_io)
│
▼
deepspeed.comm ──────────► torch.distributed (NCCL / Gloo / MPI / CCL / ...)
│
▼
accelerator abstraction (get_accelerator) ──► CUDA | ROCm | XPU | HPU | NPU | MLU | SDAA | CPU
│
▼
op_builder + csrc (C++/CUDA/HIP kernels, JIT or pre-built)
Note
The engine choice is made inside
deepspeed.initialize: aPipelineModuleyields aPipelineEngine;hybrid_engine.enabledyields aDeepSpeedHybridEngine; otherwise aDeepSpeedEngine.init_inferenceis a separate path producing anInferenceEngine. This is why the sameinitializecall transparently supports very different parallelism strategies.
Component inventory
| Component | Path | Role |
|---|---|---|
| Public API | deepspeed/__init__.py |
initialize, init_inference, zero, add_config_arguments, tp_model_init. |
| Runtime engine | deepspeed/runtime/engine.py |
DeepSpeedEngine: forward/backward/step, checkpointing, optimizer/scheduler wiring. |
| Config system | deepspeed/runtime/config.py, config_utils.py, constants.py |
DeepSpeedConfig + pydantic config models + key/default constants. |
| ZeRO | deepspeed/runtime/zero/ |
stage_1_and_2.py, stage3.py, partition_parameters.py, config.py, offload_config.py, MiCS, tiling. |
| Pipeline parallel | deepspeed/runtime/pipe/, deepspeed/pipe/ |
PipelineModule, LayerSpec, PipelineEngine. |
| Tensor parallel | deepspeed/runtime/tensor_parallel/ |
AutoTP init utilities. |
| Sequence parallel | deepspeed/sequence/ |
Ulysses sequence parallelism. |
| Communication | deepspeed/comm/ |
init_distributed, collective wrappers over torch.distributed, SDMA allgather. |
| Launcher | deepspeed/launcher/ |
runner.py (front-end), launch.py (per-node), multi-node runners. |
| Accelerator abstraction | accelerator/ |
get_accelerator() → CUDA/ROCm/XPU/HPU/NPU/MLU/SDAA/CPU/MPS backends. |
| Op builders | op_builder/ |
Build/JIT-compile C++/CUDA ops; per-accelerator subfolders. |
| Native kernels | csrc/ |
C++/CUDA/HIP sources (adam, transformer, quantization, aio, gds, ...). |
| Inference | deepspeed/inference/, deepspeed/module_inject/ |
InferenceEngine, kernel injection, layer replacement. |
| MoE | deepspeed/moe/ |
Mixture-of-Experts layers and sharded gating. |
| Checkpointing | deepspeed/checkpoint/, deepspeed/runtime/model_checkpointing/ |
Universal checkpoint conversion, parallel write. |
| Autotuning | deepspeed/autotuning/ |
Autotuner config search. |
| Elasticity | deepspeed/elasticity/ |
Elastic training agent + config. |
| Monitoring | deepspeed/monitor/ |
TensorBoard/WandB/CSV/Comet monitor backends. |
| Profiling | deepspeed/profiling/flops_profiler/ |
FLOPS/latency profiler. |
| Compression | deepspeed/compression/ |
Quantization, pruning, layer reduction. |
| Compile | deepspeed/compile/, csrc/compile/ |
DeepCompile graph optimization. |
| NVMe / I/O | deepspeed/nvme/, deepspeed/io/, csrc/aio/, csrc/gds/ |
Async NVMe I/O for offload; DeepNVMe tools. |
| Utilities | deepspeed/utils/ |
Logging, groups, NUMA binding, zero_to_fp32, tensor fragments. |
Technology stack
| Layer | Technology |
|---|---|
| Language | Python 3.8–3.12; C++/CUDA/HIP for kernels |
| DL framework | PyTorch ≥ 2.0 |
| Config validation | pydantic v2 (DeepSpeedConfigModel) |
| Config format | JSON / HJSON / dict / base64 |
| Communication | torch.distributed (NCCL, Gloo, MPI, oneCCL), custom SDMA allgather |
| Build | setuptools + ninja; per-op DS_BUILD_* env vars |
| Multi-node launch | PDSH, OpenMPI, MPICH, Intel MPI, MVAPICH, SLURM |
| Accelerators | CUDA, ROCm, XPU, HPU, NPU, MLU, SDAA, MPS, CPU |
Data flow for a training step
- Forward —
engine.forward()runs the (possibly ZeRO-3-gathered) module; parameters are fetched/prefetched and released around submodule execution. - Backward —
engine.backward(loss)scales the loss (grad accumulation + FP16 loss scaling), runs autograd, and reduces/partitions gradients (reduce-scatter under ZeRO-2/3, overlapped with compute whenoverlap_comm). - Step — on a gradient-accumulation boundary,
engine.step()runs the (possibly CPU-offloaded) optimizer, the LR scheduler, gradient clipping, and zeroes gradients.
Note
ZeRO's invariant is that no two data-parallel ranks hold redundant copies of the partitioned state (optimizer states at Stage 1, +gradients at Stage 2, +parameters at Stage 3). Parameters are transiently materialized only while a submodule executes — the basis for ZeRO-Infinity's ability to train trillion-parameter models with NVMe offload.
2. System Requirements
| Requirement | Detail |
|---|---|
| Python | 3.8 – 3.12 |
| PyTorch | ≥ 2.0.0, installed before DeepSpeed |
| Accelerator | NVIDIA CUDA, AMD ROCm, Intel XPU, Habana HPU, Ascend NPU, Cambricon MLU, SDAA, Apple MPS, or CPU |
| Build toolchain (Linux, for pre-built/JIT ops) | C++ compiler; CUDA toolkit matching torch for CUDA ops; ninja for JIT |
| NVMe offload | libaio (for async_io); optionally NVIDIA GDS (gds) |
| Shared memory | /dev/shm ≥ 512 MB (NCCL); in Docker use --shm-size=1gb+ |
| Network (multi-node) | Passwordless SSH (PDSH) or an MPI/SLURM scheduler; high-bandwidth interconnect (InfiniBand recommended) |
Auto-installed Python deps: einops, hjson, msgpack, ninja, numpy, packaging>=20.0, psutil, py-cpuinfo, pydantic>=2.0.0, torch>=2.0.0, tqdm (+ nvidia-ml-py on NVIDIA).
Optional extras (from setup.py): 1bit, 1bit_mpi, readthedocs, dev, autotuning, autotuning_ml, sparse_attn, sparse, inf, sd, triton, deepcompile, and all.
pip install deepspeed[autotuning,inf]
3. Configuration Reference
The configuration object is parsed by DeepSpeedConfig (deepspeed/runtime/config.py). It accepts a dict, a path to a JSON/HJSON file, or a base64-encoded JSON string. Sub-sections are pydantic v2 models with extra="forbid", validate_default=True, and validate_assignment=True — unknown keys raise validation errors, and duplicate JSON keys are rejected.
Important
Because validation is strict, "auto" sentinel values are stripped for non-strict construction (Hugging Face compatibility), and deprecated keys emit warnings and are re-mapped to their replacements. Treat the keys below as the source-of-truth surface as of commit
28a196f.
3.1 Top-level training keys
| Key | Type | Default | Description |
|---|---|---|---|
train_batch_size |
int | None |
Effective global batch per step. Derivable from the other two + world_size. |
train_micro_batch_size_per_gpu |
int | None |
Samples per GPU per micro-step. |
gradient_accumulation_steps |
int | None |
Micro-steps per optimizer step. |
steps_per_print |
int | None |
Log cadence for training stats. |
gradient_clipping |
float | 0.0 |
Global gradient-norm clip (0 = off). |
prescale_gradients |
bool | false |
Scale gradients before all-reduce. |
gradient_predivide_factor |
float | 1.0 |
Pre-divide factor for gradients. |
sparse_gradients |
bool | false |
Enable CSR sparse-gradient handling. |
disable_allgather |
bool | false |
Use broadcasts instead of all-gather. |
communication_data_type |
str | None |
fp16/bf16/fp32 for gradient comm. |
seq_parallel_communication_data_type |
str | fp32 |
Comm dtype for sequence parallelism. |
dump_state |
bool | false |
Dump engine state for debugging. |
wall_clock_breakdown |
bool | false |
Per-stage timing breakdown. |
memory_breakdown |
bool | false |
Memory usage breakdown. |
dataloader_drop_last |
bool | false |
Drop the last incomplete batch. |
vocabulary_size |
int | None |
For tensor-core alignment warnings. |
graph_harvesting |
bool | false |
Capture graphs for short kernel sequences. |
data_types.grad_accum_dtype |
str | None |
bf16/fp16/fp32 accumulation dtype. |
3.2 Optimizer & scheduler
{
"optimizer": { "type": "AdamW", "params": { "lr": 3e-4, "weight_decay": 0.01 },
"legacy_fusion": false },
"scheduler": { "type": "WarmupDecayLR",
"params": { "warmup_min_lr": 0, "warmup_max_lr": 3e-4,
"warmup_num_steps": 1000, "total_num_steps": 100000 } }
}
Optimizer type: Adam, AdamW, Adagrad, Lamb, Lion, OneBitAdam, ZeroOneAdam, OneBitLamb, MuAdam, MuAdamW, MuSGD, Muon. Extra param toggles: torch_adam (force stock PyTorch Adam), adam_w_mode (default true), max_grad_norm.
Scheduler type: LRRangeTest, OneCycle, WarmupLR, WarmupDecayLR, WarmupCosineLR. Selected scheduler params include warmup_min_lr, warmup_max_lr, warmup_num_steps, warmup_type (log/linear), total_num_steps, cycle_min_lr, cycle_max_lr, cycle_first_step_size, decay_lr_rate, warmup_min_ratio, cos_min_ratio.
| ZeRO-related optimizer key | Default | Meaning |
|---|---|---|
zero_allow_untested_optimizer |
false |
Permit a non-validated optimizer with ZeRO. |
zero_force_ds_cpu_optimizer |
true |
Force DeepSpeed CPU optimizer when offloading. |
3.3 Mixed precision
fp16
| Key | Default | Meaning |
|---|---|---|
enabled |
false |
Enable FP16. |
loss_scale |
0 |
0 = dynamic loss scaling. |
initial_scale_power |
16 |
Initial dynamic scale = 2^power. |
loss_scale_window |
1000 |
Window for scale adjustment. |
hysteresis |
2 |
Overflow tolerance. |
consecutive_hysteresis |
false |
Require consecutive good steps. |
min_loss_scale |
1 |
Lower bound on scale. |
auto_cast |
false |
Auto-cast inputs to FP16. |
fp16_master_weights_and_grads |
false |
FP16 master copy (ZeRO 1/2/3 only). |
bf16
| Key | Default | Meaning |
|---|---|---|
enabled |
false |
Enable BF16 (no loss scaling needed). |
immediate_grad_update |
true |
Update grads immediately. |
check_overflow |
false |
Check for overflow. |
bf16_master_weights_and_grads |
false |
BF16 master weights (ZeRO 1/2/3). |
bf16_optimizer_states |
false |
BF16 optimizer states (requires master weights). |
torch_autocast
| Key | Default | Meaning |
|---|---|---|
enabled |
false |
Use torch.autocast. |
dtype |
— | float16/bfloat16. |
lower_precision_safe_modules |
— | List of module class paths kept in low precision. |
Caution
fp16.enabledandbf16.enabledare mutually exclusive (asserted at init).*_master_weights_and_gradsandbf16_optimizer_statesare only valid with ZeRO Stages 1–3; misuse raises a config assertion.
3.4 zero_optimization — complete
| Key | Type | Default | Meaning |
|---|---|---|---|
stage |
0–3 | 0 |
Disabled / optimizer / +gradients / +parameters. |
contiguous_gradients |
bool | true |
Copy grads to a contiguous buffer (less fragmentation). |
reduce_scatter |
bool | true |
Use reduce-scatter instead of all-reduce. |
reduce_bucket_size |
int | 5e8 |
Elements reduced at a time. |
use_multi_rank_bucket_allreduce |
bool | true |
Combine rank buckets into one all-reduce. |
allgather_partitions |
bool | true |
All-gather vs. broadcast to gather params. |
allgather_bucket_size |
int | 5e8 |
Elements all-gathered at a time. |
overlap_comm |
bool | None→stage==3 |
Overlap gradient reduction with backward. |
load_from_fp32_weights |
bool | true |
Init FP32 master from FP32 checkpoint copies. |
elastic_checkpoint |
bool | false |
(No longer supported.) |
offload_param |
dict | None |
Param offload config (Stage 3). |
offload_optimizer |
dict | None |
Optimizer offload config (Stage 1/2/3). |
zenflow |
dict | None |
ZenFlow config. |
sub_group_size |
int | 1e9 |
Tile size for massive models. |
stage3_prefetch_bucket_size |
int | 5e7 |
Param elements to prefetch (alias prefetch_bucket_size). |
stage3_param_persistence_threshold |
int | 1e5 |
Don't partition params smaller than this. |
stage3_model_persistence_threshold |
int | sys.maxsize |
Max unpartitioned param elements. |
stage3_max_live_parameters |
int | 1e9 |
Max resident params per GPU before release. |
stage3_max_reuse_distance |
int | 1e9 |
Keep params reused within this distance. |
stage3_gather_16bit_weights_on_model_save |
bool | false |
Gather sharded weights into a 16-bit save. |
stage3_module_granularity_threshold |
int | 0 |
Treat fine-grained modules as units when fetching. |
stage3_use_all_reduce_for_fetch_params |
bool | false |
Use all-reduce when fetching params. |
stage3_allgather_sequential |
bool | false |
Per-param sequential all-gather (lower peak memory). |
ignore_unused_parameters |
bool | true |
Don't error on unused params (Stage 2). |
legacy_stage1 |
bool | false |
Old Stage-1 implementation (deprecated). |
round_robin_gradients |
bool | false |
Parallelize grad copy to CPU across ranks. |
zero_hpz_partition_size |
int | 1 |
Secondary (hierarchical) partition group size (ZeRO++). |
zero_quantized_weights |
bool | false |
Quantize weights for all-gather comm. |
zero_quantized_nontrainable_weights |
bool | false |
Store non-trainable weights quantized (LoRA). |
zero_quantized_gradients |
bool | false |
Quantize gradients for comm. |
zeropp_loco_param |
dict | None |
LoCo-Zero++ params (err_beta, reset_T). |
mics_shard_size |
int | -1 |
MiCS shard size. |
mics_hierarchical_params_gather |
bool | false |
MiCS hierarchical gather. |
memory_efficient_linear |
bool | true |
Memory-efficient linear (Stage 3). |
override_module_apply |
bool | true |
Override nn.Module.apply (Stage 3). |
pipeline_loading_checkpoint |
bool | false |
Force checkpoint load in pipeline mode (Stage 3). |
log_trace_cache_warnings |
bool | false |
Log trace-cache invalidations. |
enable_sanity_checks |
bool | false |
Internal sanity checks (debugging). |
save_muon_momentum_buffer_in_memory |
bool | false |
Keep Muon momentum in memory vs. NVMe (Stage 3). |
leaf_module |
dict | — | Modules treated as ZeRO-3 leaf units. |
offload_param (Stage 3)
| Key | Default | Meaning |
|---|---|---|
device |
none |
cpu/nvme/none. |
nvme_path |
None |
NVMe filesystem path. |
buffer_count |
5 |
NVMe buffer-pool size. |
buffer_size |
1e8 |
NVMe buffer size. |
max_in_cpu |
1e9 |
Param elements kept in CPU when NVMe offloading. |
pin_memory |
false |
Page-locked CPU memory. |
offload_optimizer (Stage 1/2/3)
| Key | Default | Meaning |
|---|---|---|
device |
none |
cpu/nvme/none. Optimizer compute runs on CPU regardless. |
nvme_path |
None |
NVMe path. |
buffer_count |
4 |
NVMe buffers (≥ optimizer states per param; Adam=4). |
pin_memory |
false |
Page-locked CPU memory. |
pipeline_read / pipeline_write |
false |
Overlap tile read/write with compute (ZeRO-Infinity). |
fast_init |
false |
Fast init when offloading to NVMe. |
ratio |
1.0 |
Fraction of optimizer states offloaded to CPU Adam (Stage 3). |
super_offload |
false |
High-performance CPU offload for Superchips (Stage 3). |
cpuadam_cores_perc |
0.8 |
CPU cores for CPU Adam (with super_offload). |
Warning
Deprecated ZeRO keys still parse but warn and re-map:
cpu_offload→offload_optimizer,cpu_offload_param→offload_param,cpu_offload_use_pin_memory, andstage3_gather_fp16_weights_on_model_save→gather_16bit_weights_on_model_save. Migrate configs off them.
3.5 Other config blocks
These blocks exist and are parsed by DeepSpeedConfig; see source for full sub-schemas:
| Block | Purpose |
|---|---|
activation_checkpointing |
Partition/CPU-offload activations (partition_activations, contiguous_memory_optimization, cpu_checkpointing, number_checkpoints, synchronize_checkpoint_boundary, profile). |
flops_profiler |
FLOPS/latency profiler (enabled, profile_step, module_depth, top_modules, detailed, output_file). |
autotuning |
Autotuner search settings. |
comms_logger |
Communication logging. |
monitor_config (tensorboard, wandb, csv_monitor, comet) |
Metric monitoring backends. |
compression_training |
Quantization/pruning/layer-reduction schedule. |
nebula |
Nebula fast checkpointing. |
data_states |
DataStates checkpointing. |
checkpoint |
tag_validation (Warn/Ignore/Fail), load_universal, use_node_local_storage, parallel_write.pipeline_stage. |
aio |
NVMe async-I/O tuning (block_size, queue_depth, thread_count, single_submit, overlap_events). |
tensor_parallel |
AutoTP (autotp_size, tp.tp_size, tp.tp_grain_size). |
data_efficiency |
Curriculum learning & data sampling/routing. |
compile |
DeepCompile (CompileConfig). |
weight_quantization |
Post-training weight quantization. |
hybrid_engine |
RLHF hybrid engine (enabled, max_out_tokens, inference_tp_size, release_inference_cache, pin_parameters, tp_gather_partition_size). |
eigenvalue |
Eigenvalue computation (enabled, max_iter, tol, stability, ...). |
progressive_layer_drop |
PLD (theta, gamma). |
sparse_attention |
Sparse attention (mode: dense/fixed/variable/bigbird/bslongformer). |
elasticity |
Elastic training (max_train_batch_size, micro_batch_sizes, min_gpus, max_gpus, model_parallel_size, num_gpus_per_node). |
3.6 Inference config (init_inference)
| Key (alias) | Default | Meaning |
|---|---|---|
replace_with_kernel_inject (kernel_inject) |
false |
Inject optimized transformer kernels. |
tensor_parallel.tp_size |
1 |
Inference tensor-parallel degree. |
dtype |
— | fp16/bf16/int8/fp32. |
enable_cuda_graph |
false |
Capture CUDA graph. |
use_triton / triton_autotune |
false |
Triton kernels / autotune. |
max_out_tokens (max_tokens) |
1024 |
Max output tokens. |
min_out_tokens (min_tokens) |
1 |
Min output tokens. |
injection_policy (injection_dict) |
None |
Manual layer-replacement policy. |
quant |
— | Quantization (num_bits, q_groups). |
checkpoint |
None |
Checkpoint dir/dict to load. |
keep_module_on_host |
false |
Keep module on host during replace. |
mp_size (deprecated → tensor_parallel.tp_size) |
1 |
Legacy MP size. |
moe.ep_size (deprecated ep_size) |
1 |
Expert-parallel size. |
4. Deployment & Scaling
DeepSpeed has no service to deploy — you deploy your training job. The deepspeed launcher (deepspeed/launcher/runner.py) is the front-end; it discovers resources, encodes a base64 "world info" map, and spawns per-node deepspeed.launcher.launch processes (one process per rank).
Single node
deepspeed train.py --deepspeed_config ds_config.json # all visible GPUs
deepspeed --num_gpus 4 train.py --deepspeed_config ds_config.json
CUDA_VISIBLE_DEVICES=0,1 deepspeed train.py --deepspeed_config ds_config.json
On a single node with no hostfile, the runner sets localhost to device_count() and master_addr=127.0.0.1.
Hostfile (multi-node)
MPI-style, one host per line:
worker-0 slots=8
worker-1 slots=8
worker-2 slots=8
deepspeed --hostfile=/path/hostfile train.py --deepspeed_config ds_config.json
The default hostfile path is /job/hostfile (DLTS_HOSTFILE). Resource selection:
deepspeed -i "worker-0@worker-1:0,2" train.py ... # include
deepspeed -e "worker-1:0" train.py ... # exclude (mutually exclusive with -i)
deepspeed --num_nodes 2 --num_gpus 4 train.py ... # top-N hosts, N GPUs each
Multi-node launcher backends
--launcher |
Backend binary | Notes |
|---|---|---|
pdsh (default) |
pdsh |
Parallel SSH; supports --include/--exclude; sets PDSH_RCMD_TYPE=ssh. |
openmpi |
ompi_info/mpirun |
No include/exclude/num filtering; default --mca btl ^openib. |
mpich |
mpirun |
Same devices per node required. |
impi |
mpirun (Intel MPI) |
Per-rank env mapping; disables IMPI core binding. |
mvapich |
mpiname/mpirun |
Requires MVAPICH2-GDR; sets CUDA-aware flags. |
slurm |
srun |
Supports --include/--exclude/--num_nodes/--num_gpus, --comment. |
Important
PDSH requires passwordless SSH between nodes. The runner probes the first host (
ssh -o PasswordAuthentication=no <host> hostname) and aborts withhost=<name> was not reachable via sshif it fails. Use--no_ssh_checkto skip the probe,--ssh_portfor non-standard ports, or--no_ssh(with--node_rankper node) to launch without SSH.
Environment propagation
The runner exports variables matching MLFLOW*, PYTHON*, MV2*, UCX*, Nebula vars, plus accelerator-specific exports, and reads a .deepspeed_env file from ~ or CWD (filename via DS_ENV_FILE, default .deepspeed_env):
NCCL_IB_DISABLE=0
NCCL_SOCKET_IFNAME=eth0
Elastic training
deepspeed --elastic_training --master_addr <addr> --num_nodes MIN:MAX train.py ...
Elastic mode uses the elasticity config block to compute a valid batch size for the current GPU count and overrides batch params at runtime (warns if you also set them manually unless ignore_non_elastic_batch_info: true).
Warning
Under elasticity, batch-related keys (
train_batch_size,train_micro_batch_size_per_gpu,gradient_accumulation_steps) are taken over by the elastic agent and will be overridden. Setignore_non_elastic_batch_info: trueto silence the resulting errors.
Containers
- Mount or build with PyTorch + CUDA matching your driver.
- Use
--shm-size=1gb(or larger) so NCCL has enough/dev/shm. - Pre-build ops in the image (
DS_BUILD_OPS=1) to avoid first-run JIT latency and to make images reproducible.
CPU core binding
deepspeed --bind_cores_to_rank --bind_core_list 0-31 train.py ...
Improves host efficiency (especially CPU backend / offload). Sets OMP_NUM_THREADS per rank via numactl.
Caution
Core binding conflicts with
KMP_AFFINITYand raises an error instructing you tounset KMP_AFFINITYfirst.
5. Operations
Health & inventory
ds_report # op install/compatibility + torch/cuda/nccl versions, /dev/shm size
ds_report enumerates every op (async_io, cpu_adam, fused_adam, transformer, transformer_inference, quantizer, gds, ...) with [YES]/[NO] installed and [OKAY]/[NO] compatible, and reports torch/CUDA/HIP/NCCL versions and /dev/shm size with warnings.
Logging
| Control | Effect |
|---|---|
--log_level {debug,info,warning,error,critical} |
Launcher/runner verbosity (default info). |
-q / --quiet |
Aliases to --log_level error. |
--enable_each_rank_log <dir> |
Per-rank stdout/stderr to separate files. |
DISABLE_LOGS_WHILE_COMPILING |
Suppress logs during compilation. |
steps_per_print (config) |
Training-stat cadence. |
Checkpointing operations
engine.save_checkpoint(save_dir, tag, client_state={...}, exclude_frozen_parameters=False)
load_path, client_state = engine.load_checkpoint(load_dir, tag)
engine.save_16bit_model(save_dir, "pytorch_model.bin")
Offline conversions:
# ZeRO checkpoint -> single FP32 state_dict
python -m deepspeed.utils.zero_to_fp32 <checkpoint_dir> <output> [--safe_serialization] [--max_shard_size 5GB]
# -> universal checkpoint for cross-topology resume
python -m deepspeed.checkpoint.ds_to_universal --input_folder <in> --output_folder <out> \
--num_extract_workers 4 --num_merge_workers 2 [--inject_missing_state] [--keep_temp_folder]
checkpoint.tag_validation controls whether a tag mismatch across ranks is Warn (default), Ignore, or Fail. checkpoint.parallel_write.pipeline_stage enables pipelined parallel checkpoint writes; use_node_local_storage writes to node-local disk.
Note
For very large jobs, enable
nebulaordata_statescheckpoint engines (config blocks) for faster, asynchronous checkpoint writes. The checkpoint engine is pluggable (deepspeed/runtime/checkpoint_engine/).
Monitoring
Configure a monitor backend to stream metrics:
{ "tensorboard": { "enabled": true, "output_path": "logs/", "job_name": "run1" } }
Also supported: wandb, csv_monitor, comet. Enable wall_clock_breakdown and flops_profiler for performance telemetry.
Cross-node command execution
ds_ssh -f hostfile "nvidia-smi --query-gpu=memory.used --format=csv"
Tip
Standardize a
.deepspeed_envand a versionedds_config.jsonper job, and pre-build ops in your image. This makes runs reproducible and removes first-step JIT stalls from your timing data.
6. Performance
Choosing and tuning ZeRO
- Stage selection: lowest stage that fits. Stage 2 is the usual sweet spot; Stage 3 for the largest models.
- Bucket sizes:
reduce_bucket_size/allgather_bucket_sizetrade memory for comm efficiency (default5e8). Lower under memory pressure. - Overlap:
overlap_comm: trueoverlaps gradient reduction with backward (default on for Stage 3). - Stage 3 residency: lower
stage3_max_live_parametersandstage3_prefetch_bucket_sizeto cut memory; raisestage3_param_persistence_thresholdto keep small params unpartitioned (cuts latency-bound comm). - Sequential allgather:
stage3_allgather_sequential: truereduces peak memory at some throughput cost (high-pressure scenarios).
Offload performance
- CPU optimizer offload runs the optimizer on CPU — install/build
cpu_adam. pin_memory: truespeeds host↔device transfers (uses more host RAM).- NVMe offload (
async_io) needslibaio; tune withds_nvme_tuneand theaioblock (queue_depth,block_size,thread_count,overlap_events). - Partial offload (
offload_optimizer.ratio < 1.0) keeps some optimizer states on GPU (Stage 3 only). super_offload+cpuadam_cores_percfor Superchip CPU offload.
Communication optimizations
| Feature | Config | Benefit |
|---|---|---|
| ZeRO++ hierarchical partitioning | zero_hpz_partition_size |
Reduce cross-node all-gather. |
| Quantized weights/grads | zero_quantized_weights, zero_quantized_gradients |
Smaller comm volume. |
| LoCo-Zero++ | zeropp_loco_param |
Error-compensated low-comm. |
| Multi-rank bucket all-reduce | use_multi_rank_bucket_allreduce |
Fewer, larger messages on small models. |
| 1-bit optimizers | OneBitAdam/OneBitLamb/ZeroOneAdam |
Drastically reduced comm. |
| Communication dtype | communication_data_type |
Reduce comm bytes. |
Autotuning
deepspeed --autotuning tune train.py --deepspeed_config ds_config.json
deepspeed --autotuning run train.py --deepspeed_config ds_config.json
The Autotuner (deepspeed/autotuning/) sweeps ZeRO/batch/bucket settings against your model and writes an optimal config; run tunes then trains.
Profiling
{ "flops_profiler": { "enabled": true, "profile_step": 1, "module_depth": -1, "top_modules": 1, "detailed": true },
"wall_clock_breakdown": true }
Tip
Activation checkpointing (
activation_checkpointing.partition_activations,cpu_checkpointing) trades compute for activation memory — combine with ZeRO for the largest models. Pair withsub_group_sizetuning under Stage 3 to balance memory and step time.
7. Security
DeepSpeed is an in-process library, not a network service, so its attack surface is the code/configs it executes and the cluster it orchestrates — not exposed endpoints.
Warning
Configs and checkpoints are executable trust boundaries. A DeepSpeed config can be a path, a dict, or a base64-encoded string that is decoded and parsed (
base64.urlsafe_b64decodeinDeepSpeedConfig). Checkpoints are loaded with PyTorch (pickle) by default. Treat both as code: only load configs and checkpoints from trusted sources. Prefer--safe_serialization(safetensors) when converting models for distribution.
Operational security guidance:
- SSH for multi-node — the PDSH launcher relies on passwordless SSH. Restrict keys to the training subnet, use dedicated job accounts, and avoid running as root (the
install.shscript explicitly refuses to run as root without--allow_sudo). - Environment propagation —
.deepspeed_envand exported variables are pushed to all nodes; don't put secrets in them. The runner deliberately excludes some host-specific vars (e.g. underAISC_JOB_NAME). - Process control —
--save_pidwrites a PID file under/tmp/<pid>.ds; the launcher installs SIGINT/SIGTERM handlers that terminate the full process tree and (PDSH) issue a remotepkill. Ensure/tmpis not world-writable on shared hosts. - Resource isolation — on shared clusters, scope GPUs with
--include/CUDA_VISIBLE_DEVICESand CPU cores with--bind_core_listto avoid noisy-neighbor interference. - Supply chain — pin DeepSpeed, PyTorch, and accelerator runtime versions; build ops in a controlled image.
DS_SKIP_CUDA_CHECK/DS_IGNORE_CUDA_DETECTIONbypass safety checks — use sparingly and only in known-good environments.
Caution
Never load a checkpoint, universal-checkpoint folder, or base64 config received from an untrusted party into a privileged training environment — deserialization can execute arbitrary code.
8. Developer Internals
Repository structure
| Path | Contents |
|---|---|
deepspeed/ |
The Python package (runtime, zero, comm, launcher, inference, moe, etc.). |
accelerator/ |
Accelerator abstraction (get_accelerator, per-device backends). |
op_builder/ |
Op build/JIT logic; per-accelerator subfolders (cpu, xpu, npu, hpu, mlu, sdaa). |
csrc/ |
C++/CUDA/HIP kernel sources. |
tests/ |
unit/, model/, benchmarks/, accelerator/onebit/lightning suites (pytest). |
docs/ |
Jekyll site + Sphinx code-docs (readthedocs). |
blogs/ |
Feature announcement write-ups (ZeRO++, DeepNVMe, Ulysses, FastGen, Windows, ...). |
benchmarks/, examples/ |
Benchmark and example scripts. |
bin/ |
Installed CLI scripts (deepspeed, ds_report, ds_ssh, ...). |
setup.py, version.txt, requirements/ |
Build + dependency definitions. |
Architecture deep dive
Initialization path (deepspeed/__init__.py::initialize):
- Shut down any active
zero.Initcontext, assert a model was passed. init_distributed(...)viadeepspeed.comm(auto-detects backend from the accelerator).- Resolve the config (dict / path / base64), optionally build a mesh device for sequence+data parallelism.
- Merge tensor-parallel init args; if
tensor_parallel.autotp_size > 0, enable AutoTP training mode. - Construct
DeepSpeedConfig, set optimizer flags (e.g. Muon per-param tagging), and instantiate the engine (DeepSpeedEngine/DeepSpeedHybridEngine/PipelineEngine). - Return
(engine, optimizer, dataloader, lr_scheduler).
Config system (config.py + config_utils.py): DeepSpeedConfig._initialize_params wires dozens of sub-configs (zero, fp16/bf16, optimizer, scheduler, comms, monitor, flops_profiler, autotuning, nebula, datastates, aio, tensor_parallel, data_efficiency, compile, ...). _configure_train_batch_size derives the missing batch parameter and _batch_assertion enforces the batch identity. Sub-configs extend DeepSpeedConfigModel (pydantic v2) with a deprecation mechanism (json_schema_extra={"deprecated": True, "new_param": ...}).
ZeRO (runtime/zero/): stage_1_and_2.py and stage3.py implement the partitioned optimizers; partition_parameters.py provides the zero.Init context and GatheredParameters; partitioned_param_coordinator.py manages prefetch/release with a trace cache; offload_config.py defines CPU/NVMe offload; mics.py implements MiCS hierarchical sharding; tiling.py provides tiled linear layers.
Communication (comm/): wraps torch.distributed collectives behind deepspeed.comm, with a config (DeepSpeedCommsConfig), MPI/CCL utilities, and an SDMA-based all-gather path (mori.py, gated by DS_SDMA_ALLGATHER).
Accelerator abstraction (accelerator/real_accelerator.py): get_accelerator() returns the active backend; DS_ACCELERATOR overrides auto-detection. Each backend implements device, memory, and communication-backend queries. This is what lets the same code target CUDA/ROCm/XPU/HPU/NPU/MLU/SDAA/CPU.
Op builders (op_builder/): each op declares NAME and BUILD_VAR (e.g. fused_adam/DS_BUILD_FUSED_ADAM); is_compatible() gates pre-build/JIT. all_ops.py enumerates them and installed_ops/compatible_ops are recorded at build time into git_version_info_installed.py.
Module reference (HIGH-priority modules)
| Module | Files / size | Highlights |
|---|---|---|
deepspeed/runtime |
20 files, ~523 KB | engine.py (the engine), config.py, constants.py, lr_schedules.py, bf16_optimizer.py, utils.py. |
deepspeed/runtime/zero |
18 files, ~597 KB | stage3.py, stage_1_and_2.py, partition_parameters.py, config.py, offload_config.py, mics.py. |
deepspeed/module_inject |
15 files, ~204 KB | Inference layer replacement / kernel injection containers. |
deepspeed/utils |
18 files, ~156 KB | logging.py, groups.py, numa.py, zero_to_fp32.py, tensor_fragment.py, z3_leaf_module.py. |
deepspeed/sequence |
9 files, ~148 KB | Ulysses sequence parallelism. |
deepspeed/compression |
8 files, ~109 KB | Quantization/pruning/layer reduction. |
deepspeed/compile |
16 files, ~104 KB | DeepCompile passes and custom ops. |
accelerator |
11 files, ~99 KB | Per-device accelerator backends. |
op_builder |
26 files, ~96 KB | Op build/JIT logic. |
deepspeed/autotuning |
6 files, ~96 KB | Autotuner and config templates. |
deepspeed/comm |
10 files, ~82 KB | Distributed comm wrappers. |
deepspeed/checkpoint |
10 files, ~74 KB | Universal checkpoint conversion. |
deepspeed/launcher |
6 files, ~65 KB | Runner + per-node launch + multi-node runners. |
csrc/includes |
30 files, ~231 KB | Shared CUDA/C++ headers. |
csrc/transformer |
~48 KB | Transformer training/inference kernels. |
Code patterns & conventions
- Pydantic-based config with strict validation and a custom deprecation path; prefer adding new keys as typed fields on the relevant
DeepSpeedConfigModelwith a docstring (the docstrings are the config docs). - Constants module — JSON key names and defaults live as
NAME/NAME_DEFAULTpairs inconstants.py;get_<thing>(param_dict)accessors centralize parsing. - Accelerator-agnostic — never call
torch.cuda.*directly in portable code; useget_accelerator(). A pre-commit hook (check-torchcuda.py) enforces this. - Comm wrapping — use
deepspeed.comm, nottorch.distributeddirectly (pre-commitcheck-torchdist.pyenforces this, with documented exceptions). - Formatting/linting — pre-commit runs
yapf,flake8,clang-format,codespell, license/header checks. Runpre-commit installbefore contributing.
Testing strategy
- pytest suites under
tests/unit/(the bulk), plustests/model/,tests/benchmarks/,tests/onebit/,tests/torch_compile/,tests/accelerator/,tests/lightning/,tests/hybrid_engine/. - Distributed tests use a fixed timeout (
DS_UNITTEST_TIMEOUT, default 600s) and pytest-xdist workers;DS_DISABLE_REUSE_DIST_ENVcontrols dist-env reuse. - CI definitions live under
ci/and.github/workflows/(e.g.ci/torch_latest.pyfor latest-torch runs via Modal).
Potential improvements (from source signals)
- Deprecation cleanup — several ZeRO keys (
cpu_offload*,legacy_stage1,stage3_gather_fp16_weights_on_model_save,elastic_checkpoint) remain for back-compat; a future major version could remove them. - Comm wrapper completeness —
.pre-commit-config.yamlexcludes specific files from thecheck-torchdisthook "until we wrap ProcessGroup in deepspeed.comm," indicating an in-progress migration. - Known open issues to track: ZeRO++ small-parameter
IndexError(#6659), DeepCompile hang on dynamic shapes (#7611), missing zero-guards causingZeroDivisionError/non-finite values (#7838), no public API to reassemble Adam moments from sharded checkpoints (#7961), and EvoformerAttention requiringCUTLASS_PATHinstead of auto-detecting (#8001).
Contributing
- Fork, clone,
pip install .[dev], andpre-commit install. - Follow the accelerator-agnostic and comm-wrapping conventions (hooks enforce them).
- Add config fields as typed pydantic fields with docstrings; add key/default constants in
constants.py. - Add tests under the appropriate
tests/suite; keep them accelerator-agnostic where possible. - License headers (
Apache-2.0, "DeepSpeed Team") are checked bycheck-license.py.
Note
The internal docs build (Sphinx
code-docs, readthedocs) is configured in.readthedocs.ymlanddocs/code-docs/source/conf.py, and the marketing site is a Jekyll project underdocs/. Config field docstrings are the canonical source for the published config reference.
9. Integration Points
| Integration | How it connects |
|---|---|
| PyTorch | Wraps torch.nn.Module + torch.optim.Optimizer; uses torch.distributed for collectives; honors torch.dtype. |
| Hugging Face Transformers / Accelerate | HF Trainer and Accelerate drive DeepSpeed via a config; DeepSpeedConfigModel non-strict mode strips "auto" values so HF can fill them. ZeRO-3 integrates with HF model init via zero.Init. |
| torch.distributed backends | NCCL (CUDA), Gloo, MPI, oneCCL (CCL_ROOT); the backend is chosen from the accelerator's communication_backend_name(). |
| Schedulers | PDSH, OpenMPI, MPICH, Intel MPI, MVAPICH, SLURM via --launcher. |
| Experiment tracking | TensorBoard, Weights & Biases, CSV, Comet via monitor_config. |
| Storage / checkpointing | Local FS, node-local storage, Nebula, DataStates; NVMe via async_io/GDS for offload. |
| Accelerators | CUDA, ROCm, Intel XPU, Habana HPU, Ascend NPU, Cambricon MLU, SDAA, Apple MPS, CPU — selected by get_accelerator() / DS_ACCELERATOR. |
| DeepSpeedExamples | Companion example repo (CIFAR, BERT, DeepSpeed-Chat) referenced by tutorials. |
Key environment variables (reference)
| Variable | Purpose |
|---|---|
DS_ACCELERATOR |
Force a specific accelerator backend. |
DS_BUILD_OPS |
Pre-build all compatible ops at install. |
DS_BUILD_<OP> |
Pre-build a single op (e.g. DS_BUILD_FUSED_ADAM). |
DS_ENABLE_NINJA |
Force ninja for builds. |
DS_NVCC_THREADS |
Parallelism for CUDA compilation. |
DS_SKIP_CUDA_CHECK / DS_IGNORE_CUDA_DETECTION |
Bypass CUDA version/detection checks. |
TORCH_CUDA_ARCH_LIST |
Target GPU architectures for builds. |
CUTLASS_PATH / DS_EVOFORMER_GPU_ARCH |
EvoFormer attention build. |
DEEPSPEED_TIMEOUT |
Default process-group timeout (minutes; default 30). |
DS_ENV_FILE |
Name of the per-node env file (default .deepspeed_env). |
DS_SDMA_ALLGATHER / DS_SDMA_ALLGATHER_MAX_NUMEL |
Enable/limit SDMA all-gather. |
LOCAL_RANK / RANK / WORLD_SIZE / CROSS_RANK / CROSS_SIZE / LOCAL_SIZE |
Distributed rank/size (set by the launcher). |
MASTER_ADDR / MASTER_PORT |
Rendezvous (default port 29500). |
CUDA_VISIBLE_DEVICES |
GPU selection (respected by the launcher). |
DISABLE_LOGS_WHILE_COMPILING |
Quiet logs during compilation. |
Important
The launcher sets
LOCAL_RANK,RANK,WORLD_SIZE,CROSS_RANK,CROSS_SIZE,LOCAL_SIZE,MASTER_ADDR, andMASTER_PORTfor each spawned process. Your training script should readLOCAL_RANK(or accept--local_rank) to place tensors on the correct device; suppress the injected--local_rankargument with--no_local_rankif your script doesn't expect it.