Современные нейросетевые модели растут в размерах быстрее, чем доступная видеопамять на ускорителях. Разработчики всё чаще сталкиваются с ситуацией, когда модель в принципе помещается в GPU по весам, но обучение становится невозможным из-за того, что промежуточные активации съедают десятки гигабайт памяти. Именно для решения этой проблемы был придуман подход под названием gradient checkpointing, ставший одним из стандартных инструментов в арсенале инженеров машинного обучения. Суть gradient checkpointing заключается в управляемом размене вычислений на память. При обычном обратном распространении ошибки фреймворк сохраняет все промежуточные тензоры, полученные во время прямого прохода, чтобы потом использовать их при вычислении градиентов. Чем глубже сеть, тем больше таких активаций накапливается и тем выше пиковое потребление памяти. Gradient checkpointing предлагает иной сценарий: сохранять только небольшое подмножество активаций — так называемые контрольные точки, — а всё остальное пересчитывать заново во время обратного прохода. В результате потребление памяти снижается с линейного по числу слоёв до примерно квадратного корня от этой величины, а накладные расходы по вычислениям обычно составляют от двадцати до тридцати процентов. Идея получила широкое распространение после публикации работы Чена и соавторов в 2016 году, где техника описывалась как sublinear memory cost. Сегодня она поддерживается практически во всех крупных фреймворках. В PyTorch для этого существует модуль torch.utils.checkpoint, в TensorFlow и JAX есть аналогичные обёртки, а библиотеки уровня Hugging Face Transformers и DeepSpeed предоставляют флаги активации этой функциональности буквально одной строкой конфигурации. Это значительно снижает порог входа: даже исследователь без глубокой инженерной подготовки может уменьшить требования к памяти у своей модели. Особенно ценным gradient checkpointing оказался в эпоху больших языковых моделей. Обучение трансформеров с сотнями миллионов параметров на длинных последовательностях практически невозможно без подобных оптимизаций, поскольку именно матрицы внимания и активации feed-forward блоков формируют основной объём промежуточных данных. В сочетании с mixed precision, ZeRO-оптимизацией и параллелизмом тензоров чекпоинтинг позволяет масштабировать обучение на оборудование, которое формально кажется недостаточным. У метода есть и слабые стороны. Дополнительный прямой проход замедляет обучение, а при неправильной расстановке контрольных точек выигрыш по памяти оказывается скромнее ожидаемого. Также возникают тонкие нюансы с операциями, имеющими побочные эффекты, например со слоями dropout или batch normalization, где необходимо аккуратно фиксировать состояние генератора случайных чисел.