Сети и хранение данных

Хранение датасетов и checkpoint в AI-кластере: Как спроектировать СХД

~17 минут18 сентября 2026 г.

СХД для AI-кластера нельзя корректно рассчитать только по объёму датасета или паспортной скорости массива.

Dataset размером 100 ТБ может создавать совершенно разную нагрузку: последовательно читаться крупными shards, многократно перечитываться между эпохами, состоять из миллионов небольших файлов или значительной частью попадать в local cache.

Checkpoint создаёт уже другой I/O-профиль: большой burst записи от множества ranks. Restore — третий: чтение training state для возврата job к работе после interruption.

Поэтому storage sizing лучше строить по полной цепочке:

Главный вопрос не:

Сколько GB/s нужно AI-кластеру?

А:

Какие I/O-потоки создаёт реальный training workload, сколько данных каждый из них перемещает и за какое время операция должна завершиться?

Почему AI-кластер нельзя рассчитывать только по TB

1
Почему AI-кластер нельзя рассчитывать только по TB

Ёмкость и производительность — разные характеристики.

Два проекта могут иметь одинаковый dataset в 100 ТБ, но совершенно разные требования к storage.

В одном случае:

  • крупные sequential shards;

  • несколько параллельных readers;

  • высокая потребность в aggregate bandwidth.

В другом:

  • множество небольших files или objects;

  • частые open/read operations;

  • высокая concurrency;

  • заметная metadata/IOPS-нагрузка.

Поэтому первый шаг — не выбор дисков, RAID или протокола.

Сначала нужно описать Data Flow.

Сначала нарисуйте полный Data Flow

Упрощённо AI-training может выглядеть так:

Authoritative data source

↓

Shared storage

↓

Active working set

↓

RAM / local NVMe cache

↓

Training

↓

Checkpoint staging

↓

Persistent checkpoint tier

↓

Restore

↓

Training resumed

Для каждой стрелки полезно определить:

  • bytes;

  • operations;

  • concurrency;

  • frequency;

  • допустимое время;

  • может ли поток пересекаться с другими.

AI-training создаёт несколько разных storage workloads

Минимум нужно разделять следующие потоки.

Dataset ingest

Поступление или обновление данных из:

  • data lake;

  • object storage;

  • корпоративных систем;

  • внешних источников.

Здесь важны:

  • объём изменений;

  • peak ingest rate;

  • frequency обновлений.

Training dataset reads

Compute nodes получают данные для очередных batches.

Здесь важны:

  • aggregate read throughput;

  • количество readers;

  • file/object profile;

  • concurrency;

  • cache behaviour.

Cache fill

Первичное наполнение RAM или local NVMe данными рабочего набора.

Cold-cache traffic может сильно отличаться от последующих warm reads.

Checkpoint write

Training state периодически сохраняется — часто одновременно с большого числа ranks.

Это отдельный burst workload.

Restore

Checkpoint читается обратно после restart или другого recovery scenario.

Archive и retention

Исторические checkpoints, model artifacts и datasets могут перемещаться в другой storage tier с иными требованиями к performance.

Эти потоки нельзя описать одной средней скоростью СХД.

Dataset feed: главный вопрос — ждёт ли training данные

Для training важно не само паспортное значение GB/s, а способность data path стабильно выдавать batches с требуемой скоростью.

Практический критерий:

storage path не должен создавать неприемлемые stalls в representative training workload.

Но низкая GPU utilization ещё не доказывает проблему СХД.

Почему GPU idle не означает автоматически storage bottleneck

Между storage и accelerator находятся:

  • network;

  • client NIC;

  • host memory;

  • dataloader;

  • decompression;

  • tokenizer;

  • CPU preprocessing;

  • application queues.

Поэтому ситуацию:

GPU ждёт очередной batch

нужно разбирать end-to-end.

Total dataset и active working set — разные вещи

Допустим, полный dataset занимает 300 ТБ.

