AI-modeller og platforme

SGLang: Effektiv udførelse af strukturerede sprogmodelprogrammer

mm
Føj Unite.AI til dine foretrukne kilder på Google

Store sprogmodeller (LLM’er) anvendes i stigende grad til komplekse opgaver, der kræver multiple generation-kald, avancerede prompt-teknikker, kontrolflow og strukturerede input/output. Men effektive systemer til programmering og udførelse af disse ansøgninger mangler. SGLang, et nyt introduceret system, sigter mod at løse dette problem ved at give en effektiv udførelse af komplekse sprogmodelprogrammer. SGLang består af et frontend-sprog og en runtime. Frontend’en forenkler programmering med primitive for generation og parallelisme-kontrol, mens runtime’en accelererer udførelsen gennem nye optimeringer som RadixAttention til KV-cache-genbrug og komprimerede endelige tilstandsmaskiner til hurtigere struktureret output-dekodning. Eksperimenter viser, at SGLang opnår op til 6,4 gange højere gennemløb sammenlignet med state-of-the-art-inferencesystemer på forskellige store sprog- og multimodale modeller, der løser opgaver som agent-kontrol, logisk resonnering, few-shot-læringsbenchmarks, JSON-dekodning, retrieval-augmented generation-pipelines og multi-turn-chat.

Seneste fremskridt i LLM-kapaciteter har udvidet deres anvendelighed, så de kan håndtere en bredere vifte af generelle opgaver og fungere som selvstændige agenter. I disse ansøgninger engagerer LLM’er sig i multi-rundt planlægning, resonnering og interaktion med eksterne miljøer. Dette sker gennem værktøjsanvendelse, multiple input-modaliteter og forskellige prompt-teknikker, såsom few-shot-læring, selv-konsistens, skelet-af-tanke og træ-af-tanke. Disse nye anvendelsesområder kræver multiple, ofte afhængige, LLM-generation-kald, hvilket indikerer en tendens til at anvende multi-kald-strukturer til at løse komplekse opgaver.

Denne udvikling markerer en overgang fra simpel snak til en mere sofistikeret programmatisk anvendelse af LLM’er, hvor programmer planlægger og kontrollerer generation-processerne i LLM’er. Disse programmer kaldes “Sprogmodelprogrammer” (LM-programmer). Avancerede prompt-teknikker og agente-arbejdsgange falder inden for området for LM-programmer. Der er to almindelige egenskaber ved LM-programmer: (1) LM-programmer involverer typisk multiple LLM-kald med kontrolflow for at løse komplekse opgaver og forbedre den overordnede kvalitet. (2) LM-programmer modtager strukturerede input og producerer strukturerede output, hvilket muliggør komposition af LM-programmer og integration i eksisterende software-systemer.

I denne artikel vil vi dykke dybere ind i SGLang-rammen, undersøge dens arkitektur, analysere dens præstation og sammenligne den med state-of-the-art-rammer. Så lad os komme i gang.

En introduktion til SGLang

Trods den udbredte anvendelse af LM-programmer, er nuværende systemer til udtryk og udførelse af dem ineffektive. SGLang identificerer to primære udfordringer i forbindelse med den effektive anvendelse af LM-programmer:

  • Programmeringskompleksitet: Udvikling af LM-programmer er kedelig og svær på grund af den ikke-deterministiske natur af LLM’er. Dette indebærer omfattende strengmanipulation, eksperimentel finjustering af prompts, skrøbelig output-parsing, håndtering af multiple input-modaliteter og implementering af parallelisme-mekanismer. Denne kompleksitet reducerer betydeligt læseligheden af selv simple programmer.
  • Udførelse-ineffektivitet: Udførelse af LM-programmer er ineffektiv på grund af redundant beregning og hukommelsesbrug. State-of-the-art-inference-motorer, optimeret til at reducere latency og forbedre gennemløb, mangler direkte viden om arbejdsbyrden, hvilket resulterer i betydelige ineffektiviteter. Et bemærkelsesværdigt eksempel er genbrug af Key-Value (KV)-cachen, der består af genbrugelige intermediate-tensorer, der er essentielle for generativ inferens. Nuværende systemer mangler effektive mekanismer til at facilitere KV-cache-genbrug på tværs af multiple LLM-kald, der deler en fælles præfiks, hvilket fører til unødvendige beregninger og spild af hukommelse. Desuden er begrænset dekodning for strukturerede output, såsom JSON-mode, underoptimal, da eksisterende systemer kun dekoder en token ad gangen.

