gonzo-обзоры ML статей
@gonzo_ML
Наиболее примечательным результатом является превосходство RedLLM в эффективности. Она демонстрирует значительно более высокую пропускную способность как при обучении, так и, что критически важно, при инференсе. Когда результат изображается на осях качество/затраты на инференс (FLOPs), RedLLM практически полностью доминирует на Парето-фронте. Так же было и в T5Gemma. Там, например, end-dec 9B-9B и 2B-2B имели схожую latency с dec 9B и 2B соответственно, но строго лучший перформанс, а например несимметричный вариант с большим энкодером и маленьким декодером 9B-2B был аналогичен декодеру 2B по latency, но лучше по перформансу чем 2B-2B.
В статье это сильно не обсуждается, но это хороший вопрос чтобы копнуть вглубь. Можно рассмотреть модельную ситуацию, когда есть 1000 токенов промпта + 1000 токенов генерации.
Энкодер хорош тем, что он обрабатывает весь входной промпт (1000 токенов) за один раз, параллельно за счёт двунаправленной обработки. При этом он не создаёт компактное представление из единственного вектора (как в старых seq2seq моделях), а делает его по токенам (на выходе энкодера будет 1000 векторных эмбеддингов), так что декодер при генерации 1000 токенов выхода и вычислении cross-attention будет обращаться ко всем закодированным токенам промпта.
На этом фоне для decoder-only модели может показаться что обработка последовательности промпта более медленная, потому что она 1) авторегрессионная (но это не так, на стадии prefilling весь промпт обрабатывается параллельно за один проход) и 2) с каузальным вниманием, а не двунаправленным. Но в реальности остаётся только каузальное внимание (и тут разница по большому счёту только в маске) и при использовании KV-кешей результат должен быть почти таким же, как для энкодер-декодера -- промпт обработается за один раз без авторегрессионной генерации и закешируется. Так что это соображение не релевантно.
Декодер потенциально даже может требовать меньше вычислений (хотя асимптотически одинаково), так как на каждом шаге он обращается к меньшему числу токенов (только к токенам слева), чем при двунаправленной обработке (где внимание смотрит на токены слева и справа). Однако в реальности матрица будет полноразмерной, с отдельной матрицей-маской для реализации каузальной фильтрации, так что это соображение, скорее всего, не особо значимо.
Ещё одно возможное соображение: cross-attention обращается только к финальному выходу энкодера в каждом слое декодера, в то время как decoder-only attention обращается к разным KV-кешам в каждом слое. Первый вариант, вероятно, приведёт к лучшей локальности и более быстрым вычислениям, да и памяти меньше нужно (напоминает selling point в YOCO: @gonzo_ML2699).
При этом decoder-only слои состоят из двух блоков (causal self-attn - mlp), а слои декодера в энкодер-декодере — из трёх (causal self-attn - cross-attn - mlp), поэтому RedLLM должна иметь больше параметров на слой при той же скрытой размерности. Вот почему модели одинакового общего размера имеют разное количество слоёв (Таблица 1a): у 8B DecLLM 32 слоя, а у 8B RedLLM 14/14, то есть 28 в сумме, но они неодинаковые.
Если посмотреть на более глубоком уровне, то для DecLLM это 32 слоя внимания + 32 mlp, а для RedLLM это 14 self-attention + 14 mlp в энкодере (работающие на промпте, условные 1000 токенов) и 14 self-attention + 14 cross-attention + 14 mlp в декодере = 42 слоя внимания + 28 mlp. И у DecLLM контекст self-attention для генерации растёт с 1000 токенов (промпт) до 2000 (промпт + генерация), а у RedLLM decoder self-attention растёт c 0 до 1000 (только генерация, без промпта), что с учётом квадратичной сложности внимания, наверное, играет.
Надеюсь, не ошибка нигде в выводах. Если вы видели где-то более точный расчёт или более подробный анализ, дайте знать.
Ещё одно неожиданное открытие: у RedLLM лучшая экстраполяция на длинных контекстах. Её перплексия растёт гораздо плавнее при обработке последовательностей длиннее, чем её контекст предобучения, в то время как производительность DecLLM ухудшается более резко.
В статье это сильно не обсуждается, но это хороший вопрос чтобы копнуть вглубь. Можно рассмотреть модельную ситуацию, когда есть 1000 токенов промпта + 1000 токенов генерации.
Энкодер хорош тем, что он обрабатывает весь входной промпт (1000 токенов) за один раз, параллельно за счёт двунаправленной обработки. При этом он не создаёт компактное представление из единственного вектора (как в старых seq2seq моделях), а делает его по токенам (на выходе энкодера будет 1000 векторных эмбеддингов), так что декодер при генерации 1000 токенов выхода и вычислении cross-attention будет обращаться ко всем закодированным токенам промпта.
На этом фоне для decoder-only модели может показаться что обработка последовательности промпта более медленная, потому что она 1) авторегрессионная (но это не так, на стадии prefilling весь промпт обрабатывается параллельно за один проход) и 2) с каузальным вниманием, а не двунаправленным. Но в реальности остаётся только каузальное внимание (и тут разница по большому счёту только в маске) и при использовании KV-кешей результат должен быть почти таким же, как для энкодер-декодера -- промпт обработается за один раз без авторегрессионной генерации и закешируется. Так что это соображение не релевантно.
Декодер потенциально даже может требовать меньше вычислений (хотя асимптотически одинаково), так как на каждом шаге он обращается к меньшему числу токенов (только к токенам слева), чем при двунаправленной обработке (где внимание смотрит на токены слева и справа). Однако в реальности матрица будет полноразмерной, с отдельной матрицей-маской для реализации каузальной фильтрации, так что это соображение, скорее всего, не особо значимо.
Ещё одно возможное соображение: cross-attention обращается только к финальному выходу энкодера в каждом слое декодера, в то время как decoder-only attention обращается к разным KV-кешам в каждом слое. Первый вариант, вероятно, приведёт к лучшей локальности и более быстрым вычислениям, да и памяти меньше нужно (напоминает selling point в YOCO: @gonzo_ML2699).
При этом decoder-only слои состоят из двух блоков (causal self-attn - mlp), а слои декодера в энкодер-декодере — из трёх (causal self-attn - cross-attn - mlp), поэтому RedLLM должна иметь больше параметров на слой при той же скрытой размерности. Вот почему модели одинакового общего размера имеют разное количество слоёв (Таблица 1a): у 8B DecLLM 32 слоя, а у 8B RedLLM 14/14, то есть 28 в сумме, но они неодинаковые.
Если посмотреть на более глубоком уровне, то для DecLLM это 32 слоя внимания + 32 mlp, а для RedLLM это 14 self-attention + 14 mlp в энкодере (работающие на промпте, условные 1000 токенов) и 14 self-attention + 14 cross-attention + 14 mlp в декодере = 42 слоя внимания + 28 mlp. И у DecLLM контекст self-attention для генерации растёт с 1000 токенов (промпт) до 2000 (промпт + генерация), а у RedLLM decoder self-attention растёт c 0 до 1000 (только генерация, без промпта), что с учётом квадратичной сложности внимания, наверное, играет.
Надеюсь, не ошибка нигде в выводах. Если вы видели где-то более точный расчёт или более подробный анализ, дайте знать.
Ещё одно неожиданное открытие: у RedLLM лучшая экстраполяция на длинных контекстах. Её перплексия растёт гораздо плавнее при обработке последовательностей длиннее, чем её контекст предобучения, в то время как производительность DecLLM ухудшается более резко.
? 9
? 1
14 2.3K
Обсуждение 0
Обсуждение не доступно в веб-версии. Чтобы написать комментарий, перейдите в приложение Telegram.
Обсудить в Telegram