Из этого не следует, что рядом с compute нужно разместить 300 ТБ local NVMe.

Полезно разделять:

Total dataset

Полный набор данных проекта.

Active working set

Данные, реально используемые workload в рассматриваемом временном окне и потенциально пригодные для кэширования.

Именно working set помогает определить:

  • разумный объём local cache;

  • количество повторных чтений;

  • нагрузку на shared storage после прогрева cache.

Почему размер файлов важен не меньше общего GB/s

Условно можно выделить два профиля.

Large-file workload

Небольшое число крупных shards и много последовательного чтения.

Здесь storage чаще ограничен aggregate bandwidth.

Small-file workload

Большое число небольших files или objects.

Здесь существенными становятся:

  • metadata;

  • file opens;

  • IOPS;

  • request rate;

  • tail latency.

Поэтому высокий sequential throughput массива ещё не гарантирует хороший результат на dataset с миллионами небольших файлов.

Dataset format — часть workload identity

Для sizing полезно фиксировать:

  • формат;

  • compression;

  • sharding;

  • file/object count;

  • size distribution;

  • access pattern.

Даже один logical dataset после другого packing может создавать заметно другой I/O profile.

Local NVMe: cache или staging tier, а не автоматическая замена shared storage

Local NVMe рядом с compute может использоваться для:

  • dataset cache;

  • temporary staging;

  • local recovery state;

  • промежуточных artifacts.

Но роль local storage нужно описывать явно.

Authoritative tier

Хранит данные, которые должны пережить согласованный failure scenario.

Cache/staging tier

Ускоряет access, но данные могут быть rebuildable или replicated в другом месте.

Поэтому local NVMe нельзя автоматически прибавлять к durable capacity shared storage.

Cache hit rate нужно измерять, а не назначать

Нельзя заранее считать:

local cache даст 80% hits.

Результат зависит от:

  • размера working set;

  • cache capacity;

  • epochs;

  • shuffling;

  • параллельных jobs;

  • eviction policy.

Нужно сравнивать реальные cache states.

Cold-cache test

Нужные data blocks отсутствуют в рассматриваемом cache tier.

Warm-cache test

Relevant working set уже присутствует в этом tier.

При этом необходимо фиксировать, какие именно caches считаются cold или warm:

  • application cache;

  • OS page cache;

  • local NVMe;

  • client cache;

  • storage-controller cache.

Иначе результаты могут быть несопоставимы.

Как получить shared-storage read demand

Лучший input — реальные bytes на границе sizing-уемого storage tier.

Например:

Shared read rate = bytes, пришедшие с shared tier / observation window

Для первичной оценки иногда можно использовать:

Read rate ≈ Samples/s × Mean stored bytes/sample

Но только если явно известны assumptions.

Реальный traffic может отличаться из-за:

  • compression;

  • packing;

  • multiple samples/object;

  • caching;

  • readahead;

  • read amplification.

Поэтому measured I/O trace надёжнее арифметической оценки.

Aggregate throughput может скрывать медленный client

В multi-node cluster важна не только общая сумма GB/s.

Полезно смотреть:

  • aggregate throughput;

  • per-node throughput;

  • распределение между clients;

  • tail behaviour.

Ingest и training reads нужно считать раздельно

Обновление dataset может происходить одновременно с training.

Если ingest и training используют один storage tier или одну fabric, между ними появляется конкуренция.

Правильная последовательность benchmark:

isolated flows

→ application-like replay

→ representative concurrent mix.

При этом peak всех потоков не нужно складывать механически. Нужен реальный timeline их пересечения.

Checkpoint — отдельный burst workload

Checkpoint принципиально отличается от dataset feed.

Distributed training может одновременно сохранять state со множества ranks, создавая:

  • большой write burst;

  • много parallel writers;

  • множество shards/files;

  • metadata activity.

Поэтому хороший training-read benchmark ещё не означает хороший checkpoint result.

Что входит в checkpoint

