Как мы создали LLM нового поколения DeepL с использованием FP8 для обучения и вывода

В этой статье
- В чем заключается разница между форматами BF16 и FP8?
- Предварительное обучение для DeepL LLMs
- Применение формата FP8 для обучения со смешанной точностью
- FP8 и BF16 для эффективности обучения
- FP8 и BF16 для качества обучения большой языковой модели
- FP8 против BF16: качество обучения последующего
- От обучения FP8 до вывода
- Преимущества FP8 для инференции
- Об авторах
Когда DeepL устанавливала нашу текущую систему NVIDIA DGX SuperPOD с 544 графическими процессорами NVIDIA H100 Tensor Core, мы не только получили значительное увеличение вычислительной мощности. H100 также представляет встроенную поддержку 8-разрядных типов данных с плавающей запятой (FP8) благодаря новому поколению тензорных ядер, которые позволяют графическому процессору выполнять умножение матриц и другие тензорные операции с точностью FP8. Выполняя умножение матриц в FP8, мы можем увеличить пропускную способность при обучении и устанавливать наши большие языковые модели (LLM), поскольку большая часть вычислений, используемых в современных LLM, выполняется в виде умножения матриц.
Переход от 16-битной к 8-битной точности вычислений оказал значительное влияние на разработку LLM нового поколения DeepL. Это позволяет нам создавать гораздо более крупные языковые модели языкового ИИ с большим количеством параметров, которые позволяют улучшить качество по оценке языковых экспертов, но в пределах того же окна задержки для производственного вывода. Это означает, что переводы превосходят наши предыдущие модели в 1,4 раза для европейских языков и в 1,7 раза для более сложных языковых пар, таких как английский и японский, но при этом обеспечивают эффективные результаты с той же скоростью. Это также означает, что наши модели могут обрабатывать большее количество запросов по большему количеству функций и функций без ущерба для пользовательского опыта.
Другими словами, обучение и инференция FP8 сыграли центральную роль в масштабировании языкового ИИ DeepL.
В данной публикации мы хотим описать путь, который мы прошли, чтобы применить FP8 для обучения и инференции, поделиться некоторыми инструментами и методами, лежащими в основе этого успеха, а также предоставить вам представление о результатах, которые мы получаем в плане производительности обучения и инференции.
В чем заключается разница между форматами BF16 и FP8?
Простой ответ на разницу между BFloat16 (BF16) и FP8 заключается в том, что последний использует в два раза меньше битов для выражения значений. Фактически BF16 использует 16 доступных позиций в двух байтах по 8 бит каждый. FP8 использует только один байт.
Количество доступных битов определяет точность, с которой можно устанавливать элементы мантиссы и экспоненты чисел с плавающей запятой в научной нотации. BF16 имеет 1 бит знака, 8 битов для экспоненты и 7 битов для мантиссы. FP8 имеет в два раза меньше битов: 1 бит знака и 7 битов, разделенных между экспонентой и мантиссой. В связи с этим он имеет меньший диапазон и более низкую точность, чем BF16. Он может представлять более узкий диапазон и меньшее количество чисел в этом диапазоне.
В качестве примера, предположим, что мы хотим представить возраст Земли в миллиардах лет (примерно 4,543). В BF16 мы можем точно представить это как 0100000010010001.
Как насчет представления этого числа в FP8? На самом деле существует два формата FP8 на выбор: E4M3 и E5M2. Буквы и цифры здесь обозначают способ распределения битов между экспонентой (E) и мантиссой (M). Чем больше битов вы выделяете для экспоненты, тем больше диапазон чисел, которые вы можете описать, и чем больше битов вы выделяете для мантиссы, тем больше чисел вы можете описать в этом диапазоне.
Независимо от выбранного формата FP8, точное представление числа 4,543 фактически невозможно. Если вы выберете E4M3 с его относительно большей точностью, вы сможете получить наиболее близкий результат (4,5). В E5M2 максимально возможное значение составляет 5.
С другой стороны, несмотря на недостаточный диапазон и точность, FP8 обеспечивает более быстрое выполнение вычислений и требует значительно меньше памяти по сравнению с BF16. Это чрезвычайно ценно для вывода, и при правильном подходе может быть чрезвычайно ценно и для ускорения процесса обучения. Все сводится к вопросу о том, насколько широкий диапазон и высокая точность действительно необходимы для обучения большой языковой модели. Вам необходимо точно указать возраст Земли? Или приблизиться на 43 миллиона лет достаточно близко? Если вас интересует Вселенная в целом, вам, вероятно, подойдет второй уровень точности. Ошибка округления составляет всего около 0,3% от возраста Вселенной.
Путь DeepL демонстрирует, что FP8 может обеспечить все необходимое для высококачественного обучения большой языковой модели, что открывает новые возможности для того, чтобы обучать наши модели и устанавливать их в практике.
Предварительное обучение для DeepL LLMs
Наше путешествие, которое мы берем с обучением и инференсом FP8, начинается с предварительного обучения наших LLM. После предварительной подготовки мы обучаем наши модели для определенных задач, преобразуем крупные модели в более компактные, применяем метод усиленного обучения и устанавливаем ряд стратегий параллелизации, чтобы эффективно использовать имеющиеся в нашем распоряжении значительные ресурсы графических процессоров.
Применение формата FP8 для обучения со смешанной точностью
Мы перевели наш существующий код обучения с BF16 на FP8 с помощью NVIDIA Transformer Engine: библиотеку обучения, предоставляемую NVIDIA, которая ускоряет обучение трансформерных моделей и поддерживает FP8. Transformer Engine предоставляет важные компоненты, которые облегчают обучать со смешанной точностью, обеспечивая бесперебойное управление преобразованием между форматами FP8 и BF16 и обработку коэффициентов масштабирования.
Мы используем стандартные настройки Transformer Engine, рекомендованные NVIDIA, применяя E4M3 в прямом проходе для обучения, а затем E5M2 в обратном проходе. Это означает, что мы используем формат с более высокой точностью для прогнозирования вероятностного распределения следующего токена, а затем формат с более низкой точностью, но с более широким диапазоном, для вычисления градиентов, необходимых для обновления модели, когда точность не столь важна. Мы используем каждый из двух форматов для задач, для которых он наиболее подходит.
На приведенном ниже графике мы отобразили все числа, которые могут быть представлены в формате E4M3. Как вы можете заметить, эти числа сосредоточены вокруг нуля, а их максимальное значение составляет менее 500. Фактически, количество представленных значений для форматов FP8 можно отобразить в очень короткой таблице. Ключ к успешному использованию этого формата для обучения заключается в понимании распределения этих значений и работе в рамках этого распределения.
Это предполагает хранение дополнительных коэффициентов масштабирования наряду с тензорами весов FP8 для преодоления ограниченного диапазона и предотвращения переполнения и недополнения. При выполнении вычислений с тензорами низкой точности необходимо также учитывать коэффициенты масштабирования. Например, при умножении двух тензоров используется формула: (A_fp8 * A_scale) x (B_fp8 * B_scale), где A_fp8 и B_fp8 являются 8-битными тензорами, а масштабы — 32-битными скалярными величинами. Для этих операций предусмотрено специальное оборудование, которое поддерживает их.

