Передовые методы повышения производительности LLM

Опубликовано: 2024-04-02
Оглавление показать
Проблемы в достижении более высокой пропускной способности для LLM
Требования к памяти
Авторегрессия и работа с привязкой к памяти
Инновационные решения для решения проблем с пропускной способностью
Непрерывное дозирование
Страничное внимание
Вспышка внимания
Ключевые особенности Flash Attention:
Практический пример – Оптимизация вывода с помощью спекулятивного декодирования
Заключение

В быстро развивающемся мире технологий модели большого языка (LLM) стали ключевыми игроками в том, как мы взаимодействуем с цифровой информацией. Эти мощные инструменты позволяют писать статьи, отвечать на вопросы и даже вести беседы, но они не лишены проблем. Поскольку мы требуем большего от этих моделей, мы сталкиваемся с препятствиями, особенно когда речь идет о том, чтобы заставить их работать быстрее и эффективнее. Этот блог посвящен преодолению этих препятствий.

Мы изучаем некоторые умные стратегии, призванные повысить скорость работы этих моделей без потери качества их результатов. Представьте себе, что вы пытаетесь повысить скорость гоночного автомобиля, гарантируя, что он по-прежнему сможет безупречно проходить крутые повороты — это то, к чему мы стремимся с помощью больших языковых моделей. Мы рассмотрим такие методы, как непрерывная пакетная обработка, которая помогает обрабатывать информацию более плавно, а также инновационные подходы, такие как Paged и Flash Attention, которые делают LLM более внимательными и быстрыми в своих цифровых рассуждениях.

Итак, если вам интересно расширить границы возможностей этих гигантов искусственного интеллекта, вы попали по адресу. Давайте вместе исследуем, как эти передовые методы формируют будущее LLM, делая их быстрее и лучше, чем когда-либо прежде.

Проблемы в достижении более высокой пропускной способности для LLM

Достижение более высокой пропускной способности в моделях большого языка (LLM) сталкивается с несколькими серьезными проблемами, каждая из которых препятствует скорости и эффективности работы этих моделей. Одним из основных препятствий является огромная потребность в памяти, необходимой для обработки и хранения огромных объемов данных, с которыми работают эти модели. По мере того как LLM становятся все более сложными и размерами, потребность в вычислительных ресурсах возрастает, что затрудняет поддержание, не говоря уже о повышении скорости обработки.

Еще одной серьезной проблемой является авторегрессионный характер LLM, особенно в моделях, используемых для генерации текста. Это означает, что результат каждого шага зависит от предыдущих, создавая требования к последовательной обработке, которые по своей сути ограничивают скорость выполнения задач. Эта последовательная зависимость часто приводит к возникновению узких мест, поскольку каждый шаг должен ждать завершения своего предшественника, прежде чем он сможет продолжить, что затрудняет усилия по достижению более высокой пропускной способности.

Кроме того, баланс между точностью и скоростью очень тонкий. Повышение пропускной способности без ущерба для качества выходных данных — это трудная задача, требующая инновационных решений, которые помогут ориентироваться в сложном ландшафте эффективности вычислений и эффективности моделей.

Эти проблемы формируют фон, на котором достигаются успехи в оптимизации LLM, расширяя границы возможного в области обработки естественного языка и за его пределами.

Требования к памяти

Фаза декодирования генерирует один токен на каждом временном шаге, но каждый токен зависит от тензоров ключей и значений всех предыдущих токенов (включая тензоры KV входных токенов, вычисленные при предварительном заполнении, и любые новые тензоры KV, вычисленные до текущего временного шага). .

Поэтому, чтобы каждый раз минимизировать избыточные вычисления и избежать повторного вычисления всех этих тензоров для всех токенов на каждом временном шаге, можно кэшировать их в памяти графического процессора. На каждой итерации, когда вычисляются новые элементы, они просто добавляются в работающий кеш для использования в следующей итерации. По сути, это известно как кэш KV.