Checkpoint не обязательно равен model weights.

В зависимости от конкретного stack в него могут входить:

  • model state;

  • optimizer state;

  • distributed shards;

  • metadata;

  • другие states, необходимые приложению для recovery.

Parameter count модели для этого недостаточно.

Почему один большой файл не заменяет checkpoint benchmark

Одни и те же 5 ТБ можно записать:

  • одним writer;

  • сотнями parallel writers;

  • тысячами shards.

Storage увидит совершенно разную concurrency и metadata workload.

Поэтому checkpoint profile должен включать:

  • total bytes;

  • writer count;

  • file/object count;

  • completion time.

First-order sizing checkpoint write

Для первичной оценки можно использовать:

Required write rate ≈ Checkpoint bytes / Persistence target

или:

Persistence time ≈ Checkpoint bytes / Effective write rate

Но это только first-order sizing.

Формула не учитывает:

  • metadata;

  • writer topology;

  • serialization;

  • tail writer;

  • client limitations;

  • commit semantics.

Финальный результат нужно измерять на реальном checkpoint path.

Средний write throughput может скрывать tail

Если checkpoint считается завершённым только после последнего required writer, один медленный rank способен определять полное wall-clock время операции.

Поэтому полезно хранить отдельно:

  • aggregate GB/s;

  • total completion time;

  • tail behaviour writers.

У checkpoint есть разные временные метрики

Как минимум нужно различать три события.

1. Blocking/staging time

Сколько checkpoint находится на critical path training.

2. Persistence completion

Когда данные полностью записаны в выбранный storage tier.

3. Usable recovery point

Когда checkpoint считается пригодным для восстановления в согласованном failure scenario.

Последние два события могут совпадать, но это нельзя предполагать автоматически.

Что значит durable checkpoint

Слово durable имеет смысл только вместе с failure domain.

Например, проект может требовать пережить:

  • restart процесса;

  • потерю compute node;

  • потерю local NVMe;

  • отказ storage component;

  • более широкий инфраструктурный сбой.

Поэтому событие вроде завершившегося локального write или fsync само по себе не является универсальным доказательством защиты от любого failure scenario.

Проект должен определить:

Async checkpoint: training resumed ещё не означает новый recovery point

При asynchronous checkpoint workflow может выглядеть так:

training

↓

checkpoint requested

↓

staging

↓

training resumed

↓

background persistence

↓

durability condition reached

↓

recovery point advanced

Это одна из важнейших границ storage sizing.

Возобновление GPU compute ещё не означает, что новый checkpoint уже пригоден для восстановления после требуемого failure scenario.

Async checkpoint не устраняет storage requirement

После staging background process всё ещё должен записать checkpoint.

Если persistent tier не успевает за generation rate, в зависимости от implementation это может проявиться как:

  • очередь;

  • ожидание следующего save;

  • дополнительное RAM pressure;

  • resource contention.

Поэтому async save уменьшает critical-path blocking, но не отменяет requirement к storage throughput.

Async checkpoint также использует host resources

Staging state в host memory может требовать значительного объёма RAM.

Background processing также способно потреблять CPU.

Поэтому checkpoint architecture влияет не только на СХД, но и на compute-node host sizing.

Как проверить, успевает ли storage за checkpoint generation

Для объёмной оценки:

Checkpoint bytes/hour = Checkpoint size × Checkpoints/hour

Это полезный average volume metric.

Но checkpoint генерируется bursts.

Следовательно, storage должен пройти две разные проверки:

Average sustainability

Background persistence не отстаёт систематически от generation rate.

Burst completion

Отдельный checkpoint укладывается в требуемое persistence window.

Нет универсального правила, что каждый save обязательно должен завершаться до следующего checkpoint. Поведение зависит от implementation.

Важно другое:

persistence pipeline не должен устойчиво накапливать backlog или resource pressure.

Local и shared checkpoints имеют разные failure domains

