Jak stworzyliśmy modele LLM nowej generacji DeepL z wykorzystaniem FP8 do trenowania i wnioskowania

Spis treści:
- Jaka jest różnica między formatami BF16 i FP8?
- Szkolenie wstępne dla modeli DeepL LLM
- Zastosowanie formatu FP8 do trenowania z mieszaną precyzją
- FP8 kontra BF16 pod względem wydajności trenowania
- FP8 kontra BF16 pod względem jakości trenowania LLM
- Jakość trenowania w dół FP8 vs BF16
- Od trenowania FP8 do wnioskowania
- Korzyści płynące z FP8 dla wnioskowania
- O autorach
Kiedy DeepL uruchomił wasz obecny system NVIDIA DGX SuperPOD z 544 procesorami graficznymi NVIDIA H100 Tensor Core, nie tylko uzyskałeś znaczny wzrost mocy obliczeniowej. H100 wprowadza również natywną obsługę 8-bitowych typów danych zmiennoprzecinkowych (FP8) dzięki nowej generacji rdzeni Tensor Core, które umożliwiają procesorowi graficznemu wykonywanie mnożenia macierzy i innych operacji tensorowych z dokładnością FP8. Obliczając mnożenie macierzy w FP8, możecie zwiększyć przepustowość podczas trenowania i uruchamiania waszych dużych modeli językowych (LLM), ponieważ większość obliczeń związanych z nowoczesnymi modelami LLM ma formę mnożenia macierzy.
Przejście z obliczeń 16-bitowych na 8-bitowe miało ogromny wpływ na rozwój modeli języka naturalnego (LLM) nowej generacji firmy DeepL. Pozwala nam to tworzyć znacznie większe modele technologii językowej AI, z dużo większą liczbą parametrów, które zapewniają znaczną poprawę jakości w ocenie ekspertów językowych, ale w ramach tego samego okna opóźnienia dla wnioskowania produkcyjnego. Oznacza to, że tłumaczenia są 1,4 razy lepsze od naszych poprzednich modeli w przypadku języków europejskich i 1,7 razy lepsze w przypadku bardziej złożonych par językowych, takich jak angielski i japoński, ale zapewniają równie szybkie wyniki. Oznacza to również, że nasze modele mogą obsłużyć większą liczbę żądań w ramach większej liczby funkcji i możliwości, bez uszczerbku dla doświadczenia użytkownika.
Innymi słowy, trenowanie i wnioskowanie FP8 odegrały kluczową rolę w skalowaniu technologii językowej AI DeepL.
W tym poście chcemy opisać drogę, jaką przebyliśmy, aby zastosować FP8 do trenowania i wnioskowania, podzielić się niektórymi narzędziami i technikami, które leżą u podstaw tego sukcesu, oraz przedstawić wyniki, jakie wygenerowaliśmy w terminach wydajności trenowania i wnioskowania.
Jaka jest różnica między formatami BF16 i FP8?
Proste wyjaśnienie różnicy między BFloat16 (BF16) a FP8 polega na tym, że ten drugi wykorzystuje o połowę mniej bitów do wyrażenia wartości. W praktyce BF16 wykorzystuje 16 dostępnych pozycji w dwóch bajtach po 8 bitów każdy. FP8 wykorzystuje tylko jeden bajt.
Liczba dostępnych bitów decyduje o precyzji, z jaką można uruchomić elementy mantysy i wykładnika liczb zmiennoprzecinkowych w notacji naukowej. BF16 ma 1 bit znaku, 8 bitów dla wykładnika i 7 bitów dla mantysy. FP8 ma o połowę mniej bitów do wykorzystania, z 1 bitem znaku i 7 bitami podzielonymi między wykładnik i mantysę. Z tego powodu ma mniejszy zasięg i mniejszą precyzję niż BF16. Może to oznaczać węższy zakres i mniejszą liczbę wartości w tym zakresie.
Załóżmy na przykład, że chcecie przedstawić wiek Ziemi w miliardach lat (około 4,543). W BF16 możemy to dokładnie przedstawić jako 0100000010010001.
A co z przedstawieniem tej liczby w formacie FP8? W rzeczywistości do wyboru są dwa formaty FP8: E4M3 i E5M2. Litery i cyfry oznaczają sposób rozłożenia bitów między wykładnikiem (E) a mantysą (M). Im więcej bitów przeznaczysz na wykładnik, tym większy zakres liczb możesz opisać, a im więcej bitów przeznaczysz na mantysę, tym więcej liczb możesz opisać w tym zakresie.
Niezależnie od wybranego formatu FP8, nie jest możliwe dokładne odwzorowanie wartości 4,543. Jeśli wybierzesz E4M3, który charakteryzuje się stosunkowo większą precyzją, możesz uzyskać najbliższy wynik (4,5). W E5M2 najbliższą wartością, jaką można uzyskać, jest 5.
Z drugiej strony, pomimo braku zakresu i precyzji, FP8 umożliwia szybsze obliczenia i wymaga znacznie mniej pamięci w porównaniu z BF16. Ma to ogromne znaczenie dla wnioskowania, a przy odpowiednim podejściu może być również niezwykle cenne dla przyspieszenia trenowania. Sprowadza się to do pytania, jak duży zakres i precyzja są faktycznie potrzebne do trenowania LLM. Czy musisz dokładnie przedstawić wiek Ziemi? A może zbliżenie się do 43 milionów lat jest wystarczające? Jeśli interesuje cię wszechświat jako całość, prawdopodobnie zadowoli cię ten drugi poziom precyzji. Błąd zaokrąglenia stanowi przecież tylko około 0,3% wieku wszechświata.
Historia DeepL dowodzi, że FP8 może zapewnić wszystko, co jest potrzebne do wysokiej jakości szkolenia modeli LLM, co otworzyło nowe możliwości w zakresie tego, do czego trenujemy nasze modele i jak je uruchomić w praktyce.
Szkolenie wstępne dla modeli DeepL LLM
Wasza podróż z wykorzystaniem trenowania i wnioskowania FP8 rozpoczyna się od wstępnego trenowania waszych modeli LLM. Po wstępnym trenowaniu dostosowujemy nasze modele do określonych zadań, przekształcamy duże modele w mniejsze, stosujemy uczenie się przez wzmocnienie i uruchomić zestaw strategii równoległości, abyśmy mogli wykorzystać ogromną liczbę posiadanych procesorów graficznych.
Zastosowanie formatu FP8 do trenowania z mieszaną precyzją
Przenieśliśmy nasz dotychczasowy kod szkoleniowy z BF16 do FP8 przy użyciu NVIDIA Transformer Engine: biblioteki trenującej dostarczanej przez firmę NVIDIA, która przyspiesza działanie modeli transformatorowych i obsługuje FP8. Transformer Engine zapewnia niezbędne komponenty, które ułatwiają trenowanie z wykorzystaniem mieszanej precyzji, płynnie zarządzając konwersją między formatami FP8 i BF16 oraz obsługując współczynniki skalowania.
Korzystamy z domyślnej konfiguracji silnika Transformer Engine, zgodnie z zaleceniami firmy NVIDIA, używając E4M3 w przejściu do przodu do trenowania, a następnie E5M2 w przejściu do tyłu. Oznacza to w praktyce, że używamy formatu o wyższej precyzji do przewidywania rozkładu prawdopodobieństwa następnego tokenu, a następnie formatu o niższej precyzji, ale większym zakresie, do obliczania gradientów niezbędnych do aktualizacji modelu, gdy precyzja ma mniejsze znaczenie. Każdy z tych dwóch formatów wykorzystujemy do zadań, do których najlepiej się nadaje.
Na poniższym wykresie przedstawiliśmy wszystkie liczby, które można przedstawić w formacie E4M3. Jak widać, liczby te skupiają się wokół zera, a ich maksymalna wartość wynosi mniej niż 500. W rzeczywistości liczbę wartości reprezentowanych przez formaty FP8 można przedstawić w bardzo krótkiej tabeli. Sztuczka polegająca na tym, aby ten format sprawdził się podczas trenowania, polega na świadomości rozkładu tych wartości i pracy w jego ramach.
Wymaga to przechowywania dodatkowych współczynników skalowania wraz z tensorami wag FP8, aby przezwyciężyć ograniczony zakres i zapobiec przepełnieniu i niedopełnieniu. Podczas wykonywania obliczeń z wykorzystaniem tensorów o niskiej precyzji należy również uwzględnić współczynniki skalowania. Na przykład, mnożąc dwa tensory, używasz wzoru: (A_fp8 * A_scale) x (B_fp8 * B_scale), gdzie A_fp8 i B_fp8 to tensory 8-bitowe, a skale to skalarne 32-bitowe. Dla tych operacji sprzęt jest w stanie obsługiwać.