Это значительно сокращает объем необходимых вычислений, но приводит к увеличению требований к памяти наряду с и без того более высокими требованиями к памяти для больших языковых моделей, что затрудняет их работу на стандартных графических процессорах. С увеличением размера параметров модели (от 7 до 33 байт) и более высокой точности (от fp16 до fp32) также возрастают требования к памяти. Давайте посмотрим пример требуемого объема памяти:

Как мы знаем, двумя основными обитателями памяти являются

  1. Собственные веса модели в памяти отсутствуют. таких параметров, как 7B, и тип данных каждого параметра, например, 7B в fp16 (2 байта) ~= 14 ГБ в памяти
  2. Кэш KV: Кэш, используемый для значения ключа на этапе самообслуживания, чтобы избежать избыточных вычислений.

Размер кэша KV на токен в байтах = 2 * (число_слоев) * (скрытый_размер) * точность_в_байтах

Первый фактор 2 учитывает матрицы K и V. Эти скрытые_размеры и dim_head можно получить из карты модели или файла конфигурации.

Приведенная выше формула рассчитана для каждого токена, поэтому для входной последовательности это будет seq_len * size_of_kv_per_token. Таким образом, приведенная выше формула преобразуется в:

Общий размер кэша KV в байтах = (длина_последовательности) * 2 * (число_слоев) * (скрытый_размер) * точность_в_байтах

Например, для LLAMA 2 в fp16 размер будет (4096) * 2 * (32) * (4096) * 2, что составляет ~ 2 ГБ.

Вышеупомянутое относится к одному входу, при наличии нескольких входов этот объем быстро растет, поэтому выделение и управление памятью на лету становится решающим шагом для достижения оптимальной производительности, если не приводит к нехватке памяти и проблемам фрагментации.

Иногда требования к памяти превышают мощность нашего графического процессора, в таких случаях нам нужно изучить модельный параллелизм, тензорный параллелизм, который здесь не рассматривается, но вы можете изучить его.

Авторегрессия и работа с привязкой к памяти

Как мы видим, часть формирования выходных данных больших языковых моделей носит авторегрессионный характер. Указывает на создание любого нового токена, это зависит от всех предыдущих токенов и их промежуточных состояний. Поскольку на этапе вывода не все токены доступны для дальнейших вычислений и имеется только один вектор (для следующего токена) и блок предыдущего этапа, это становится похоже на матрично-векторную операцию, которая недостаточно использует вычислительные возможности графического процессора, когда по сравнению с этапом предварительного заполнения. В задержке доминирует скорость, с которой данные (веса, ключи, значения, активации) передаются в графический процессор из памяти, а не то, насколько быстро происходят вычисления. Другими словами, это операция , привязанная к памяти .

Инновационные решения для решения проблем с пропускной способностью

Непрерывное дозирование

Самый простой шаг для уменьшения ограничений памяти на этапе декодирования — это пакетирование входных данных и выполнение вычислений для нескольких входных данных одновременно. Но простая постоянная пакетная обработка привела к низкой производительности из-за природы генерируемых последовательностей различной длины, и здесь задержка пакета зависит от самой длинной последовательности, которая генерируется в пакете, а также от растущих требований к памяти, поскольку требуется несколько входных данных. теперь обрабатывается сразу.

Поэтому простое статическое дозирование неэффективно и наступает непрерывное дозирование. Его суть заключается в динамическом агрегировании пакетов входящих запросов, адаптации к меняющейся скорости поступления и использовании возможностей параллельной обработки, когда это возможно. Это также оптимизирует использование памяти за счет группировки последовательностей одинаковой длины в каждом пакете, что сводит к минимуму объем заполнения, необходимый для более коротких последовательностей, и позволяет избежать траты вычислительных ресурсов на чрезмерное заполнение.