Local checkpoint может дать быстрый recovery в некоторых scenarios.

Shared или другой persistent tier может покрывать более широкий failure domain.

Но нельзя автоматически утверждать:

local storage ненадёжный, shared — надёжный.

Нужно явно определить, какие failures переживает каждый tier.

Полезная архитектурная модель:

Fast recovery tier

Оптимизирован под быстрый restart в ограниченном failure domain.

Broader durable tier

Сохраняет recovery point для более серьёзного сценария отказа.

Restore нужно benchmark отдельно

Система, которая быстро принимает checkpoints, не обязана столь же быстро читать их обратно.

Поэтому:

Checkpoint Write PASS ≠ Restore PASS.

Для restore нужно измерить:

  • checkpoint bytes;

  • reader topology;

  • storage read duration;

  • recovery topology.

First-order sizing restore

Для первичной оценки:

Required restore read rate ≈ Checkpoint read bytes / Storage load target

или:

Но storage load — только один этап полного recovery.

Storage load time не равно RTO

2
Storage load time не равно RTO

После interruption могут потребоваться:

  • replacement или allocation compute resources;

  • process startup;

  • checkpoint discovery;

  • storage read;

  • resharding;

  • state reconstruction;

  • dataloader initialization.

Поэтому:

RTO ≠ CheckpointBytes / ReadBandwidth.

Storage отвечает только за часть restart timeline.

Recovery topology тоже важна

Distributed checkpoint может загружаться не обязательно на ту же topology, на которой был создан.

Если при recovery меняется число ranks или layout, может потребоваться resharding и дополнительная работа.

Поэтому representative restore test должен воспроизводить реальный recovery scenario.

Что означает RPO для AI-training

RPO — Recovery Point Objective.

В контексте training удобно сформулировать его как:

сколько уже выполненного полезного training progress допустимо потерять после interruption.

Важно: RPO нельзя приравнять к расписанию checkpoint.

Если save запускается каждые десять минут, но новый usable checkpoint появляется позже, фактическая recovery point может отставать.

RPO нужно оценивать по последнему checkpoint, который действительно соответствует принятой recoverability/durability policy.

Что означает RTO

RTO — время, за которое workload должен восстановиться после interruption.

Для AI-training практический критерий:

через какое время система снова делает полезный training progress.

То есть не просто:

процессы снова запущены.

А:

training реально продолжился.

Checkpoint frequency — компромисс

Частые saves:

  • уменьшают потенциальную потерю progress;

  • увеличивают storage traffic и operational overhead.

Редкие:

  • уменьшают checkpoint workload;

  • увеличивают потенциальный lost work.

Поэтому универсального checkpoint interval не существует.

Он определяется совместно через:

  • workload;

  • save duration;

  • interruption assumptions;

  • RPO;

  • training economics.

POSIX или S3: сравнивайте workload и semantics

Нельзя универсально утверждать:

POSIX всегда быстрее S3.

или:

object storage лучше для AI.

Нужно сравнивать:

  • application compatibility;

  • access pattern;

  • object/file sizes;

  • concurrency;

  • required semantics;

  • throughput;

  • metadata/request behaviour.

Storage semantics тоже важны

Distributed applications зависят не только от скорости transfer.

Могут быть важны:

  • consistency;

  • shared namespace;

  • atomicity;

  • metadata behaviour;

  • commit semantics.

Поэтому synthetic bandwidth benchmark — полезный subsystem test, но он не заменяет application-like checkpoint replay.

Storage fabric — часть end-to-end path

Путь данных может выглядеть так:

media

→ storage controllers

→ fabric

→ compute-node NIC

→ host

→ dataloader

→ accelerator

Bottleneck может находиться на любом участке.

Поэтому паспортный bandwidth backend-массива нельзя приравнивать к production throughput compute nodes.

Почему benchmark нужно запускать с compute-side clients

Production-like test должен включать:

  • representative client count;

  • production protocol;

  • реальные NIC;

  • actual file/object profile;

  • production-like concurrency.