FP8 kontra BF16 pod względem wydajności trenowania
Kiedy mówimy o wydajności trenowania, mamy na myśli szybkość, z jaką model może zostać trenowany przy użyciu dostępnej mocy obliczeniowej. Aby porównać wydajność trenowania między FP8 i BF16, przyglądamy się wykorzystaniu FLOPS modelu (MFU), czyli liczbie operacji zmiennoprzecinkowych na sekundę (FLOPS) wykonywanych przez model, wyrażonej jako procent FLOPS, które są technicznie możliwe do osiągnięcia przy użyciu dostępnego sprzętu.
W naszym porównaniu jako wspólny mianownik wykorzystaliśmy liczbę operacji FLOPS możliwych do wykonania w formacie BF16, mimo że z technicznego punktu widzenia po przejściu na format FP8 możliwe jest wykonanie większej liczby operacji FLOPS. Dzięki temu mogliśmy oszacować przyrost wydajności dostępnej mocy obliczeniowej, jaki jest możliwy po przejściu z BF16 na FP8.
Jak pokazano na poniższym wykresie, wydajność wykorzystania mocy obliczeniowej dostępnej podczas trenowania naszego modelu wzrosła z 44,6% MFU do 67% MFU dzięki FP8, co skutecznie przyspieszyło trenowanie naszego modelu o 50%.

