Модели и платформы ИИ

UltraFastBERT: Введение в экспоненциально более быстрое языковое моделирование

mm
Добавьте Unite.AI в избранные источники в Google

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

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

Эта статья представляет UltraFastBERT, основанную на BERT фреймворк, соответствующий по эффективности ведущим моделям BERT, но использующий только 0,3% нейронов во время вывода, а именно 12 из 4095 нейронов в каждом слое. Мы рассмотрим архитектуру UltraFastBERT, функциональность и результаты. Давайте начнем.

UltraFastBERT: Введение в экспоненциально более быстрое языковое моделирование

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

В своей основе, фреймворк UltraFastBERT является вариантом фреймворка BERT, основанного на этой концепции, и заменяет прямые слои на более быстрые прямые сети в своей архитектуре, что в конечном итоге приводит к тому, что фреймворк UltraFastBERT использует только 0,3% доступных нейронов, обеспечивая результаты, сравнимые с моделями BERT аналогичного размера и процесса обучения, особенно на задачах вниз по потоку. Благодаря своим дизайнерским реализациям, промежуточные слои в фреймворке UltraFastBERT экспоненциально быстрее.

Учитывая быструю прямую сеть (FFF) и прямую сеть (FF), каждую с n нейронами, временная сложность прямого прохода в прямой сети равна O(n), тогда как временная сложность равна O(log2n) для быстрой прямой сети, и разница во временной сложности в основном обусловлена тем, что в быстрой прямой сети нейроны организованы в сбалансированное бинарное дерево, и когда вводится вход, сеть выполняет только одну ветвь дерева условно. Кроме того, выполнение вывода на быстрой прямой сети приводит к условному умножению матриц (CMM), при котором входные строки скалярно умножаются с естественными весовыми столбцами индивидуально, и выход предыдущей операции точечного произведения определяет вес столбцов для продолжения. В результате сеть использует все нейроны только для нескольких входов, и ни один вход не требует более нескольких нейронов для обработки сетью. Умножение CMM контрастирует с плотным умножением матриц (DMM), которое вычисляет скалярное произведение всех входов со всеми весовыми столбцами.

Чтобы суммировать, UltraFastBERT – это основанный на BERT фреймворк, обеспечивающий результаты, сравнимые с ведущими моделями BERT, которые

  1. Использует только 0,3% доступных нейронов во время вывода, и использует только 12 нейронов из общего количества 4095 нейронов для каждого слоя вывода.
  2. Обеспечивает сильную производительность, сравнимую с ведущими моделями BERT, реализуя стратегии тонкой настройки на задачах вниз по потоку.
  3. Предоставляет родную реализацию условного умножения матриц (CMM), которая образует основу для быстрой прямой сети, и в конечном итоге приводит к 78-кратному увеличению производительности по сравнению с родной оптимизированной плотной матричной умножением (DMM).

Прямые нейронные сети

Прямая нейронная сеть является одной из наиболее простых искусственных нейронных сетей, которая перемещает информацию только в прямом направлении, от входных узлов к выходным узлам через скрытые узлы. Одним из основных преимуществ прямой нейронной сети является то, что в таких сетях нет петель или циклов, и они проще в构造е по сравнению с РНН или рекуррентными нейронными сетями и КНН или классическими нейронными сетями. Архитектура прямой нейронной сети состоит из трех компонентов: входных слоев, скрытых слоев и выходных слоев, и каждый слой состоит из единиц, называемых нейронами, и каждый слой связан с другим с помощью весов.

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

Двигаясь дальше, в работе прямой нейронной сети есть два ключевых этапа: прямая фаза и фаза обратного распространения.

Прямая фаза

В прямой фазе входные данные вводятся в сеть, и она затем распространяется вперед. Скрытые слои вычисляют взвешенную сумму входных данных и вводят нелинейность в модель, передавая сумму входных данных через функцию активации, такую как ReLu, Sigmoid и TanH. Процесс повторяется снова и снова, пока веса не достигнут выходного слоя, и модель делает прогноз.

Фаза обратного распространения

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

UltraFastBERT: Архитектура модели и работа

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

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

Двигаясь дальше, во время обучения фреймворк UltraFastBERT следует процедуре обучения, используемой фреймворком crammedBERT, которая включает в себя отключение dropout во время предварительного обучения и использование 1-цикличного треугольного графика скорости обучения. Модель затем подвергается тонкой настройке для максимизации ее производительности на широком спектре задач, в основном из набора данных GLUE, в течение общей продолжительности 5 эпох.

Вывод

Вывод является важным компонентом для быстрой прямой сети, и эти быстрые прямые сети сами по себе образуют значительную часть больших языковых моделей, и они известны своим исключительным ускорительным потенциалом. Чтобы понять этот ускорительный потенциал, давайте рассмотрим пример одной из наиболее продвинутых языковых моделей, GPT-3, в которой прямые сети в каждом трансформер-слое состоят из более 49 100 нейронов. Если быстрое прямое дерево (максимальная глубина 15) могло заменить исходную прямую сеть, введенное быстрое прямое дерево имело бы более 65 000 нейронов, но оно использовало бы только 16 из этих нейронов для вывода, что составляет примерно 0,03% от доступных нейронов GPT-3.

