AI-mallit ja alustat

SGLang: Tehokas Rakenteisten Kielimalliohjelmien Suorittaminen

mm
Lisää Unite.AI suosikkilähteisiisi Google-palvelussa

Suuret kielimallit (LLM) käytetään yhä enemmän monimutkaisiin tehtäviin, jotka vaativat useita generointikutsuja, edistyneitä ohjaustekniikoita, ohjausvirran hallintaa ja rakenteellisia syöte- ja tulostuksia. Kuitenkin tehokkaat järjestelmät näiden sovellusten ohjelmointiin ja suorittamiseen puuttuvat. SGLang, uusi järjestelmä, pyrkii ratkaisemaan tämän tarjoamalla tehokkaan suorittamisen monimutkaisille kielimalliohjelmille. SGLang koostuu eturintamasta ja ajonaikaisesta ympäristöstä. Eturintama yksinkertaa ohjelmointia primitiiveillä, jotka hallitsevat generointia ja rinnakkaisuuden hallintaa, kun taas ajonaikainen ympäristö kiihdyttää suorittamista uusilla optimoinneilla, kuten RadixAttentionilla, joka hyödyntää KV-välimuistia, ja pakatuilla äärellisillä automaateilla, jotka nopeuttavat rakenteellisen tulostuksen purkamista. Kokeet osoittavat, että SGLang saavuttaa jopa 6,4-kertaisen suorituskyvyn verrattuna viimeisimpiin inference-järjestelmiin erilaisilla suurilla kielimalleilla ja multimodaalisilla malleilla, jotka ratkaisevat tehtäviä, kuten agenttien hallintaa, loogista päättelyä, vähän koulutusaineistoa vaativia benchmark-testeja, JSON-dekoodausta, hakijajärjestelmien tuottamista ja monivaiheisia keskusteluja.

Viimeaikaiset edistykset LLM-kapasiteetissa ovat laajentaneet niiden käyttökelpoisuutta, mahdollistaen niiden käsittelemisen laajempaa joukkoa yleisiä tehtäviä ja toimimisen itsenäisinä agenteina. Näissä sovelluksissa LLM:t osallistuvat monivaiheiseen suunnitteluun, päättelyyn ja vuorovaikutukseen ulkoisten ympäristöjen kanssa. Tämä tapahtuu työkalujen avulla, useiden syötemuotojen kautta ja erilaisilla ohjaustekniikoilla, kuten vähän koulutusaineistoa vaativilla, itseensäviittaavilla, luurankomaisilla ja puumaisilla ohjaustekniikoilla. Nämä uudet käyttötarkoitukset edellyttävät useita, usein riippuvia, LLM-generointikutsuja, osoittaen suunnan monikutsurakenteiden käyttämiseen monimutkaisten tehtävien suorittamiseksi.

Tämä muutos merkitsee siirtymistä yksinkertaisesta chat-keskustelusta monimutkaisempiin ohjelmallisiin LLM-käyttötapauksiin, joissa ohjelmat suunnittelevat ja hallitsevat LLM-generointiprosesseja. Nämä ohjelmat kutsutaan “Kielimalliohjelmiksi” (LM-ohjelmat). Edistyneet ohjaustekniikat ja agenteille suunnatut työvirrat kuuluvat LM-ohjelmien piiriin. On kaksi yleistä ominaisuutta LM-ohjelmissa: (1) LM-ohjelmat sisältävät usein useita LLM-kutsuja, joita yhdistetään ohjausvirran kanssa monimutkaisten tehtävien suorittamiseksi ja kokonaislaadun parantamiseksi. (2) LM-ohjelmat vastaanottavat rakenteellisia syöte- ja tuototietoja, mikä mahdollistaa LM-ohjelmien yhdistämisen olemassa oleviin ohjelmistojärjestelmiin.

Tässä artikkelissa tutustumme SGLang-kehykseen, sen arkkitehtuuriin, suorituskykyyn ja vertaamme sitä nykyisiin kehyksiin. Aloita siis.

SGLangin Johdanto