To imponujący wzrost wydajności. Aby to osiągnąć, współpracowaliśmy z firmą NVIDIA w celu optymalizacji wykorzystania funkcji silnika Transformer Engine. W oparciu o inną konfigurację trenowania udało nam się stopniowo zwiększyć wydajność trenowania o 25% w ciągu 15 miesięcy, osiągając poziom 80% MFU.

FP8 kontra BF16 pod względem jakości trenowania LLM
Wyniki FP8 pod względem terminów trenowania są zatem naprawdę imponujące. Jednak tym, na czym naprawdę nam zależy w DeepL, jest jakość trenowania. Jak można to porównać do jakości trenowania z precyzją BF16?
Aby sprawdzić jakość dostarczaną przez FP8, przetestowaliśmy trenowanie jednego z waszych modeli w obu formatach. Umożliwiło wam to porównanie strat trenowanych i jakości końcowej.
Trenowaliśmy model 1,5B na trzech bilionach tokenów, a następnie porównaliśmy jakość trenowania FP8 z BF16. Kluczowym miernikiem była tutaj strata trenująca, która odnosi się do zdolności modelu do przewidywania następnego tokenu.
Jak widać na poniższym wykresie, udało nam się wykryć niewielką przewagę BF16 nad FP8, co pokazuje linia FP8 przebiegająca tuż nad linią BF16. Różnica ta jest jednak niwelowana przez znacznie większe wahania strat trenowanych między kolejnymi krokami, które występują w obu formatach, i w obu przypadkach obserwujemy tę samą wymierną poprawę w zakresie minimalizacji strat trenowanych w miarę upływu czasu.

Jakość trenowania w dół FP8 vs BF16
Następnie przeszliśmy do testowania jakości, jaką zapewniało trenowanie w FP8 w porównaniu z BF16 w praktycznej aplikacji końcowej.
W tym przypadku sprawdziliśmy, jak model radzi sobie podczas pracy z językiem angielskim i niemieckim. Porównaliśmy złożoność walidacji, która określa niepewność modelu podczas przewidywania kolejnego tokenu w sekwencji. Po raz kolejny oczekuje się, że z czasem stopień złożoności będzie się zmniejszał. W tym praktycznym scenariuszu nie stwierdziliśmy żadnego pogorszenia jakości podczas trenowania FP8 w porównaniu z BF16.

