Prompt engineering

Accelererende stor skalamodellinferens: Teknikker for effektiv utrulling

mm
Legg til Unite.AI blant dine foretrukne kilder på Google
LLM Inference Speed up

Stor skalamodeller (LLM) som GPT-4, LLaMA og PaLM, utvider grensene for hva som er mulig med naturlig språkbehandling. Likevel presenterer utrulling av disse massive modellene i produksjonsmiljøer betydelige utfordringer når det gjelder beregningskrav, minnebruk, latency og kostnader. Ettersom LLM-er blir større og mer kapable, er det kritisk å optimalisere deres inferensytelse for å kunne bruke dem i virkelige applikasjoner.

I denne tekniske dybdeduellen, skal vi utforske banebrytende teknikker for å akselerere LLM-inferens, noe som muliggjør raskere responstider, høyere gjennomstrømming og mer effektiv utnyttelse av maskinvareressurser. Vi skal dekke metoder som spenner fra numerisk presisjonsteknikker og nye oppmerksomhetsmekanismer til arkitektoniske innovasjoner som er spesifikt utformet for effektiv tekstgenerering.

La oss starte med å forstå hvorfor LLM-inferens er så utfordrende sammenlignet med tradisjonelle NLP-modeller.

Inferensutfordringen med stor skalamodeller

Før stor skalamodellene kom, baserte naturlig språkbehandling på mindre modeller som var fokusert på spesifikke oppgaver som tekstklassifisering, navngitte enhetsgjenkjenning og holdningsanalyse. Disse modellene kunne utrulleres på beskjedne maskiner og fulgte relativt enkle inferensprosesser.

LLM-er, på den andre siden, representerer et paradigmeskifte. Disse modellene er trent på enorme datasett med milliarder av parametre, noe som gjør dem i stand til å utføre en rekke språkoppgaver med bemerkelsesverdig dyktighet. Likevel kommer denne kraften med en kostnad – dramatisk økt beregningskrav under både trening og inferens.

En av de viktigste utfordringene er den autoregresive naturen til tekstgenerering med LLM-er. For å produsere menneskelignende tekst, må disse modellene forutsi ett token (ord eller subord) om gangen, hvor hvert nytt token avhenger av tidligere generert utgang. Denne sekvensielle avhengigheten forhindrer effektiv parallellisering og resulterer i beregningskrav som øker polynomisk med sekvenslengde.

I tillegg krever LLM-er ofte lange inndatasekvenser (prompts) for å etablere den nødvendige konteksten for høykvalitets tekstgenerering. Lengre inndatakrever mer minne for å lagre mellomliggende tilstander og oppmerksomhetsmatriser, noe som ytterligere belaster maskinressursene.

Med disse unike utfordringene, kan tradisjonelle optimaliseringsteknikker som kvantisering og statiske beregningsgrafer være utilstrekkelige, og kampen for å opprettholde LLM-ytelse samtidig som de gir meningsfulle hastighetsforbedringer. La oss dykke ned i noen av de viktigste strategiene som er spesifikt utformet for å akselerere LLM-inferens.

Numerisk presisjonsteknikker

Fra 32-bit til 16-bit presisjon

Fra 32-bit til 16-bit presisjon

En av veiene for å akselerere LLM-inferens er å utnytte redusert numerisk presisjon for modellvektorer og aktiveringer. Moderne dyp læringsrammeverk som PyTorch og TensorFlow bruker vanligvis 32-bit flyttall (FP32) presisjon som standard. Likevel har forskning vist at LLM-er ofte kan opprettholde høy nøyaktighet selv når de opererer ved lavere presisjoner, som 16-bit (FP16), 8-bit heltall (INT8) eller til og med 4-bit heltall (INT4).

Redusert numerisk presisjon tilbyr flere fordeler:

  • Redusert minneavtrykk: Lavere presisjonsrepresentasjoner krever mindre minne, noe som gjør det mulig å få større modeller eller batch-størrelser til å passe innen samme maskinkonstrainer.
  • Raskere beregning: Mange moderne CPU-er og GPU-er tilbyr spesialiserte instruksjoner og maskinvareakselerasjon for lavere presisjonsaritmetikk, noe som muliggjør betydelige hastighetsforbedringer.
  • Forbedret energi-effektivitet: Med mindre minnekrav og raskere beregninger, kan lavere presisjonsinferens oversette til redusert energiforbruk – en kritisk fordel for kant- og mobile utrullinger.