For at løse disse udfordringer introducerer SGLang et struktureret generations-sprog til LLM’er. Det centrale idé er at systematisk udnytte multi-kald-strukturen i LM-programmer til effektiv udførelse. Som vist i følgende figur, har SGLang to dele: et frontend-sprog og en backend-runtime.

Frontend’en forenkler programmeringen af LM-programmer, og runtime’en accelererer deres udførelse. Disse dele kan arbejde sammen for bedre præstation eller fungere uafhængigt.

SGLang er et domæne-specifikt sprog indlejret i Python, der giver primitive for generation (f.eks. extend, gen, select) og parallelisme-kontrol (f.eks. fork, join). Det er kompatibelt med Pythons kontrolflow og biblioteker, hvilket tillader brugere at udvikle avancerede prompt-arbejdsgange let med naturlig Python-syntaks. SGLang inkluderer en interpreter og en compiler. Interpreteren håndterer prompt-tilstanden som en strøm og sender primitive operationer til strømmen for asynkron udførelse, hvilket sikrer korrekt kontrol over synkronisering og intra-program-parallelisme. Desuden kan SGLang-programmer spores og kompilieres for yderligere optimeringer. Runtime’en i SGLang foreslår flere nye optimeringer til at accelerere udførelsen af LM-programmer:

  • RadixAttention: Denne teknik muliggør automatisk genbrug af KV-cachen på tværs af multiple generation-kald. I eksisterende inference-motorer bliver KV-cachen for en anmodning kasseret efter behandling, hvilket forhindrer genbrug på tværs af multiple kald og langsomer udførelse. SGLang opbevarer en LRU-cache af KV-cachen i en radix-træ, der håndterer KV-cachen som en traditionel cache og bruger radix-træet til effektiv matching, indsættelse og eviction. Dette tillader runtime’en at håndtere forskellige genbrugs-mønstre effektivt.
  • Komprimeret endelig tilstandsmaskine: Denne teknik muliggør hurtigere begrænset dekodning for strukturerede output. Eksisterende systemer følger kun begrænsninger for den næste token, hvilket gør dem i stand til at dekodere en token ad gangen. I stedet analyserer SGLang begrænsningerne og bygger en komprimeret endelig tilstandsmaskine til at repræsentere dem, hvilket komprimerer en multi-token-sti til en enkelt-steg-sti, når det er muligt, og tillader dekodning af multiple token på én gang for hurtigere hastighed.
  • API-speculative udførelse: For API-modeller som OpenAI’s GPT-4 introducerer SGLang API-speculative udførelse til at optimere multi-kald-programmer.

Med SGLang blev forskellige LLM-ansøgninger implementeret, herunder agent-kontrol, logisk resonnering, few-shot-læringsbenchmarks, JSON-dekodning, retrieval-augmented generation-pipelines, multi-turn-chat og multi-modality-behandling. Præstationen blev testet på modeller, herunder Llama-7B/70B, Mistral-8x7B, LLaVA-v1.5-7B (billede) og LLaVA-NeXT-34B (video) på NVIDIA (NVDA ) A10G og A100 GPU’er. Eksperimentelle resultater viser, at SGLang opnår op til 6,4 gange højere gennemløb på tværs af en bred vifte af arbejdsbyrder, modeller og hardware-konfigurationer sammenlignet med eksisterende programmerings- og inference-systemer, herunder Guidance, vLLM og LMQL.

SGLang: Programmeringsmodel og metode

SGLang-programmeringsmodellen introduceres gennem et løbende eksempel, der beskriver sprogets primitive og udførelse-mønstre, og fremhæver runtime-optimeringsmuligheder. Denne model forenkler kedelige operationer i multi-kald-arbejdsgange (f.eks. strengmanipulation, API-kald, begrænsnings-specifikation, parallelisme) ved at give fleksible og komponerende primitive. SGLang er et domæne-specifikt sprog indlejret i Python.

Funktionen multi_dimensional_judge tager tre argumenter: `s`, `path` og `essay`. s håndterer prompt-tilstanden, path er billedfil-stien, og essay er essay-teksten. Nye streng og SGLang-primitive kan føjes til tilstanden s for udførelse ved hjælp af +=-operatoren. Først føjer funktionen billedet og essayet til prompten. Den checker derefter, om essayet er relateret til billedet ved hjælp af select, og gemmer resultaterne i s[“related”]. Hvis relateret, forkas prompten til tre kopier for parallel evaluering fra forskellige dimensioner ved hjælp af gen til at gemme resultater i f[“judgment”]. Herefter samler den vurderingerne, genererer en sammenfatning og tildeler en bogstav-karakter. Til sidst returnerer den resultaterne i JSON-format, der følger et skema defineret af en regulær udtryks-begrænsning regex. SGLang forenkler betydeligt dette program, da et tilsvarende program ved hjælp af en OpenAI-API-lignende grænseflade ville kræve 2,1 gange så mange linjer kode på grund af manuel strengmanipulation og parallelisme-kontrol.

