Liity verkostomme!

Tekoäly

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

mm
Ota käyttöön vLLM Inference Engine suorittaaksesi suuria kielimalleja

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 LLM:ssä

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

vLLM: Helppo, nopea ja halpa LLM-palvelu PagedAttentionilla

vLLM: Helppo, nopea ja halpa LLM-palvelu PagedAttentionilla

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.

Olen viettänyt viimeiset viisi vuotta uppoutuen koneoppimisen ja syväoppimisen kiehtovaan maailmaan. Intohimoni ja asiantuntemukseni ovat saaneet minut osallistumaan yli 50:een erilaiseen ohjelmistosuunnitteluprojektiin keskittyen erityisesti tekoälyyn/ML:ään. Jatkuva uteliaisuuteni on myös vetänyt minut kohti luonnollisen kielen käsittelyä, alaa, jota olen innokas tutkimaan lisää.