Vaikka LM-ohjelmia käytetään laajasti, nykyiset järjestelmät niiden ilmaisemiseen ja suorittamiseen ovat tehottomia. SGLang tunnistaa kaksi päähaastetta tehokkaan LM-ohjelmien käytön yhteydessä:

  • Ohjelmointikompleksisuus: LM-ohjelmien kehittäminen on vaativaa ja hankalaa LLM:n epädeterministisen luonteen vuoksi. Tähän sisältyy laaja merkkijonon manipulointi, koekokeellinen ohjausten säätö, haavoittuvat tulostuksen parsiointi, useiden syötemuotojen käsittely ja rinnakkaisuuden toteuttaminen. Tämä kompleksisuus vähentää jopa yksinkertaisten ohjelmien luettavuutta.
  • Suoritustehottomuus: LM-ohjelmien suorittaminen on tehottomaa redundanteista laskelmista ja muistin käytöstä johtuen. Viimeisimmät inference-moottorit, jotka on optimoitu vähentämään viivästystä ja parantamaan suorituskykyä, eivät ole suunniteltu työmäärän tiedostamiseen, mikä johtaa merkittäviin tehottomuuksiin. Esimerkkinä on KV-välimuistin uudelleenkäyttö, joka koostuu uudelleenkäytettävistä välituloksista, jotka ovat välttämättömiä generatiiviselle inferenceille. Nykyiset järjestelmät eivät tarjoa tehokkaita mekanismeja KV-välimuistin uudelleenkäytölle useiden LLM-kutsujen välillä, jotka jakavat yhteisen etuliitteen, mikä johtaa tarpeettomiin laskelmiin ja haaskatuun muistiin. Lisäksi rajoitettu dekoodaus rakenteellisten tulostusten kuten JSON-tiedostojen käsittelyssä on alimitoitu, koska nykyiset järjestelmät dekoodaavat vain yhden tokenin kerrallaan.

Ratkaisemaan nämä haasteet SGLang esittelee Rakenteisen Generoinnin Kielen LLM:ille. Perusidea on hyödyntää järjestelmällisesti LM-ohjelmien monikutsurakennetta tehokkaan suorittamisen saavuttamiseksi. Seuraavassa kuvassa on esitetty SGLangin kaksi osaa: eturintama ja ajonaikainen ympäristö.

Eturintama yksinkertaa LM-ohjelmien ohjelmointia, ja ajonaikainen ympäristö kiihdyttää niiden suorittamista. Nämä osat voivat toimia yhdessä paremman suorituskyvyn saavuttamiseksi tai toimia itsenäisesti.

SGLang on Pythoniin upotettu domain-kohtainen kieli, joka tarjoaa primitiivejä generoinnin (esim. laajennus, gen, valitse) ja rinnakkaisuuden hallinnan (esim. fork, join) osalta. Se on yhteensopiva Pythonin ohjausvirran ja kirjastojen kanssa, mikä mahdollistaa edistyneiden ohjausvirran työkalujen kehittämisen helposti käyttäen Pythonin syntaksia. SGLang sisältää tulkin ja kääntäjän. Tulkki hallitsee ohjausvirran tilan merkkijonona ja lähettää primitiivitoiminnot merkkijonoon asynkronisesti, varmistaen oikean synchronisaation ja intraohjelmallisen rinnakkaisuuden. Lisäksi SGLang-ohjelmat voidaan jäljittää ja kääntää edelleen optimointeja varten. SGLangin ajonaikainen ympäristö ehdottaa useita uusia optimointeja LM-ohjelmien suorittamisen nopeuttamiseksi:

  • RadixAttention: Tämä tekniikka mahdollistaa KV-välimuistin automaattisen uudelleenkäytön useiden generointikutsujen välillä. Nykyisissä inference-moottoreissa KV-välimuisti hävitetään kunkin pyynnön jälkeen, estäen uudelleenkäytön useiden kutsujen välillä ja hidastaen suorittamista. SGLang ylläpitää LRU-välimuistia KV-välimuistista radix-puun sisällä, hallitsemalla KV-välimuistia perinteisen välimuistin tavoin ja käyttäen radix-puuta tehokkaan vastaamisen, lisäämisen ja poistamisen toteuttamiseen. Tämä mahdollistaa ajonaikaisen ympäristön tehokkaan käsittelyn erilaisia uudelleenkäyttötapauksia.
  • Pakattu Äärellinen Automaatti: Tämä tekniikka mahdollistaa nopeamman rajoitetun dekoodauksen rakenteellisten tulostusten käsittelyssä. Nykyiset järjestelmät noudattavat rajoituksia vain seuraavalle tokenille, mikä mahdollistaa vain yhden tokenin dekoodauksen kerrallaan. Sen sijaan SGLang analysoi rajoitukset ja rakentaa pakatun äärellisen automaatin edustamaan niitä, pakkaamalla usean tokenin polun yhdeksi askelksi, missä mahdollista, mahdollistaen useiden tokenien dekoodauksen yhtä aikaa nopeamman nopeuden vuoksi.
  • API Spekulatiivinen Suorittaminen: API-malleille, kuten OpenAI:n GPT-4:lle, SGLang esittelee API spekulatiivisen suorittamisen monikutsuohjelmien optimointiin.

