You Only Cache Once: Decoder-Decoder Architectures for Language Models
Yutao Sun, Li Dong, Yi Zhu, Shaohan Huang, Wenhui Wang, Shuming Ma, Quanlu Zhang, Jianyong Wang, Furu Wei
Статья: https://arxiv.org/abs/2405.05254
Код: https://github.com/microsoft/unilm/tree/master/YOCO
Архитектурные новости. Авторы придумали архитектуру для LLM под названием decoder-decoder.
Напомним, что оригинальный трансформер (и например модели типа T5) был построен на полной архитектуре encoder-decoder, большая часть современных LLM (типа GPT) используют только decoder, и другая популярная ветка недавнего прошлого (модели семейства BERT) состоит только из encoder. Энкодер всегда был двунаправленным (bidirectional) и модели с таким двунаправленным компонентом (то есть encoder и encoder-decoder) имели проблемы с авторегрессионной генерацией — там для генерации нового токена сначала надо было заэнкодить всю последовательность из входа и уже нагенерённой части выхода. Можно конечно использовать только декодерную часть для генерации, но тогда сгенерённые токены не используют на полную мощь параметры энкодера. У decoder тут всё неплохо, при авторегрессионной генерации можно закешировать вектора KV (key и value в блоках внимания) и переиспользовать для генерации нового токена, не надо заново кодировать всю историю.
Но как говорится в сказании о Савитри, “есть один недостаток”. KV-кэш очень пухнет при росте длины генерируемой последовательности, он отжирает кучу памяти GPU и LLM-ки становятся memory-bound. Так для 65B модели (с grouped-query attention и квантизацией KV в 8 бит) для 512k токенов нужно 86Gb памяти, что перекрывает объём памяти H100-80GB. К тому же фаза prefill (см тут или хороший обзор тут), в которой надо обработать все входные токены промпта и вычислить для них значения KV, может занимать сотни секунд для очень длинных входов типа 1М (здесь, кстати, интересно, что Гугл с Gemini 1.5 придумал).
Весь трансформер из L слоёв разделяется поровну и первые L/2 слоёв реализуют self-decoder через efficient self-attention. Размер KV-кеша этой части константен, то есть O(1). Выход последнего слоя self-decoder даёт глобальный KV-кеш, куда ходит вторая половина, cross-decoder, реализованная через оставшиеся L/2 слоёв. Каждый блок получает на вход Q и через cross-attention идёт в этот глобальный KV-кеш. Здесь уже везде стандартное (почти, с GQA, https://arxiv.org/abs/2305.13245) multi-head attention с полным окном.
Под efficient self-attention в self-decoder авторы подразумевают sliding-window attention как в старом добром sparse transformer имени Ильи Суцкевера и ко (https://www.tgoop.com/gonzo_ML/65). Как вариант, вместо него в self-decoder может использоваться RetNet (https://www.tgoop.com/gonzo_ML/1753) под названием gRet (aka gRetNet или RetNet-3) с data-dependent гейтингом. Вроде бы такой же мы и разбирали когда-то давно в оригинальной статье.
В остальном блоки в этих слоях в целом стандартные, чередование внимания и FFN, с использованием pre-RMSNorm, SwiGLU, GQA.
Полученная архитектура называется YOCO (You Only Cache Once, так понимаю тут речь про кеширование в L/2 слое). Это всё похоже на encoder-decoder, но снаружи выглядит как декодер и обе части используют causal masking.
YOCO эффективнее обычного трансформера за счёт меньших требований к памяти, кеш для длинных последовательностей скейлится как O(N) вместо O(NL), то есть можно делать больше инференса и/или с более крупными батчами (что повышает throughput).
Ещё из интересных свойств YOCO есть то, что во время стадии prefill можно сделать early exit и не ходить в cross-decoder, это повышает скорость данной фазы. Поскольку в self-decoder находится половина слоёв, то это уже сокращение вычислений и времени в два раза. К тому же эффективная реализация внимания в self-decoder обычно быстра. Они приводят пример запроса с размером контекста в 512K, на котором prefill latency падает со 180 секунд (трансформер с flash-decoding и kernel fusion) до менее 6 секунд. И даже на длине 32K YOCO всё равно в три раза быстрее (на этой фазе, а не в целом end-to-end).
Yutao Sun, Li Dong, Yi Zhu, Shaohan Huang, Wenhui Wang, Shuming Ma, Quanlu Zhang, Jianyong Wang, Furu Wei
Статья: https://arxiv.org/abs/2405.05254
Код: https://github.com/microsoft/unilm/tree/master/YOCO
Архитектурные новости. Авторы придумали архитектуру для LLM под названием decoder-decoder.
Напомним, что оригинальный трансформер (и например модели типа T5) был построен на полной архитектуре encoder-decoder, большая часть современных LLM (типа GPT) используют только decoder, и другая популярная ветка недавнего прошлого (модели семейства BERT) состоит только из encoder. Энкодер всегда был двунаправленным (bidirectional) и модели с таким двунаправленным компонентом (то есть encoder и encoder-decoder) имели проблемы с авторегрессионной генерацией — там для генерации нового токена сначала надо было заэнкодить всю последовательность из входа и уже нагенерённой части выхода. Можно конечно использовать только декодерную часть для генерации, но тогда сгенерённые токены не используют на полную мощь параметры энкодера. У decoder тут всё неплохо, при авторегрессионной генерации можно закешировать вектора KV (key и value в блоках внимания) и переиспользовать для генерации нового токена, не надо заново кодировать всю историю.
Но как говорится в сказании о Савитри, “есть один недостаток”. KV-кэш очень пухнет при росте длины генерируемой последовательности, он отжирает кучу памяти GPU и LLM-ки становятся memory-bound. Так для 65B модели (с grouped-query attention и квантизацией KV в 8 бит) для 512k токенов нужно 86Gb памяти, что перекрывает объём памяти H100-80GB. К тому же фаза prefill (см тут или хороший обзор тут), в которой надо обработать все входные токены промпта и вычислить для них значения KV, может занимать сотни секунд для очень длинных входов типа 1М (здесь, кстати, интересно, что Гугл с Gemini 1.5 придумал).
Весь трансформер из L слоёв разделяется поровну и первые L/2 слоёв реализуют self-decoder через efficient self-attention. Размер KV-кеша этой части константен, то есть O(1). Выход последнего слоя self-decoder даёт глобальный KV-кеш, куда ходит вторая половина, cross-decoder, реализованная через оставшиеся L/2 слоёв. Каждый блок получает на вход Q и через cross-attention идёт в этот глобальный KV-кеш. Здесь уже везде стандартное (почти, с GQA, https://arxiv.org/abs/2305.13245) multi-head attention с полным окном.
Под efficient self-attention в self-decoder авторы подразумевают sliding-window attention как в старом добром sparse transformer имени Ильи Суцкевера и ко (https://www.tgoop.com/gonzo_ML/65). Как вариант, вместо него в self-decoder может использоваться RetNet (https://www.tgoop.com/gonzo_ML/1753) под названием gRet (aka gRetNet или RetNet-3) с data-dependent гейтингом. Вроде бы такой же мы и разбирали когда-то давно в оригинальной статье.
В остальном блоки в этих слоях в целом стандартные, чередование внимания и FFN, с использованием pre-RMSNorm, SwiGLU, GQA.
Полученная архитектура называется YOCO (You Only Cache Once, так понимаю тут речь про кеширование в L/2 слое). Это всё похоже на encoder-decoder, но снаружи выглядит как декодер и обе части используют causal masking.
YOCO эффективнее обычного трансформера за счёт меньших требований к памяти, кеш для длинных последовательностей скейлится как O(N) вместо O(NL), то есть можно делать больше инференса и/или с более крупными батчами (что повышает throughput).
Ещё из интересных свойств YOCO есть то, что во время стадии prefill можно сделать early exit и не ходить в cross-decoder, это повышает скорость данной фазы. Поскольку в self-decoder находится половина слоёв, то это уже сокращение вычислений и времени в два раза. К тому же эффективная реализация внимания в self-decoder обычно быстра. Они приводят пример запроса с размером контекста в 512K, на котором prefill latency падает со 180 секунд (трансформер с flash-decoding и kernel fusion) до менее 6 секунд. И даже на длине 32K YOCO всё равно в три раза быстрее (на этой фазе, а не в целом end-to-end).
🔥23❤5👍3👀2
В тестах за основу взяли StableLM-3B-4E1T и сделали сопоставимую YOCO, она даёт результаты сравнимые с другими хорошо затюненными моделями такого же размера. Лосс от размера модели скейлится также как у Llama-optimized трансформера. При этом YOCO с gRet чуть лучше, чем со sliding-window attention (SWA) и обычный трансформер.
Если расширить контекст YOCO-3B до 1M (привет, Gemini!) через продолжение обучения с length schedule 64K, 256K, 1M, то на Needle In A Haystack всё выглядит почти идеально.
В недрах приложений есть сравнение с Mamba, RetNet, Hybrid H3, gRetNet и трансформером. YOCO с трансформером рулят (по перплексии).
Самые интересные результаты в производительности. По памяти улучшение в разы и чем больше длина последовательности, тем больше улучшение. На длине 1М YOCO ест в 9.38x меньше памяти, чем трансформер с GQA, Flash-Decoding и kernel fusion. В основном за счёт KV кеша, но кажется ещё небольшое улучшение у gRet при хранении активаций. По метрике prefilling latency улучшение в десятки раз. По throughput (токены в секунду) на длинных входах ускорение почти до 10 раз (в основном по двум причинам: более быстрый prefill, а также возможность использовать больший батч из-за лучшей работы с памятью). В сочетаниях типа YOCO + BitNet + Groq может быть кумулятивный эффект и вообще бомба.
Хорошая инженерная работа, мне нравится.
Если расширить контекст YOCO-3B до 1M (привет, Gemini!) через продолжение обучения с length schedule 64K, 256K, 1M, то на Needle In A Haystack всё выглядит почти идеально.
В недрах приложений есть сравнение с Mamba, RetNet, Hybrid H3, gRetNet и трансформером. YOCO с трансформером рулят (по перплексии).
Самые интересные результаты в производительности. По памяти улучшение в разы и чем больше длина последовательности, тем больше улучшение. На длине 1М YOCO ест в 9.38x меньше памяти, чем трансформер с GQA, Flash-Decoding и kernel fusion. В основном за счёт KV кеша, но кажется ещё небольшое улучшение у gRet при хранении активаций. По метрике prefilling latency улучшение в десятки раз. По throughput (токены в секунду) на длинных входах ускорение почти до 10 раз (в основном по двум причинам: более быстрый prefill, а также возможность использовать больший батч из-за лучшей работы с памятью). В сочетаниях типа YOCO + BitNet + Groq может быть кумулятивный эффект и вообще бомба.
Хорошая инженерная работа, мне нравится.
arXiv.org
You Only Cache Once: Decoder-Decoder Architectures for Language Models
We introduce a decoder-decoder architecture, YOCO, for large language models, which only caches key-value pairs once. It consists of two components, i.e., a cross-decoder stacked upon a...
🔥22👍6❤1🆒1
Свежего Романа Ямпольского вам в ленту
https://youtu.be/NNr6gPelJ3E
Слова Лекса Фридмана:
Here's my conversation with Roman Yampolskiy, AI safety researcher who believes that the chance of AGI eventually destroying human civilization is 99.9999%.
I will continue to chat with many AI researchers & engineers, most of whom put p(doom) at <20%, but it's important to balance those technical conversations by understanding the long-term existential risks of AI. This was a terrifying and fascinating discussion.
https://youtu.be/NNr6gPelJ3E
Слова Лекса Фридмана:
Here's my conversation with Roman Yampolskiy, AI safety researcher who believes that the chance of AGI eventually destroying human civilization is 99.9999%.
I will continue to chat with many AI researchers & engineers, most of whom put p(doom) at <20%, but it's important to balance those technical conversations by understanding the long-term existential risks of AI. This was a terrifying and fascinating discussion.
YouTube
Roman Yampolskiy: Dangers of Superintelligent AI | Lex Fridman Podcast #431
Roman Yampolskiy is an AI safety researcher and author of a new book titled AI: Unexplainable, Unpredictable, Uncontrollable. Please support this podcast by checking out our sponsors:
- Yahoo Finance: https://yahoofinance.com
- MasterClass: https://maste…
- Yahoo Finance: https://yahoofinance.com
- MasterClass: https://maste…
🔥24👍6❤4🤮4😁3🤷♂1
[Mamba-2] Transformers are SSMs: Generalized Models and Efficient Algorithms Through Structured State Space Duality
Tri Dao, Albert Gu
Статья: https://arxiv.org/abs/2405.21060
Код: https://github.com/state-spaces/mamba
Блог: https://goombalab.github.io/blog/2024/mamba2-part1-model/
Твиттер-тред: https://x.com/_albertgu/status/1797651223035904355
Transformers are RNNs/SSMs
Краткий формат. Авторы Mamba (https://www.tgoop.com/gonzo_ML/2148) выпустили обновлённую версию своей модели, Mamba-2. У неё вектор состояния большего размера (16 -> 256), при этом она в два раза быстрее обучается, а её код проще (30 строк).
Старая Мамба была хороша, но авторы не были полностью удовлетворены. Во-первых, механизмы внимания оставались где-то за пределами парадигмы SSM, а было бы интересно их как-то объединить. Во-вторых, хоть Мамба и была уже достаточно быстра (с эффективной имплементацией через selective scan), всё равно она уступала по вычислительной эффективности механизму внимания и перемножению матриц.
Авторы подошли к проблеме фундаментально и предложили фреймворк под названием structured state space duality (SSD), который объединяет structured SSM и варианты внимания в новом SSD слое. Показана эквивалентность SSM и семейства структурированных матриц под названием semiseparable matrices. Основная идея работы в том, что различные методы вычисления SSM могут быть выражены как алгоритмы умножения структурированных матриц. Также авторы развили теорию линейного внимания (“Transformers are RNNs: Fast Autoregressive Transformers with Linear Attention”, https://arxiv.org/abs/2006.16236 — название текущей работы, видимо, аллюзия на эту) и обобщили результаты про его рекуррентную форму на structured masked attention (SMA). Наконец они соединили SSM и SMA, показав, что у них есть большое пересечение где они двойственны друг другу и по сути являются моделью, выражаемой одной и той же функцией. Также доказали, что любой kernel attention method с быстрой рекуррентной формой должен быть SSM.
В этой статье на 52 страницы много математики, я пока ещё не углублялся, но авторы написали прекрасную серию постов, которую можно читать вместо статьи:
Часть 1: В целом про SSD модель (https://goombalab.github.io/blog/2024/mamba2-part1-model/)\
Часть 2: Теория с математическим разбором фреймворка SSD (https://goombalab.github.io/blog/2024/mamba2-part2-theory/)
Часть 3: Алгоритмическая часть и код (https://goombalab.github.io/blog/2024/mamba2-part3-algorithm/)
Часть 4: Оптимизации на уровне системы для large-scale training, файнтюнинга и инференса (https://goombalab.github.io/blog/2024/mamba2-part4-systems/)
Оригинальная Мамба была selective SSM (S6) с диагональной структурой. SSD идёт ещё дальше и ограничивает диагональ матрицы A, теперь все элементы должны иметь одинаковые значения (то есть это скаляр умноженный на единичную матрицу). Старая Mamba применялась к каждому входному каналу отдельно, новая обрабатывает сразу много каналов (например 64) одной общей рекуррентностью. Это повышает вычислительную эффективность и даёт более быстрое обучение. При этом теоретически у Mamba-2 меньшая выразительность, чем у Mamba-1, и первая Мамба также может быть лучше в инференсе. Это всё пока не изучалось и ждёт своих исследователей.
Фреймворк позволяет перенести устоявшиеся для внимания техники на архитектуры SSM и реализовать аналоги голов (MHA) в SSM. Также архитектура блока сети (Mamba блок, https://www.tgoop.com/gonzo_ML/2153) слегка изменена относительно SSM. Появляется grouped-value attention в структуре голов и все data-dependent проекции (параметры A,B,C в SSM) теперь получаются параллельно со входом X, а не последовательно как раньше. Реализованы разные оптимизации, в частности модель сделана Tensor Parallelism-friendly.
Tri Dao, Albert Gu
Статья: https://arxiv.org/abs/2405.21060
Код: https://github.com/state-spaces/mamba
Блог: https://goombalab.github.io/blog/2024/mamba2-part1-model/
Твиттер-тред: https://x.com/_albertgu/status/1797651223035904355
Transformers are RNNs/SSMs
Краткий формат. Авторы Mamba (https://www.tgoop.com/gonzo_ML/2148) выпустили обновлённую версию своей модели, Mamba-2. У неё вектор состояния большего размера (16 -> 256), при этом она в два раза быстрее обучается, а её код проще (30 строк).
Старая Мамба была хороша, но авторы не были полностью удовлетворены. Во-первых, механизмы внимания оставались где-то за пределами парадигмы SSM, а было бы интересно их как-то объединить. Во-вторых, хоть Мамба и была уже достаточно быстра (с эффективной имплементацией через selective scan), всё равно она уступала по вычислительной эффективности механизму внимания и перемножению матриц.
Авторы подошли к проблеме фундаментально и предложили фреймворк под названием structured state space duality (SSD), который объединяет structured SSM и варианты внимания в новом SSD слое. Показана эквивалентность SSM и семейства структурированных матриц под названием semiseparable matrices. Основная идея работы в том, что различные методы вычисления SSM могут быть выражены как алгоритмы умножения структурированных матриц. Также авторы развили теорию линейного внимания (“Transformers are RNNs: Fast Autoregressive Transformers with Linear Attention”, https://arxiv.org/abs/2006.16236 — название текущей работы, видимо, аллюзия на эту) и обобщили результаты про его рекуррентную форму на structured masked attention (SMA). Наконец они соединили SSM и SMA, показав, что у них есть большое пересечение где они двойственны друг другу и по сути являются моделью, выражаемой одной и той же функцией. Также доказали, что любой kernel attention method с быстрой рекуррентной формой должен быть SSM.
В этой статье на 52 страницы много математики, я пока ещё не углублялся, но авторы написали прекрасную серию постов, которую можно читать вместо статьи:
Часть 1: В целом про SSD модель (https://goombalab.github.io/blog/2024/mamba2-part1-model/)\
Часть 2: Теория с математическим разбором фреймворка SSD (https://goombalab.github.io/blog/2024/mamba2-part2-theory/)
Часть 3: Алгоритмическая часть и код (https://goombalab.github.io/blog/2024/mamba2-part3-algorithm/)
Часть 4: Оптимизации на уровне системы для large-scale training, файнтюнинга и инференса (https://goombalab.github.io/blog/2024/mamba2-part4-systems/)
Оригинальная Мамба была selective SSM (S6) с диагональной структурой. SSD идёт ещё дальше и ограничивает диагональ матрицы A, теперь все элементы должны иметь одинаковые значения (то есть это скаляр умноженный на единичную матрицу). Старая Mamba применялась к каждому входному каналу отдельно, новая обрабатывает сразу много каналов (например 64) одной общей рекуррентностью. Это повышает вычислительную эффективность и даёт более быстрое обучение. При этом теоретически у Mamba-2 меньшая выразительность, чем у Mamba-1, и первая Мамба также может быть лучше в инференсе. Это всё пока не изучалось и ждёт своих исследователей.
Фреймворк позволяет перенести устоявшиеся для внимания техники на архитектуры SSM и реализовать аналоги голов (MHA) в SSM. Также архитектура блока сети (Mamba блок, https://www.tgoop.com/gonzo_ML/2153) слегка изменена относительно SSM. Появляется grouped-value attention в структуре голов и все data-dependent проекции (параметры A,B,C в SSM) теперь получаются параллельно со входом X, а не последовательно как раньше. Реализованы разные оптимизации, в частности модель сделана Tensor Parallelism-friendly.
🔥24👍4👀3❤2
Гигантских моделей не обучали, самая большая, кажется, 2.7B. Массовых тестов Mamba-2 пока тоже не было, но авторы верят, что новая модель должны быть сравнима или лучше. На The Pile кривые лосса у новой Мамбы идут чуть ниже старой. На сложной задаче multi-query associative recall (MQAR, https://arxiv.org/abs/2312.04927) Mamba-2 существенно лучше Mamba-1.
Ждём развития и adoption.
Ждём развития и adoption.
arXiv.org
Transformers are SSMs: Generalized Models and Efficient Algorithms...
While Transformers have been the main architecture behind deep learning's success in language modeling, state-space models (SSMs) such as Mamba have recently been shown to match or outperform...
👍6