Он адаптивно регулирует размер пакета на основе таких факторов, как текущий объем памяти, вычислительные ресурсы и длина входной последовательности. Это гарантирует, что модель работает оптимально в различных условиях без превышения ограничений памяти. Это помогает постраничному вниманию (поясняется ниже) помогает уменьшить задержку и увеличить пропускную способность.

Читайте также: Как непрерывная пакетная обработка обеспечивает 23-кратное увеличение пропускной способности при выводе LLM при одновременном снижении задержки p50.

Страничное внимание

Поскольку мы выполняем пакетную обработку для повышения пропускной способности, это также происходит за счет увеличения требований к кэш-памяти KV, поскольку теперь мы обрабатываем несколько входных данных одновременно. Эти последовательности могут превышать объем памяти доступных вычислительных ресурсов, что делает нецелесообразным их полную обработку.

Также замечено, что простое распределение памяти в кэше KV приводит к значительной фрагментации памяти, как мы наблюдаем в компьютерных системах из-за неравномерного распределения памяти. vLLM представила Paged Attention — метод управления памятью, основанный на концепциях подкачки и виртуальной памяти операционной системы, позволяющий эффективно справляться с растущими требованиями к кэш-памяти KV.

Paged Attention устраняет ограничения памяти, разделяя механизм внимания на более мелкие страницы или сегменты, каждый из которых охватывает подмножество входной последовательности. Вместо того, чтобы вычислять оценки внимания для всей входной последовательности сразу, модель фокусируется на одной странице за раз, обрабатывая ее последовательно.

Во время вывода или обучения модель перебирает каждую страницу входной последовательности, вычисляя показатели внимания и соответствующим образом генерируя выходные данные. После обработки страницы ее результаты сохраняются, и модель переходит к следующей странице.

Разделяя механизм внимания на страницы, Paged Attention позволяет модели большого языка обрабатывать входные последовательности произвольной длины, не превышая ограничений памяти. Это эффективно уменьшает объем памяти, необходимый для обработки длинных последовательностей, что делает возможным работу с большими документами и пакетами.

Читайте далее: Быстрое обслуживание LLM с помощью vLLM и PagedAttention.

Вспышка внимания

Поскольку механизм внимания имеет решающее значение для моделей-трансформеров, на которых основаны большие языковые модели, он помогает модели сосредоточиться на соответствующих частях входного текста при составлении прогнозов. Однако по мере того, как модели на основе трансформаторов становятся больше и сложнее, механизм самообслуживания становится все более медленным и требовательным к памяти, что приводит к проблеме «узкого места» памяти, как упоминалось ранее. Flash Attention — это еще один метод оптимизации, целью которого является смягчение этой проблемы за счет оптимизации операций внимания, что позволяет ускорить обучение и выводы.

Ключевые особенности Flash Attention:

Kernel Fusion: важно не просто максимизировать использование вычислительных ресурсов графического процессора, но и обеспечить максимальную эффективность операций. Flash Attention объединяет несколько этапов вычислений в одну операцию, уменьшая необходимость в повторяющейся передаче данных. Такой оптимизированный подход упрощает процесс реализации и повышает эффективность вычислений.

Мозаичное размещение: Flash Attention делит загруженные данные на более мелкие блоки, обеспечивая параллельную обработку. Эта стратегия оптимизирует использование памяти, обеспечивая масштабируемые решения для моделей с большими размерами входных данных.

(Объединенное ядро ​​CUDA, показывающее, как мозаика и объединение сокращают время, необходимое для вычислений. Источник изображения: FlashAttention: быстрое и эффективное использование памяти Exact Attention с учетом ввода-вывода)

Оптимизация памяти: Flash Attention загружает параметры только для нескольких последних токенов, повторно используя активации из недавно вычисленных токенов. Этот подход со скользящим окном уменьшает количество запросов ввода-вывода для загрузки весов и максимизирует пропускную способность флэш-памяти.

