Игорь Градов
Игорь Градов
5 мин
ai

PyTorch: оптимизация памяти через диск сократила расход GPU с 10 ГБ до мегабайт

Графовые нейросети на миллионы узлов требуют от оптимизатора столько памяти, что даже видеокарта с 24 ГБ не справляется, но пакет Disk Sparse Adam (DSA) решает эту проблему, вынося данные на диск.

Почему это важно

Стандартный оптимизатор SparseAdam в PyTorch хранит всю историю градиентов в оперативной или видеопамяти, и при графе на 10 миллионов узлов одни только служебные данные занимают больше 10 ГБ. DSA сбрасывает эти данные на диск и подгружает только нужный кусок, сокращая потребление памяти до нескольких мегабайт.

Проблема знакома каждому, кто работает с большими графами знаний или рекомендательными системами: PyTorch падает с ошибкой «CUDA out of memory», хотя сама модель в память помещается. Виноват не размер модели, а оптимизатор, который хранит два «момента» (историю градиентов для ускорения обучения) для каждого параметра. Автор открытого пакета DSA, распространяемого под лицензией MIT, предложил выносить эти моменты на диск через механизм mmap (отображение файлов в память, когда операционная система подгружает данные страницами по запросу). Для исследователей и стартапов в России, где аренда мощных GPU-серверов обходится дорого, а бюджетные видеокарты вроде RTX 3090 или 4090 есть у многих, это практичный способ запускать эксперименты без облачной инфраструктуры.

Почему стандартный SparseAdam съедает всю память?

Возьмём конкретный расчёт. Модель для графа знаний: 10 миллионов сущностей, размерность вектора 128, формат float32.

  • Сами параметры (веса): 10 000 000 x 128 x 4 байта = 5,12 ГБ
  • Первый момент (m): ещё 5,12 ГБ
  • Второй момент (v): ещё 5,12 ГБ

Итого оптимизатор отнимает 10,24 ГБ сверх самой модели. Общий расход: 15,36 ГБ. Видеокарта с 16 ГБ видеопамяти уже не тянет, а если увеличить размерность до 256 или взять граф на 50 миллионов узлов, PyTorch падает с ошибкой CUDA out of memory, либо система зависает, заполнив весь файл подкачки.

При этом в каждом мини-батче (порции данных для одного шага обучения) обновляются не все 10 миллионов узлов, а, например, 10 000. Держать в дорогой памяти GPU историю для остальных 9 990 000 узлов бессмысленно.

Что понадобится

  • Видеокарта: любая с поддержкой CUDA, подойдёт даже бесплатный Google Colab
  • Диск: NVMe SSD (на обычном HDD будет медленно)
  • Python и PyTorch: стандартная установка
  • Пакет DSA: устанавливается из исходного кода на GitHub (лицензия MIT, открытый код)
  • Время: замена оптимизатора в существующем коде занимает несколько минут

Пошаговая инструкция

  1. Установите пакет DSA из репозитория на GitHub. Пакет работает как прямая замена (drop-in replacement) стандартного оптимизатора: переписывать архитектуру модели или загрузчик данных не нужно.

  2. Создайте эмбеддинги (векторные представления узлов графа) с параметром sparse=True:

import torch
embedding = torch.nn.Embedding(10_000_000, 128, sparse=True)
  1. Инициализируйте оптимизатор DSA вместо стандартного SparseAdam, указав папку на диске для хранения состояний:
from dsa.optimizer import DiskSparseRiemannianAdam

optimizer = DiskSparseRiemannianAdam(
    params={"emb": embedding.weight},
    lr=0.001,
    k=0.0,       # 0.0 для евклидова пространства, 1.0 для гиперболического
    disk_dir="./opt_cache"
)

Параметр k управляет геометрией пространства: при k=0.0 оптимизатор работает в обычном евклидовом пространстве, при k=1.0 используется шар Пуанкаре (гиперболическое пространство, которое лучше подходит для иерархических структур вроде деревьев категорий).

  1. Запустите цикл обучения, передавая индексы батча и градиенты:
for batch_indices in dataloader:
    idx_np = batch_indices.numpy()
    weights_np = optimizer.state_files["emb"]["w"][idx_np].copy()
    current_weights = torch.from_numpy(weights_np).requires_grad_(True)

    loss = compute_loss(current_weights)
    loss.backward()

    optimizer.step(updates={"emb": (batch_indices, current_weights.grad)})

optimizer.shutdown()
  1. Вызовите optimizer.shutdown() после завершения обучения, чтобы корректно завершить фоновый поток записи на диск.
Как это применить