FP8 и BF16 для эффективности обучения
Когда мы говорим о производительности обучения, мы имеем в виду, насколько быстро модель может быть обучена с учетом доступной ей вычислительной мощности. Для сравнения эффективности обучения между FP8 и BF16 мы рассматриваем коэффициент использования FLOPS модели (MFU), который представляет собой количество операций с плавающей запятой в секунду (FLOPS), выполняемых моделью, в процентах от FLOPS, технически возможных с имеющимся аппаратным обеспечением.
Для сравнения мы использовали количество FLOPS, возможное с форматом BF16, в качестве общего знаменателя, несмотря на то, что с технической точки зрения при переходе на FP8 становится возможным большее количество FLOPS. Это позволило нам оценить прирост производительности при использовании доступных вычислительных мощностей, который становится возможным при переходе с BF16 на FP8.
Как показано на графике ниже, эффективность использования вычислительной мощности при обучать нашу модель увеличилась с 44,6 % MFU до 67 % MFU с FP8, что позволило ускорить обучать модель на 50 %.

Это впечатляющий прирост производительности. Для достижения этой цели мы сотрудничали с NVIDIA, чтобы оптимизировать использование функций Transformer Engine. На основе другой конфигурации обучения нам удалось постепенно повысить эффективность обучения на 25 % в течение 15 месяцев, что позволило нам достичь 80 % MFU.