Уменьшение передачи данных: Flash Attention сводит к минимуму обратную передачу данных между типами памяти, такими как память с высокой пропускной способностью (HBM) и SRAM (статическая память с произвольным доступом). Загружая все данные (запросы, ключи и значения) только один раз, вы снижаете затраты на повторную передачу данных.

Практический пример – оптимизация вывода с помощью спекулятивного декодирования

Другой метод, используемый для ускорения генерации текста в модели авторегрессионного языка, - это спекулятивное декодирование. Основная цель спекулятивного декодирования — ускорить генерацию текста при сохранении качества генерируемого текста на уровне, сравнимом с качеством целевого распределения.

Спекулятивное декодирование представляет собой небольшую/черновую модель, которая прогнозирует последующие токены в последовательности, которые затем принимаются/отклоняются основной моделью на основе заранее определенных критериев. Интеграция эскизной модели меньшего размера с целевой моделью значительно повышает скорость генерации текста, это связано с характером требований к памяти. Поскольку эскизная модель небольшая, ее требуется меньше. весов нейронов, подлежащих загрузке, и номер. Объем вычислений теперь меньше по сравнению с основной моделью, это уменьшает задержку и ускоряет процесс генерации выходных данных. Затем основная модель оценивает полученные результаты и гарантирует, что они соответствуют целевому распределению следующего вероятного токена.

По сути, спекулятивное декодирование оптимизирует процесс генерации текста, используя меньшую и более быструю черновую модель для прогнозирования последующих токенов, тем самым ускоряя общую скорость генерации текста, сохраняя при этом качество сгенерированного контента, близкое к целевому распределению.

Очень важно, что токены, генерируемые моделями меньшего размера, не всегда постоянно отклоняются, в этом случае производительность приводит к снижению, а не к улучшению. Посредством экспериментов и характера вариантов использования мы можем выбрать меньшую модель/ввести спекулятивное декодирование в процесс вывода.

Заключение

Знакомство с передовыми методами повышения производительности модели большого языка (LLM) освещает путь вперед в области обработки естественного языка, демонстрируя не только проблемы, но и инновационные решения, которые могут их решить. Эти методы, от непрерывной пакетной обработки до страничного и мгновенного внимания, а также интригующий подход спекулятивного декодирования, представляют собой нечто большее, чем просто постепенные улучшения. Они представляют собой значительный шаг вперед в нашей способности делать большие языковые модели быстрее, эффективнее и, в конечном счете, более доступными для широкого спектра приложений.

Значение этих достижений невозможно переоценить. Оптимизируя пропускную способность LLM и повышая производительность, мы не просто дорабатываем двигатели этих мощных моделей; мы переосмысливаем то, что возможно с точки зрения скорости и эффективности обработки. Это, в свою очередь, открывает новые горизонты для применения большой языковой модели: от служб языкового перевода в режиме реального времени, которые могут работать со скоростью разговора, до продвинутых аналитических инструментов, способных обрабатывать огромные наборы данных с беспрецедентной скоростью.

Более того, эти методы подчеркивают важность сбалансированного подхода к оптимизации больших языковых моделей, который тщательно учитывает взаимодействие между скоростью, точностью и вычислительными ресурсами. Поскольку мы расширяем границы возможностей LLM, поддержание этого баланса будет иметь решающее значение для обеспечения того, чтобы эти модели могли продолжать служить универсальными и надежными инструментами во множестве отраслей.

Передовые методы повышения производительности больших языковых моделей — это больше, чем просто технические достижения; они являются вехами в продолжающейся эволюции искусственного интеллекта. Они обещают сделать LLM более адаптируемым, более эффективным и мощным, открывая путь для будущих инноваций, которые будут продолжать трансформировать наш цифровой ландшафт.

Узнайте больше об архитектуре графического процессора для оптимизации вывода больших языковых моделей в нашем недавнем сообщении в блоге.