Selv om numerisk presisjonsteknikker er kraftfulle, introduserer de en viss nøyaktighetsTap sammenlignet med FP32-operasjon. Nøkkel er å nøye evaluere denne avveiningen mellom beregningsgevinster og potensiell ytelsesforringelse for ditt spesifikke brukstilfelle.

Det finnes to hovedtilnærminger til kvantisering med LLM-er:

Post-trening kvantisering (PTQ): I denne metoden, blir en LLM først trent med standard FP32 presisjon. Etter trening, blir modellvektorene kvantisert (omgjort) til en lavere presisjonsformat som INT8 eller INT4. PTQ er enkel å implementere, men kan føre til større nøyaktighetsTap.

Kvantiserings-bevisst trening (QAT): Med QAT, blir kvantiseringsprosessen simulert under treningfasen selv. Dette gjør det mulig for modellen å lære å kompensere for kvantiseringsfeil, noe som minimerer nøyaktighetsforringelse når den endelige kvantiserte modellen blir utrullet. QAT er mer komplisert, men ofte gir bedre resultater sammenlignet med PTQ.

For praktisk anvendelse, kan en utnytte forhåndskvantifiserte modeller som er tilgjengelige på plattformer som Hugging Face, som har en rekke modeller som er optimalisert gjennom ulike kvantiseringsteknikker. For eksempel, hvis en ønsker å laste ned en forhåndskvantifisert LLaMA-2-7b-modell, kan en gjøre dette ved å bruke Hugging Face sine transformers-bibliotek. I tillegg kan en bruke verktøy som AutoGPTQ til å kvantisere en modell, som integrerer sømløst med eksisterende biblioteker for å komprimere modellen effektivt.

Her er et eksempel på å laste ned en forhåndskvantifisert LLaMA-2-7b-modell ved å bruke Hugging Face sine transformers-bibliotek:

from transformers import AutoModelForCausalLM, AutoTokenizer

<p>model_id = "TheBloke/Llama-2-7b-Chat-GPTQ"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id)
Og for å kvantisere en modell, kan en følge disse stegene ved å bruke AutoGPTQ-verktøyet:</p>

<p>from transformers import AutoModelForCausalLM, AutoTokenizer, GPTQConfig</p>

<p>model_id = "llama-2-7b-original"
tokenizer = AutoTokenizer.from_pretrained(model_id)
quantization_config = GPTQConfig(bits=4, dataset="your-dataset", tokenizer=tokenizer)
model = AutoModelForCausalLM.from_pretrained(model_id, quantization_config=quantization_config)</p>

Husk at kvantisering kan kreve post-kvantiserings finjustering eller prompt-engineering for å opprettholde modellkvalitet. For ny kvantisering, kan en bidra tilbake til samfunnet ved å pushe kvantiserte modeller til plattformer som Hugging Face.

Det er alltid viktig å balansere mellom modellstørrelse, beregningskrav og ytelse når en velger kvantiseringstrategi for ditt spesifikke brukstilfelle.

 

Flash Attention-algoritmen

Multi-head oppmerksomhetsmekanismen er en kjernekomponent i transformer-baserte LLM-er, og muliggjør modellen å fange lange avhengigheter og kontekstualiserte representasjoner. Likevel er denne oppmerksomhetsoperasjonen beregningsuEffektiv for autoregressiv tekstgenerering, da den krever gjentakende beregning av mange av de samme verdiene for hvert nytt token.

Flash Attention-algoritmen, introdusert i Flash Attention-papiret, tilbyr en mer minne-Effektiv og parallellisering-vennlig tilnærming til oppmerksomhetsoperasjonen. I stedet for å gjentakende beregne oppmerksomhetsverdier for hvert token, cacherer og gjenbruker Flash Attention mellomliggende nøkkel/verdi-matriser, og unngår redundante beregninger.

Denne optimaliseringen reduserer ikke bare beregningsoverhodet, men også forbedrer minne-tilgangsmønster, noe som gir bedre utnyttelse av GPU-minne-båndbredde og parallellisme.

Selv om detaljene i Flash Attention er ganske kompliserte, er hovedideen å dekomponere oppmerksomhetsoperasjonen i to faser:

  1. Prefiks-summer-embedding: Denne fasen beregner og cacher nøkkel/verdi-embeddings for alle inndata-tokens, og muliggjør effektiv gjenbruk under generering.
  2. Kausale oppmerksomhet: Den faktiske oppmerksomhetsoperasjonen, nå optimalisert for å utnytte de cachede nøkkel/verdi-embeddings fra den første fasen.

