Пересчёт активаций повторно выполняет часть прямого прохода ради сокращения хранения промежуточных тензоров в обучении. DCP сохраняет и загружает переданное состояние обучения. Эти механизмы решают разные задачи: пересчёт активаций сам по себе не создаёт контрольную точку для восстановления после перезапуска.
Пересчёт активаций
Определение
Пересчёт активаций — способ снизить расход памяти при обучении модели, повторно вычисляя нужные промежуточные тензоры во время обратного прохода. За экономию памяти платят дополнительными вычислениями; выигрыш зависит от выбранных участков.
Также ищут: Activation checkpointing · Gradient checkpointing
Зачем это знать
Пересчёт может сократить память, занятую активациями, но требует повторных вычислений и не сохраняет состояние для продолжения после перезапуска. Проверьте градиенты, длительность полного шага и пик памяти на целевой конфигурации.
Карта понятия
Что подтверждено
В PyTorch activation checkpointing обменивает вычисления на память: в выбранном участке прямого прохода часть тензоров, нужных для вычисления градиентов, не сохраняется, а вычисляется заново во время обратного прохода.
Граница применимости: Документированный API torch.utils.checkpoint в PyTorch 2.9. Утверждение относится к промежуточным тензорам выбранного участка, сохраняемым для обратного прохода; оно не обещает сокращения памяти под параметры, состояние оптимизатора или пикового объёма всего шага.
Документация PyTorch 2.9 рекомендует явно передавать use_reentrant=False. В режиме use_reentrant=False early_stop=True по умолчанию прекращает повторное выполнение участка, когда пересчитаны все нужные тензоры; настройку также может переопределить set_checkpoint_early_stop. Для use_reentrant=True early_stop игнорируется.
Граница применимости: Рекомендация и семантика относятся к torch.utils.checkpoint в PyTorch 2.9. В исходном коде v2.9.1 пропуск use_reentrant приводит к предупреждению и выбору True; утверждение не повторяет документированное обещание исключения при пропуске параметра.
При обычном исполнении без torch.compile PyTorch по умолчанию сохраняет и восстанавливает состояние своего генератора на CPU, даже если среди аргументов нет CPU-тензоров. Для входных тензоров на других устройствах сохраняются состояния одного типа: CUDA имеет приоритет, иначе выбирается первый обнаруженный тип. Остальные типы не охвачены; при случайных операциях это может дать неверные градиенты. preserve_rng_state=False отключает сохранение и восстановление этих состояний.
Граница применимости: API PyTorch 2.9 и реализация v2.9.1. Дополнительный тип определяют по тензорам не на CPU; если таких аргументов нет, используется DefaultDeviceType. Новые устройства внутри функции и сторонние генераторы не получают общей гарантии восстановления. Под torch.compile флаг preserve_rng_state=False не отключает сохранение RNG.
При use_reentrant=False проверка determinism_check='default' сравнивает метаданные сохранённых и повторно вычисленных тензоров; отдельно реализация v2.9.1 проверяет совпадение их количества. Ни одна из этих проверок не сравнивает численные значения тензоров или градиенты. Если функция зависит от глобального состояния, изменившегося между проходами, градиенты могут незаметно оказаться неверными.
Граница применимости: Документация PyTorch 2.9 описывает сравнение формы, типа данных и устройства и предупреждает о различии прямого и обратного вызовов из-за глобальных переменных. Исходный код v2.9.1 дополнительно проверяет количество сохранённых тензоров. Эта проверка не подтверждает равенство значений или градиентов.
Не путать
Что проверить
- Явно укажите use_reentrant=False и проверьте, подходит ли выбранный участок для повторного выполнения в обратном проходе.
- Если участок использует случайные операции, проверьте типы устройств и переносы внутри функции: сохранение случайного состояния не охватывает все устройства и все генераторы приложения.
- Не считайте determinism_check="default" проверкой значений тензоров или градиентов. Сравните их с контрольным запуском, особенно при изменяемом состоянии функции.
- После изменения измерьте полный шаг и пиковую память на целевой конфигурации. Не выводите из пересчёта активаций, что сохранены параметры, состояние оптимизатора или данные для возобновления обучения.
Первоисточники
- torch.utils.checkpoint
Пересчёт промежуточных результатов при вычислении градиентов экономит память активаций. Документация описывает условия корректности и работу со случайными числами.
- torch.utils.checkpoint — исходный код
Исходный код из тега v2.9.1: поведение use_reentrant при пропуске, сохранение RNG для типов устройств и проверки числа тензоров и их метаданных.
- Distributed Checkpoint — torch.distributed.checkpoint
Официальная документация PyTorch 2.9: параллельное сохранение локальных фрагментов, переразложение при загрузке, входное состояние, условия загрузки и отсутствие гарантии обратной совместимости сохранённых state_dict между версиями PyTorch.
Связанные понятия
Курсы по теме
В каталоге
- Подобрать GPU для обучения — Включив пересчёт, измерьте пик памяти и длительность полного шага на выбранной GPU: меньше хранимых активаций не доказывает, что памяти хватит и обучение уложится в срок.