Допустим, вы работаете с графом знаний российской электронной коммерции: 10 миллионов товаров, 128-мерные векторы. На стандартном SparseAdam вам нужно 15,36 ГБ памяти, и RTX 3090 с 24 ГБ VRAM справится впритык, а RTX 4060 с 8 ГБ не справится вообще. С DSA расход памяти на оптимизатор падает до нескольких мегабайт: в оперативной памяти или VRAM остаются только параметры текущего батча. Весь цикл обучения запускается даже в бесплатном Google Colab. Pytorch оптимизация памяти в этом случае сводится к замене одной строки: вместо torch.optim.SparseAdam подставляете DiskSparseRiemannianAdam с указанием папки на диске.

Частые ошибки
  • HDD вместо SSD. На обычном жёстком диске случайное чтение и запись работают на порядки медленнее, и дисковый ввод-вывод становится узким местом. DSA рассчитан на NVMe SSD.
  • Применение к плотным слоям. DSA создан для разреженных (sparse) параметров: torch.nn.Embedding и EmbeddingBag. Для свёрточных слоёв или трансформеров (transformer, архитектура нейросети, на которой построены GPT и другие языковые модели) он не подходит, там все градиенты плотные.
  • Забыли вызвать optimizer.shutdown(). Без этого фоновый поток записи не завершится корректно, и часть данных может не сохраниться на диск.
  • Недостаточно свободного места на диске. Моменты занимают столько же, сколько раньше в памяти (10+ ГБ для графа на 10 миллионов узлов), только теперь на SSD. Убедитесь, что места хватает.

Что делать с этим прямо сейчас, по ролям

Исследователям и разработчикам в РФ: если вы работаете с графами знаний на российских данных (графы товаров, социальных сетей, корпоративных баз знаний), DSA снимает порог входа. Pytorch оптимизация памяти через mmap позволяет запускать эксперименты на бюджетной видеокарте без аренды облачных GPU.

Авторам Дзена и контент-специалистам: тема «как обучать большие модели на слабом железе» хорошо работает в технических каналах. Конкретный расчёт (15 ГБ превращаются в пару мегабайт) даёт материал для наглядного поста.

Предпринимателям и стартапам: если ваш продукт использует рекомендательные системы или графы знаний, DSA сокращает затраты на инфраструктуру. Вместо аренды сервера с 80 ГБ видеопамяти можно начать с одной потребительской карты.

Мнение редакции dzen.guru

DSA решает узкую, но болезненную задачу: убирает главное бутылочное горлышко при обучении больших разреженных моделей. По моим наблюдениям, для российских исследователей это особенно актуально, потому что доступ к мощным облачным GPU с санкционных аккаунтов ограничен, а свой сервер с A100 стоит как подержанный автомобиль. Скорость обучения будет ниже, чем на чистом GPU (автор честно отмечает, что точных замеров пока нет), но для экспериментальной стадии, когда важно проверить гипотезу, а не выжать последнюю миллисекунду, это разумный компромисс. Пакет молодой, звёзд на GitHub пока немного, поэтому перед использованием в продакшене стоит протестировать на своих данных и следить за обновлениями.

Для тех, кто работает с графовыми нейросетями на ограниченном бюджете, DSA даёт конкретный и воспроизводимый способ обойти ограничение памяти. Попробуйте заменить оптимизатор в своём пайплайне (конвейере обработки данных) и замерьте разницу: если расчёт из статьи верен для ваших данных, экономия на железе окупит час потраченного времени.

Нейросети на практике

Разбираем инструменты для работы с ИИ, которые реально доступны в России

Читать dzen.guru
Поделиться:TelegramVK
Игорь Градов
Игорь Градов

Основатель dzen.guru. Эксперт по монетизации и продвижению на Дзен. Автор курса «Старт на Дзен 2026».

Комментарии

Читайте также

Claude Code через Telegram: разрешения ИИ-агенту теперь даются кнопкой с телефона
ai

Claude Code через Telegram: разрешения ИИ-агенту теперь даются кнопкой с телефона

Разработчик собрал agent-hub, приложение для управления Claude Code, Codex и Qwen через темы Telegram-группы, чтобы ИИ-агент не простаивал вдали от хозяина:…

5 мин
ИИ-агент Claude на VPS банит сам себя в 7 прогонах из 60, отрезая доступ владельцу
ai

ИИ-агент Claude на VPS банит сам себя в 7 прогонах из 60, отрезая доступ владельцу

Автор открытого навыка vps-forge провёл 120 прогонов Claude Opus 5.5 на виртуальных серверах и показал, что без подсказок агент банит сам себя в 7 прогонах из…

4 мин
Разработчик показал, как локально запустить нейросеть на MacBook с 24 ГБ без облака
ai

Разработчик показал, как локально запустить нейросеть на MacBook с 24 ГБ без облака

Разработчик за полгода собрал голосового помощника для macOS, который сам открывает папки, ищет файлы и читает почту, и дообучил для него большую модель на…

6 мин