Ускоряване на Llama 2 70B с NVIDIA H100
Пътят на ускорената LLM инференция

Преследването на производителност в двигателя за отговори на Perplexity ни насочва към възприемане на най-новите технологии, които NVIDIA и AWS предлагат. В този блог с удоволствие споделяме резултатите от най-новите ни експерименти: сравнение на инференцията с Llama 2 70B при различни хардуерни и софтуерни настройки.
Нашата платформа за инференция на езикови модели (LLM), pplx-api, е изградена върху авангарден стек, базиран на библиотеки с отворен код. От началото на публичната бета версия на pplx-api през октомври се сблъскваме с предизвикателства, свързани с мащабирането, и се учим как най-добре да настроим конфигурацията си, за да постигнем мащабируемост в масови мащаби. Това ни подтикна да проведем експерименти със следните водещи въпроси:
Какъв е прирастът на суровата производителност при преминаване на нашите графични процесори от NVIDIA A100 към NVIDIA H100, при запазване на всички останали настройки?
Каква е ефективността на 8-битовата квантизация с плаваща запетая (fp8), за която H100 добавя родна поддръжка? Каква е цената на тази квантизация по отношение на точността?
Как тензорният паралелизъм и размерът на пакета (batch size) влияят върху латентността и пропускателната способност на токените?
Като се има предвид горното, коя конфигурация води до най-мащабируемия баланс между производителност и ефективност на разходите?
Експериментална настройка
Проведохме следния експеримент като серия от локални бенчмаркове, за да избегнем мрежовата латентност.
Основни показатели:
Латентност: Общото време, необходимо на сървъра за инференция да генерира пълния си отговор.
Пропускателна способност: Броят изходни токени за секунда на графичен процесор (GPU), които сървърът за инференция може да генерира за всички потребители и заявки.
Константи:
Следните фактори биха оказали влияние върху основните показатели, затова ги запазихме постоянни при различните опити в експеримента.
AI модел
Производителността се мащабира с размера на езиковия модел (LLM). Повече параметри изискват повече изчисления, което води до по-бавна инференция. Например Llama 2 13B е по-бърза от Llama 2 70B при равни други условия. В този експеримент се придържаме към Llama 2 70B, тъй като искаме да оптимизираме обслужването на най-способните модели с отворен код.
Набор от данни за входни/изходни токени
Количеството входни и изходни токени във всяка двойка заявка/отговор за пример може да повлияе на измерванията на производителността. Като цяло генерирането на изходни токени доминира общото време за отговор. Когато изборът на данни води само до отговори „да/не“ от езиковия модел, отговорът е по-бърз в сравнение с пробите, които изискват от модела да пише есета. Нашият набор от данни се състои от синтетични заявки с 1024 входни токена, предизвикващи 512 изходни токена. Това разпределение беше избрано, за да съответства на наблюдаваното разпределение на трафика при нашето публично внедряване на Llama2 70B.
Версия на софтуера
NVIDIA TensorRT-LLM (версия v0.5.0) е библиотека с отворен код за оптимизиране на инференцията на LLM. Пусната в края на 2023 г., тя синтезира многобройните оптимизации за инференция на NVIDIA и предоставя гъвкав слой за персонализиране на ключовите параметри на този експеримент: размер на партидата (batch size), квантизация и тензорен паралелизъм.
Променливи
Експериментирахме в 4 оси на конфигурация: тензорен паралелизъм, архитектура на графичния процесор, квантизация и максимален размер на партидата. Тези оси са взаимосвързани, тъй като всяка от тях представлява компромис по отношение на критичния ресурс с тесни места – паметта на графичния процесор.
Архитектура на графичния процесор (GPU)
Архитектурата на графичния процесор Hopper от девето поколение (H100-HBM3-80GB / p5.48xlarge) предлага огромен списък от функции в сравнение със своя предшественик Ampere (A100-SXM4-80GB / p4de.24xlarge), включително 2x–6x по-високи изчислителни скорости и почти 2x по-голяма пропускателна способност на паметта на GPU. Пропускателната способност на паметта на GPU е критичен метричен показател за инференцията, тъй като основното тесно място в латентността при матричните умножения в инференцията идва от зареждането на гигабайти данни на модела от паметта на GPU в изчислителните регистри. Въз основа на тези статистики изнесохме хипотезата, че прякото сравнение между NVIDIA H100 и A100 ще покаже двойно подобрение както в латентността, така и в пропускателната способност.
Друга ключова разлика между NVIDIA H100 и A100 е, че тензорното ядро на H100 добавя родна поддръжка за 8-битови инструкции с плаваща запетая (fp8), което отваря вратата към допълнителни оптимизации, описани по-долу. Ето защо използваме fp8 и fp16 специално за H100.
За да запазим паметта на GPU постоянна в този експеримент, се придържахме към възли с 8x80GB памет на GPU както за нашите NVIDIA A100, така и за H100. В допълнение към възможността за по-големи размери на партидите, паметта на GPU е важна, тъй като параметрите на модела се зареждат в нея по време на стартирането на сървъра за бърз достъп. Например, ако всеки от 70-те милиарда параметра в нашия модел е 16-битово число с плаваща запетая, размерът на модела е около 140 GB, което не се побира в един графичен процесор. Оттук идва и нуждата от тензорен паралелизъм, който обясняваме по-долу.
Тензорен паралелизъм
Тензорният паралелизъм се отнася до броя графични устройства (GPU), които се използват за стартиране на сървъра за инференция. Когато заделим определен брой графични процесори, TensorRT-LLM обединява техните ресурси, за да ни помогне да достигнем минималния изискван бюджет за памет за стартиране на Llama2 70B. Нашата хипотеза е, че по-ниският тензорен паралелизъм ще доведе до по-висока латентност (поради по-малкото ресурси, изразходвани за задоволяване на всяка партида), но до по-висока пропускателна способност на GPU (поради по-добро оползотворяване) в сравнение с по-високия тензорен паралелизъм.
Квантизация
Квантизацията е намаляването на прецизността в теглата и активациите, използвани от невронните мрежи. Използваме тази техника, за да намалим наполовина консумацията на памет на GPU, когато преминаваме от fp16 към fp8. Това прави възможно стартирането на същия модел с по-малко общо използване на паметта на GPU, което позволява по-нисък тензорен паралелизъм и повишава пропускателната способност.
Внедряванията на квантизацията имат потенциала да влошат точността. Затова оценихме точността за различните прецизности, като сравнихме тяхната статистика за перплексивност (perplexity) — мярка за това колко добре езиковият модел предсказва следващия токен в изречение — в корпуса WikiText. За 8-битова плаваща запетая и 8-битово тегло с 8-битова активация и SmoothQuant (w8a8 SQ) нямаше съществена промяна в перплексивността (< 1%) в сравнение с fp16 на WikiText, така че се почувствахме уверени да продължим. Въпреки това w4a16 показа съществена промяна от 7% в перплексивността, което вероятно се дължи на още по-ниската прецизност и необходимите динамични конвертирания между int4 и fp16.
Размер на партидата (Batch Size)
Паралелизмът чрез партидиране (batching) е класическа стратегия за извличане на максимална производителност от ограничена откъм ресурси система. Чрез обработката на множество заявки във всяко право насочено преминаване през невронната мрежа доказвано се увеличава пропускателната способност за сметка на известна латентност. Партидирането води и до по-голяма консумация на памет на GPU, тъй като размерът на KV кеша, който управлява механизма за внимание, нараства линейно с размера на партидата.
В случая на Llama 2 70B (който има 80 слоя), fp16 с размер на партидата 32 за размер на контекста 4096, размерът на KV кеша достига значителните 40 GB. Това в крайна сметка пречи на Llama 2 70B fp16, чиито само тегла заемат 140GB, да се побере удобно в 160GB памет на GPU, налична при тензорен паралелизъм 2 (TP-2).
Резултати
Прегледахме съвместимите комбинации от 4-те променливи на експеримента и представяме най-показателните тенденции по-долу.
Подобрението на латентността от квантизацията е около 10% при сравняване на H100 fp16 → fp8 и A100 fp16 → w8a8 със SmoothQuant. Въпреки това, смесената прецизност w4a16 всъщност се представя по-добре при малки размери на партидите и по-зле при по-големи размери на партидите в сравнение с fp16. Това може да се дължи на редица фактори, включително по-малко оптимизирани изчислителни ядра, време за кастиране между int4 и fp16, както и на факта, че w4a16 все още използва 16-битови числа с плаваща запетая за активациите, което води до липса на спестявания в размерите на KV кеша. Тъй като w4a16 също така показа по-ниска точност, стигаме до заключението, че трябва да се придържаме към w8a8 SQ за A100 и fp8 за H100.
В първите ни две фигури представяме само конфигурации на TP-8. H100 постига 54% латентност и 184% пропускателна способност в сравнение с A100, когато и двете използват fp16 / BS-128 / TP-8, което се подобрява до 49% латентност и 202% пропускателна способност при използване на fp8 на H100. Това подобрение в производителността може да се отдаде на увеличението на изчислителната мощност и пропускателната способност на паметта между H100 и A100. Забележително е, че разликата е по-малко изразена при по-малки размери на партидите, където използването може да е по-ниско.
Докато изграждаме нашата платформа, искаме да спазваме определени изисквания за латентност за нашите потребители, като същевременно максимизираме пропускателната способност. По този начин, вместо да сравняваме A100 спрямо H100 при същия размер на партидата, за нас е по-логично да сравняваме тяхната пропускателна способност само при конфигурации, където те отговарят на изискванията за латентност. Зададохме праг от 25600ms латентност за завършване на 512-те изходни токена и установихме, че H100 / TP-8 / fp8 / BS-128 дава 251% пропускателна способност в сравнение с A100 / TP-8 / fp16 / BS-64, тъй като може да обработва двоен размер на партидата при по-ниска латентност. Предвид факта, че квантизацията осигурява икономии на памет на GPU, сега трябва да оценим как тензорният паралелизъм може да добави следващ слой оптимизация.
Що се отнася до квантизацията и архитектурата, има ясни победители: H100 доминира над A100, а квантизацията с намалена прецизност подобрява използването на паметта, латентността и пропускателната способност. Въпреки това размерът на партидата и тензорният паралелизъм представляват компромис в нашите ключови показатели. По-големият размер на партидата оптимизира пропускателната способност за сметка на повишена латентност и консумация на памет. От друга страна, по-високият тензорен паралелизъм увеличава общия пул от налична памет и оптимизира латентността, но е за сметка на пропускателната способност поради разходите за синхронизация на разпределеното матрично умножение и поради ангажирането на повече ресурси на графичния процесор.
Конфигурацията в нашия експеримент, която максимизира пропускателната способност, е H100 / fp8 / TP-2 / BS-128, с 767 изходни токена в секунда на GPU. Това е 460% подобрение спрямо A100 / fp16 / TP-8 / BS-64. Въпреки това то идва с цената на удвоена латентност – близо 42000ms за 512 изходни токена – така че може да е неподходящо като продукционна конфигурация. Резултатите от TP-4 BS-128 (626 tok/sec/gpu при време за отговор 26188ms) и TP-2 BS-32 (435 tok/sec/gpu при време за отговор 18821ms) могат да представляват по-добри компромиси по отношение на основните ни показатели.
Заключение
Нашите резултати показват, че:
Достигаме 54% латентност и 184% пропускателна способност, използвайки H100 в сравнение с A100 при една и съща конфигурация, което се подобрява съответно до 49% и 202%, когато H100 се възползва от родната си поддръжка за fp8.
При максимизиране на пропускателната способност при ограничение на латентността, H100 / fp8 / TP-8 / BS-128 осигурява 251% пропускателна способност в сравнение с A100 / fp16 / TP-8 / BS-64, тъй като може да обработва двойна партида с по-висока скорост.
Като се възползваме от H100 с TP-2 с fp8, можем да постигнем 373% от пропускателната способност на A100 / fp16 / TP-8 / BS-128, с по-малко от 10% увеличение на латентността.
Размерът на партидата и тензорният паралелизъм представляват компромис между пропускателната способност и латентността за оператора на система за инференция с LLM.
Тези резултати ни дават увереност за пълно преминаване към графични процесори H100 в нашия предишен захранван от A100 хардуерен стек. Радваме се, че можем да потвърдим прираста на производителността, рекламиран от NVIDIA, и очакваме с нетърпение следващите им пробиви в ускорения хардуер.
Какво следва
Нашата следваща граница за оптимизация е да изследваме влиянието върху точността и производителността на структурираната рядкост (structured sparsity) и int4 прецизността, което би могло значително да намали отпечатъка в паметта на GPU за Llama 2 70B и да доведе до до 2 пъти подобрение на латентността. Вълнуваме се да продължим пътуването към светкавично бърза инференция и се надяваме да дадем възможност на нашите потребители да изграждат мощни приложения върху нашата платформа.
В близко бъдеще pplx-api ще премахне ограниченията на честотата и ще предложи повече потребителски езикови модели на Perplexity, включително базиран на интернет езиков модел с поддръжка за факти (grounding).
Регистрирайте се за Perplexity Pro на perplexity.ai/pro. Получете достъп до нашия авангарден pplx-api и се възползвайте от тези усъвършенствани възможности във вашите проекти. Научете повече за pplx-api в нашия блог.
Интересувате се от оформянето на бъдещето на изкуствения интелект? Ние наемаме служители! Бъдете част от екип, който управлява мащабна инфраструктура за генеративни LLM. Разгледайте възможностите в Perplexity Careers.
Автори:
Аараш Хейдари, Григорий Алексеев, Кевин Ху, Денис Яратс