AI-mallit ja alustat
LLM-jakelun optimointi: vLLM PagedAttention ja tehokkaan AI-palvelun tulevaisuus
Suurten kielen mallien (LLM) käyttäminen todellisissa sovelluksissa esittää ainutlaatuisia haasteita, erityisesti laskentaresurssien, viiveen ja kustannusvaikuttavuuden suhteen. Tässä kattavassa oppaassa tutkimme LLM-palvelun maisemaa, keskittyen erityisesti vLLM:ään (vektori kielen malli), joka on ratkaisu, joka muuttaa tapaa, jolla käytämme ja vuorovaikutamme näiden voimakkaiden mallien kanssa.
LLM-palvelun haasteet
Ennen kuin tutkimme tarkemmin ratkaisuja, tarkastellaan avainhaasteita, jotka tekevät LLM-palvelusta monimutkaisen tehtävän:
Laskentaresurssit
LLM:t ovat maineeltaan valtavien parametriensa määrästä, joka vaihtelee miljardeista satoihin miljardeihin. Esimerkiksi GPT-3:lla on 175 miljardia parametria, kun taas uudemmilla malleilla, kuten GPT-4:llä, on arvioitu olevan vielä enemmän. Tämä valtava koko kääntyy merkittäviksi laskentavaatimuksiksi inferenceksi.
Esimerkki:
Tarkastellaan suhteellisen vaatimatonta LLM:ää, jolla on 13 miljardia parametria, kuten LLaMA-13B. Tästä mallista vaaditaan:
– Noin 26 GB muistia vain mallin parametreja varten (olettaen 16-bittistä tarkkuutta)
– Lisämuistia aktivaatioille, huomiomekanismeille ja välitöntöihin laskelmiin
– Merkittävää GPU-laskentatehoa reaaliaikaiselle inferenceksi
Viive
Monissa sovelluksissa, kuten chatboteissa tai reaaliaikaisessa sisällön luonnissa, matala viive on tärkeää hyvän käyttökokemuksen kannalta. LLM:n monimutkaisuus kuitenkin voi johtaa merkittäviin prosessointiaikoihin, erityisesti pidempien sekvenssien kohdalla.
Esimerkki:
Kuvitellaan asiakaspalveluun tarkoitettu chatbotti, joka perustuu LLM:ään. Jos jokainen vastaus vaatii useita sekunteja, keskustelu tulee tuntumaan epäluonnolliselta ja ärsyttävältä käyttäjille.
Kustannukset
LLM:n suorittamiseen tarvittava laitteisto voi olla erittäin kallista. Korkean suorituskyvyn tarjoavat GPU:t tai TPU:t ovat usein välttämättömiä, ja näiden järjestelmien energiankulutus on merkittävää.
Esimerkki:
Käyttäminen NVIDIA A100 -GPU:lla (jota usein käytetään LLM-inferenssiin) voi maksaa tuhansia dollareita päivässä pilvilaskennan maksuissa.
Perinteiset LLM-palvelun lähestymistavat
Ennen kuin tutkimme edistyneempiä ratkaisuja, tarkastellaan lyhyesti joitakin perinteisiä LLM-palvelun lähestymistapoja:
Yksinkertainen käyttöönotto Hugging Transformersin avulla
Hugging Face Transformers -kirjasto tarjoaa suoraviivaisen tavan LLM:n käyttöönottoon, mutta se ei ole optimoitu korkean läpäisyn palveluun.
Koodiesimerkki:
“`python
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
mallin_nimi = “meta-llama/Llama-2-13b-hf”
malli = AutoModelForCausalLM.from_pretrained(mallin_nimi, device_map=”auto”)
tokenizer = AutoTokenizer.from_pretrained(mallin_nimi)
def luo_teksti(aloitus, maksimi_pituus=100):
syöte = tokenizer(aloitus, return_tensors=”pt”).to(malli.device)
tulokset = malli.generate(**syöte, maksimi_pituus=maksimi_pituus)
return tokenizer.decode(tulokset[0], skip_special_tokens=True)
print(luo_teksti(“Tulevaisuus on”))
“`
Vaikka tämä lähestymistapa toimii, se ei sovellu korkean liikenteen sovelluksiin resurssien tehokkaan käytön ja optimointien puutteen vuoksi.
Käyttäminen TorchServe- tai vastaavilla kehyksillä
TorchServe-kehyksillä on edistyneempiä palvelumahdollisuuksia, kuten kuormituksen tasaus ja mallin versio. Ne eivät kuitenkaan ratkaise LLM-palvelun erityisiä haasteita, kuten tehokkaan muistin hallinnan suurten mallien osalta.
LLM-palvelun muistin hallinta
Tehokas muistin hallinta on kriittinen LLM-palvelun kannalta, sillä se vaatii laajat laskentaresurssit. Seuraavat kuvat havainnollistavat muistin hallinnan eri näkökohtia, jotka ovat olennaisia LLM-suorituskyvyn optimoinnille.
Segmentoitu vs. sivutettu muisti
Näistä kaavioista nähdään, miten segmentoitu ja sivutettu muisti eroaa toisistaan.
- Segmentoitu muisti: Tässä tekniikassa muisti jaetaan eri segmentteihin, joista kunkin vastaa eri ohjelmaa tai prosessia. LLM-palvelun kontekstissa eri segmentit voivat olla eri mallin osille, kuten tokenisointi, upottaminen ja huomiomekanismit. Kunkin segmentin voi kasvattaa tai kutistaa itsenäisesti, mikä tarjoaa joustavuutta, mutta voi myös johtaa fragmentaatioon, jos segmenttejä ei hallita oikein.
- Sivutettu muisti: Tässä muisti jaetaan kiinteän kokoisiin sivuihin, jotka kartoitetaan fyysiseen muistiin. Sivut voidaan vaihtaa tarpeen mukaan, mikä mahdollistaa tehokkaan muistin käytön. LLM-palvelussa tämä on tärkeää suurten määrien muistin hallinnassa, jotka tarvitaan mallin painoarvojen ja välitöntöjen laskelmien tallentamiseen.
Muistin hallinta OS:ssa vs. vLLM
Tässä kuvassa verrataan perinteistä OS:n muistin hallintaa vLLM:n muistin hallintaa.
- OS:n muistin hallinta: Perinteisissä käyttöjärjestelmissä prosessit (esim. Prosessi A ja Prosessi B) saavat sivuja muistia (Sivu 0, Sivu 1 jne.) fyysisessä muistissa. Tämä kohdistus voi johtaa fragmentaatioon ajan myötä, kun prosessit pyytävät ja vapauttavat muistia.
- vLLM:n muistin hallinta: vLLM-kehyksessä käytetään avain-arvo -välimuistia (KV-välimuisti) muistin hallintaan. Pyynnöt (esim. Pyynnö A ja Pyynnö B) saavat lohkoja KV-välimuistista (KV-lohko 0, KV-lohko 1 jne.). Tämä lähestymistapa auttaa vähentämään fragmentaatiota ja optimoi muistin käytön, mikä mahdollistaa nopeamman ja tehokkaamman mallin palvelun.
Huomiomekanismi LLM:ssä
Huomiomekanismi on perusrakenteellinen osa transformer-malleja, joita yleisesti käytetään LLM:ssä. Tässä kaaviossa nähdään huomioformula ja sen osat:
- Kysymys (Q): Uusi token dekoodausvaiheessa tai viimeinen token, jonka malli on nähnyt.
- Avain (K): Aikaisempi konteksti, johon malli tulisi kiinnittää huomiota.
- Arvo (V): Painotettu summa aikaisemmasta kontekstista.
Huomioformula laskee huomioarvot ottamalla kysymyksen ja avainten pistetulon, skaalaa sen avainulottuvuuden neliöjuuren, soveltaa softmax-funktiota ja lopulta ottaa pistetulon arvoista. Tämä prosessi mahdollistaa mallille keskittymisen merkityksellisiin osiin syötejonossa jokaisen tokenin luomisen aikana.
Palvelun läpäisyvertailu
Tässä kuvassa esitetään vertailu palvelun läpäisystä eri kehyksillä (HF, TGI ja vLLM) käyttäen LLaMA-malleja eri laitteistokokoonpanoissa.
- LLaMA-13B, A100-40GB: vLLM saavuttaa 14-kertaisen – 24-kertaisen suuremman läpäisyn verrattuna Hugging Face Transformersiin (HF) ja 2,2-kertaisen – 2,5-kertaisen suuremman läpäisyn verrattuna Hugging Face Text Generation Inferenceen (TGI).
- LLaMA-7B, A10G: Samansuuntaisia tuloksia havaitaan, vLLM suorittaa merkittävästi paremmin kuin sekä HF että TGI.
vLLM: Uusi LLM-palvelun arkkitehtuuri
vLLM, jota kehittävät tutkijat UC Berkeleyssä, edustaa merkittävää askelta eteenpäin LLM-palveluteknologiassa. Tutustumme sen avainominaisuuksiin ja innovaatioihin:
PagedAttention
vLLM:n ytimessä on PagedAttention, uudenlainen huomioalgoritmi, joka on inspiroitu virtuaalimuistin hallinnasta käyttöjärjestelmissä. Tässä on kuvaus siitä, miten se toimii:
– Avain-arvo-välimuistin jakaminen: Sen sijaan, että koko avain-arvo-välimuisti tallennettaisiin yhtenäiseen muistiin, PagedAttention jakaa sen kiinteän kokoisiin lohkoihin.
– Ei-jatkuva tallennus: Nämä lohkoja voidaan tallentaa epäjatkuvasti muistiin, mikä mahdollistaa joustavamman muistin hallinnan.
– Tarpeen mukaan varusteltu: Lohkot varustellaan vain silloin, kun niitä tarvitaan, mikä vähentää muistin haaskauksen.
– Tehokas jakaminen: Useat sekvenssit voivat jakaa lohkoja, mikä mahdollistaa optimoinnit tekniikoille kuten rinnakkainen näyte ja kaarihaun.
Kuvitus:
“`
Perinteinen KV-välimuisti:
[Token 1 KV][Token 2 KV][Token 3 KV]…[Token N KV]
(Jatkuva muistin varustelu)
PagedAttention KV-välimuisti:
[Block 1] -> Fyysinen osoite A
[Block 2] -> Fyysinen osoite C
[Block 3] -> Fyysinen osoite B
…
(Epäjatkuva muistin varustelu)
“`
Tämä lähestymistapa vähentää merkittävästi muistin fragmentaatiota ja mahdollistaa paljon tehokkaamman GPU-muistin käytön.
Jatkuva eräily
vLLM toteuttaa jatkuvaan eräilyyn, jossa pyynnöt prosessoidaan dynaamisesti niiden saapuessa, sen sijaan, että odottaisiin kiinteän kokoisia eriä. Tämä johtaa alempaan viiveeseen ja suurempaan läpäisyyn.
Esimerkki:
“`
Aikaleima 0 ms: Pyynnö A saapuu
Aikaleima 10 ms: Aloita Pyynnö A:n prosessointi
Aikaleima 15 ms: Pyynnö B saapuu
Aikaleima 20 ms: Aloita Pyynnö B:n prosessointi (rinnakkain A:n kanssa)
Aikaleima 25 ms: Pyynnö C saapuu
…
“`
Jatkuva eräily mahdollistaa vLLM:lle kunkin pyynnön prosessoinnin välittömästi, sen sijaan, että odottaisiin, että ne muodostavat kiinteän kokoisia eriä.
Tehokas rinnakkainen näyte
Sovelluksissa, jotka vaativat useita tulosteita kunkin syötteen kohdalla (esim. luovia kirjoittamisen apuvälineitä), vLLM:n muistin jakamisominaisuudet loistavat. Se voi generoida useita tulosteita uudelleenkytten KV-välimuistia jaettujen etuliitteiden osalta.
Koodiesimerkki vLLM:llä:
“`python
from vllm import LLM, SamplingParams
vllm = LLM(malli=”meta-llama/Llama-2-13b-hf”)
syötteet = [“Tulevaisuus on”]
# Generoi 3 näytettä kunkin syötteen kohdalla
näyteparametrit = SamplingParams(n=3, lämpötila=0.8, maksimi_tokenit=100)
tulokset = vllm.generate(syötteet, näyteparametrit)
for tulos in tulokset:
print(f”Syöte: {tulos.syöte}”)
for i, t in enumerate(tulos.tulokset):
print(f”Näyte {i + 1}: {t.text}”)
“`
Tämä koodi generoi tehokkaasti useita näytteitä annetulle syötteelle hyödyntäen vLLM:n optimointeja.
vLLM-suorituskyvyn benchmarkkaus
Todella arvostelemaan vLLM:n vaikutusta, tarkastellaan joitakin suorituskykyvertailuja:
Läpäisyvertailu
Perustuen esitettyihin tietoihin, vLLM suorittaa merkittävästi paremmin kuin muut palveluratkaisut:
– Jopa 24-kertaisesti suurempi läpäisy verrattuna Hugging Face Transformersiin
– 2,2-kertaisesti – 3,5-kertaisesti suurempi läpäisy verrattuna Hugging Face Text Generation Inferenceen (TGI)
Kuvitus:
“`
Läpäisy (Tokenia/sekunti)
|
| ****
| ****
| ****
| **** ****
| **** **** ****
| **** **** ****
|————————
HF TGI vLLM
“`
Muistin tehokkuus
vLLM:n PagedAttention johtaa lähes optimaaliseen muistinkäyttöön:
– Vain noin 4 % muistin haaskaus, verrattuna 60-80 % perinteisiin järjestelmiin
– Tämä tehokkuus mahdollistaa suurempien mallien palvelun tai useamman rinnakkaisen pyynnön käsittelemisen samalla laitteistolla
vLLM:n käyttäminen
Nyt kun olemme tutkineet vLLM:n hyödyt, käydään läpi prosessi vLLM:n asentamisesta ja käytöstä projekteissasi.
6.1 Asentaminen
vLLM:n asentaminen on suoraviivaista pipin avulla:
“`python
!pip install vllm
“`
6.2 Perusasetukset offline-inferenssiin
Tässä on yksinkertainen esimerkki vLLM:n käytöstä offline-tekstin generointiin:
“`python
from vllm import LLM, SamplingParams
# Käynnistä malli
vllm = LLM(malli=”meta-llama/Llama-2-13b-hf”)
# Valmista syötteet
syötteet = [
“Kirjoita lyhyt runo tekoälystä:”,
“Selitä kvanttilaskenta yksinkertaisesti:”
]
# Aseta näyteparametrit
näyteparametrit = SamplingParams(lämpötila=0.8, maksimi_tokenit=100)
# Generoi vastaukset
tulokset = vllm.generate(syötteet, näyteparametrit)
# Tulosta tulokset
for tulos in tulokset:
print(f”Syöte: {tulos.syöte}”)
print(f”Generoitu teksti: {tulos.tulokset[0].text}\n”)
“`
Tämä skripti osoittaa, miten ladata malli, asettaa näyteparametrit ja generoida teksti useille syötteille.
6.3 vLLM-palvelimen asettaminen
Online-palveluun vLLM tarjoaa OpenAI-yhteensopivan API-palvelimen. Tässä on, miten asettaa se:
1. Käynnistä palvelin:
“`bash
python -m vllm.entrypoints.openai.api_server –malli meta-llama/Llama-2-13b-hf
“`
2. Kysely palvelimelle curl:llä:
“`bash
curl http://localhost:8000/v1/completions \
-H “Content-Type: application/json” \
-d ‘{
“malli”: “meta-llama/Llama-2-13b-hf”,
“syöte”: “Tekoälyn hyödyt ovat:”,
“maksimi_tokenit”: 100,
“lämpötila”: 0.7
}’
“`
Tämä asetus mahdollistaa LLM:n palvelun OpenAI:n API:lle yhteensopivalla rajapinnalla, mikä helpottaa integrointia olemassa oleviin sovelluksiin.
Edistyneet aiheet vLLM:stä
Vaikka vLLM tarjoaa merkittäviä parannuksia LLM-palveluun, on tärkeää tarkastella edistyneempiä aiheita:
7.1 Mallin kvantisaatio
Entistä tehokkaamman palvelun, erityisesti laitteistolla, jolla on rajoitettu muisti, voidaan saavuttaa kvantisaatiotekniikoiden avulla. Vaikka vLLM itsessään ei tue kvantisaatiota, sitä voidaan käyttää kvantisoitujen mallien kanssa:
“`python
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
# Lataa kvantisoitu malli
mallin_nimi = “meta-llama/Llama-2-13b-hf”
malli = AutoModelForCausalLM.from_pretrained(mallin_nimi, device_map=”auto”, lataa_8_bittisessä.muodossa=True)
tokenizer = AutoTokenizer.from_pretrained(mallin_nimi)
# Käytä kvantisoitua mallia vLLM:llä
from vllm import LLM
vllm = LLM(malli=malli, tokenizer=tokenizer)
“`
7.2 Hajasijoitettu inference
Erittäin suurten mallien tai korkean liikenteen sovellusten osalta hajasijoitettu inference useiden GPU:iden tai koneiden yli voi olla tarpeen. Vaikka vLLM ei tuke tätä ominaisuutta suoraan, sitä voidaan integroida hajasijoitettuihin järjestelmiin, kuten Ray:hin:
“`python
import ray
from vllm import LLM
@ray.remote(num_gpus=1)
class HajasijoitettuLLM:
def __init__(self, mallin_nimi):
self.vllm = LLM(malli=mallin_nimi)
def generoi(self, syöte, parametrit):
return self.vllm.generate(syöte, parametrit)
# Käynnistä hajasijoitetut LLM:t
llm1 = HajasijoitettuLLM.remote(“meta-llama/Llama-2-13b-hf”)
llm2 = HajasijoitettuLLM.remote(“meta-llama/Llama-2-13b-hf”)
# Käytä niitä rinnakkain
tulos1 = llm1.generoi.remote(“Syöte 1”, näyteparametrit)
tulos2 = llm2.generoi.remote(“Syöte 2”, näyteparametrit)
# Hae tulokset
print(ray.get([tulos1, tulos2]))
“`
7.3 Seuranta ja havainnollistus
LLM-palvelun tuotannossa seuranta on kriittinen. Vaikka vLLM ei tarjoa sisäänrakennettua seurantaa, sitä voidaan integroida työkaluihin, kuten Prometheus ja Grafana:
“`python
from prometheus_client import start_http_server, Summary
from vllm import LLM
# Määritä mittarit
PYNNÖSTEN_KÄSITTELYAika = Summary(‘pyyntöjen_käsittely_aika’, ‘Aika, joka kuluu pyynnön käsittelyyn’)
# Käynnistä vLLM
vllm = LLM(malli=”meta-llama/Llama-2-13b-hf”)
# Julkaise mittarit
start_http_server(8000)
# Käytä mallia seurannan kanssa
@PYNNÖSTEN_KÄSITTELYAika.time()
def käsittele_pyyntö(syöte):
return vllm.generate(syöte)
# Käyttölooppisi tässä
“`
Tämä asetus mahdollistaa seurata mittareita, kuten pyyntöjen käsittelyaika, jotka voidaan visualisoida Grafana-näkymissä.
Johtopäätös
Suurten kielen mallien palvelu tehokkaasti on monimutkainen mutta kriittinen tehtävä tekoälyn aikakaudella. vLLM, sen innovatiivisen PagedAttention-algoritmin ja optimoidun toteutuksensa ansiosta, edustaa merkittävää askelta eteenpäin LLM-palvelun tekemisessä helpommaksi ja kustannustehokkaammaksi.
Parantamalla läpäisyyttä, vähentämällä muistin haaskautta ja tarjoamalla joustavampia palveluvaihtoehtoja, vLLM avaa uusia mahdollisuuksia voimakkaiden kielen mallien integroimiseen laajaan valikoimaan sovelluksiin. Olitpa sitten rakentamassa chatbottia, sisällön luontijärjestelmää tai mitä tahansa NLP-pohjaista sovellusta, ymmärtäminen ja hyödyntäminen työkaluja kuten vLLM on avain menestykseen.
