Хорошая последовательность:

synthetic subsystem qualification

→ application-like dataset/checkpoint replay

→ representative concurrent mix.

Synthetic benchmark полезен — просто он отвечает не на все вопросы.

Capacity budget тоже нужно разделять по ролям

Storage capacity проекта может включать:

  • authoritative datasets;

  • transformed copies;

  • checkpoints;

  • historical retained checkpoints;

  • model artifacts;

  • staging;

  • temporary copies;

  • projected growth.

Local cache считается отдельно.

Например:

8 compute nodes × 15 ТБ local NVMe

не означают автоматически:

120 ТБ durable capacity.

Physical и usable capacity — разные величины

Replication, erasure coding, snapshots и reserved space могут уменьшать объём, доступный workload.

Поэтому для sizing нужно запрашивать:

usable capacity после согласованной resilience policy.

Не достаточно сложить nominal capacity всех drives.

Checkpoint frequency и retention — разные параметры

Frequency

Как часто создаётся новый checkpoint.

Retention

Сколько versions сохраняется и как долго.

Первое в первую очередь влияет на write workload.

Второе — на capacity.

Их нужно учитывать независимо.

AI Storage I/O Budget

Перед выбором СХД полезно заполнить общую карту потоков.

Dataset

Параметр

Значение

Total dataset

Active working set

Format/compression

Files/objects

Size distribution

Readers

Shared-read rate

Files/objects per second

Cache

Параметр

Значение

Cache tier

RAM

Local NVMe/node

Cold-cache state

Warm-cache state

Measured hit/miss

Eviction behaviour

Rebuildable

Checkpoint

Параметр

Значение

Checkpoint size

Writers

Files/objects

Frequency

Blocking/staging target

Persistence target

Recovery-point condition

Failure domain

Retention

Restore

Параметр

Значение

Read bytes

Readers

Storage-load target

Recovery topology

Full restart target

RPO

RTO

Flow overlap

Flow

Может пересекаться с

Dataset reads

Ingest

Cache fill

Checkpoint write

Restore

Archive/export

Как провести qualification

1. Зафиксировать stack

Сохранить:

  • training framework;

  • dataset version;

  • file/object format;

  • dataloader;

  • checkpoint implementation;

  • cache policy.

2. Снять representative I/O trace

Нужны:

  • bytes;

  • operations;

  • timing;

  • concurrency;

  • file/object sizes.

3. Разделить flows

Отдельно:

  • ingest;

  • training reads;

  • cache fill;

  • checkpoint;

  • restore.

4. Определить authoritative tiers

Зафиксировать, где должны сохраняться:

  • datasets;

  • checkpoints;

  • model artifacts.

И какой failure domain должен переживать каждый tier.

5. Проверить cache states

Выполнить controlled tests с зафиксированным состоянием relevant cache tiers.

6. Проверить dataset reads

Измерить production-like:

  • throughput;

  • operations;

  • per-client behaviour.

7. Проверить metadata-heavy path

Если production dataset действительно содержит большое число небольших files/objects.

8. Измерить exact checkpoint

Сохранить:

  • bytes;

  • writers;

  • shards/files;

  • frequency.

9. Измерить blocking/staging

Не смешивать его с background persistence.

10. Определить recovery-point condition

Зафиксировать событие, после которого checkpoint считается пригодным для восстановления в выбранном failure scenario.

11. Измерить persistence completion

Проверить, что storage устойчиво обслуживает generation rate без нежелательного backlog.

12. Выполнить representative restore

В том числе с нужной recovery topology.

13. Отделить storage load от полного RTO

Проверить полный путь до useful training resumed.

14. Проверить compute-side path

С реальными clients, NIC, protocol и fabric.

15. Проверить concurrent workload mix

Только те потоки, которые действительно пересекаются в production.

16. Проверить capacity и retention

На usable, а не nominal capacity.