Алгоритм и совместимость

Фреймворк UltraFastBERT использует рекурсивный псевдокодовый алгоритм для быстрого прямого вывода, и алгоритм изображен на изображении ниже.

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

Важно отметить, что в качестве части быстрой прямой сети однопоточное плотное умножение матриц полагается на выполнение инструкций умножения и накопления (MAC), и в результате замена DMM на подход CMM принесет пользу ЦП, поскольку для вычисления выхода слоя на каждый элемент требуется меньше инструкций MAC. Следовательно, несмотря на то, что в нем используется условность, обычно связанная с ветвлением, “нейронное ветвление” действует как добавление к смещению памяти для соответствующих указателей в фреймворке. Следовательно, в фреймворке UltraFastBERT предсказание ветвления инструкций никогда не полностью задействовано для облегчения условности CMM, и оно загружает только соответствующие столбцы матрицы весов индивидуально. Кроме того, поскольку фреймворк выполняет операции скалярного произведения строк и столбцов, векторная параллельная обработка SIMD все еще является хорошим вариантом для ускорения реализаций вывода для конкретных устройств.

UltraFastBERT: Производительность и результаты

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

Результаты тонкой настройки

Следующая фигура демонстрирует производительность различных моделей на наборе данных GLUE-dev. Здесь N представляет количество нейронов, доступных фреймворкам для обучения, “Avg” представляет средний балл всех задач.

Как можно четко увидеть, фреймворк UltraFastBERT, обученный на GPU A6000 в течение более 24 часов, удается сохранить почти 96% прогностической производительности на задачах вниз по потоку GLUE по сравнению с исходным фреймворком BERT. Кроме того, можно увидеть, что с увеличением глубины быстрых прямых сетей производительность фреймворков снижается, хотя большая часть ухудшения производительности происходит только для задачи CoLa. Если задачу CoLa暂енно отложить, фреймворк UltraFastBERT возвращает балл прогностической производительности около 98,6%.

Результаты вывода

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

  1. На уровне 1 реализация построена с помощью процедур BLAS уровня 1, а именно скалярно-векторного произведения и векторно-векторного скалярного произведения.
  2. На уровне 2 реализации используют процедуры BLAS уровня 2, а именно пакетные скалярно-векторные произведения и пакетные матрично-векторные скалярные произведения.
  3. На уровне 3 реализации используют непакетный подход матрично-матричному умножению BLAS уровня 3, и хотя это самый быстрый доступный подход для прямых сетей, такие реализации недоступны для быстрых прямых сетей, поскольку библиотека не поддерживает векторную разреженность условного умножения матриц.

Кроме того, фреймворк UltraFastBERT развертывает реализации GPU с помощью настраиваемых ядер CUDA или PyTorch.

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

Однако стоит отметить, что ускорения, сообщенные в вышеуказанной таблице, предназначены для “справедливых сравнений”, т. е. как быстрые прямые, так и прямые реализации используют одни и те же примитивные линейные алгебраические операции. Кроме того, на уровне 1 и уровне 2 реализации быстрых прямых сетей способны выполнять вывод в 48 и 78 раз быстрее, чем самая быстрая реализация прямой сети соответственно.

Окончательные мысли

В этой статье мы говорили об UltraFastBERT, варианте фреймворка BERT, основанном на концепции, что прямые слои не используют 100% доступных нейронов для генерации выхода для каждого входа во время вывода, что приводит к расточительству ресурсов, увеличивает сложность, время вычислений и вычислительные затраты, и заменяет прямые слои на более быстрые прямые сети в своей архитектуре, что в конечном итоге приводит к тому, что фреймворк UltraFastBERT использует только 0,3% доступных нейронов, обеспечивая результаты, сравнимые с моделями BERT аналогичного размера и процесса обучения, особенно на задачах вниз по потоку.

Благодаря своим дизайнерским реализациям промежуточные слои в фреймворке UltraFastBERT экспоненциально быстрее. Кроме того, сильная производительность, обеспеченная фреймворком UltraFastBERT, является доказательством того, что модели крупного языка (LLM) могут обеспечить сильную производительность, используя только часть своих параметров для отдельных выводов, поскольку фреймворк UltraFastBERT использует только 0,3% доступных нейронов во время вывода и все же достигает 78-кратного ускорения производительности по сравнению с временем вывода.

Kunal Kejriwal — backend‑инженер, специализирующийся на Python, PostgreSQL, Redis и облачной инфраструктуре в GCP и AWS. Имея три года опыта в построении и масштабировании производственных систем, он пишет об инфраструктуре ИИ, распределённых системах и архитектуре развертывания нагрузок машинного обучения.