FP8 и BF16 для качества обучения большой языковой модели
Таким образом, преимущества FP8 с точки зрения эффективности обучения действительно впечатляют. Однако, результат, который действительно важен для DeepL, — это качество обучения. Как это соотносится с качеством обучения с точностью BF16?
Для проверки качества, обеспечиваемого FP8, мы протестировали обучать одну из наших моделей в обоих форматах. Это позволило нам сравнить потери при обучении и качество на последующих этапах.
Мы обучали модель объемом 1,5 млрд токенов на трех триллионах токенов, а затем сравнили качество обучения FP8 и BF16. Ключевым показателем здесь была потеря при обучении, которая отражает способность модели предсказывать следующий токен.
Как видно из приведенного ниже графика, мы обнаружили небольшое превосходство BF16 над FP8, о чем свидетельствует линия FP8, проходящая чуть выше линии BF16. Однако эта разница заглушается гораздо более широкими колебаниями потери обучения от одного шага к другому, которые происходят для обоих форматов, и в обоих случаях мы наблюдаем то же самое ощутимое улучшение в минимизации потери обучения с течением времени.

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

В результате перехода с BF16 на FP8 мы можем обучать наши модели быстрее, с меньшими требованиями к памяти, и достигать того же качества обучения с минимальным снижением потери обучения и сопоставимой валидационной сложностью. Это фактически означает, что DeepL способен создавать более сложные модели, решать более сложные задачи, максимально используя вычислительную мощность. Это значительно расширяет возможности обучения с помощью больших языковых моделей.
От обучения FP8 до вывода
Следующий этап работы включает подготовку LLM к производственному инференсу. Здесь основную работу по поддержке выполняет NVIDIA TensorRT-LLM, решение NVIDIA для масштабируемого вывода LLM, которое поддерживает FP8. Он использует веса вашей модели, полученные во время обучения, и создает механизм для оптимизации работы модели с целью достижения максимальной вычислительной эффективности, используя такие методы оптимизации, как слияние ядер, оптимизированный код C++/CUDA, кэширование KV и непрерывная пакетная обработка.
Преимущества FP8 для инференции
Вывод для LLM всегда предполагает взаимодействие пропускной способности (количество токенов, которые могут быть обработаны за определенный промежуток времени) и задержки. Само собой разумеется, что для обеспечения наилучшего качества обслуживания клиентов необходимо контролировать задержки. Однако пропускная способность также имеет большое значение для DeepL, поскольку она определяет количество запросов, которые мы можем обработать в данный момент времени, и, следовательно, объем того, что наша модель может сделать на практике.
С увеличением пропускной способности неизбежно увеличивается и задержка. Объединение нескольких запросов в пакеты позволяет увеличить пропускную способность, однако при этом увеличивается задержка для каждого индивидуального запроса. Это может повлиять на качество обслуживания клиентов. Однако производительность FP8 по сравнению с BF16 значительно изменяет этот баланс в нашу пользу.
Как показано на графике ниже, для большинства размеров пакетов FP8 может обрабатывать вдвое большую пропускную способность при той же степени задержки, что и BF16. Если мы установим определенный бюджет задержки, который соответствует оптимальному опыту для наших пользователей, мы сможем увидеть это на практике. Фактически, FP8 эффективно удвоила эффективную пропускную способность наших LLM с точки зрения производительности.

Другими словами, переход с BF16 на FP8 не только позволил нам создать более мощные и сложные LLM для DeepL. Это также гарантирует, что мы можем эффективно применять эти LLM, чтобы обеспечить оптимальный клиентский опыт и масштабировать влияние нашего языкового ИИ в реальных условиях. Мы получаем более быстрое обучение более крупных моделей, которые затем могут работать с теми же параметрами задержки, обрабатывая при этом вдвое больше запросов.
Что будет дальше? Недавно мы установили новую систему NVIDIA DGX SuperPOD с системами NVIDIA DGX GB200, которая обеспечивает еще более значительное увеличение вычислительной мощности. Для нас особенно интересно, что эта машина представит новое поколение Tensor Cores, которые могут изначально поддерживать тензорные операции FP4, такие как умножение матриц. Именно тогда наше путешествие начинается заново. Было интересно узнать, что мы можем сделать с одним байтом при обучении и выводе. Пожалуйста, следите за обновлениями, чтобы узнать, что можно сделать с половиной байта.
Об авторах
Маркус Шнес, штатный инженер-исследователь в области высокопроизводительных вычислений
Маркус Шнес является штатным инженером по высокопроизводительным вычислениям в DeepL, где он занимается масштабированием процесса обучения и инференции больших языковых моделей. Он проявляет особый интерес к распределенному обучению и вычислениям с плавающей запятой низкой точности.
www.linkedin.com/in/markus-schnoes-349300185
Фабиан Йосвиг, штатный инженер-исследователь в области высокопроизводительных вычислений
Фабиан Йосвиг является штатным инженером-исследователем в DeepL, обладающим опытом в области машинного обучения, высокопроизводительных вычислений и теоретической физики элементарных частиц. Он занимается масштабированием моделей ИИ и инфраструктуры для самого точного переводчика в мире.