Przejście z BF16 na FP8 pozwoliło wam przyspieszyć trenowanie modeli, zmniejszyć zapotrzebowanie na pamięć i osiągnąć taką samą jakość trenowania przy minimalnym pogorszeniu w terminach straty trenowania i porównywalnej złożoności walidacji. Oznacza to, że DeepL jest w stanie tworzyć bardziej zaawansowane modele, realizując bardziej złożone zadania dzięki maksymalnemu wykorzystaniu mocy obliczeniowej. Znacznie poszerza to zakres możliwości trenowania LLM.
Od trenowania FP8 do wnioskowania
Kolejny etap podróży obejmuje przygotowanie modeli LLM do wnioskowania produkcyjnego. W tym przypadku ciężar obsługi spoczywa na NVIDIA TensorRT-LLM, rozwiązaniu firmy NVIDIA do skalowalnej inferencji LLM, które obsługuje FP8. Pobiera wagi modelu z trenować i tworzy silnik optymalizujący operacje modelu pod kątem maksymalnej wydajności obliczeniowej, wykorzystując techniki optymalizacji, takie jak fuzja jądra, zoptymalizowany kod C++/CUDA, buforowanie KV i ciągłe przetwarzanie wsadowe.
Korzyści płynące z FP8 dla wnioskowania
W przypadku modeli LLM wnioskowanie zawsze wiąże się z interakcją między przepustowością (liczbą tokenów, które można przetworzyć w określonym czasie) a opóźnieniem. Nie trzeba dodawać, że zapewnienie jak najlepszej obsługi klienta wymaga kontrolowania opóźnień. Jednak przepustowość ma również ogromne znaczenie dla DeepL, ponieważ określa liczbę żądań, które możecie obsłużyć w danym momencie, a tym samym zakres możliwości naszego modelu w praktyce.
Wraz ze wzrostem przepustowości nieuchronnie wzrasta również opóźnienie. Grupowanie wielu żądań pozwala uzyskać większą przepustowość, ale kosztem zwiększonego opóźnienia dla każdego indywidualnego żądania. Może to mieć wpływ na jakość obsługi klienta. Jednak wydajność wnioskowania FP8 w porównaniu z BF16 znacząco zmienia tę równowagę na waszą korzyść.
Jak pokazuje poniższy wykres, w przypadku większości rozmiarów partii FP8 może obsłużyć dwukrotnie większą przepustowość przy takim samym poziomie opóźnienia jak BF16. Jeśli skonfigurujemy konkretny budżet opóźnień, który zapewni naszym użytkownikom optymalne wrażenia, możemy to zaobserwować w praktyce. W efekcie FP8 podwoił efektywną wydajność waszych modeli LLM w terminach przepustowości.

Innymi słowy, przejście z BF16 do FP8 nie tylko umożliwiło wam stworzenie bardziej wydajnych i zaawansowanych modeli LLM dla DeepL. Gwarantuje to również, że jesteśmy w stanie skutecznie stosować te modele LLM, aby zapewnić optymalną obsługę klienta i zwiększyć wpływ naszej technologii językowej AI w praktyce. Otrzymujemy szybsze trenowanie większych modeli, które mogą następnie działać w ramach tych samych parametrów opóźnień, obsługując jednocześnie dwukrotnie większą liczbę żądań.
Kolejne kroki Niedawno uruchomiliśmy nowy system NVIDIA DGX SuperPOD z procesorami NVIDIA DGX GB200, który zapewnia kolejny niemal wykładniczy wzrost mocy obliczeniowej. Dla nas naprawdę interesujące jest to, że ta maszyna wprowadzi nową generację rdzeni Tensor Core, które będą natywnie obsługiwać operacje tensorowe FP4, takie jak mnożenie macierzy. Wtedy właśnie zaczyna się nasza podróż od nowa. To ekscytujące obserwować, co można osiągnąć za pomocą jednego bajtu w zakresie trenowania i wnioskowania. Obserwujcie tę przestrzeń, aby zobaczyć, jakie możliwości daje pół bajtu.
O autorach
Markus Schnös, inżynier ds. badań HPC
Markus Schnös jest inżynierem ds. badań HPC w DeepL, gdzie zajmuje się skalowaniem trenowania i wnioskowania LLM. Szczególnie interesuje cię trenowanie rozproszone i obliczenia zmiennoprzecinkowe o niskiej precyzji.
www.linkedin.com/in/markus-schnoes-349300185
Fabian Joswig, inżynier ds. badań HPC
Fabian Joswig jest inżynierem badawczym w DeepL. Posiadasz doświadczenie w dziedzinie uczenia maszynowego, obliczeń o wysokiej wydajności oraz teoretycznej fizyki cząstek elementarnych. Skupia się na skalowaniu modeli AI i infrastruktury dla najdokładniejszego tłumacza na świecie.