SGLang giver primitive for kontrol af prompt-tilstand, generation og parallelisme, der kan anvendes med Python-syntaks og biblioteker. Her er primitiverne:

gen: Kalder en model til at generere og gemmer resultaterne i en variabel med det navn, der er specificeret i dens første argument. Den understøtter et regex-argument til at begrænse output til at følge en grammatik defineret af et regulært udtryk (f.eks. en JSON-skema).

  • select: Kalder en model til at vælge den højeste sandsynlighed fra en liste.
  • += eller extend: Føjer en streng til prompten.
  • [variabelnavn]: Henter resultaterne af en generation.
  • fork: Oprettor parallelle fork af prompt-tilstanden.
  • join: Genforener prompt-tilstanden.
  • billede og video: Modtager billed- og video-input.

Den nemmeste måde at udføre et SGLang-program på er gennem en interpreter, hvor en prompt behandles som en asynkron strøm. Primitive som extend, gen og select sendes til strømmen for asynkron udførelse. Disse non-blocking-kald tillader Python-kode at fortsætte med at køre uden at vente på, at generationen er færdig, ligesom lancering af CUDA-kerner asynkront. Hver prompt håndteres af en strøm-eksekutør i en baggrundstråd, hvilket muliggør intra-program-parallelisme. Henting af generation-resultater vil blokere, indtil de er klar, hvilket sikrer korrekt synkronisering. Alternativt kan SGLang-programmer kompilieres som beregningsgrafer og udføres med en graf-eksekutør, hvilket tillader yderligere optimeringer. Denne artikel bruger interpreter-tilstand som standard og diskuterer compiler-tilstandsresultater i Appendix D. SGLang understøtter åbne-vægt-modeller med sin egen SGLang-runtime (SRT) samt API-modeller som OpenAI og Anthropic-modeller.

Programmeringssystemer for LLM’er kan klassificeres som høj-niveau (f.eks. LangChain, DSPy) og lav-niveau (f.eks. LMQL, Guidance, SGLang). Høj-niveau-systemer giver foruddefinerede eller auto-genererede prompts, såsom DSPy’s prompt-optimizer. Lav-niveau-systemer ændrer typisk ikke prompts, men tillader direkte manipulation af prompts og primitive. SGLang er et lav-niveau-system, der ligner LMQL og Guidance. Følgende tabel sammenligner deres funktioner.

SGLang fokuserer mere på runtime-effektivitet og kommer med sin egen co-designet runtime, der tillader nye optimeringer. Høj-niveau-sprog (f.eks. DSPy) kan kompilieres til lav-niveau-sprog (f.eks. SGLang). Integrationen af SGLang som backend i DSPy til bedre runtime-effektivitet demonstreres senere.

Ovenstående eksempel illustrerer RadixAttention-operationer med en LRU-eviction-politik på tværs af ni tidspunkter, hvilket viser den dynamiske tildeling og eviction af noder i respons til forskellige anmodninger, hvilket sikrer effektiv KV-cache-genbrug og hukommelseshåndtering.

Trin 1: Radix-træet er initialt tomt.

Trin 2: Serveren behandler en indkommende brugerbesked “Hej” og responderer med LLM-output “Hej”. Systemprompten “Du er en hjælpsom assistent”, brugerbeskeden “Hej!” og LLM-svaret “Hej!” konsolideres til træet som en enkelt kant forbundet til en ny node.

Trin 3: En ny prompt ankommer, og serveren finder præfikset af prompten (dvs. den første vending af samtalen) i radix-træet og genbruger dens KV-cache. Den nye vending føjes til træet som en ny node.

Trin 4: En ny chatsession begynder. Noden fra Trin 3 deles i to noder for at tillade, at de to chatsessioner kan dele systemprompten.

Trin 5: Den anden chatsession fortsætter. Men på grund af hukommelsesbegrænsninger skal en node fra Trin 4 fjernes. Den nye vending føjes til efter den tilbageværende node fra Trin 4.

Trin 6: Serveren modtager en few-shot-læringsanmodning, behandler den og indsætter den i træet. Rod-noden deles, fordi den nye anmodning ikke deler nogen præfiks med eksisterende noder.

Trin 7: Serveren modtager en batch af yderligere few-shot-læringsanmodninger. Disse anmodninger deler samme sæt af few-shot-eksempler, så en node fra Trin 6 deles for at tillade deling.

