Τεχνητή νοημοσύνη
Βελτιστοποίηση της ανάπτυξης του LLM: vLLM PagedAttention και το μέλλον της αποτελεσματικής εξυπηρέτησης AI

Τα μεγάλης κλίμακας γλωσσικά μοντέλα (LLM) που αναπτύσσονται σε πραγματικές εφαρμογές παρουσιάζουν μοναδικές προκλήσεις, ιδιαίτερα σε ότι αφορά τους υπολογιστικούς πόρους, την καθυστέρηση και την αποδοτικότητα. Σε αυτό το綜합ικό οδηγό, θα εξερευνήσουμε το τοπίο της εξυπηρέτησης LLM, με ιδιαίτερη έμφαση στο vLLM (διανυσματικό γλωσσικό μοντέλο), μια λύση που αναμορφώνει τον τρόπο με τον οποίο αναπτύσσουμε και αλληλεπιδρούμε με αυτά τα ισχυρά μοντέλα.
Οι προκλήσεις της εξυπηρέτησης των μεγάλων γλωσσικών μοντέλων
Πριν διεισδύσουμε σε συγκεκριμένες λύσεις, ας εξετάσουμε τις βασικές προκλήσεις που καθιστούν την εξυπηρέτηση LLM μια σύνθετη εργασία:
Υπολογιστικοί πόροι
Τα LLM είναι γνωστά για τους τεράστιους αριθμούς παραμέτρων, που κυμαίνονται από δισεκατομμύρια σε εκατοντάδες δισεκατομμύρια. Για παράδειγμα, το GPT-3 διαθέτει 175 δισεκατομμύρια παραμέτρους, ενώ πιο πρόσφατα μοντέλα όπως το GPT-4 υπολογίζεται ότι έχουν ακόμη περισσότερες. Αυτό το τεράστιο μέγεθος μεταφράζεται σε σημαντικές υπολογιστικές απαιτήσεις για inference.
Παράδειγμα:
Συμβουλήτε ένα σχετικά μετριοπαθή LLM με 13 δισεκατομμύρια παραμέτρους, όπως το LLaMA-13B. Ακόμη και αυτό το μοντέλο απαιτεί:
– Περίπου 26 GB μνήμης μόνο για την αποθήκευση των παραμέτρων του μοντέλου (υποθέτοντας 16-bit ακρίβεια)
– Πρόσθετη μνήμη για ενεργοποιήσεις, μηχανισμούς προσοχής και ενδιάμεσους υπολογισμούς
– Υλική υπολογιστική δύναμη GPU για inference σε πραγματικό χρόνο
Καθυστέρηση
Σε πολλές εφαρμογές, όπως chatbots ή γεννήτριας περιεχομένου σε πραγματικό χρόνο, η χαμηλή καθυστέρηση είναι κρίσιμη για μια καλή εμπειρία χρήστη. Ωστόσο, η复雑η των LLM μπορεί να οδηγήσει σε σημαντικούς χρόνους επεξεργασίας, ιδιαίτερα για μεγαλύτερες ακολουθίες.
Παράδειγμα:
Φανταστείτε ένα chatbot εξυπηρέτησης πελατών που τροφοδοτείται από ένα LLM. Αν κάθε απάντηση χρειάζεται vài δευτερόλεπτα για να γεννηθεί, η συζήτηση θα feels ακατάλληλη και εκνευριστική για τους χρήστες.
Κόστος
Η απαιτούμενη υλική υποδομή για να τρέξει LLM σε κλίμακα μπορεί να είναι εξαιρετικά ακριβή. Υψηλής απόδοσης GPU ή TPU συχνά είναι απαραίτητα, και η κατανάλωση ενέργειας αυτών των συστημάτων είναι σημαντική.
Παράδειγμα:
Το να τρέχεις ένα cluster NVIDIA A100 GPU (συχνά χρησιμοποιείται για inference LLM) μπορεί να κοστίζει χιλιάδες δολάρια την ημέρα σε χρεώσεις cloud υπολογισμού.
Παραδοσιακές προσεγγίσεις για την εξυπηρέτηση LLM
Πριν εξερευνήσουμε πιο προηγμένες λύσεις, ας αναλύσουμε σύντομα κάποιες παραδοσιακές προσεγγίσεις για την εξυπηρέτηση LLM:
Απλή ανάπτυξη με Hugging Face Transformers
Η βιβλιοθήκη Hugging Face Transformers παρέχει έναν απλό τρόπο για την ανάπτυξη LLM, αλλά δεν είναι βελτιστοποιημένη για εξυπηρέτηση υψηλής απόδοσης.
Παράδειγμα κώδικα:
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"))
Αunque αυτή η προσέγγιση λειτουργεί, δεν είναι κατάλληλη για εφαρμογές υψηλής κίνησης λόγω της ανεπαρκούς χρήσης πόρων και έλλειψης βελτιστοποιήσεων για εξυπηρέτηση.
Χρήση TorchServe ή παρόμοιων πλαισίων
Πλαίσια όπως το TorchServe παρέχουν πιο robust εξυπηρέτηση, συμπεριλαμβανομένης της ισορροπίας φόρτου και της διαχείρισης εκδόσεων μοντέλων. Ωστόσο, δεν αντιμετωπίζουν τις συγκεκριμένες προκλήσεις της εξυπηρέτησης LLM, όπως την αποτελεσματική διαχείριση μνήμης για μεγάλα μοντέλα.
Κατανόηση της διαχείρισης μνήμης στην εξυπηρέτηση LLM
Η αποτελεσματική διαχείριση μνήμης είναι κρίσιμη για την εξυπηρέτηση μεγάλων γλωσσικών μοντέλων (LLM) λόγω των εκτενών υπολογιστικών πόρων που απαιτούνται. Οι ακόλουθες εικόνες εικονογραφούν διάφορες πτυχές της διαχείρισης μνήμης, που είναι ουσιαστικές για την βελτιστοποίηση της απόδοσης LLM.
Τμηματική vs. σελιδοποιημένη μνήμη
Αυτές οι δύο διαγράμματα συγκρίνουν τεχνικές διαχείρισης μνήμης τμηματικής και σελιδοποιημένης μνήμης, που χρησιμοποιούνται συνήθως σε λειτουργικά συστήματα (ΛΣ).
- Τμηματική μνήμη: Αυτή η τεχνική διαιρεί τη μνήμη σε διαφορετικά τμήματα, κάθε ένα από τα οποία αντιστοιχεί σε διαφορετικό πρόγραμμα ή διαδικασία. Για παράδειγμα, σε ένα περιβάλλον εξυπηρέτησης LLM, διαφορετικά τμήματα μπορεί να έχουν назначθεί σε διάφορες συνιστώσες του μοντέλου, όπως τοκενίωση, ενσωμάτωση και μηχανισμοί προσοχής. Κάθε τμήμα μπορεί να μεγαλώσει ή να σμικρύνει ανεξάρτητα, παρέχοντας ευελιξία αλλά πιθανώς οδηγώντας σε θραύσματα αν τα τμήματα δεν διαχειρίζονται σωστά.
- Σελιδοποιημένη μνήμη: Εδώ, η μνήμη διαιρείται σε σελίδες σταθερής μεγέθους, οι οποίες αντιστοιχούν στη φυσική μνήμη. Οι σελίδες μπορούν να ανταλλαχθούν εντός και εκτός της μνήμης όπως χρειάζεται, επιτρέποντας την αποτελεσματική χρήση των πόρων μνήμης. Στην εξυπηρέτηση LLM, αυτό μπορεί να είναι κρίσιμο για τη διαχείριση των μεγάλων ποσοτήτων μνήμης που απαιτούνται για την αποθήκευση των βαρών του μοντέλου και των ενδιάμεσων υπολογισμών.
Διαχείριση μνήμης στο Λειτουργικό Σύστημα vs. vLLM
Αυτή η εικόνα αντιπαραβάλλει την παραδοσιακή διαχείριση μνήμης του Λειτουργικού Συστήματος με την προσέγγιση διαχείρισης μνήμης που χρησιμοποιεί το vLLM.
- Διαχείριση μνήμης του Λειτουργικού Συστήματος: Σε παραδοσιακά λειτουργικά συστήματα, οι διεργασίες (π.χ. Διεργασία A και Διεργασία B) έχουν назначθεί σελίδες μνήμης (Σελίδα 0, Σελίδα 1, κ.λπ.) στη φυσική μνήμη. Αυτή η ανάθεση μπορεί να οδηγήσει σε θραύσματα με το πέρασμα του χρόνου καθώς οι διεργασίες ζητούν και απελευθερώνουν μνήμη.
- Διαχείριση μνήμης vLLM: Το πλαίσιο vLLM χρησιμοποιεί μια κρυφή μνήμη Key-Value (KV) για να διαχειριστεί τη μνήμη πιο αποτελεσματικά. Οι αιτήσεις (π.χ. Αίτηση A και Αίτηση B) έχουν назначθεί μπλοκ της κρυφής μνήμης KV (Μπλοκ KV 0, Μπλοκ KV 1, κ.λπ.). Αυτή η προσέγγιση βοηθά να ελαχιστοποιήσει τα θραύσματα και να βελτιστοποιήσει τη χρήση μνήμης, επιτρέποντας ταχύτερη και πιο αποτελεσματική εξυπηρέτηση μοντέλων.
Μηχανισμός προσοχής στα LLM
Ο μηχανισμός προσοχής είναι ένας θεμελιώδης συνιστώσας των μοντέλων μετασχηματιστών, που χρησιμοποιούνται συνήθως για LLM. Αυτό το διάγραμμα εικονογραφεί τη формуλή προσοχής και τους συνιστώσες της:
- Ερώτηση (Q): Ένα νέο token στο βήμα αποκωδικοποιητή ή το τελευταίο token που έχει δει το μοντέλο.
- Κλειδί (K): Προηγούμενο контέκστ που το μοντέλο πρέπει να προσεγγίσει.
- Τιμή (V): Βαρημένη σύνοψη του προηγούμενου контέκστ.
Η формуλή υπολογίζει τους βαθμούς προσοχής λαμβάνοντας το γινόμενο της ερώτησης με τα κλειδιά, κλιμακώνοντας με την τετραγωνική ρίζα της διάστασης του κλειδιού, εφαρμόζοντας μια συνάρτηση softmax και τελικά λαμβάνοντας το γινόμενο με τις τιμές. Αυτή η διαδικασία επιτρέπει στο μοντέλο να εστιάσει στις σχετικές partes της εισόδου ακολουθίας κατά τη γεννήτρια κάθε token.
Σύγκριση εξυπηρέτησης
Αυτή η εικόνα παρουσιάζει μια σύγκριση της εξυπηρέτησης μεταξύ διαφορετικών πλαισίων (HF, TGI και vLLM) χρησιμοποιώντας μοντέλα LLaMA σε διάφορες ρυθμίσεις υλικού.
- LLaMA-13B, A100-40GB: Το vLLM επιτύγχαίνει 14x – 24x υψηλότερη εξυπηρέτηση από το HuggingFace Transformers (HF) και 2.2x – 2.5x υψηλότερη εξυπηρέτηση από το HuggingFace Text Generation Inference (TGI).
- LLaMA-7B, A10G: Παρόμοιες τάσεις παρατηρούνται, με το vLLM να υπερτερεί σημαντικά τόσο του HF όσο και του TGI.
vLLM: Μια νέα αρχιτεκτονική εξυπηρέτησης LLM
Το vLLM, που αναπτύχθηκε από ερευνητές στο UC Berkeley, αντιπροσωπεύει ένα σημαντικό βήμα προς τα εμπρός στην τεχνολογία εξυπηρέτησης LLM. Ας εξερευνήσουμε τις βασικές του λειτουργίες και καινοτομίες:
PagedAttention
Στην καρδιά του vLLM βρίσκεται το PagedAttention, ένας καινοτόμος αλγόριθμος προσοχής που εμπνέεται από τη διαχείριση εικονικής μνήμης στα λειτουργικά συστήματα. Εδώ είναι πώς λειτουργεί:
– Διαμοίραση κρυφής μνήμης Key-Value (KV): Αντί να αποθηκεύει την整ική κρυφή μνήμη KV συνεχώς στη μνήμη, το PagedAttention τη διαιρεί σε μπλοκ σταθερής μεγέθους.
– Μη συνεχής αποθήκευση: Αυτά τα μπλοκ μπορούν να αποθηκευτούν μη συνεχώς στη μνήμη, επιτρέποντας μια πιο ευέλικτη διαχείριση μνήμης.
– Ανάθεση κατόπιν αιτήματος: Τα μπλοκ αναθέτονται μόνο όταν χρειάζονται, μειώνοντας την σπατάλη μνήμης.
– Αποτελεσματική κοινή χρήση: Πολλαπλά sequences μπορούν να μοιράζονται μπλοκ, επιτρέποντας βελτιστοποιήσεις για τεχνικές όπως παράλληλη δειγματοληψία και αναζήτηση δέσμης.
Εικονογράφηση:
“`
Παραδοσιακή κρυφή μνήμη KV:
[Token 1 KV][Token 2 KV][Token 3 KV]…[Token N KV]
(Συνεχής ανάθεση μνήμης)
Κρυφή μνήμη PagedAttention:
[Μπλοκ 1] -> Φυσική Διεύθυνση A
[Μπλοκ 2] -> Φυσική Διεύθυνση C
[Μπλοκ 3] -> Φυσική Διεύθυνση B
…
(Μη συνεχής ανάθεση μνήμης)
“
Αυτή η προσέγγιση μειώνει σημαντικά τη θραυσματοποίηση μνήμης και επιτρέπει μια πολύ πιο αποτελεσματική χρήση της μνήμης GPU.
Συνεχής δειγματοληψία
Το vLLM εφαρμόζει συνεχής δειγματοληψία, η οποία επεξεργάζεται δυναμικά τις αιτήσεις καθώς φτάνουν, αντί να περιμένει να σχηματίσει σταθερές δειγματοληψίες. Αυτό οδηγεί σε χαμηλότερη καθυστέρηση και υψηλότερη εξυπηρέτηση.
Παράδειγμα:
Φανταστείτε μια ροή εισερχόμενων αιτήσεων:
“`
Χρόνος 0ms: Αίτηση A φτάνει
Χρόνος 10ms: Ξεκινά η επεξεργασία της Αίτησης A
Χρόνος 15ms: Αίτηση B φτάνει
Χρόνος 20ms: Ξεκινά η επεξεργασία της Αίτησης B (παράλληλα με την A)
Χρόνος 25ms: Αίτηση C φτάνει
…
“
Με τη συνεχής δειγματοληψία, το vLLM μπορεί να ξεκινήσει την επεξεργασία κάθε αίτησης αμέσως, αντί να περιμένει να ομαδοποιήσει τις αιτήσεις σε προκαθορισμένες δειγματοληψίες.
Αποτελεσματική παράλληλη δειγματοληψία
Για εφαρμογές που απαιτούν πολλαπλά δείγματα εξόδου ανά προτροπή (π.χ. βοηθοί δημιουργικής γραφής), οι ικανότητες κοινής χρήσης μνήμης του vLLM ξεχωρίζουν. Μπορεί να παράγει πολλαπλά δείγματα ενώ μοιράζεται την κρυφή μνήμη KV για κοινά προθέματα.
Παράδειγμα κώδικα χρησιμοποιώντας vLLM:
from vllm import LLM, SamplingParams
llm = LLM(model="meta-llama/Llama-2-13b-hf")
prompts = ["Το μέλλον της AI είναι"]
# Γεννήτρια 3 δείγματα ανά προτροπή
sampling_params = SamplingParams(n=3, temperature=0.8, max_tokens=100)
outputs = llm.generate(prompts, sampling_params)
for output in outputs:
print(f"Προτροπή: {output.prompt}")
for i, out in enumerate(output.outputs):
print(f"Δείγμα {i + 1}: {out.text}")
Αυτός ο κώδικας παράγει αποτελεσματικά πολλαπλά δείγματα για την δοθείσα προτροπή, αξιοποιώντας τις βελτιστοποιήσεις του vLLM.
Βελτιστοποίηση της απόδοσης του vLLM
Για να εκτιμήσουμε πραγματικά την επίδραση του vLLM, ας δούμε κάποιες συγκρίσεις απόδοσης:
Σύγκριση εξυπηρέτησης
Βασισμένο στις πληροφορίες που παρέχονται, το vLLM υπερτερεί σημαντικά άλλες λύσεις εξυπηρέτησης:
– Μέχρι 24x υψηλότερη εξυπηρέτηση σε σύγκριση με το Hugging Face Transformers
– 2.2x έως 3.5x υψηλότερη εξυπηρέτηση από το Hugging Face Text Generation Inference (TGI)
Εικονογράφηση:
“`
Εξυπηρέτηση (Tokens/δευτερόλεπτο)
|
| ****
| ****
| ****
| **** ****
| **** **** ****
| **** **** ****
|————————
HF TGI vLLM
“`
Αποτελεσματικότητα μνήμης
Το PagedAttention του vLLM οδηγεί σε σχεδόν ιδανική χρήση μνήμης:
– Μόνο περίπου 4% σπατάλη μνήμης, σε σύγκριση με 60-80% σε παραδοσιακά συστήματα
– Αυτή η αποτελεσματικότητα επιτρέπει την εξυπηρέτηση μεγαλύτερων μοντέλων ή την αντιμετώπιση περισσότερων συνεχόμενων αιτήσεων με την ίδια υλική υποδομή
Εξάρτηση με το vLLM
Τώρα που έχουμε εξερευνήσει τα πλεονεκτήματα του vLLM, ας περάσουμε στη διαδικασία εγκατάστασης και χρήσης του στις εφαρμογές σας.
6.1 Εγκατάσταση
Η εγκατάσταση του vLLM είναι απλή χρησιμοποιώντας pip:
!pip install vllm
6.2 Βασική χρήση για ngoạiτική inference
Εδώ είναι ένα απλό παράδειγμα χρήσης του vLLM για εξωτερική γεννήτρια κειμένου:
from vllm import LLM, SamplingParams
# Αρχικοποίηση του μοντέλου
llm = LLM(model="meta-llama/Llama-2-13b-hf")
# Προετοιμασία προτροπών
prompts = [
"Γράψτε ένα μικρό ποίημα για την τεχνητή νοημοσύνη:",
"Εξηγήστε την κβαντική υπολογιστική με απλά λόγια:"
]
# Ρύθμιση παραμέτρων δειγματοληψίας
sampling_params = SamplingParams(temperature=0.8, max_tokens=100)
# Γεννήτρια απαντήσεων
outputs = llm.generate(prompts, sampling_params)
# Εκτύπωση των αποτελεσμάτων
for output in outputs:
print(f"Προτροπή: {output.prompt}")
print(f"Γεννημένο κείμενο: {output.outputs[0].text}\n")
Αυτός ο κώδικας示άζει πώς να φορτώσετε ένα μοντέλο, να ορίσετε παραμέτρους δειγματοληψίας και να γεννήσετε κείμενο για πολλαπλές προτροπές.
6.3 Ρύθμιση του vLLM Server
Για την εξυπηρέτηση σε πραγματικό χρόνο, το vLLM παρέχει einen OpenAI-συμβατό API server. Εδώ είναι πώς να το ρυθμίσετε:
1. Ξεκινήστε τον server:
python -m vllm.entrypoints.openai.api_server --model meta-llama/Llama-2-13b-hf
2. Κάνετε αίτηση στον server χρησιμοποιώντας curl:
curl http://localhost:8000/v1/completions \
-H "Content-Type: application/json" \
-d '{
"model": "meta-llama/Llama-2-13b-hf",
"prompt": "Η τεχνητή νοημοσύνη περιλαμβάνει:",
"max_tokens": 100,
"temperature": 0.7
}'
Αυτή η ρύθμιση σας επιτρέπει να εξυπηρετήσετε το LLM σας με μια διεπαφή συμβατή με το API της OpenAI, καθιστώντας εύκολη την ενσωμάτωση σε υπάρχουσες εφαρμογές.
Πρόγραμμα σπουδών για την απόδοση του vLLM
Για να εκτιμήσουμε πραγματικά την επίδραση του vLLM, ας δούμε κάποιες συγκρίσεις απόδοσης:
Σύγκριση εξυπηρέτησης
Βασισμένο στις πληροφορίες που παρέχονται, το vLLM υπερτερεί σημαντικά άλλες λύσεις εξυπηρέτησης:
– Μέχρι 24x υψηλότερη εξυπηρέτηση σε σύγκριση με το Hugging Face Transformers
– 2.2x έως 3.5x υψηλότερη εξυπηρέτηση από το Hugging Face Text Generation Inference (TGI)
Εικονογράφηση:
“`
Εξυπηρέτηση (Tokens/δευτερόλεπτο)
|
| ****
| ****
| ****
| **** ****
| **** **** ****
| **** **** ****
|————————
HF TGI vLLM
“`
Αποτελεσματικότητα μνήμης
Το PagedAttention του vLLM οδηγεί σε σχεδόν ιδανική χρήση μνήμης:
– Μόνο περίπου 4% σπατάλη μνήμης, σε σύγκριση με 60-80% σε παραδοσιακά συστήματα
– Αυτή η αποτελεσματικότητα επιτρέπει την εξυπηρέτηση μεγαλύτερων μοντέλων ή την αντιμετώπιση περισσότερων συνεχόμενων αιτήσεων με την ίδια υλική υποδομή














