Tekoäly
LLM-käytön optimointi: vLLM PagedAttention ja tehokkaan tekoälyn tulevaisuus

Tosimaailman sovelluksissa käyttöönotettavat suuret kielimallit (LLM) asettavat ainutlaatuisia haasteita erityisesti laskennallisten resurssien, viiveen ja kustannustehokkuuden suhteen. Tässä kattavassa oppaassa tutkimme LLM-palveluiden maisemaa keskittyen erityisesti vLLM:ään (vektorikielimalli), joka on ratkaisu, joka muokkaa tapaa, jolla otamme käyttöön ja vuorovaikutuksessa näiden tehokkaiden mallien kanssa.
Suurten kielimallien palvelemisen haasteet
Ennen kuin sukeltaa erityisiin ratkaisuihin, tarkastellaan keskeisiä haasteita, jotka tekevät LLM:stä monimutkaisen tehtävän:
Laskennalliset resurssit
LLM:t ovat tunnettuja valtavasta parametrimäärästään, joka vaihtelee miljardeista satoihin miljardeihin. Esimerkiksi GPT-3:ssa on 175 miljardia parametria, kun taas uudemmat mallit vastaavat GPT-4 arvioidaan olevan vielä enemmän. Tämä pelkkä koko merkitsee merkittäviä laskennallisia vaatimuksia päättelylle.
Esimerkiksi:
Harkitse suhteellisen vaatimatonta OTK 13 miljardilla parametrilla, kuten LLaMA-13B. Jopa tämä malli vaatii:
– Noin 26 Gt muistia vain malliparametrien tallentamiseen (olettaen 16-bittisellä tarkkuudella)
– Lisämuistia aktivointia, huomiomekanismeja ja välilaskutoimituksia varten
– Huomattava GPU:n laskentateho reaaliaikaisten päätelmien tekemiseen
Viive
Monissa sovelluksissa, kuten chatboteissa tai reaaliaikaisessa sisällöntuotannossa, alhainen viive on ratkaisevan tärkeää hyvän käyttökokemuksen kannalta. LLM:ien monimutkaisuus voi kuitenkin johtaa merkittäviin prosessointiaikoihin, erityisesti pidempien sekvenssien kohdalla.
Esimerkiksi:
Kuvittele asiakaspalvelun chatbotti, jonka toiminnasta vastaa LLM. Jos jokaisen vastauksen luominen kestää useita sekunteja, keskustelu tuntuu käyttäjille luonnottomalta ja turhauttavalta.
Hinta
Laitteistot, joita tarvitaan LLM:ien suorittamiseen mittakaavassa, voivat olla erittäin kalliita. Huippuluokan GPU:t tai TPU:t ovat usein välttämättömiä, ja näiden järjestelmien energiankulutus on huomattava.
Esimerkiksi:
NVIDIA A100 -grafiikkasuorittimien klusterin käyttäminen (käytetään usein LLM-johtopäätöksiin) voi maksaa tuhansia dollareita päivässä pilvipalvelumaksuina.
Perinteiset lähestymistavat LLM-palveluun
Ennen kuin tutkit edistyneempiä ratkaisuja, tarkastellaan lyhyesti joitain perinteisiä lähestymistapoja LLM:ien palvelemiseen:
Yksinkertainen käyttöönotto halaavilla kasvomuuntajilla
Hugging Face Transformers -kirjasto tarjoaa suoraviivaisen tavan ottaa käyttöön LLM:itä, mutta sitä ei ole optimoitu korkean suorituskyvyn palvelemiseen.
Esimerkkikoodi:
from transformers import AutoModelForCausalLM, AutoTokenizer import torch model_name = "meta-llama/Llama-2-13b-hf" model = AutoModelForCausalLM.from_pretrained(model_name, device_map="auto") tokenizer = AutoTokenizer.from_pretrained(model_name) def generate_text(prompt, max_length=100): inputs = tokenizer(prompt, return_tensors="pt").to(model.device) outputs = model.generate(**inputs, max_length=max_length) return tokenizer.decode(outputs[0], skip_special_tokens=True) print(generate_text("The future of AI is"))
Vaikka tämä lähestymistapa toimii, se ei sovellu suuren liikenteen sovelluksiin tehottoman resurssien käytön ja palvelun optimoinnin puutteen vuoksi.
Käyttämällä TorchServeä tai vastaavia kehyksiä
Kehykset, kuten TorchServe, tarjoavat tehokkaampia palveluominaisuuksia, kuten kuormituksen tasapainotuksen ja malliversioiden. Ne eivät kuitenkaan vieläkään vastaa LLM-palvelun erityishaasteisiin, kuten suurten mallien tehokkaaseen muistinhallintaan.
Muistinhallinnan ymmärtäminen LLM-palvelussa
Tehokas muistinhallinta on kriittistä suurten kielimallien (LLM) palvelemiseksi tarvittavien laajojen laskentaresurssien vuoksi. Seuraavat kuvat havainnollistavat erilaisia muistinhallinnan näkökohtia, jotka ovat olennaisia LLM-suorituskyvyn optimoinnissa.
Segmentoitu vs. sivuttu muisti
Nämä kaksi kaaviota vertaavat segmentoitua muistia ja sivutun muistin hallintatekniikoita, joita käytetään yleisesti käyttöjärjestelmissä (OS).
- Segmentoitu muisti: Tämä tekniikka jakaa muistin eri segmentteihin, joista jokainen vastaa eri ohjelmaa tai prosessia. Esimerkiksi LLM-palvelukontekstissa eri segmenttejä voidaan allokoida mallin eri komponenteille, kuten tokenointi-, upotus- ja huomiomekanismeille. Jokainen segmentti voi kasvaa tai kutistua itsenäisesti, mikä tarjoaa joustavuutta, mutta voi johtaa pirstoutumiseen, jos segmenttejä ei hallita kunnolla.
- Sivutettu muisti: Tässä muisti on jaettu kiinteän kokoisiin sivuihin, jotka on kartoitettu fyysiseen muistiin. Sivuja voidaan vaihtaa sisään ja ulos tarpeen mukaan, mikä mahdollistaa muistiresurssien tehokkaan käytön. LLM-palvelussa tämä voi olla ratkaisevan tärkeää mallipainojen ja välilaskutoimitusten tallentamiseen tarvittavien suurten muistimäärien hallinnassa.
Muistinhallinta käyttöjärjestelmässä vLLM
Tämä kuva erottelee perinteisen käyttöjärjestelmän muistinhallinnan vLLM:ssä käytetyn muistinhallintamenetelmän kanssa.
- Käyttöjärjestelmän muistin hallinta: Perinteisissä käyttöjärjestelmissä prosesseille (esim. prosessi A ja prosessi B) on varattu muistisivuja (sivu 0, sivu 1 jne.) fyysisessä muistissa. Tämä allokointi voi johtaa pirstoutumiseen ajan myötä prosessien pyytäessä ja vapauttaessa muistia.
- vLLM-muistinhallinta: vLLM-kehys käyttää Key-Value (KV) -välimuistia hallitakseen muistia tehokkaammin. Pyynnöt (esim. pyyntö A ja pyyntö B) ovat KV-välimuistin lohkoja (KV Block 0, KV Block 1 jne.). Tämä lähestymistapa auttaa minimoimaan pirstoutumisen ja optimoi muistin käytön, mikä mahdollistaa nopeamman ja tehokkaamman mallin käytön.
Huomiomekanismi LLM:issä
Huomiomekanismi on peruskomponentti muuntajamalleissa, joita käytetään yleisesti LLM:issä. Tämä kaavio havainnollistaa huomiokaavaa ja sen komponentteja:
- Kysely (Q): Uusi tunnus dekooderin vaihe tai viimeinen merkki, jonka malli on nähnyt.
- Avain (K): Aikaisempi konteksti, johon mallin tulisi kiinnittää huomiota.
- Arvo (V): Painotettu summa edelliseen kontekstiin verrattuna.
Kaava laskee huomiopisteet ottamalla kyselyn pistetulon avaimilla, skaalaamalla avainmitan neliöjuurella, käyttämällä softmax-funktiota ja ottamalla lopuksi pistetulon arvojen kanssa. Tämän prosessin avulla malli voi keskittyä syöttösekvenssin olennaisiin osiin kutakin merkkiä luodessaan.
Suorituskyvyn vertailu
Tämä kuva esittää vertailun eri kehysten (HF, TGI ja vLLM) välillä käyttämällä LLaMA mallit erilaisissa laitteistoasennuksissa.
- LLaMA-13B, A100-40GB: vLLM saavuttaa 14x – 24x suuremman suorituskyvyn kuin HuggingFace Transformers (HF) ja 2.2x -2.5x suuremman suorituskyvyn kuin HuggingFace Text Generation Inference (TGI).
- LLaMA-7B, A10G: Samanlaisia suuntauksia havaitaan, ja vLLM on huomattavasti parempi kuin HF ja TGI.
vLLM: Uusi LLM-palveluarkkitehtuuri
vLLM, kehittäjä tutkijat UC Berkeleyssä, edustaa merkittävää harppausta LLM-palveluteknologiassa. Tutustutaan sen tärkeimpiin ominaisuuksiin ja innovaatioihin:
Sivut Huomio
vLLM:n ytimessä on PagedAttention, uusi huomioalgoritmi, joka on saanut inspiraationsa käyttöjärjestelmien virtuaalisen muistin hallinnasta. Näin se toimii:
- Avainarvon (KV) välimuistin osiointi: Sen sijaan, että PagedAttention tallentaisi koko KV-välimuistin peräkkäin muistiin, se jakaa sen kiinteän kokoisiin lohkoihin.
- Ei-jatkuva tallennus: Nämä lohkot voidaan tallentaa epäyhtenäisesti muistiin, mikä mahdollistaa joustavamman muistinhallinnan.
- On-demand-allokointi: Lohkoja varataan vain tarvittaessa, mikä vähentää muistin hukkaa.
- Tehokas jakaminen: Useat sekvenssit voivat jakaa lohkoja, mikä mahdollistaa optimoinnin sellaisille tekniikoille kuin rinnakkaisnäytteenotto ja sädehaku.
Kuva:
”`
Perinteinen KV-välimuisti:
[Token 1 KV][Token 2 KV][Token 3 KV]…[Token N KV]
(Jatkuva muistin varaus)
PagedAttention KV -välimuisti:
[Block 1] -> Fyysinen osoite A
[Block 2] -> Fyysinen osoite C
[Block 3] -> Fyysinen osoite B
...
(Ei-peräkkäinen muistin varaus)
”`
Tämä lähestymistapa vähentää merkittävästi muistin pirstoutumista ja mahdollistaa paljon tehokkaamman GPU-muistin käytön.
Jatkuva eräajo
vLLM toteuttaa jatkuvan erän, joka käsittelee pyynnöt dynaamisesti niiden saapuessa sen sijaan, että se odottaisi kiinteäkokoisten erien muodostamista. Tämä johtaa pienempään latenssiin ja suurempaan suorituskykyyn.
Esimerkiksi:
Kuvittele saapuvien pyyntöjen virta:
”`
Aika 0ms: Pyyntö A saapuu
Aika 10 ms: Aloita pyynnön A käsittely
Aika 15 ms: Pyyntö B saapuu
Aika 20 ms: Aloita pyynnön B käsittely (rinnakkain A:n kanssa)
Aika 25 ms: Pyyntö C saapuu
...
”`
Jatkuvan eräajon avulla vLLM voi aloittaa jokaisen pyynnön käsittelyn välittömästi sen sijaan, että odottaisi niiden ryhmittelyä ennalta määritettyihin eriin.
Tehokas rinnakkaisnäytteenotto
Sovelluksissa, jotka vaativat useita tulosnäytteitä kehotetta kohden (esim. luovat kirjoitusassistentit), vLLM:n muistin jakamisominaisuudet loistavat. Se voi tuottaa useita ulostuloja samalla kun KV-välimuistia käytetään uudelleen jaetuille etuliitteille.
Esimerkkikoodi vLLM:llä:
from vllm import LLM, SamplingParams llm = LLM(model="meta-llama/Llama-2-13b-hf") prompts = ["The future of AI is"] # Generate 3 samples per prompt sampling_params = SamplingParams(n=3, temperature=0.8, max_tokens=100) outputs = llm.generate(prompts, sampling_params) for output in outputs: print(f"Prompt: {output.prompt}") for i, out in enumerate(output.outputs): print(f"Sample {i + 1}: {out.text}")
Tämä koodi luo tehokkaasti useita näytteitä annettua kehotetta varten hyödyntäen vLLM:n optimointia.
VLLM-suorituskyvyn benchmarking
Jotta voisimme todella arvostaa vLLM:n vaikutusta, katsotaanpa joitain suorituskykyvertailuja:
Suorituskyvyn vertailu
Annettujen tietojen perusteella vLLM on huomattavasti muita palveluratkaisuja parempi:
– Jopa 24 kertaa suurempi suorituskyky Hugging Face Transformers -muuntajiin verrattuna
– 2.2–3.5 kertaa suurempi suorituskyky kuin halaavien kasvojen tekstin luontipäätelmä (TGI)
Kuva:
”`
Suorituskyky (tokeneita/sekunti)
|
| ****
| ****
| ****
| ********
| ****************
| ****************
|————————
HF TGI vLLM
”`
Muistin tehokkuus
vLLM:n PagedAttention johtaa lähes optimaaliseen muistin käyttöön:
– Muistihukkaa vain noin 4 % verrattuna 60-80 %:iin perinteisissä järjestelmissä
– Tämä tehokkuus mahdollistaa suurempien mallien palvelemisen tai useampien samanaikaisten pyyntöjen käsittelyn samalla laitteistolla
vLLM:n käytön aloittaminen
Nyt kun olemme tutkineet vLLM:n etuja, käydään läpi sen käyttöönottoprosessi ja sen käyttö projekteissasi.
6.1-asennus
vLLM:n asentaminen on yksinkertaista pip:n avulla:
!pip install vllm
6.2 Offline-päättelyn peruskäyttö
Tässä on yksinkertainen esimerkki vLLM:n käyttämisestä offline-tekstin luomiseen:
from vllm import LLM, SamplingParams # Initialize the model llm = LLM(model="meta-llama/Llama-2-13b-hf") # Prepare prompts prompts = [ "Write a short poem about artificial intelligence:", "Explain quantum computing in simple terms:" ] # Set sampling parameters sampling_params = SamplingParams(temperature=0.8, max_tokens=100) # Generate responses outputs = llm.generate(prompts, sampling_params) # Print the results for output in outputs: print(f"Prompt: {output.prompt}") print(f"Generated text: {output.outputs[0].text}\n")
Tämä skripti näyttää, kuinka malli ladataan, näytteenottoparametrit asetetaan ja tekstiä luodaan useille kehotteille.
6.3 vLLM-palvelimen määrittäminen
Online-palvelua varten vLLM tarjoaa OpenAI-yhteensopivan API-palvelimen. Näin määrität sen:
1. Käynnistä palvelin:
python -m vllm.entrypoints.openai.api_server --model meta-llama/Llama-2-13b-hf
2. Tee kysely palvelimelta curlilla:
curl http://localhost:8000/v1/completions \ -H "Content-Type: application/json" \ -d '{ "model": "meta-llama/Llama-2-13b-hf", "prompt": "The benefits of artificial intelligence include:", "max_tokens": 100, "temperature": 0.7 }'
Tämän asennuksen avulla voit palvella LLM:täsi OpenAI:n API:n kanssa yhteensopivalla käyttöliittymällä, mikä tekee sen integroimisesta olemassa oleviin sovelluksiin helposti.
Kehittyneet aiheet vLLM:ssä
Vaikka vLLM tarjoaa merkittäviä parannuksia LLM-palveluun, on myös muita huomioita ja edistyneitä aiheita tutkittavaksi:
7.1 Mallin kvantisointi
Kvantisointitekniikoita voidaan käyttää entistä tehokkaamman palvelun aikaansaamiseksi, erityisesti laitteistoissa, joissa on rajoitettu muisti. Vaikka vLLM itse ei tällä hetkellä tue kvantisointia, sitä voidaan käyttää yhdessä kvantisoitujen mallien kanssa:
from transformers import AutoModelForCausalLM, AutoTokenizer import torch # Load a quantized model model_name = "meta-llama/Llama-2-13b-hf" model = AutoModelForCausalLM.from_pretrained(model_name, device_map="auto", load_in_8bit=True) tokenizer = AutoTokenizer.from_pretrained(model_name) # Use the quantized model with vLLM from vllm import LLM llm = LLM(model=model, tokenizer=tokenizer)
7.2 Hajautettu johtopäätös
Erittäin suurille malleille tai paljon liikennettä käyville sovelluksille voi olla tarpeen tehdä hajautettuja päätelmiä useiden GPU:iden tai koneiden kesken. Vaikka vLLM ei natiivisti tue tätä, se voidaan integroida hajautettuihin järjestelmiin käyttämällä kehyksiä, kuten Ray:
import ray from vllm import LLM @ray.remote(num_gpus=1) class DistributedLLM: def __init__(self, model_name): self.llm = LLM(model=model_name) def generate(self, prompt, params): return self.llm.generate(prompt, params) # Initialize distributed LLMs llm1 = DistributedLLM.remote("meta-llama/Llama-2-13b-hf") llm2 = DistributedLLM.remote("meta-llama/Llama-2-13b-hf") # Use them in parallel result1 = llm1.generate.remote("Prompt 1", sampling_params) result2 = llm2.generate.remote("Prompt 2", sampling_params) # Retrieve results print(ray.get([result1, result2]))
7.3 Seuranta ja havainnointi
Kun LLM:itä palvellaan tuotannossa, seuranta on ratkaisevan tärkeää. Vaikka vLLM ei tarjoa sisäänrakennettua valvontaa, voit integroida sen työkaluihin, kuten Prometheus ja Grafana:
from prometheus_client import start_http_server, Summary from vllm import LLM # Define metrics REQUEST_TIME = Summary('request_processing_seconds', 'Time spent processing request') # Initialize vLLM llm = LLM(model="meta-llama/Llama-2-13b-hf") # Expose metrics start_http_server(8000) # Use the model with monitoring @REQUEST_TIME.time() def process_request(prompt): return llm.generate(prompt) # Your serving loop here
Tämän asennuksen avulla voit seurata mittareita, kuten pyyntöjen käsittelyaikaa, jotka voidaan visualisoida Grafana-kojelaudoissa.
Yhteenveto
Suurten kielimallien tehokas palveleminen on monimutkainen mutta ratkaiseva tehtävä tekoälyn aikakaudella. vLLM innovatiivisella PagedAttention-algoritmillaan ja optimoidulla toteutuksella on merkittävä edistysaskel LLM:n käyttöönoton helpottamiseksi ja kustannustehokkaammaksi.
VLLM parantaa dramaattisesti suorituskykyä, vähentää muistin hukkaa ja mahdollistaa joustavammat käyttövaihtoehdot, ja se avaa uusia mahdollisuuksia tehokkaiden kielimallien integroimiseen monenlaisiin sovelluksiin. Olitpa rakentamassa chatbotia, sisällöntuottojärjestelmää tai mitä tahansa muuta NLP-pohjaista sovellusta, vLLM:n kaltaisten työkalujen ymmärtäminen ja hyödyntäminen on avain menestykseen.