Як ми створили LLM нового покоління DeepL з FP8 для навчання та інференції

Коли DeepL розгортав наш поточний NVIDIA DGX SuperPOD з 544 графічними процесорами NVIDIA H100 Tensor Core, ми отримали не тільки значне збільшення обчислювальної потужності. H100 також впроваджує підтримку вбудованого 8-бітного типу даних з плаваючою комою (FP8) завдяки новому поколінню Tensor Cores, які дозволяють GPU виконувати множення матриць та інші тензорні операції з точністю 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. Це надзвичайно цінно для виведення висновків, а при правильному підході може бути надзвичайно цінним і для прискорення процесу навчання. Все зводиться до питання, наскільки великий діапазон і точність насправді потрібні для того, щоб навчати LLM. Чи потрібно точно вказувати вік Землі? Або ж 43 мільйони років — це достатньо близько? Якщо вас цікавить Всесвіт в цілому, то, ймовірно, ви будете задоволені другим рівнем точності. Адже похибка округлення становить лише близько 0,3% від віку Всесвіту.

Досвід DeepL доводить, що FP8 може забезпечити все необхідне для високоякісного навчання LLM, що відкрило нові можливості для того, щоб наші моделі навчалися, та для того, щоб їх розгортали в практиці.

Попереднє навчання для 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, ми розглядаємо використання Model 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 для якості навчання LLM

Тому переваги FP8 в термінах ефективності навчання дійсно дуже вражаючі. Однак результат, який нас дійсно цікавить як DeepL, — це якість навчання. Як це можна порівняти з якістю навчання, коли точність – BF16?

Щоб перевірити якість, яку забезпечує FP8, ми навчили одну з наших моделей в обох форматах. Це дозволило нам порівняти втрати під час навчання та якість на нижчих рівнях. 

Ми навчили модель розміром 1,5 млрд на трьох трильйонах токенів, а потім порівняли якість навчання FP8 та BF16. Ключовим показником тут була втрата навчання, яка позначає здатність моделі передбачати наступний токен.

Як ви можете бачити на графіку нижче, ми виявили невелику перевагу BF16 над FP8, про що свідчить лінія FP8, яка знаходиться трохи вище лінії BF16. Однак ця різниця загублюється на тлі набагато більших коливань втрат під час навчання від одного кроку до іншого, які відбуваються для обох форматів, і в обох випадках ми бачимо те саме відчутне покращення в мінімізації втрат під час навчання з часом.

Якість навчання FP8 проти BF16 на вихідному рівні

Потім ми перейшли до тестування якості, яку забезпечують навчання в FP8 та BF16 у практичному застосуванні на нижньому рівні.

У цьому випадку ми перевірили, як модель працює з англійською та німецькою мовами. Ми порівняли валідаційну складність, яка кількісно оцінює невизначеність, з якою стикається модель при прогнозуванні наступного символу в послідовності. Знову ж таки, очікується, що з часом розгубленість зменшиться. У цьому практичному сценарії ми фактично не виявили погіршення якості, коли навчали FP8 порівняно з BF16.

В результаті переходу з BF16 на FP8 ми можемо швидше навчати наші моделі, зменшивши вимоги до пам'яті, і досягати такої ж якості навчання з мінімальним погіршенням термінів втрат під час навчання та порівнянною складністю валідації. Це фактично означає, що DeepL здатний створювати більш досконалі моделі, вирішуючи більш складні завдання, завдяки максимальному використанню обчислювальної потужності. Це значно розширює можливості навчати за допомогою LLM.

Від навчання 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, де він займається масштабуванням навчання та інференції великих мовних моделей (LLM). Він особливо цікавиться розподіленим навчанням та обчисленнями з низькою точністю з плаваючою комою.

www.linkedin.com/in/markus-schnoes-349300185

https://github.com/Marks101

Фабіан Йосвіг, штатний інженер-дослідник у галузі високопродуктивних обчислень

Фабіан Йосвіг — штатний інженер-дослідник у DeepL, має досвід у галузі машинного навчання, високопродуктивних обчислень та теоретичної фізики елементарних частинок. Він зосереджується на масштабуванні моделей ШІ та інфраструктури для найточнішого перекладача у світі.

https://www.linkedin.com/in/fabianjoswig/

https://github.com/fjosw

Share