Kunstig intelligens

SGLang: Effektiv Utøvelse av Strukturerte Språkmodellprogrammer

mm
SGLang: Efficient Execution of Structured Language Model Programs

Store språkmodeller (LLM) brukes stadig mer for komplekse oppgaver som krever flere generasjonskall, avanserte promptteknikker, kontrollflyt og strukturerte inndata/utdata. likevel mangler det effektive systemer for programmering og kjøring av disse applikasjonene. SGLang, et nytt introdusert system, har som mål å løse dette ved å gi effektiv utøvelse av komplekse språkmodellprogrammer. SGLang består av et frontend-språk og en runtime. Frontenden forenkler programmering med primitiver for generering og parallell kontroll, mens runtime akselerer kjøring gjennom nye optimaliseringer som RadixAttention for KV-cache-gjenbruk og komprimerte finite statemaskiner for raskere strukturert utdata-dekoding. Eksperimenter viser at SGLang oppnår opptil 6,4 ganger høyere gjennomstrømming sammenlignet med state-of-the-art-inferenssystemer på forskjellige store språk- og multimodale modeller, som løser oppgaver som agentkontroll, logisk resonnering, few-shot-læringsbenchmarks, JSON-dekoding, retrieval-augmented genereringsrørledninger og multi-turn-samtale.

Nylige fremgang i LLM-egenskaper har utvidet deres nytte, og de kan nå håndtere en bredere rekke generelle oppgaver og fungere som autonome agenter. I disse applikasjonene engasjerer LLM-er i multi-runde-planlegging, resonnering og interaksjon med eksterne miljøer. Dette muliggjøres gjennom verktøybruk, multiple inndata-modi og forskjellige promptteknikker, som few-shot-læring, selv-konsistens, skjelett-av-tenkning og tre-av-tenkning. Disse nye bruksområdene nødvendiggjør multiple, ofte avhengige, LLM-generasjonskall, og indikerer en trend mot å bruke multi-kall-strukturer for å fullføre komplekse oppgaver.

Denne overgangen markerer en overgang fra enkel chatt til en mer sofistikert programmatisk bruk av LLM-er, hvor programmer planlegger og kontrollerer genereringsprosessene til LLM-er. Disse programmene kalles “Språkmodellprogrammer” (LM-programmer). Avanserte promptteknikker og agenter-arbeidsflyt faller innenfor området for LM-programmer. Det finnes to vanlige egenskaper ved LM-programmer: (1) LM-programmer innebærer vanligvis flere LLM-kall med kontrollflyt for å fullføre komplekse oppgaver og forbedre kvaliteten. (2) LM-programmer mottar strukturerte inndata og produserer strukturerte utdata, og muliggjør komposisjon av LM-programmer og integrasjon i eksisterende programvaresystemer.

I denne artikkelen vil vi dykke dyptere inn i SGLang-rammeverket, utforske dens arkitektur, analysere dens ytelse og sammenligne den med state-of-the-art-rammeverk. La oss begynne.

En Introduksjon til SGLang

Til tross for den utbredte bruken av LM-programmer, er nåværende systemer for å uttrykke og kjøre dem ineffektive. SGLang identifiserer to primære utfordringer forbundet med effektiv bruk av LM-programmer:

  • Programmeringskompleksitet: Utvikling av LM-programmer er tungvint og vanskelig på grunn av den ikke-deterministiske naturen til LLM-er. Dette inkluderer omfattende strengmanipulering, eksperimentell finjustering av prompter, skjøre utdataparsing, håndtering av multiple inndata-modi og implementering av parallellisme-mekanismer. Denne kompleksiteten reduserer betydelig lesbarheten av selv enkle programmer.
  • Kjøring-ineffektivitet: Kjøring av LM-programmer er ineffektiv på grunn av redundant beregning og minnebruk. State-of-the-art-inferensmotorer, som er optimert for å redusere latency og forbedre gjennomstrømming, mangler direkte kunnskap om arbeidsbelastningen, noe som resulterer i betydelige ineffektiviteter. Et bemerkelsesverdig eksempel er gjenbruk av Key-Value (KV)-cachen, som består av gjenbruksbare mellomliggende tensorer som er essensielle for generativ inferens. Nåværende systemer mangler effektive mekanismer for å fasilitere KV-cache-gjenbruk over multiple LLM-kall som deler en felles prefiks, noe som resulterer i unødvendige beregninger og bortkastet minne. I tillegg er begrenset dekoding for strukturerte utdata, som JSON-modus, underoptimalt, da eksisterende systemer bare dekoder en token om gangen.