17. Проверить RPO/RTO

По полной recovery timeline и согласованному failure domain.

Когда storage действительно может быть bottleneck

3
Когда storage действительно может быть bottleneck

Симптом

Что проверить

GPU ждут batches

storage / network / preprocessing

Cold-cache run медленный, warm быстрее

cache / working set

После добавления compute throughput не вырос

aggregate data path

Sequential GB/s высокий, small files медленные

metadata / IOPS

Один client отстаёт

fabric / NIC / client tail

Checkpoint сильно блокирует training

staging / sync save

Blocking малый, persistence долгое

background storage path

Checkpoints начинают отставать

persistence capacity / implementation

Checkpoint неожиданно большой

optimizer / state composition

Средний write rate хороший, completion медленный

tail writer / metadata

Restore медленный

read path / recovery topology

Storage load быстрый, RTO плохой

non-storage recovery

Local recovery быстрый, но не покрывает нужный failure scenario

failure domain

Local NVMe переполняется

cache/staging lifecycle

Backend быстрый, clients медленные

fabric / protocol / NIC

Capacity заканчивается

retention / copies / resilience

Synthetic test хороший, production плохой

workload mismatch / concurrency

Что считать PASS

Dataset Feed PASS

Representative training pipeline не получает неприемлемых storage-induced stalls.

Metadata PASS

Система выдерживает реальный file/object profile при требуемой concurrency.

Cache PASS

Cache benefit подтверждён measurement, а роль cache не смешана с durability.

Checkpoint Blocking PASS

Critical-path staging/save укладывается в target.

Checkpoint Persistence PASS

Checkpoint достигает согласованного recovery-point condition в требуемое окно без устойчивого backlog.

Restore PASS

Storage-компонент recovery укладывается в target.

RPO/RTO PASS

Допустимая потеря training progress и полный recovery соответствуют требованиям проекта.

Capacity PASS

Usable capacity покрывает datasets, checkpoints, retention и рост.

Resilience PASS

Authoritative data и recovery points переживают согласованный failure domain.

Какие данные нужны для подбора СХД

Перед выбором storage platform полезно подготовить:

Блок

Данные

Dataset

size, format, files/objects, updates

Working set

active bytes, reuse

Training reads

nodes, readers, bytes/s, ops/s

Cache

tiers, state, measured hit/miss

Checkpoint

bytes, writers, files, frequency

Persistence

blocking, completion, failure domain

Restore

bytes, readers, storage duration

Recovery

topology, RPO/RTO

Fabric

protocol, NICs, client path

Flow overlap

concurrent workloads

Capacity

usable space, retention, growth

Resilience

required failure scenarios

После этого вопрос:

Какая СХД нужна AI-кластеру?

можно заменить технически проверяемым требованием:

Storage architecture должна обслуживать такой dataset-read profile, такой working-set/cache pattern, такой checkpoint write burst и persistence window, а restore path — такой recovery target и failure domain.

Главное

AI-storage нельзя рассчитывать одной цифрой:

TB

или:

GB/s.

Сначала нужно разделить I/O-потоки:

dataset reads → cache → checkpoint staging → persistence → restore.

Для dataset важны:

  • working set;

  • file/object profile;

  • concurrency;

  • фактический traffic нужного tier.

Для cache:

  • конкретное состояние cache tiers;

  • measured reuse;

  • failure domain.

Для checkpoint:

  • exact artifact size;

  • writer topology;

  • blocking/staging time;

  • persistence completion;

  • условие появления нового usable recovery point.

При async save особенно важно помнить:

training resumed ≠ recovery point ready.

Для restore:

storage load time ≠ полный RTO.

А паспортная скорость backend-массива не является production result: финальный qualification проходит через compute-side clients на representative I/O mix и с реальным пересечением потоков.

Именно поэтому проектирование СХД для AI-кластера начинается не с RAID, протокола или накопителя, а с полного Data Flow и AI Storage I/O Budget.