Käyttämällä SGLangia, useita LLM-sovelluksia on toteutettu, mukaan lukien agenttien hallinta, looginen päättely, vähän koulutusaineistoa vaativat benchmark-testit, JSON-dekoodaus, hakijajärjestelmien tuottaminen, monivaiheiset keskustelut ja monimodaalinen prosessointi. Suorituskyky on testattu malleilla, kuten Llama-7B/70B, Mistral-8x7B, LLaVA-v1.5-7B (kuva) ja LLaVA-NeXT-34B (video) NVIDIA (NVDA ) A10G- ja A100-grafiikkakorteilla. Kokeelliset tulokset osoittavat, että SGLang saavuttaa jopa 6,4-kertaisen suorituskyvyn laajalla joukolla työmäärää, malleja ja laitteistokokoonpanoja, verrattuna olemassa oleviin ohjelmointi- ja inference-järjestelmiin, mukaan lukien Guidance, vLLM ja LMQL.

SGLang: Ohjelmointimalli ja Menetelmä

SGLangin ohjelmointimalli esitetään esimerkin kautta, joka kuvailee kielen primitiivejä ja suorittamistiloja, sekä korostaa ajonaikaisen ympäristön optimointimahdollisuuksia. Tämä malli yksinkertaa monimutkaisia operaatioita monikutsu-työvirroissa (esim. merkkijonon manipulointi, API-kutsu, rajoitusten määrittely, rinnakkaisuus) tarjoamalla joustavia ja komponentteja primitiivejä. SGLang on Pythoniin upotettu domain-kohtainen kieli. Seuraavassa kuvassa on esitetty ohjelma, joka arvioi esseetä kuvasta branch-solve-merge-ohjausmenetelmällä.

Funktio multi_dimensional_judge ottaa kolme argumenttia: `s`, `path` ja `essay`. s hallitsee ohjausvirran tilan, path on kuvatiedoston polku ja essay on esseeteksti. Uudet merkkijonot ja SGLang-primitiivit voidaan liittää tilaan s suorittamista varten +=-operaattorin avulla. Ensinnäkin funktio lisää kuvan ja esseetekstin ohjausvirtaan. Se tarkistaa sitten, onko esseeteksti liittynyt kuvaan valitsemalla tuloksen s[“related”]-muuttujaan. Jos ne liittyvät, ohjausvirta forkataan kolmeen rinnakkaiseen kopiointiin eri ulottuvuuksien arvioimiseksi gen-primitiivin avulla, joka tallentaa tulokset f[“judgment”]-muuttujaan. Seuraavaksi se yhdistää arviot, generoi yhteenvetokuvauksen ja määrittää kirjaimen arvosanan. Lopuksi se palauttaa tulokset JSON-muodossa, noudattaen sääntöä, joka määritellään säännöllisellä lausekkeella.