Ved å separere disse fasene, kan Flash Attention utnytte høy parallellisme, og akselerere oppmerksomhetsbottlenecket i LLM-inferens betydelig.

Her er en kort, konseptuell illustrasjon av å implementere Flash Attention med en LLM:

from transformers import AutoModelForCausalLM
import torch
from flash_attention import flash_attention

<p># Last inn en LLM som OctoCoder
model = AutoModelForCausalLM.from_pretrained("bigcode/octocoder")</p>

<p># Eksempel-systemprompt som guider modellen mot å være en bedre kodehjelper
system_prompt = "..."</p>

<p># Forberedelse av en lengre inndata med systemprompten
long_prompt = system_prompt + "Spørsmål: Skriv en funksjon i Python som transformerer bytes til gigabyte."</p>

<p># Konvertering av modellen for Flash Attention-optimisering
model.to_bettertransformer()</p>

<p># Kjøring av modellen med Flash Attention
start_time = time.time()
with torch.backends.cuda.sdp_kernel(enable_flash=True):
result = model.generate(long_prompt, max_new_tokens=60)
print(f"Generert på {time.time() - start_time} sekunder.")</p>

Selv om Flash Attention tilbyr imponerende ytelsesforbedringer, fungerer den innenfor den eksisterende transformer-arkitekturen. For å fullt ut å utnytte potensialet for akselerert LLM-inferens, må vi utforske arkitektoniske innovasjoner som er spesifikt utformet for denne oppgaven.

Pruning av LLM-er

Pruning av LLM-er er en teknikk for å reducere modellstørrelse samtidig som funksjonaliteten opprettholdes. Den bruker en data-avhengig estimator for vekt-viktig basert på Hessian-matrise-approksimasjoner. I pruning, fjernes mindre viktige vektgrupper, og modellen finjusteres for å gjenopprette nøyaktighet. LLM-Pruner-pakken tilbyr skript for pruning med ulike strategier som støttes. Pruning inkluderer å oppdage avhengigheter, estimere gruppebidrag, og en gjenopprettingsfase som inkluderer en kort post-trening.

Her er et forenklet Python-eksempel som demonstrerer bruk av LLM-Pruner for en LLaMa-modell:

from transformers import AutoModelForSequenceClassification
from pruning import LLMPruner

<p># Last inn en forhåndstrent LLaMa-modell
model = AutoModelForSequenceClassification.from_pretrained("llama-base")</p>

<p># Initialiser pruner med ønsket konfigurasjon
pruner = LLMPruner(
model,
pruning_ratio=0.25,
block_mlp_layers=(4, 30),
block_attention_layers=(4, 30),
pruner_type='taylor'
)</p>

<p># Kjør pruning
pruned_model = pruner.prune()</p>

<p># Finjuster den prunedde modellen
pruned_model.fine_tune(training_data)</p>

Dette kode-utdraget representerer lasting av en forhåndstrent LLaMa-modell, konfigurasjon av pruner med spesifikke innstillinger, kjøring av pruning-prosessen og finjustering av den prunedde modellen.

Arkitektoniske innovasjoner for effektiv tekstgenerering

Transformer-arkitekturen, selv om den er svært effektiv for språkmodellering, ble designet som en generell sekvens-til-sekvens-modell. Når det gjelder utrulling av LLM-er for tekstgenereringsoppgaver med lange inndata-kontekster, har forskere funnet at mer spesialiserte arkitekturer kan forbedre inferens-effektivitet uten å ofre kvalitet.

Her er noen av de viktigste arkitektoniske innovasjonene som muliggjør raskere LLM-inferens:

Alibi: Alibi-arkitekturen, introdusert i PAL-Instruction-papiret, separerer modellering av lang inndata-kontekst fra tekstgenereringsprosessen selv. Den bruker en komprimert representasjon av inndata-konteksten (den “alibi”) for å initialisere genereringsprosessen, og unngår behovet for å prosessere hele inndata-sekvensen på nytt under autoregressiv generering.

Rotary-embeddings: I stedet for å bruke standard posisjons-embeddings, bruker rotary-embeddingsteknikken rotasjonsmatriser for å kode posisjonsinformasjon mer effektivt. Denne tilnærmingen har vist seg å forbedre ytelse og muliggjøre prosessering av lengre inndata-sekvenser.