For å løse disse utfordringene, introduserer SGLang et strukturert genereringsspråk for LLM-er. Det grunnleggende konseptet er å systematisk utnytte multi-kall-strukturen i LM-programmer for effektiv kjøring. Som vist i figuren nedenfor, består SGLang av to deler: en frontend-språk og en backend-runtime.

Frontenden forenkler programmeringen av LM-programmer, og runtime akselerer deres kjøring. Disse delene kan fungere sammen for bedre ytelse eller fungere uavhengig.

SGLang er et domene-spesifikt språk som er innbygget i Python, og tilbyr primitiver for generering (f.eks. extend, gen, select) og parallell kontroll (f.eks. fork, join). Det er kompatibelt med Pythons kontrollflyt og biblioteker, og tillater brukerne å utvikle avanserte prompt-workflows enkelt med naturlig Python-syntaks. SGLang inkluderer en interpreter og en compiler. Interpreteren håndterer prompt-tilstanden som en strøm og sender primitive operasjoner til strømmen for asynkron kjøring, og sikrer korrekt kontroll over synkronisering og intra-program-parallellisme. I tillegg kan SGLang-programmer spores og kompilert for ytterligere optimaliseringer.

  • RadixAttention: Denne teknikken muliggjør automatisk gjenbruk av KV-cachen over multiple generasjonskall. I eksisterende inferensmotorer, blir KV-cachen til en forespørsel kastet etter behandling, og hindrer gjenbruk over multiple kall og sakte kjøring. SGLang opprettholder en LRU-cache av KV-cachen innenfor en radix-tre, og håndterer KV-cachen som en tradisjonell cache, og bruker radix-treet for effektiv matching, innsetting og utvisning.
  • Komprimert Finite Statemaskin: Denne teknikken muliggjør raskere begrenset dekoding for strukturerte utdata. Eksisterende systemer følger bare begrensninger for den neste token, og kan bare dekodere en token om gangen. I stedet analyserer SGLang begrensningene og bygger en komprimert finit statemaskin for å representere dem, og komprimerer en multi-token-path til en enkelt-steg-path når det er mulig, og tillater dekoding av multiple token på en gang for raskere hastighet.
  • API Spekulativ Kjøring: For API-baserte modeller som OpenAI sine GPT-4, introduserer SGLang API-spekulativ kjøring for å optimalisere multi-kall-programmer.

Med SGLang, ble forskjellige LLM-applikasjoner implementert, inkludert agentkontroll, logisk resonnering, few-shot-læringsbenchmarks, JSON-dekoding, retrieval-augmented genereringsrørledninger, multi-turn-samtale og multi-modalt prosessering. Ytelsen ble testet på modeller inkludert Llama-7B/70B, Mistral-8x7B, LLaVA-v1.5-7B (bilde) og LLaVA-NeXT-34B (video) på NVIDIA A10G og A100 GPU-er. Eksperimentelle resultater viser at SGLang oppnår opptil 6,4 ganger høyere gjennomstrømming over en bred rekke av arbeidsbelastninger, modeller og maskinvare-konfigurasjoner, sammenlignet med eksisterende programmerings- og inferenssystemer, inkludert Guidance, vLLM og LMQL.

SGLang: Programmeringsmodell og Metodologi

SGLang-programmeringsmodellen introduseres gjennom et eksempel, som beskriver språkets primitiver og kjøringsmodi, og fremhever runtime-optimaliseringsmuligheter. Dette modell forenkler tungvinte operasjoner i multi-kall-arbeidsflyt (f.eks. strengmanipulering, API-kall, begrensningsspesifikasjon, parallellisme) ved å tilby fleksible og komponerbare primitiver. SGLang er et domene-spesifikt språk innbygget i Python.