SGLang tarjoaa primitiivit ohjausvirran hallintaan, generointiin ja rinnakkaisuuteen, jotka voidaan käyttää Pythonin syntaksin ja kirjastojen kanssa. Tässä ovat primitiivit:

gen: Kutsuu mallia generoimaan ja tallentaa tulokset muuttujaan, jonka nimi on määritelty sen ensimmäisessä argumentissa. Se tukee regex-argumenttia, joka rajoittaa tulostuksen noudattamaan kielioppiä, joka on määritelty säännöllisellä lausekkeella (esim. JSON-skeema).

  • valitse: Kutsuu mallia valitsemaan korkeimman todennäköisyyden vaihtoehdon luettelosta.
  • += tai laajennus: Liittää merkkijonon ohjausvirtaan.
  • [muuttujan_nimi]: Haetaan generoinnin tuloksia.
  • fork: Luo rinnakkaisia haaroja ohjausvirran tilasta.
  • join: Yhdistää ohjausvirran tilan.
  • kuva ja video: Käsittävät kuvan ja videon syötteitä.

Yksinkertaisin tapa suorittaa SGLang-ohjelmaa on kääntäjän avulla, jossa ohjausvirta käsitellään asynkronisena merkkijonona. Primitiivit, kuten laajennus, gen ja valitse, lähettävät merkkijonoon asynkronisesti, mikä mahdollistaa oikean synchronisaation ja intraohjelmallisen rinnakkaisuuden. Vastaavat non-blocking-kutsut sallivat Python-koodin suorittamisen ilman odottamista generoinnin valmistumista, samalla tavalla kuin CUDA-ytimien asynkroninen käynnistäminen. Jokainen ohjausvirta hallitaan taustaproessimena, mikä mahdollistaa intraohjelmallisen rinnakkaisuuden. Haetaan generoinnin tuloksia, joka estää suorittamisen, kunnes ne ovat valmiit, varmistaen oikean synchronisaation. Vaihtoehtoisesti SGLang-ohjelmat voidaan kääntää laskentaverkoiksi ja suorittaa verkon suorittimella, mikä mahdollistaa lisää optimointeja. Tämä artikkeli käyttää oletusarvoisesti tulkintatilaa ja käsittelee käännöksen tuloksia liitteessä D. SGLang tukee avoimia mallimalleja omalla SGLang-ajonaikaisella ympäristöllä (SRT) sekä API-malleja, kuten OpenAI ja Anthropic.

LLM:ien ohjelmointijärjestelmät voidaan luokitella korkean tason (esim. LangChain, DSPy) ja matalan tason (esim. LMQL, Guidance, SGLang) järjestelmiksi. Korkean tason järjestelmät tarjoavat ennalta määritellyt tai automaattisesti generoidut ohjausvirrat, kuten DSPy:n ohjausvirran optimoija. Matalan tason järjestelmät eivät yleensä muuta ohjausvirtoja, mutta sallivat suoran ohjausvirran ja primitiivien manipuloinnin. SGLang on matalan tason järjestelmä, joka on samankaltainen kuin LMQL ja Guidance. Seuraavassa taulukossa on esitetty niiden ominaisuuksien vertailu.

SGLang keskittyy enemmän ajonaikaisen ympäristön tehokkuuteen ja tulee omalla yhteen suunnitellulla ajonaikaisella ympäristöllä, joka mahdollistaa uusia optimointeja. Korkean tason kielet (esim. DSPy) voidaan kääntää matalan tason kieliksi (esim. SGLang). SGLangin integrointi DSPy:n taustajärjestelmäksi paremman ajonaikaisen ympäristön saavuttamiseksi on osoitettu myöhemmin.

Edellä oleva esimerkki osoittaa RadixAttention-operaatiot LRU-poistopolitiikalla yhdeksän aikapisteessä, havainnollistaen radix-puun dynaamista kehittymistä erilaisiin pyynnöksiin, mukaan lukien kaksi chat-istuntoa, erä vähän koulutusaineistoa vaativia kysymyksiä ja itseensäviittaavaa näytteenottoa. Jokainen puun reuna kantaa merkintää, joka edustaa alijonoa tai tokenien jonoa. Solmut on väritetty eri tiloja vastaamaan: vihreä uusille solmuille, sininen välimuistissa oleville solmuille, jotka on käytetty aikapisteessä, ja punainen poistetuille solmuille.

