Översikt över slutledning av Large Language Model (LLM), dess betydelse, utmaningar och nyckelproblemformuleringar.
Large Language Models (LLM) har revolutionerat området för Natural Language Processing (NLP) genom att möjliggöra ett brett utbud av applikationer, från chatbots och AI-agenter till kod- och innehållsgenerering. Men implementeringen av LLM i verkliga scenarier står ofta inför utmaningar relaterade till latens, resursförbrukning och skalbarhet.
I den här serien blogginlägg kommer vi att utforska olika optimeringstekniker för LLM-inferens. Vi kommer att dyka in i strategier för att minska latens, minnesfotavtryck och beräkningskostnader, från cachningsmekanismer till hårdvaruaccelerationer och modellkvantisering.
I det här inlägget kommer vi att ge en kort översikt över LLM-inferens, dess betydelse och utmaningarna i samband med det. Vi kommer också att beskriva de viktigaste problemformuleringarna som kommer att styra vår utforskning av optimeringstekniker.
Modellinferens hänvisar till processen att använda en tränad maskininlärningsmodell för att göra förutsägelser eller generera utdata baserat på nya indata. I LLM-sammanhang innebär slutledning bearbetning av textinmatning och generering av koherent och kontextuellt relevant textutdata.
Modellen tränas endast en gång eller periodvis, medan slutledning förekommer mycket oftare, förmodligen tusentals gånger per sekund i produktionsmiljöer.
Slutledningsoptimering är avgörande för att säkerställa att LLM:er kan distribueras effektivt i verkliga applikationer. Målet är att minimera latensen (tiden det tar att generera ett svar), minska resursförbrukningen (CPU, GPU, minne) och förbättra skalbarheten (förmågan att hantera ökande belastningar).
Till exempel kräver GPT-3 (med 175 miljarder parametrar) betydande beräkningsresurser för slutledning. Optimering kan minska svarstiderna från 1–2 sekunder till millisekunder, vilket gör LLM mer praktiska för interaktiva applikationer.
Transformatorarkitekturen, som använder uppmärksamhetsmekanismer, har blivit grunden för de flesta toppmoderna LLM:er. Denna arkitektur inkluderar positionskodningar, multi-head självuppmärksamhet, feed-forward neurala nätverk och lagernormalisering. Transformatorer klassificeras generellt i tre huvudtyper:
Kodar-avkodarmodeller (t.ex. T5) var den ursprungliga arkitekturen som introducerades i tidningen "Attention is All You Need." Dessa modeller är designade för uppgifter som kräver både förståelse och generering, såsom översättning och sammanfattning. De bearbetar ingångssekvensen med kodaren och genererar sedan utmatningssekvensen med avkodaren.
Eftersom modeller med endast avkodare är den vanligaste LLM-arkitekturen för autoregressiva uppgifter, kommer denna serie att fokusera på optimeringstekniker specifikt för denna typ av modell.
Uppmärksamhetsmekanismen är en nyckelkomponent i transformatorarkitekturen som gör att modellen kan fokusera på olika delar av ingångssekvensen när utdata genereras. Den beräknar en viktad summa av ingångsrepresentationerna, där vikterna bestäms av relevansen av varje inmatningstoken för den aktuella utmatningstoken som genereras. Denna mekanism gör det möjligt för modellen att fånga beroenden mellan tokens, oavsett deras avstånd i inmatningssekvensen.
Uppmärksamhetsmekanismen kan vara beräkningsmässigt dyr, särskilt för långa inmatningssekvenser, eftersom den kräver beräkning av parvisa interaktioner mellan alla tokens ( O(n^2)
-komplexitet). Låt oss se det mer steg-för-steg detaljer:
Inmatningsrepresentation : Varje token i inmatningssekvensen representeras som en vektor, vanligtvis med hjälp av inbäddningar.
Fråga, nyckel, värdevektorer : För varje token beräknas tre vektorer: en frågevektor ( Q_i
), en nyckelvektor ( K_i
) och en värdevektor ( V_i
). Dessa vektorer härleds från ingångsrepresentationerna med hjälp av inlärda linjära transformationer.
Uppmärksamhetspoäng : Uppmärksamhetspoängen beräknas genom att ta punktprodukten av frågevektorn för den aktuella token med nyckelvektorerna för alla tidigare tokens i inmatningssekvensen. Detta resulterar i en poäng som anger hur mycket fokus som ska läggas på varje token.
Softmax-normalisering : Uppmärksamhetspoängen normaliseras sedan med softmax-funktionen för att erhålla uppmärksamhetsvikter, som summerar till 1.
Viktad summa : Slutligen beräknas utmatningsrepresentationen för den aktuella token som en viktad summa av värdevektorerna, med användning av uppmärksamhetsviktarna.
Multi-head uppmärksamhet är en förlängning av uppmärksamhetsmekanismen som gör att modellen gemensamt kan ta del av information från olika representationsdelrum på olika positioner. Istället för att ha en enda uppsättning uppmärksamhetsvikter, beräknar uppmärksamhet med flera huvuden flera uppsättningar uppmärksamhetspoäng parallellt, var och en med sina egna inlärda linjära transformationer.
Utsignalerna från dessa uppmärksamhetshuvuden sammanfogas sedan och transformeras linjärt för att producera den slutliga utmatningsrepresentationen.
Denna mekanism förbättrar modellens förmåga att fånga olika relationer och beroenden i indata, vilket leder till förbättrad prestanda för olika NLP-uppgifter.
Med en förståelse för LLM och transformatorarkitektur, låt oss beskriva inferensberäkningsprocessen. Inferens genererar nästa $n$-token för en given inmatningssekvens och kan delas upp i två steg:
Förfyllningsstadiet : I detta steg utförs en framåtpassning genom modellen för inmatningssekvensen, och nyckel- och värderepresentationer beräknas för varje token. Dessa representationer lagras för senare användning i avkodningssteget i en KV-cache. Representationer av alla tokens i varje lager beräknas parallellt.
Avkodningsstadiet : I detta steg genererar modellen utmatningstoken en i taget på ett autoregressivt sätt. För varje token hämtar modellen nyckel- och värderepresentationerna från KV-cachen som lagrats under förfyllningssteget, tillsammans med den aktuella inmatningstokens frågerepresentation för att beräkna nästa token i sekvensen.
Denna process fortsätter tills ett stoppkriterium är uppfyllt (t.ex. uppnår en maximal längd eller genererar en slut-av-sekvens-token). De nya nyckel- och värderepresentationerna lagras i KV-cachen för efterföljande tokens. I detta skede tillämpas också en tokensamplingsstrategi för att bestämma nästa token som ska genereras (t.ex. girig sökning, strålsökning, top-k-sampling).
För ett prefix med längden L , inbäddningsstorlek d och en modell med h huvuden och n lager, kan komplexiteten i slutledningsberäkningen analyseras enligt följande:
Förfyllningsstadiet : I förfyllningssteget beräknar vi den initiala representationen för alla tokens i ingången. Komplexiteten här är:
Här:
O(Ln .d^2)
: Representerar frammatningsberäkningen, som behandlar varje token oberoende över lager. Detta skalas linjärt med både sekvenslängden L och antalet lager n .
Andra termen O(L^2. nh d)
: Representerar uppmärksamhetsmekanismens kostnad. Här interagerar varje token med varannan token, vilket resulterar i L^2
-komplexitet för uppmärksamhetsberäkning per lager. Komplexiteten växer kvadratiskt med sekvenslängden, vilket kan bli en stor flaskhals för långa sekvenser.
Avkodningsstadiet : Avkodningsstadiet är den autoregressiva delen, komplexiteten är:
Här:
Framkopplingsberäkning : För varje genererad token utför vi feedforward-operationer i varje lager. Eftersom det görs för en token i taget (inte hela sekvensen), är komplexiteten per token: O(nd^2)
.
Uppmärksamhetsberäkning med cachning : Varje ny token interagerar med den befintliga sekvensen genom uppmärksamhet, med hjälp av de tidigare beräknade nyckel-värdeparen. För varje token som genereras är denna uppmärksamhetsberäkning proportionell mot sekvenslängden L , vilket ger: O(Lnd .h)
Som vi kan se påverkas komplexiteten av slutledningsberäkningen av längden på inmatningssekvensen ( L ), antalet lager ( n ), antalet uppmärksamhetshuvuden ( h ) och inbäddningsstorleken ( d ). Denna komplexitet kan bli en flaskhals i realtidsapplikationer, särskilt när man hanterar långa inmatningssekvenser och/eller stora modeller.
KV-caching är en avgörande optimeringsteknik för LLM-inferens, särskilt i avkodningsstadiet. Genom att lagra nyckel- och värderepresentationer som beräknats under förfyllningssteget, kan modellen undvika redundanta beräkningar för tidigare bearbetade tokens.
Detta minskar avsevärt beräkningskostnaden och latensen under slutledning, eftersom modellen bara behöver beräkna uppmärksamhetspoängen för den nya token som genereras, snarare än att räkna om nyckel- och värderepresentationerna för alla tokens i inmatningssekvensen.
Detta gör kostnaden linjär med avseende på antalet genererade tokens, snarare än kvadratisk med avseende på ingångslängden.
KV-cache kräver dock ytterligare minne för att lagra nyckel- och värderepresentationer, vilket kan vara en kompromiss i miljöer med begränsade resurser.
Låt oss beräkna minneskraven för LLaMA 7B-modellen.
d_model
): 4096d_head
): 32d_head
): 128 (4096/32) Nyckelstorlek per token = d_head × num_heads
= 128 × 32 = 4096 element
Värdestorlek per token = d_head × num_heads
= 128 × 32 = 4096 element
Totalt antal element per token per lager = 4096 + 4096 = 8192 element
Element per lager = L × 8192 = 2048 × 8192 = 16 777 216 element
Minne per lager (i byte) = 16 777 216 × 2 = 33 554 432 byte = 33,55 MB
Totalt minnesbehov: 14 GB (modellvikter) + 1-2 GB (overhead) + 1073,6 MB (KV-cache) = 15-16 GB . Denna beräkning ger oss en uppskattning av minneskraven för LLaMA 7B-modellen under slutledning. LLaMA 7B är relativt liten jämfört med modeller som GPT-3 (175 miljarder parametrar), vilket skulle kräva betydligt mer minne för både modellvikterna och KV-cachen.
Dessutom, när de skalas till $m$ samtidiga användare, skulle resurskraven vara $m$ gånger högre. Därför är optimeringstekniker avgörande för att distribuera stora modeller i resursbegränsade miljöer.
När man utvärderar effektiviteten av slutledningsoptimeringstekniker kan flera mätvärden övervägas:
Pre-fill latens : Tiden det tar att utföra förfyllningsstadiet av slutledning, även kallad time-to-first-token (TTFT) latens. Detta mått är avgörande för interaktiva applikationer där användare förväntar sig snabba svar. Faktorer som modellstorlek, inmatningslängd och hårdvarufunktioner kan påverka detta mått.
Avkodningslatens : Tiden det tar att generera varje efterföljande token efter förfyllningssteget, även kallad Inter-Token Latency (ITL). Detta mått är viktigt för att mäta modellens lyhördhet under textgenerering. För applikationer som chatbots är låg ITL bra, men snabbare är inte alltid bättre, eftersom 6-8 tokens per sekund ofta räcker för mänsklig interaktion. Faktorer som påverkar KV-cachestorlek, samplingsstrategi och hårdvara.
End-to-End-latens : Den totala tiden som det tar från det att indata tas emot tills den slutliga utdata genereras. Detta mått är väsentligt för att förstå slutledningsprocessens övergripande prestanda och påverkas av förfyllning, avkodning och andra komponentlatenser (t.ex. JSON-parsning). Påverkande faktorer inkluderar modellstorlek, ingångslängd och hårdvara, såväl som effektiviteten för hela pipelinen.
Maximum Request Rate aka QPS (Queries Per Second) : Antalet slutledningsbegäranden som kan behandlas per sekund. Detta mått är avgörande för att utvärdera modellens skalbarhet i produktionsmiljöer. Faktorer som modellstorlek, hårdvara och optimeringstekniker kan påverka QPS. Till exempel, om 15 QPS serveras för en P90-latens via 1 GPU, skulle 20 GPU:er behövas för att tjäna 300 QPS. Påverkande faktorer inkluderar hårdvaruresurser, lastbalansering och optimeringstekniker.
FLOPS (flyttalsoperationer per sekund) : Antalet flyttalsoperationer som modellen kan utföra på en sekund. Detta mått är användbart för att förstå beräkningskostnaden för slutledning och kan användas för att jämföra effektiviteten hos olika modeller och optimeringstekniker. Påverkande faktorer inkluderar modellarkitektur, hårdvara och optimeringstekniker.
Vi kommer att täcka alla dessa optimering i framtida inlägg i serien.
Systemoptimering : Optimering av den underliggande hårdvaru- och mjukvaruinfrastrukturen, som att använda specialiserad hårdvara (t.ex. TPU:er, GPU:er) eller optimera mjukvarustacken (t.ex. genom att använda effektiva bibliotek och ramverk). Det kan delas upp i:
Minneshantering : Hanterar effektivt minnesanvändning för att minska omkostnader och förbättra prestanda.
Effektiv beräkning : Utnyttja parallellism och optimera beräkningar för att minska latens.
Batchning : Bearbetar flera förfrågningar samtidigt för att förbättra genomströmningen.
Schemaläggning : Effektivt schemalägga uppgifter för att maximera resursutnyttjandet.
Modellkompressioner : Tekniker som kvantisering, beskärning och destillation kan användas för att minska storleken på modellen och förbättra slutledningshastigheten utan att avsevärt ge avkall på prestanda.
Algoritmoptimering : Förbättring av de algoritmer som används för slutledning, som att använda mer effektiva samplingsstrategier eller optimera uppmärksamhetsmekanismen. Exempelvis kan spekulativ avkodning, som gör att modellen kan generera flera tokens parallellt, avsevärt minska avkodningsfördröjningen.
I det här inlägget gav vi en översikt över LLM-inferens, dess betydelse och utmaningarna i samband med det. Vi beskrev också de viktigaste problemformuleringarna som kommer att vägleda vår utforskning av optimeringstekniker i efterföljande inlägg.
Genom att förstå krångligheterna med LLM-inferens och de faktorer som påverkar dess prestanda, kan vi bättre förstå betydelsen av optimeringstekniker för att göra LLM mer praktiska för tillämpningar i verkliga världen. I nästa inlägg kommer vi att fördjupa oss i specifika optimeringstekniker och deras implementeringar, med fokus på att minska latens och resursförbrukning samtidigt som modellens prestanda bibehålls.