Funksjonen multi_dimensional_judge tar tre argumenter: `s`, `path` og `essay`. s håndterer prompt-tilstanden, path er bilde-fil-sti, og essay er essay-teksten. Nye strenger og SGLang-primitiver kan legges til tilstanden s for kjøring ved å bruke +=-operatoren. Først legges bildet og essayet til prompten. Deretter sjekkes det om essayet er relatert til bildet ved å bruke select, og resultatet lagres i s[“related”]. Hvis relatert, forkas prompten i tre kopier for parallell evaluering fra forskjellige dimensjoner, ved å bruke gen til å lagre resultater i f[“judgment”]. Deretter slås dommene sammen, genereres en sammenfatting, og tildelt en bokstav-karakter. Til slutt returneres resultater i JSON-format, etter en skjema definert av en regulær uttrykk-begrensning regex. SGLang forenkler betydelig dette programmet, da et tilsvarende program som bruker et OpenAI-API-lignende grensesnitt ville kreve 2,1 ganger så mange kode-linjer på grunn av manuell strengmanipulering og parallell kontroll.

SGLang tilbyr primitiver for å kontrollere prompt-tilstand, generering og parallellisme, som kan brukes med Python-syntaks og biblioteker. Her er primitivene:

gen: Kaller en modell for å generere og lagrer resultater i en variabel med navnet spesifisert i dens første argument. Den støtter en `regex`-argument for å begrense utdata til å følge en grammatikk definert av et regulært uttrykk (f.eks. et JSON-skjema).

  • select: Kaller en modell for å velge den høyest sannsynlige valgmuligheten fra en liste.
  • += eller extend: Legger til en streng til prompten.
  • [variabel_navn]: Henter resultater fra en generering.
  • fork: Oppretter parallelle fork av prompt-tilstanden.
  • join: Gjenforener prompt-tilstanden.
  • bilde og video: Tar imot bilde- og video-inndata.

Den enkleste måten å kjøre et SGLang-program er gjennom en interpreter, hvor en prompt behandles som en asynkron strøm. Primitiver som extend, gen og select sendes til strømmen for asynkron kjøring. Disse ikke-blokkerende kallene tillater Python-kode å fortsette å kjøre uten å vente på at genereringen er ferdig, på samme måte som å lansere CUDA-kjerner asynkront. Hver prompt håndteres av en strøm-eksekutør i en bakgrunnstråd, og muliggjør intra-program-parallellisme. Henting av genereringsresultater vil blokkere til de er klare, og sikrer korrekt synkronisering. Alternativt kan SGLang-programmer kompilert som beregningsgrafer og kjørt med en graf-eksekutør, og tillater for ytterligere optimaliseringer. Denne artikkelen bruker interpreter-modus som standard, og diskuterer compiler-modus-resultater i Appendiks D. SGLang støtter åpne vekt-modeller med sin egen SGLang Runtime (SRT), samt API-modeller som OpenAI og Anthropic-modeller.

Programmeringssystemer for LLM-er kan klassifiseres som høynivå (f.eks. LangChain, DSPy) og lavnivå (f.eks. LMQL, Guidance, SGLang). Høynivå-systemer tilbyr forhåndsdefinerte eller auto-genererte prompter, som DSPy sin prompt-optimizer. Lav-nivå-systemer tillater vanligvis ikke å endre prompter, men tillater direkte manipulering av prompter og primitiver. SGLang er et lav-nivå-system lignende LMQL og Guidance. Følgende tabell sammenligner deres funksjoner.

SGLang fokuserer mer på runtime-effektivitet og kommer med sin egen co-designet runtime, og tillater nye optimaliseringer. Høynivå-språk (f.eks. DSPy) kan kompilert til lav-nivå-språk (f.eks. SGLang). Integrering av SGLang som en backend i DSPy for bedre runtime-effektivitet demonstreres senere.

Eksempelet ovenfor illustrerer RadixAttention-operasjoner med en LRU-utvisningspolitikk over ni tidspunkter, og viser den dynamiske allokasjonen og utvisningen av noder i respons til forskjellige typer forespørsler, og sikrer effektiv KV-cache-gjenbruk og minnehåndtering.

