Модель LLaMA-2 70B не помещается в память A100 80GB при использовании DDP. FSDP решает эту проблему, шардируя параметры, градиенты и оптимизатор между GPU. Мы настраиваем FSDP под ключ — нативную реализацию fully sharded data parallelism в PyTorch, которая экономит до 70% памяти без потери скорости. Сертифицированные инженеры с многолетним опытом в distributed training. За время работы мы выполнили более 50 проектов для моделей от 1B до 70B параметров. Наши клиенты экономят до 40% бюджета на облачные GPU за счет оптимальной конфигурации.
PyTorch FSDP documentation
Почему FSDP выгоднее DeepSpeed?
FSDP — часть PyTorch core и не требует внешних зависимостей. В отличие от DeepSpeed ZeRO-3, интеграция с Hugging Face Transformers и Accelerate происходит через нативные API. Мы используем FSDP в каждом втором проекте по fine-tuning больших моделей — от LLaMA до Mistral. PyTorch FSDP documentation
Как работает FSDP?
Принцип работы
При forward pass: параметры каждого sharded layer собираются (all-gather) со всех GPU перед вычислением. После forward — немедленно освобождаются, если включён reshard_after_forward. При backward pass: параметры снова собираются, градиенты вычисляются, затем reduce-scatter распределяет шарды градиентов по GPU. Это устраняет ситуацию, когда каждый GPU хранит полную копию модели, как в обычном DDP.
Базовая настройка
import torch
import torch.distributed as dist
from torch.distributed.fsdp import FullyShardedDataParallel as FSDP
from torch.distributed.fsdp.fully_sharded_data_parallel import (
CPUOffload,
BackwardPrefetch,
)
from torch.distributed.fsdp.wrap import (
size_based_auto_wrap_policy,
enable_wrap,
wrap,
)
import functools
def setup_fsdp(rank, world_size):
dist.init_process_group("nccl", rank=rank, world_size=world_size)
torch.cuda.set_device(rank)
def wrap_model_with_fsdp(model, rank):
auto_wrap_policy = functools.partial(
size_based_auto_wrap_policy,
min_num_params=100_000_000
)
model = FSDP(
model,
auto_wrap_policy=auto_wrap_policy,
cpu_offload=CPUOffload(offload_params=False),
backward_prefetch=BackwardPrefetch.BACKWARD_PRE,
device_id=torch.cuda.current_device(),
sharding_strategy=ShardingStrategy.FULL_SHARD,
mixed_precision=MixedPrecision(
param_dtype=torch.bfloat16,
reduce_dtype=torch.float32,
buffer_dtype=torch.bfloat16,
),
)
return model
Как выбрать стратегию шардирования?
from torch.distributed.fsdp import ShardingStrategy
# FULL_SHARD — полное шардирование (аналог ZeRO-3)
strategy = ShardingStrategy.FULL_SHARD
# SHARD_GRAD_OP — шардирование только градиентов и оптимизатора (ZeRO-2)
strategy = ShardingStrategy.SHARD_GRAD_OP
# NO_SHARD — обычный DDP
strategy = ShardingStrategy.NO_SHARD
# HYBRID_SHARD — FULL_SHARD внутри узла, репликация между узлами
strategy = ShardingStrategy.HYBRID_SHARD
Выбор стратегии зависит от размера модели, количества GPU и скорости межсоединений. Для 8 GPU с NVLink оптимален FULL_SHARD, для multi-node — HYBRID_SHARD.
Стратегии шардирования: сравнение памяти и скорости
| Стратегия |
Экономия памяти |
Коммуникационный overhead |
Типичный сценарий |
| FULL_SHARD |
До 75% |
Высокий |
Одна нода с быстрым межсоединением |
| SHARD_GRAD_OP |
До 50% |
Средний |
Модели среднего размера |
| HYBRID_SHARD |
~60% |
Низкий |
Multi-node кластеры |
| NO_SHARD |
0% |
Низкий |
Базовая DDP |
Как настроить FSDP: пошаговая инструкция
-
Определите топологию кластера: количество GPU, узлов, тип межсоединения (NVLink, InfiniBand).
- Выберите стратегию шардирования: FULL_SHARD для одного узла с NVLink, HYBRID_SHARD для multi-node.
- Настройте mixed precision: используйте bfloat16 для параметров, float32 для reductions.
- Переопределите wrap policy: для трансформеров используйте
transformer_auto_wrap_policy с указанием класса слоя.
- Оптимизируйте checkpointing: включите offload_to_cpu при сохранении full state dict.
- Профилируйте производительность: измерьте throughput, GPU utilization и latency p99.
Когда использовать HYBRID_SHARD?
HYBRID_SHARD сочетает FULL_SHARD внутри ноды и репликацию между нодами. Это снижает межнодовый трафик, что критично при медленных межсоединениях (Ethernet). Подходит для кластеров из 2+ узлов с InfiniBand или RoCE.
Практические аспекты настройки
Wrap policy для трансформеров
Для трансформеров важно оборачивать каждый Transformer block отдельно:
from torch.distributed.fsdp.wrap import transformer_auto_wrap_policy
from transformers.models.llama.modeling_llama import LlamaDecoderLayer
llama_auto_wrap_policy = functools.partial(
transformer_auto_wrap_policy,
transformer_layer_cls={LlamaDecoderLayer},
)
model = FSDP(model, auto_wrap_policy=llama_auto_wrap_policy)
Сохранение и загрузка checkpoint
from torch.distributed.fsdp import FullStateDictConfig, StateDictType
save_policy = FullStateDictConfig(offload_to_cpu=True, rank0_only=True)
with FSDP.state_dict_type(model, StateDictType.FULL_STATE_DICT, save_policy):
cpu_state = model.state_dict()
if rank == 0:
torch.save(cpu_state, "checkpoint.pt")
if rank == 0:
state_dict = torch.load("checkpoint.pt")
else:
state_dict = {}
with FSDP.state_dict_type(model, StateDictType.FULL_STATE_DICT, save_policy):
model.load_state_dict(state_dict)
Интеграция с Hugging Face Accelerate
from accelerate import Accelerator
from accelerate.utils import FullyShardedDataParallelPlugin
from torch.distributed.fsdp.fully_sharded_data_parallel import FullOptimStateDictConfig, FullStateDictConfig
fsdp_plugin = FullyShardedDataParallelPlugin(
state_dict_config=FullStateDictConfig(offload_to_cpu=True, rank0_only=False),
optim_state_dict_config=FullOptimStateDictConfig(offload_to_cpu=True, rank0_only=False),
)
accelerator = Accelerator(fsdp_plugin=fsdp_plugin)
Как мы настроили FSDP для LLaMA-70B
В одном из проектов нам потребовалось дообучить LLaMA-2 70B на 8x A100 80GB. Исходно модель не влезала даже с DeepSpeed ZeRO-3. Мы выбрали FSDP с FULL_SHARD и гибридной точностью bfloat16, настроили transformer_auto_wrap_policy и backward prefetch. В результате throughput составил 850 tokens/s при batch size 4 на GPU. Экономия памяти — 68% по сравнению с DDP. Кроме того, мы сократили время на каждый epoch на 30% за счёт оптимизации коммуникации. Клиент сэкономил более 35% затрат на аренду GPU.
Что входит в настройку FSDP
- Аудит модели и конфигурации GPU
- Выбор оптимальной стратегии шардирования и mixed precision
- Настройка wrap policy под архитектуру (трансформеры, CNN, GNN)
- Интеграция с Accelerate и Hugging Face Trainer
- Оптимизация checkpointing и загрузки
- Профилирование производительности (throughput, memory, GPU utilization)
- Документация и обучение вашей команды
- Поддержка после деплоя
Типичные ошибки при настройке FSDP
- OOM при сохранении checkpoint: используйте FullStateDictConfig с offload_to_cpu=True.
- Медленная инициализация: попробуйте HYBRID_SHARD для multi-node.
- Несовместимость с некоторыми слоями: проверьте auto_wrap_policy на все подмодули.
Сроки настройки — от 5 до 10 рабочих дней. Стоимость рассчитывается индивидуально после бесплатной консультации. Свяжитесь с нами, чтобы обсудить задачу. Закажите настройку FSDP под ключ — получите консультацию сертифицированного инженера.
MLOps: инфраструктура для обучения, деплоя и мониторинга ML-моделей
Модель обучена, метрики — F1 0.94 на валидации. Через три месяца в продакшене качество падает на 12%. Никто не знает, когда именно — нет мониторинга. Нельзя быстро переобучить — обучающий скрипт лежит в Jupyter-ноутбуке у data scientist’а, который уже уволился. Данные для ретрейна собирают руками из трёх разрозненных систем. Примерно половина проектов приходят к нам с этой болью. Мы строим MLOps платформу под ключ: от трекинга экспериментов до автоматического деплоя и мониторинга дрейфа данных. Оценим вашу инфраструктуру за 1–2 недели, а через 4–6 недель вы получите базовое ядро MLOps, работающее в продуктивном контуре. Наша команда — 10+ лет опыта в ML-инфраструктуре, более 50 внедрений.
Experiment tracking и воспроизводимость
Без трекинга ML-проект превращается в хаос: непонятно, какой чекпоинт лучше, какие гиперпараметры использовались, какой датасет. Воспроизвести результат через месяц — квест.
MLflow — open source стандарт для трекинга. Логирует параметры, метрики, артефакты (модели, графики) и код. MLflow Model Registry — централизованное хранилище моделей с версионированием и lifecycle stages (Staging → Production → Archived). Деплой через MLflow Serving или интеграция с внешними системами.
Типичная инициализация в коде:
import mlflow
mlflow.set_experiment("fraud-detection-v2")
with mlflow.start_run():
mlflow.log_params({"learning_rate": 3e-4, "batch_size": 64, "epochs": 10})
mlflow.log_metric("val_f1", val_f1, step=epoch)
mlflow.pytorch.log_model(model, "model")
Это минимум. В production добавляем логирование системных метрик (GPU utilization, memory), датасета (hash, версия), кода (git commit hash). Weights & Biases — более богатый UI, collaboration features, sweep для hyperparameter optimization. MLflow — для on-premise deployment без внешних зависимостей.
DVC (Data Version Control) — версионирование данных и моделей поверх git. Данные хранятся в S3/GCS/Azure Blob, в git — только метаданные (хэши). dvc repro воспроизводит весь пайплайн от сырых данных до метрик.
Как обеспечить воспроизводимость обучения? Фиксируйте random seeds (torch.manual_seed, numpy.random.seed, random.seed) и записывайте их в метаданные эксперимента. Без этого дебаггинг нерегулярных результатов — боль. Логируйте версию датасета (DVC hash) и git commit — тогда любой эксперимент можно повторить с точностью до байта.
Оркестрация пайплайнов: Kubeflow, Airflow, Prefect
Когда нужен оркестратор пайплайнов? Скрипт обучения на 100 строк в cron — нормально для простых задач. Но как только появляется multi-step пайплайн (загрузка данных → preprocessing → feature engineering → обучение → валидация → деплой если качество выше порога), нужен оркестратор с retry-логикой, визуализацией, алертами.
Kubeflow — Kubernetes-native оркестратор для ML (см. Wikipedia). Каждый шаг — Docker-контейнер. Поддерживает параллельные шаги, условные ветки, артефакты между шагами. Интегрируется с Katib (AutoML), KServe (serving), Feast (feature store).
Apache Airflow — более общий DAG-оркестратор. Широкая экосистема операторов (S3, Spark, DBT, Kubernetes). Проще развернуть, если уже есть Airflow в компании.
Prefect / Metaflow — меньше boilerplate. Prefect 2.x с декораторами @flow и @task — быстрый старт для небольших команд.
Типичная архитектура обучающего пайплайна на Kubeflow:
- Data ingestion component — забирает данные из S3/БД, валидирует схему через Great Expectations
- Preprocessing component — трансформации, normalization, train/val/test split
- Training component — обучение на GPU, логирование в MLflow
- Evaluation component — вычисление метрик, сравнение с baseline в Model Registry
- Conditional deployment — деплой только если новая модель лучше текущей на >2% F1
Каждый component — отдельный Docker-образ. Пайплайн версионируется в git. Запуск по расписанию (ретрейнинг раз в неделю на новых данных) или вручную.
Model Registry и управление жизненным циклом
Model Registry — не просто хранилище чекпоинтов. Это централизованная система, которая знает:
- Какая модель сейчас в продакшене (и с какими метриками)
- История всех версий с параметрами обучения
- Метаданные: датасет, git commit, результаты валидации
- Lifecycle stage: None → Staging → Production → Archived
MLflow Model Registry — стандарт. Для enterprise — Vertex AI Model Registry (GCP), SageMaker Model Registry (AWS), Azure ML Model Registry.
Продвижение модели через стейджи: автоматически переводим модель в Staging после успешного прохождения eval, затем ручное или автоматическое (при A/B тесте) продвижение в Production. Rollback — переключение на предыдущую Production-версию за секунды.
Serving: от FastAPI до Triton Inference Server
Простой случай. FastAPI + PyTorch/ONNX на одном сервере — 80% production ML deployments именно так. Достаточно для большинства задач с нагрузкой до 100 req/s.
from fastapi import FastAPI
import onnxruntime as ort
app = FastAPI()
session = ort.InferenceSession("model.onnx", providers=["CUDAExecutionProvider"])
@app.post("/predict")
async def predict(request: PredictRequest):
inputs = preprocess(request.text)
outputs = session.run(None, {"input_ids": inputs})
return {"label": postprocess(outputs)}
Triton Inference Server — production-стандарт для высоких нагрузок (500+ req/s). Dynamic batching, concurrent model execution, model ensemble. Поддерживает TensorRT, ONNX, PyTorch TorchScript, TensorFlow SavedModel.
KServe — Kubernetes-native ML serving с autoscaling, canary deployments, A/B testing из коробки. Scale-to-zero для неактивных моделей — экономия на инфраструктуре до 40% (более 1.2 млн рублей в год для проекта с 10 моделями).
Мониторинг: data drift, model drift, инфраструктурные метрики
Мониторинг — то, что обычно делают в последнюю очередь и о чём жалеют в первую. Три уровня.
Инфраструктурный мониторинг. Latency (P50/P95/P99), throughput (req/s), error rate (4xx, 5xx), GPU/CPU utilization. Prometheus + Grafana — стандарт. Алерт при P99 latency > threshold или error rate > 1%.
Data drift мониторинг. Распределение входных данных меняется со временем. Детектируем через PSI (Population Stability Index) для числовых признаков: PSI > 0.2 — сильный дрейф. Chi-squared test для категориальных, Kolmogorov-Smirnov test для непрерывных. Evidently AI — open source библиотека с готовыми дрейф-тестами.
Model drift мониторинг. Если есть ground truth с задержкой (например, через неделю знаем конверсию) — мониторим реальные метрики. Если нет — surrogate метрики: распределение prediction scores, доля confident predictions.
Alerting. Три уровня: INFO (небольшой дрейф, логируем), WARNING (значимый, уведомляем команду), CRITICAL (качество упало ниже порога — автоматическое переключение на fallback-модель).
Почему важен мониторинг дрейфа данных? Без него вы узнаёте о деградации модели только по жалобам пользователей или звенящему SLA. Алерт о дрейфе позволяет переобучить модель заранее, до того как ошибки начнут приносить убытки. В одном из наших проектов мониторинг PSI выявил дрейф через 2 дня после изменения источника данных — это спасло кампанию с бюджетами на 2 млн рублей.
| Типичная ошибка |
Последствия |
Решение |
| Отсутствие версионирования данных |
Невоспроизводимость экспериментов |
Внедрить DVC или аналоги |
| Ручной деплой моделей |
Ошибки человеческого фактора, долгий rollback |
Автоматизировать CI/CD пайплайн |
| Мониторинг только по бизнес-метрикам |
Позднее обнаружение дрейфа |
Добавить data drift мониторинг (PSI, KS) |
Feature Store
Feature Store решает проблему training-serving skew. Если preprocessing во время обучения и инференса реализован в двух разных местах — расхождение неизбежно.
Когда нужен Feature Store?
- Несколько моделей используют одни и те же признаки
- Признаки вычисляются из потоковых данных (real-time)
- Большая команда с разными людьми на feature engineering и model training
Feast — open source Feature Store. Офлайн store (S3 + Parquet) для обучения, онлайн store (Redis, DynamoDB) для low-latency инференса. Feature definitions как код, materialization job синхронизирует офлайн → онлайн.
Tecton (коммерческий), Vertex AI Feature Store (GCP), SageMaker Feature Store (AWS) — managed варианты с меньшим ops overhead.
CI/CD для ML
ML CI/CD — обычный CI/CD плюс специфичные ML-шаги.
ML-специфичные checks в CI:
- Проверка воспроизводимости: запустить обучение с фиксированным seed, результат должен совпадать
- Data validation: Great Expectations или Pandera на schema/distribution checks
- Model performance check: автоматический eval на holdout, блокировать merge если деградация > порога
- Latency regression test: inference должен укладываться в SLA
GitOps для деплоя. Merge в main → CI запускает обучение → eval → если проходит → автоматический деплой в Staging → smoke tests → ручное продвижение в Production или автоматическое при успешном canary.
Инструменты: GitHub Actions / GitLab CI для CI, ArgoCD для GitOps-деплоя на Kubernetes.
Что входит в разработку MLOps-платформы
Мы предоставляем полный цикл работ, документацию и обучение команды.
| Этап |
Длительность |
Результат |
| Аудит текущей инфраструктуры и data pipeline |
1–2 недели |
Roadmap с рисками и приоритетами |
| Развёртывание ядра: MLflow, оркестратор, serving |
4–6 недель |
Работающий пайплайн обучения и деплоя |
| Feature Store и CI/CD для ML |
2–3 месяца |
Feature Store, автоматические retrain и деплой |
| Мониторинг дрейфа и алертинг |
3–4 недели |
Дашборды, алерты, playbook по инцидентам |
| Обучение команды и документация |
1–2 недели |
Runbook, политики, обучение для data scientists |
Итоговый срок от аудита до полноценной MLOps-платформы: 3–5 месяцев. Также возможен поэтапный запуск: базовый уровень (трекинг + serving) за 4–6 недель.
Стоимость рассчитывается индивидуально под объём данных, количество моделей и требования к инфраструктуре. Закажите аудит MLOps-инфраструктуры — получите roadmap за 1–2 недели. Свяжитесь с нами для оценки вашего проекта — мы пришлём предварительный расчёт за 2 рабочих дня.
Обратите внимание: гарантия на архитектурные решения — 12 месяцев. Предоставляем сертификаты интеграции с основными облачными провайдерами (AWS, GCP, Azure). За время работы мы не потеряли ни одного клиента после первого внедрения — опыт 50+ успешных MLOps-проектов говорит сам за себя. Получите консультацию по построению MLOps платформы уже сегодня.