Настройка DeepSpeed для распределённого обучения LLM
DeepSpeed — библиотека от Microsoft для эффективного обучения больших языковых моделей. Её ключевые возможности: технология ZeRO (Zero Redundancy Optimizer), которая устраняет избыточность при хранении состояния оптимизатора и параметров модели между GPU, а также поддержка mixed precision, gradient checkpointing и pipeline parallelism.
ZeRO: ключевая инновация DeepSpeed
ZeRO Stage 1 — шардирование состояния оптимизатора (Adam states) между GPU. На 8 GPU: потребление памяти оптимизатором снижается в 8 раз.
ZeRO Stage 2 — добавляется шардирование градиентов. Суммарное снижение памяти: ~8x для состояния оптимизатора + ~8x для градиентов.
ZeRO Stage 3 — полное шардирование: параметры, градиенты, состояние оптимизатора. Позволяет обучать модели, которые в сумме не помещаются даже на все GPU кластера. При этом параметры gather и scatter при каждом forward/backward pass — overhead на коммуникацию выше, чем Stage 2.
ZeRO-Infinity — offloading параметров на CPU RAM и NVMe SSD. Позволяет обучать модели с триллионами параметров на ограниченном количестве GPU за счёт пропускной способности PCIe/NVMe.
Конфигурация DeepSpeed
{
"zero_optimization": {
"stage": 2,
"allgather_partitions": true,
"allgather_bucket_size": 2e8,
"overlap_comm": true,
"reduce_scatter": true,
"reduce_bucket_size": 2e8,
"contiguous_gradients": true
},
"fp16": {
"enabled": true,
"loss_scale": 0,
"loss_scale_window": 1000,
"initial_scale_power": 16,
"hysteresis": 2,
"min_loss_scale": 1
},
"bf16": {
"enabled": false // или true для A100/H100
},
"gradient_accumulation_steps": 4,
"gradient_clipping": 1.0,
"train_batch_size": "auto",
"train_micro_batch_size_per_gpu": 4,
"wall_clock_breakdown": false
}
Интеграция с Hugging Face Transformers
from transformers import TrainingArguments, Trainer
training_args = TrainingArguments(
output_dir="./results",
deepspeed="ds_config_zero2.json",
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
fp16=True,
num_train_epochs=3,
logging_steps=100,
save_steps=1000,
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
tokenizer=tokenizer,
)
trainer.train()
Запуск:
deepspeed --num_gpus=8 train.py --deepspeed ds_config.json
# Или через torchrun:
torchrun --nproc_per_node=8 train.py --deepspeed ds_config.json
ZeRO Stage 3: обучение очень больших моделей
Для моделей 30B+ параметров на ограниченном кластере:
{
"zero_optimization": {
"stage": 3,
"offload_optimizer": {
"device": "cpu",
"pin_memory": true
},
"offload_param": {
"device": "cpu",
"pin_memory": true
},
"overlap_comm": true,
"contiguous_gradients": true,
"sub_group_size": 1e9,
"reduce_bucket_size": "auto",
"stage3_prefetch_bucket_size": "auto",
"stage3_param_persistence_threshold": "auto",
"stage3_max_live_parameters": 1e9,
"stage3_max_reuse_distance": 1e9,
"stage3_gather_16bit_weights_on_model_save": true
}
}
Оценка конфигурации
DeepSpeed предоставляет инструмент оценки необходимой памяти:
from deepspeed.runtime.zero.stage3 import estimate_zero3_model_states_mem_needs_all_live
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-13b-hf")
estimate_zero3_model_states_mem_needs_all_live(
model,
num_gpus_per_node=8,
num_nodes=1
)
# Выводит оценку RAM и GPU памяти для разных конфигураций
Практические показатели
| Конфигурация | Модель | Кластер | Throughput |
|---|---|---|---|
| ZeRO-2, BF16 | LLaMA 7B | 8x A100 80GB | ~7000 tokens/s |
| ZeRO-2, BF16 | LLaMA 13B | 8x A100 80GB | ~3500 tokens/s |
| ZeRO-3, BF16 | LLaMA 30B | 8x A100 80GB | ~1200 tokens/s |
| ZeRO-3 + Offload | LLaMA 65B | 8x A100 80GB + 512GB RAM | ~400 tokens/s |
DeepSpeed в сочетании с gradient checkpointing и activation recomputation позволяет обучать модели в 3-5x большего размера на том же железе по сравнению с наивной DDP реализацией.







