Данные и хранение на GPU: чекпоинты, кэш и пайплайны

Задача страницы. Помочь выстроить поток данных под GPU‑задачи: где хранить датасеты и чекпоинты, как быстро переносить большие объёмы, чем кэшировать, как избежать простоя GPU из‑за I/O и не потерять прогресс при прерывании инстанса.

Принципы, которые экономят часы и деньги

  • Локальность и «горячие» данные. Датасеты и модели, которые активно читаются, держите на локальном NVMe (внутри инстанса). Всё остальное — в объектном хранилище.
  • Мало крупных файлов лучше, чем много мелких. Пакуйте датасеты в tar‑шарды/партиции; тысячам мелких файлов всегда проигрывать по IOPS.
  • Потоковый конвейер вместо «ждать пока скачается всё». Стриминг и префетч позволяют считать уже первые батчи, пока хвост догружается.
  • Идемпотентность и автосейвы. Любой шаг должен безопасно перезапускаться; чекпоинты и артефакты — с версионированием и атомарной записью.
  • Отделяйте вычисления от хранения. Инстанс можно удалить, данные — нет; чекпоинты и артефакты дублируйте в долговременное хранилище.

Быстрый выбор стратегии (по размеру и типу задачи)

  • До ~50 ГБ (прототип, инференс): копируйте прямо на NVMe инстанса; кэш моделей/эмбеддингов тоже туда.

  • 50–500 ГБ (тренировка, CV): храните в объектном хранилище, при старте — быстрая синхронизация «горячих» шардов на NVMe + фоновая докачка.

  • 500 ГБ–10 ТБ (LLM, видео): храните в объектном хранилище; используйте тар‑шарды/WebDataset, стриминг и агрессивный префетч; чекпоинты — сразу в удалённое хранилище.

  • Multi‑node: на каждый узел — локальный кэш под свой shard‑диапазон; не тяните одни и те же файлы по сети на все узлы одновременно. Чекпоинты: никакой потери прогресса Как часто?

  • Обучение: по времени (например, каждые 15–30 мин.) и по шагам/эпохам.

  • Инференс/батчи: по чанкам (N образцов/клипов/документов).

Структура и атомарность:

  • Пишите во временный файл и атомарно переименовывайте в целевое имя: checkpoint.tmp → checkpoint.pt.
  • Держите ротацию: …/ckpt-000100, …/ckpt-000200 и latest как симлинк/манифест.
  • Сразу после записи — дублирование в удалённое хранилище (объектное/S3‑совместимое).

Пример (PyTorch, атомарная запись + дублирование)

import os, json, torch, fsspec, tempfile
def atomic_save(obj, path_local):
 d = os.path.dirname(path_local); os.makedirs(d, exist_ok=True)
 with tempfile.NamedTemporaryFile(dir=d, delete=False) as t:
 torch.save(obj, t.name)
 tmp = t.name
 os.replace(tmp, path_local) # атомарно
def save_and_upload(state, local_path, remote_url):
 atomic_save(state, local_path)
 with fsspec.open(local_path, "rb") as fsrc, fsspec.open(remote_url, "wb") as fdst:
 fdst.write(fsrc.read())
# пример: save_and_upload(state, "/data/ckpts/ckpt-000200.pt", "s3://bucket/exp1/ckpt-000200.pt")

Перенос и подготовка датасетов

Быстрый параллельный HTTP/HTTPS:

# urls.txt — список прямых ссылок; aria2 параллелит загрузку
aria2c -i urls.txt -x16 -s16 -j8 -d /data/datasets

Объектное хранилище / S3‑совместимое (пример rclone):

# копируем с высокой параллельностью, проверками и резюме
rclone copy s3:mybucket/path /data/datasets/path 
 --transfers=32 --checkers=64 --fast-list --copy-links --progress

Синхронизация из другого сервера (rsync):

rsync -ah --info=progress2 --partial --inplace --chmod=ugo=r 
 --exclude='*.tmp' source:/datasets/imagenet/ /data/datasets/imagenet/

Архивы и тар‑шарды:

  • Разбивайте датасет на шарды по 512 МБ–2 ГБ в формате tar (или parquet‑партиции) — это резко снижает накладные расходы при чтении.
  • Для картинок/видео используйте WebDataset (tar‑шарды + индекс).

Синхронизация из другого сервера (rsync):

import webdataset as wds
dataset = (wds.WebDataset("/data/datasets/myset/{000000..000255}.tar")
 .decode("pil")
 .to_tuple("jpg;png", "json"))