Trin 8: Serveren modtager en ny besked fra den første chatsession. Den fjerner alle noder fra den anden chatsession, da de er mindst nyligt brugt.

Trin 9: Serveren modtager en anmodning om at sampile flere svar til spørgsmålene i en node fra Trin 8, sandsynligvis til selv-konsistens-promptning. For at gøre plads til disse anmodninger fjernes multiple noder.

Dette eksempel demonstrerer, hvordan RadixAttention håndterer den dynamiske tildeling og eviction af noder i respons til forskellige anmodninger, hvilket sikrer effektiv KV-cache-genbrug og hukommelseshåndtering.

SGLang: Evaluering og resultater

Resultater på åbne-vægt-modeller

Latens- og gennemløbsresultaterne vises i følgende figurer. SGLang forbedrer gennemløbet med op til 6,4 gange og reducerer latensen med op til 3,7 gange. Disse forbedringer skyldes KV-cache-genbrug, udnyttelse af parallelisme inden for et enkelt program og hurtigere begrænset dekodning.

På disse benchmarks var cache-ramme-raten mellem 50% og 99%. Figur 13 (Appendix) viser de opnåede og optimale cache-ramme-rater for alle af dem, hvilket viser, at SGLang’s cache-bevidst planlægning nærmer sig 96% af den optimale ramme-rate i gennemsnit.

Resultater på større modeller med tensor-parallelisme

Større modeller, Mixtral-8x7B og Llama-70B, blev testet med tensor-parallelisme på samme sæt af benchmarks, og resultaterne rapporteres i følgende figur. Hastighedsforbedringen på større modeller viser en tendens, der ligner den, der observeres på mindre modeller, hvilket indikerer, at SGLang’s optimering generaliserer godt til større modeller. Guidance og LMQL blev udeladt på grund af manglende effektive implementeringer af tensor-parallelisme.

Resultater på multi-modale modeller

SGLang har naturlig støtte til multi-modale modeller med billede- og video-primitiver. Optimeringerne i denne artikel er kompatible med multi-modale modeller. For RadixAttention beregnes hashen af input-billederne og bruges som nøgle i radix-træet, hvilket tillader genbrug af KV-cachen for billed-token fra samme billede. LLaVA-v1.5-7B (billede) blev kørt på llava-bench-in-the-wild, og LLaVA-NeXT-34B (video) blev kørt på ActivityNet. Da disse modeller ikke er godt understøttet af andre baseline-systemer, blev modellernes oprindelige implementering i Hugging Face Transformers brugt som baseline. Som vist i følgende tabel giver SGLang op til 6 gange højere gennemløb på disse benchmarks. I llava-bench-in-the-wild blev multiple spørgsmål om samme billede behandlet, og SGLang-runtime genbrugte KV-cachen i dette tilfælde.

Produktionsudførelse

SGLang er blevet udført i Chatbot Arena til at betjene åbne-vægt-modeller. På grund af lav trafik for nogle modeller betjener kun en SGLang-arbejder hver. Efter en måned blev en RadixAttention-cache-ramme-rate på 52,4% for LLaVA-Next-34B og 74,1% for Vicuna-33B observeret. Cache-rammer kom fra fælles systembeskeder, hyppigt genbrugte eksempel-billeder og multi-vendings-chat-historik. Dette reducerede første-token-latensen i gennemsnit med 1,7 gange for Vicuna-33B.

Afsluttende tanker

I denne artikel har vi talt om SGLang, et nyt introduceret system, der sigter mod at løse dette problem ved at give en effektiv udførelse af komplekse sprogmodelprogrammer. SGLang består af et frontend-sprog og en runtime. Frontend’en forenkler programmering med primitive for generation og parallelisme-kontrol, mens runtime’en accelererer udførelsen gennem nye optimeringer som RadixAttention til KV-cache-genbrug og komprimerede endelige tilstandsmaskiner til hurtigere struktureret output-dekodning. Eksperimenter viser, at SGLang opnår op til 6,4 gange højere gennemløb sammenlignet med state-of-the-art-inferencesystemer på forskellige store sprog- og multimodale modeller, der løser opgaver som agent-kontrol, logisk resonnering, few-shot-læringsbenchmarks, JSON-dekodning, retrieval-augmented generation-pipelines og multi-turn-chat.

En ingeniør af profession, en forfatter af hjerte. Kunal er en teknisk forfatter med en dyb kærlighed og forståelse af AI og ML, dedikeret til at forenkle komplekse koncepter inden for disse felter gennem sin engagerende og informative dokumentation.