Ask 1: Radix-puu on aluksi tyhjä.

Ask 2: Palvelin käsittelee saapuvan käyttäjän viestin “Hei” ja vastaa LLM-vastauksella “Moi”. Järjestelmän ohjausvirta “Olet avulias apuri”, käyttäjän viesti “Hei!” ja LLM-vastaus “Moi!” yhdistetään yhdeksi reunaksi, joka on liitetty uuteen solmuun.

Ask 3: Uusi ohjausvirta saapuu, ja palvelin löytää ohjausvirran etuliitteen (ts. ensimmäisen keskustelun kierroksen) radix-puusta ja uudelleenkäyttää sen KV-välimuistia. Uusi kierros liitetään puuhun uutena solmuna.

Ask 4: Uusi chat-istunto alkaa. Solmu Ask 3:sta jaetaan kahteen solmuun, jotta kaksi chat-istuntoa voivat jakaa järjestelmän ohjausvirran.

Ask 5: Toinen chat-istunto jatkuu. Muistin rajoitusten vuoksi solmu Ask 4:stä on poistettava. Uusi kierros liitetään Ask 4:stä jäljelle jäävän solmun jälkeen.

Ask 6: Palvelin vastaanottaa vähän koulutusaineistoa vaativan kysymyksen, käsittelee sen ja lisää sen puuhun. Juurisolmu on jaettu, koska uusi kysymys ei jaa etuliitettä olemassa olevien solmujen kanssa.

Ask 7: Palvelin vastaanottaa useita vähän koulutusaineistoa vaativia kysymyksiä. Nämä kysymykset jakavat saman joukon vähän koulutusaineistoa vaativia esimerkkejä, joten solmu Ask 6:sta on jaettu jakamisen mahdollistamiseksi.

Ask 8: Palvelin vastaanottaa uuden viestin ensimmäisestä chat-istunnosta. Se poistaa kaikki solmut toisesta chat-istunnosta, koska ne ovat vähiten äskettäin käytettyjä.

Ask 9: Palvelin vastaanottaa pyynnön näytteiden ottamiseksi kysymyksiin solmusta Ask 8:sta, luultavasti itseensäviittaavan ohjausvirran vuoksi. Tehdäkseen tilaa näille pyynnöille useita solmuja on poistettava.

Tämä esimerkki osoittaa, miten RadixAttention käsittelee dynaamisen solmujen aloittamisen ja poistamisen erilaisiin pyynnöksiin, varmistaen tehokkaan KV-välimuistin uudelleenkäytön ja muistin hallinnan.

SGLang: Arviointi ja Tulokset

Tulokset Avokantaisilla Malleilla

Viive- ja suorituskykytulokset on esitetty seuraavissa kuvissa. SGLang parantaa suorituskykyä jopa 6,4-kertaisesti ja vähentää viivästystä jopa 3,7-kertaisesti. Nämä parannukset johtuvat KV-välimuistin uudelleenkäytöstä, yksittäisen ohjelman rinnakkaisuuden hyödyntämisestä ja nopeammasta rajoitetusta dekoodauksesta.

Näillä benchmark-testeillä välimuistin osumatarkkuus vaihtelee 50 %:sta 99 %:iin. Liite 13 (Liitteessä) listaa saavutetut ja optimaaliset välimuistin osumatarkkuudet kaikille, osoittaen, että SGLangin välimuistitietoinen aikataulutus lähestyy 96 %:ia optimaalisesta osumatarkkuudesta keskimäärin.

Tulokset Suuremmilla Malleilla Tensorin Rinnakkaisuudella

