Свежая выжимка ml и AI статей - каждый день
В последние годы большие языковые модели (LLM) значительно увеличились в размерах, что привело к росту их словарных запасов. Этот рост словарного запаса, в свою очередь, привел к тому, что память, используемая для обучения этих моделей, стала распределяться неравномерно, особенно в одном слое — слое кросс-энтропии в вычислении потерь. В этой статье мы рассмотрим метод, известный как Cut Cross-Entropy (CCE), который предлагает новый подход к вычислению кросс-энтропии, значительно сокращая использование памяти без ущерба для скорости обучения или сходимости.
LLM, такие как Gemma 2 (2B), используют кросс-энтропию для оценки вероятности следующего токена в последовательности. Кросс-энтропийная потеря требует вычисления логит-матрицы, где каждая запись соответствует паре входного токена и элемента словаря. Для моделей с большими словарями это может потребовать огромного количества памяти, что делает обучение неэффективным и дорогим.
Кросс-энтропийная потеря вычисляется следующим образом:
[ \ell_i(x) = \log \text{softmax}{x_i} \left( C^T E_i \right) = C^T{x_i} E_i - \log \sum_j \exp(C^T_j E_i) ]
где ( E_i ) — это вложение (embedding) для последовательности токенов, ( C ) — классификатор, а ( x_i ) — правильный токен. В традиционном подходе вся матрица логитов ( C^T E ) материализуется в памяти, что для больших словарей может потребовать до 90% всей памяти, используемой на этапе обучения.
CCE предлагает вычислять кросс-энтропию без материализации полной матрицы логитов в глобальной памяти. Вместо этого:
Индексированное умножение матриц: Вычисляется только логит для правильного токена, используя индексированное умножение матриц.
Логарифмическое суммирование экспонент: Операция log-sum-exp вычисляется на лету, что позволяет избежать хранения всех логитов в памяти.
Для реализации CCE используется набор специализированных ядер CUDA, которые выполняют:
Эти ядра работают с блоками данных, что позволяет эффективно использовать кэш GPU и сократить общее потребление памяти.
При анализе производительности CCE в сравнении с традиционными методами, такими как PyTorch, torch.compile, Torch Tune и Liger Kernels, CCE показывает выдающиеся результаты:
CCE также использует градиентный фильтр, который пропускает вычисления для элементов градиента, вносящих незначительный вклад. Это позволяет еще больше сократить время вычислений, не влияя на точность.
Метод Cut Cross-Entropy представляет собой значительный шаг вперед в оптимизации обучения больших языковых моделей. Он позволяет эффективно использовать память, что открывает возможности для обучения моделей с еще большими словарными запасами и увеличивает возможности для параллельных вычислений. CCE не только сокращает потребление памяти, но и сохраняет или даже улучшает скорость и качество обучения, делая его привлекательным решением для будущих разработок в области LLM.