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, открытый код)
- Время: замена оптимизатора в существующем коде занимает несколько минут
Пошаговая инструкция
-
Установите пакет DSA из репозитория на GitHub. Пакет работает как прямая замена (drop-in replacement) стандартного оптимизатора: переписывать архитектуру модели или загрузчик данных не нужно.
-
Создайте эмбеддинги (векторные представления узлов графа) с параметром
sparse=True:
import torch
embedding = torch.nn.Embedding(10_000_000, 128, sparse=True)
- Инициализируйте оптимизатор 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 используется шар Пуанкаре (гиперболическое пространство, которое лучше подходит для иерархических структур вроде деревьев категорий).
- Запустите цикл обучения, передавая индексы батча и градиенты:
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()
- Вызовите
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 ГБ видеопамяти можно начать с одной потребительской карты.
DSA решает узкую, но болезненную задачу: убирает главное бутылочное горлышко при обучении больших разреженных моделей. По моим наблюдениям, для российских исследователей это особенно актуально, потому что доступ к мощным облачным GPU с санкционных аккаунтов ограничен, а свой сервер с A100 стоит как подержанный автомобиль. Скорость обучения будет ниже, чем на чистом GPU (автор честно отмечает, что точных замеров пока нет), но для экспериментальной стадии, когда важно проверить гипотезу, а не выжать последнюю миллисекунду, это разумный компромисс. Пакет молодой, звёзд на GitHub пока немного, поэтому перед использованием в продакшене стоит протестировать на своих данных и следить за обновлениями.
Для тех, кто работает с графовыми нейросетями на ограниченном бюджете, DSA даёт конкретный и воспроизводимый способ обойти ограничение памяти. Попробуйте заменить оптимизатор в своём пайплайне (конвейере обработки данных) и замерьте разницу: если расчёт из статьи верен для ваших данных, экономия на железе окупит час потраченного времени.
Нейросети на практике
Разбираем инструменты для работы с ИИ, которые реально доступны в России
Читать dzen.guru
Основатель dzen.guru. Эксперт по монетизации и продвижению на Дзен. Автор курса «Старт на Дзен 2026».
Читайте также

Авторство кода нейросети: как понять, где ваше решение, а где чужое
Авторство кода нейросети перестало быть абстрактным вопросом для философов: разработчики, копирайтеры и все, кто делегирует создание текстов или программ…

Искусственный интеллект на производстве: план за 3 минуты вместо часов в Excel
Производственное планирование перестаёт зависеть от интуиции диспетчера и аврального пересчёта в Excel: искусственный интеллект на производстве уже берёт на…
ИИ в информационной безопасности: куда попадают файлы из ChatGPT и почему это кадровый риск
Договор с клиентом, фрагмент кода, медицинская карта: каждый день пользователи нейросетей загружают данные, которые никогда бы не отправили незнакомцу, а…
Комментарии