Dette eksempelet demonstrerer hvordan RadixAttention håndterer den dynamiske allokasjonen og utvisningen av noder i respons til forskjellige typer forespørsler, og sikrer effektiv KV-cache-gjenbruk og minnehåndtering.

SGLang: Evaluering og Resultater

Resultater på Åpne Vekt-Modeller

Latens- og gjennomstrømmingsresultater vises i følgende figurer. SGLang forbedrer gjennomstrømming med opptil 6,4 ganger og reduserer latens med opptil 3,7 ganger. Disse forbedringene skyldes KV-cache-gjenbruk, utnyttelse av parallellisme innenfor et enkelt program, og raskere begrenset dekoding.

På disse benchmarkene var cache-treff-raten mellom 50% og 99%. Figuren 13 (Appendiks) lister opp nådde og optimale cache-treff-rater for alle av dem, og viser at SGLang sin cache-bevisst planlegging nærmer seg 96% av den optimale treff-raten i gjennomsnitt.

Resultater på Større Modeller med Tensor-Parallellisme

Større modeller, Mixtral-8x7B og Llama-70B, ble testet med tensor-parallellisme på samme sett av benchmark, og resultater rapporteres i følgende figur. Hastighetsforbedringen på større modeller viser en trend lignende den observerte på mindre modeller, og indikerer at SGLang sin optimalisering generaliserer godt til større modeller. Guidance og LMQL ble utelatt på grunn av manglende effektive implementeringer av tensor-parallellisme.

Resultater på Multi-Modale Modeller

SGLang har nativ støtte for multi-modale modeller med bilde- og video-primitiver. Optimaliseringene i denne artikkelen er kompatible med multi-modale modeller. For RadixAttention, beregnes hashen av inndata-bildene og brukes som nøkkel i radix-treet, og tillater gjenbruk av KV-cachen av bilde-token fra samme bilde. LLaVA-v1.5-7B (bilde) ble kjørt på llava-bench-in-the-wild, og LLaVA-NeXT-34B (video) på ActivityNet. Fordi disse modellene ikke støttes godt av andre baseline-systemer, ble modell-forfatterens originale implementering i Hugging Face Transformers brukt som baseline. Som vist i følgende tabell, tilbyr SGLang opptil 6 ganger høyere gjennomstrømming på disse benchmarkene. I llava-bench-in-the-wild ble flere spørsmål om samme bilde håndtert, og SGLang-runtime gjenbrukte KV-cachen i dette tilfellet.

Produksjons-Deployering

SGLang er deployert i Chatbot Arena for å betjene åpne vekt-modeller. På grunn av lav trafikk for noen modeller, betjener bare en SGLang-arbeider hver modell. Etter en måned, ble en RadixAttention-cache-treff-rate på 52,4% for LLaVA-Next-34B og 74,1% for Vicuna-33B observert. Cache-treff kom fra felles system-meldinger, hyppig gjenbrukte eksempel-bilder og multi-turn-samtale-historier. Dette reduserte første-token-latens med en gjennomsnitt på 1,7 ganger for Vicuna-33B.

Slutt tanker

I denne artikkelen har vi snakket om SGLang, et nytt introdusert system som har som mål å løse dette ved å gi effektiv utøvelse av komplekse språkmodellprogrammer. SGLang består av et frontend-språk og en runtime. Frontenden forenkler programmering med primitiver for generering og parallell kontroll, mens runtime akselerer kjøring gjennom nye optimaliseringer som RadixAttention for KV-cache-gjenbruk og komprimerte finite statemaskiner for raskere strukturert utdata-dekoding. Eksperimenter viser at SGLang oppnår opptil 6,4 ganger høyere gjennomstrømming sammenlignet med state-of-the-art-inferenssystemer på forskjellige store språk- og multimodale modeller, som løser oppgaver som agentkontroll, logisk resonnering, few-shot-læringsbenchmarks, JSON-dekoding, retrieval-augmented genereringsrørledninger og multi-turn-samtale.

En ingeniør av yrke, en forfatter av hjerte. Kunal er en teknisk forfatter med en dyp kjærlighet og forståelse av AI og ML, dedikert til å forenkle komplekse konsepter i disse feltene gjennom sin engasjerende og informerende dokumentasjon.