Multi-Query-Attention (MQA): I tradisjonell oppmerksomhet, hver utgangs-token oppmerksomhet på hele inndata-sekvensen, noe som resulterer i redundant beregning. MQA reformulerer oppmerksomhetsoperasjonen for å dele beregninger mellom flere utgangs-tokens, og reduserer kompleksiteten.

Multiquery-oppmerksomhet

Multiquery-oppmerksomhet

Grouped-Query-Attention (GQA): Bygget på MQA, grupperer GQA utgangs-tokens i kluster og beregner oppmerksomhet samtidig for hvert kluster. Denne tilnærmingen reduserer ytterligere beregningskrav samtidig som den opprettholder høykvalitets tekstgenerering.

Selv om disse arkitektoniske innovasjonene fortsatt er i aktiv forskning og utvikling, har de vist seg å gi imponerende hastighetsforbedringer for LLM-inferensoppgaver, spesielt når de kombineres med teknikker som Flash Attention og numerisk presisjons-optimisering.

Virkelige utrullingshensyn

Utenom de grunnleggende algoritmene og arkitekturene, finnes det flere praktiske hensyn og avveininger som må navigeres når det gjelder utrulling av LLM-er i produksjonsmiljøer:

Maskinvare-akselerasjon: Selv om CPU-er kan håndtere LLM-inferens, er GPU-er og andre akseleratorer som Google sine TPUs essensielle for å oppnå høy gjennomstrømming og lav latency. Valg av riktig maskinvare og optimalisering av minnebruk er kritisk.

Batching og parallellisme: For å fullt ut å utnytte maskinvare-parallellisme, kan strategier som batchet inferens (prosessering av flere inndata samtidig) og modell-parallellisme (distribusjon av en LLM over flere enheter) betydelig forbedre gjennomstrømming.

Kvantisering vs. kvalitet-avveining: Grad av kvantisering (8-bit, 4-bit osv.) vil direkte påvirke inferens-hastighet og minnebruk, men også påvirke utgangskvalitet. Denne avveiningen må nøye vurderes for hvert enkelt brukstilfelle.

Modell-diskusjon: En alternativ til kvantisering, kan modell-diskusjonsteknikker komprimere store LLM-er til mindre, mer effektive elev-modeller samtidig som de opprettholder høy nøyaktighet.

Caching og optimerte kjøretider: Optimerte dyp lærings-kjøretider som NVIDIA sine TensorRT og rammeverk designet for LLM-utrulling (f.eks. MosaicML sine Composable Inference Suite) kan gi betydelige ytelsesforbedringer gjennom teknikker som operator-fusjon, kernel-optimisering og intelligente caching-strategier.

Veien til optimal LLM-utrulling ofte involverer å kombinere flere teknikker samtidig som en nøye vurderer de spesifikke kravene til din applikasjon, infrastruktur-begrensninger og ytelsesmål.

Konklusjon

Ettersom stor skalamodeller fortsetter å utvikle seg raskt, blir akselerering av deres inferens-ytelse stadig viktigere for å muliggjøre virkelige applikasjoner og demokratisere tilgangen til disse kraftfulle AI-kapasitetene.

I denne tekniske guiden, har vi utforsket banebrytende teknikker som spenner fra numerisk presisjons-optimisering, nye oppmerksomhets-algoritmer som Flash Attention, og arkitektoniske innovasjoner som er spesifikt utformet for effektiv tekstgenerering. Selv om hver tilnærming tilbyr sine egne fordeler, ligger den sanne kraften ofte i å kombinere flere strategier samtidig som en navigerer de komplekse avveiningene mellom hastighet, minnebruk og utgangskvalitet.

Ser fremover, kan vi forvente fortsatt forskning og utvikling i dette området, drevet av den uendelige etterspørselen etter mer kapable og tilgjengelige LLM-er. Fra maskinvare-akselerasjon og modell-komprimering til helt nye arkitekturer, jakten på effektiv LLM-inferens forblir en spennende frontier i verden av naturlig språkbehandling og kunstig intelligens.

Jeg har brukt de siste fem årene på å dykke ned i den fasiniserende verden av Maskinlæring og Dypt Læring. Min lidenskap og ekspertise har ledet meg til å bidra til over 50 ulike programvareprosjekter, med særlig fokus på AI/ML. Min pågående nysgjørhet har også trukket meg mot Naturlig Språkbehandling, et felt jeg er ivrig etter å utforske videre.