Suuremmat mallit, Mixtral-8x7B ja Llama-70B, on testattu tensorin rinnakkaisuudella samalla joukolla benchmark-testeillä, ja tulokset on raportoitu seuraavassa kuvassa. Suuremmilla malleilla havaittu nopeutus on samankaltainen kuin pienemmillä malleilla, osoittaen, että SGLangin optimointi yleistyy hyvin suuremmille malleille. Guidance ja LMQL on jätetty pois johtuen tensorin rinnakkaisuuden tehokkaan toteutuksen puutteesta.

Tulokset Monimodaalisilla Malleilla

SGLang tukee luonnostaan monimodaalisia malleja kuva- ja video-primitiiveillä. Tässä artikkelissa esitetyt optimoinnit ovat yhteensopivia monimodaalisten mallien kanssa. RadixAttentionissa syötteen kuvien haettiin hash ja käytettiin avaimena radix-puussa, mikä mahdollisti KV-välimuistin uudelleenkäytön saman kuvan tokenien osalta. LLaVA-v1.5-7B (kuva) on suoritettu llava-bench-in-the-wild-benchmarkilla ja LLaVA-NeXT-34B (video) on suoritettu ActivityNet-benchmarkilla. Koska nämä mallit eivät ole hyvin tuettuja muiden vertailujärjestelmien kanssa, mallin alkuperäinen toteutus Hugging Face Transformersissa on käytetty vertailukohtana. Kuten seuraavassa taulukossa on esitetty, SGLang tarjoaa jopa 6-kertaisen suorituskyvyn näillä benchmark-testeillä. Llava-bench-in-the-wild-benchmarkissa useita kysymyksiä samasta kuvasta käsiteltiin, ja SGLangin ajonaikainen ympäristö uudelleenkäytti KV-välimuistia tässä tapauksessa.

Tuotantoon Käyttöönotto

SGLang on käyttöönotettu Chatbot Arenaan avoimien mallien palveluun. Johtuen alhaisesta liikenteestä joillekin malleille, vain yksi SGLang-työntekijä palvelee kunkin mallin. Kuukauden jälkeen havaittiin 52,4 %:n RadixAttention-välimuistin osumatarkkuus LLaVA-Next-34B:lle ja 74,1 %:n Vicuna-33B:lle. Välimuistin osumat tulivat yleisistä järjestelmän viesteistä, usein uudelleen käytetyistä esimerkkikuvista ja monivaiheisista chat-historioista. Tämä vähensi ensimmäisen tokenin viivästystä keskimäärin 1,7-kertaisesti Vicuna-33B:lle.

Lopputajat

Tässä artikkelissa olemme puhuneet SGLangista, uudesta järjestelmästä, joka pyrkii ratkaisemaan tehokkaan suorittamisen monimutkaisille kielimalliohjelmille. SGLang koostuu eturintamasta ja ajonaikaisesta ympäristöstä. Eturintama yksinkertaa ohjelmointia primitiiveillä, jotka hallitsevat generointia ja rinnakkaisuuden hallintaa, kun taas ajonaikainen ympäristö kiihdyttää suorittamista uusilla optimoinneilla, kuten RadixAttentionilla KV-välimuistin uudelleenkäytölle ja pakatuilla äärellisillä automaateilla nopeamman rakenteellisen tulostuksen purkamiseksi. Kokeet osoittavat, että SGLang saavuttaa jopa 6,4-kertaisen suorituskyvyn verrattuna viimeisimpiin inference-järjestelmiin erilaisilla suurilla kielimalleilla ja multimodaalisilla malleilla, jotka ratkaisevat tehtäviä, kuten agenttien hallintaa, loogista päättelyä, vähän koulutusaineistoa vaativia benchmark-testeja, JSON-dekoodausta, hakijajärjestelmien tuottamista ja monivaiheisia keskusteluja.

Kunal Kejriwal on backend‑insinööri, joka on erikoistunut Pythoniin, PostgreSQL:ään, Redis:iin ja pilvi‑infrastruktuuriin GCP:ssä ja AWS:ssä. Kolmen vuoden kokemuksella tuotantojärjestelmien rakentamisesta ja skaalaamisesta hän kirjoittaa AI‑infrastruktuurista, hajautetuista järjestelmistä ja koneoppimistyönkuormien käyttöönoton arkkitehtuurista.