loader = wds.WebLoader(dataset, batch_size=64, num_workers=8)
``` Кэширование: модели, датасеты, артефакты

**Стандартизируйте пути к кэшу** (переопределите их на NVMe инстанса):

export HF_HOME=/data/.cache/hf export TRANSFORMERS_CACHE=$HF_HOME/transformers export HF_DATASETS_CACHE=$HF_HOME/datasets export TORCH_HOME=/data/.cache/torch mkdir -p $TRANSFORMERS_CACHE $HF_DATASETS_CACHE $TORCH_HOME


**Предпрогрев (pre‑warm):**

- На этапе «подготовки» один раз скачайте веса/токенайзеры/вспомогательные артефакты в кэш, затем снимайте образ/шаблон или закрепляйте диск.
- Для инференс‑сервисов держите отдельный **слой кэша** (например, общий том), чтобы деплои не перекачивали веса заново.

 [ Начните сейчас ](https://app.cloudcompute.ru/)Дата‑пайплайны для обучения/инференса

**Обучение:**

- **Префетч и pinned memory** в DataLoader.
- **Аугментации на GPU**, где уместно, чтобы CPU не стал бутылочным горлышком.
- **Шардирование по эпохам** — распределяйте список шардов между воркерами/узлами, чтобы избежать «драки» за одинаковые файлы.

**Инференс/батчи:**

- Читайте из источника чанками (N документов/клипов), сохраняйте **промежуточные результаты** каждые M чанков.
- Параллельно выгружайте результаты в хранилище; не накапливайте гигабайты в /tmp.

**Видеопотоки/рендер:**

- Храните исходники на объектном хранилище; формируйте **рабочие очереди** ссылок и вытягивайте в локальный кэш непосредственно перед обработкой.
- Используйте **NVENC/AV1** профили и фиксированные пресеты (см. раздел рендеринга).

Multi‑node и распределённый I/O

- **Своя доля для каждого узла.** Раздавайте каждому узлу **собственный набор шардов**; избегайте общей сетевой директории с «горячими» чтениями.
- **Локальный кэш → чистка по LRU.** Ограничьте размер кэша; вычищайте неиспользуемые шарды по LRU, чтобы NVMe не забивался.
- **Параллельные менеджеры загрузки.** Разделите пул «скачивателей» и «читателей», чтобы обучение не ждало сеть/диск.

Безопасность и управление доступом

- **Секреты только через переменные окружения/секрет‑менеджер.** Не коммитьте токены в репозиторий; ограничьте объём выведенных логов.
- **Шифруйте архивы и чувствительные артефакты.** При необходимости — шифрование на стороне клиента перед загрузкой в объектное хранилище.
- **Маскируйте пути/имена** в публичных артефактах; для датасетов с PII используйте анонимизацию/псевдонимизацию.

Стоимость и жизненный цикл данных

- **Хранение тарифицируется даже у остановленных инстансов.** Планируйте объёмы дисков и своевременную чистку.
- **Стейджинг‑диск ≠ архив.** После завершения — выгрузка артефактов в долговременное хранилище, удаление инстанса/тома.
- **Сжимайте и дедуплицируйте.** Zstd для больших логов/JSON; избегайте gzip для потокового чтения (zstd быстрее и эффективнее).

Траблшутинг

- **GPU простаивает (<70%):** проверьте num\_workers, pin\_memory, префетч, скорость диска/сети, наличие шардов локально.
- **OOM на диске:** включите LRU‑чистку кэша и ротацию временных файлов; не держите несколько копий одного и того же датасета.
- **Повреждённые файлы:** проверяйте контрольные суммы; включите повторные попытки/резервные зеркала в загрузчиках.
- **Прерываемые инстансы:** проверяйте, что чекпоинт пишется «часто и атомарно», и немедленно выгружается наружу.

Полезные сниппеты

**PyTorch DataLoader (параметры I/O):**

loader = DataLoader(dataset, batch_size=64, shuffle=True, num_workers=8, pin_memory=True, persistent_workers=True, prefetch_factor=4)


**Загрузка из объектного хранилища по списку ключей:**

import fsspec fs = fsspec.filesystem("s3", anon=False) for key in keys: with fs.open(f"s3://bucket/{key}", "rb") as fsrc, open(f"/data/{key}", "wb") as fdst: fdst.write(fsrc.read())


Навигация по смежным страницам

[**Оптимизация производительности:**](/solutions/performance-tuning/)

[**Распределённый I/O и большие корпуса:**](/solutions/llm-training/distributed-io/)

[**Чекпоинтинг и перезапуск:**](/solutions/llm-training/checkpointing/)

[**Multi‑GPU и топологии:**](/solutions/multi-gpu/)

[**Interruptible‑паттерны:**](/solutions/interruptible-patterns/)

[**Планировщик стоимости:**](/solutions/cost-planner/)

[**Мониторинг и логи:**](/solutions/monitoring-logging/)

[**Безопасность:**](/solutions/security/)

Готовы запустить?

Запустить GPU-сервер