اتصل بنا للحصول على مزيد من المعلومات

تحسين نشر LLM: vLLM PagedAttention ومستقبل خدمة الذكاء الاصطناعي الفعالة

الذكاء الاصطناعي

تحسين نشر LLM: vLLM PagedAttention ومستقبل خدمة الذكاء الاصطناعي الفعالة

mm
قم بنشر محرك الاستدلال vLLM لتشغيل نماذج اللغات الكبيرة

يمثل نشر نماذج اللغات الكبيرة (LLMs) في تطبيقات العالم الحقيقي تحديات فريدة، لا سيما فيما يتعلق بالموارد الحسابية، وزمن الوصول، وفعالية التكلفة. في هذا الدليل الشامل، سنستكشف مشهد تقديم LLM، مع التركيز بشكل خاص على vLLM (نموذج لغة المتجهات)، وهو الحل الذي يعيد تشكيل الطريقة التي ننشر بها هذه النماذج القوية ونتفاعل معها.

تحديات تقديم نماذج لغوية كبيرة

قبل الغوص في حلول محددة، دعونا نتفحص التحديات الرئيسية التي تجعل LLM تخدم مهمة معقدة:

الموارد الحسابية

تشتهر LLMs بأعدادها الهائلة من المعلمات، والتي تتراوح من المليارات إلى مئات المليارات. على سبيل المثال، يحتوي GPT-3 على 175 مليار معلمة، في حين أن النماذج الأحدث مثل GPT-4 ويقدر أن يكون أكثر من ذلك. يُترجم هذا الحجم الهائل إلى متطلبات حسابية كبيرة للاستدلال.

على سبيل المثال:
النظر في متواضعة نسبيا LLM مع 13 مليار معلمة، مثل LLaMA-13B. وحتى هذا النموذج يتطلب:

- حوالي 26 جيجابايت من الذاكرة فقط لتخزين معلمات النموذج (بافتراض دقة 16 بت)
– ذاكرة إضافية للتنشيط وآليات الانتباه والحسابات المتوسطة
- قوة حسابية كبيرة لوحدة معالجة الرسومات للاستدلال في الوقت الفعلي

كمون

في العديد من التطبيقات، مثل برامج الدردشة الآلية أو إنشاء المحتوى في الوقت الفعلي، يعد زمن الوصول المنخفض أمرًا بالغ الأهمية للحصول على تجربة مستخدم جيدة. ومع ذلك، فإن تعقيد LLMs يمكن أن يؤدي إلى أوقات معالجة كبيرة، خاصة بالنسبة للتسلسلات الأطول.

على سبيل المثال:
تخيل برنامج chatbot لخدمة العملاء مدعومًا بشهادة LLM. إذا استغرق إنشاء كل رد عدة ثوانٍ، فستشعر المستخدمين بأن المحادثة غير طبيعية ومحبطة.

التكلفة

قد تكون الأجهزة المطلوبة لتشغيل LLMs على نطاق واسع باهظة الثمن للغاية. غالبًا ما تكون وحدات معالجة الرسومات أو وحدات معالجة الرسومات (TPU) المتطورة ضرورية، ويكون استهلاك هذه الأنظمة للطاقة كبيرًا.

على سبيل المثال:
يمكن أن يكلف تشغيل مجموعة من وحدات معالجة الرسومات NVIDIA A100 (غالبًا ما تستخدم لاستدلال LLM) آلاف الدولارات يوميًا كرسوم الحوسبة السحابية.

الأساليب التقليدية لخدمة LLM

قبل استكشاف المزيد من الحلول المتقدمة، دعنا نراجع بإيجاز بعض الأساليب التقليدية لخدمة حاملي شهادة LLM:

نشر بسيط مع معانقة محولات الوجه

توفر مكتبة Hugging Face Transformers طريقة مباشرة لنشر LLMs، ولكنها ليست مُحسّنة للخدمة عالية الإنتاجية.

رمز المثال:

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"))

على الرغم من نجاح هذا الأسلوب، إلا أنه غير مناسب للتطبيقات ذات عدد الزيارات المرتفع نظرًا لاستخدامه غير الفعال للموارد ونقص التحسينات في الخدمة.

استخدام TorchServe أو أطر عمل مماثلة

توفر أطر العمل مثل TorchServe إمكانات خدمة أكثر قوة، بما في ذلك موازنة التحميل وإصدار النموذج. ومع ذلك، فإنها لا تزال لا تعالج التحديات المحددة لخدمة LLM، مثل الإدارة الفعالة للذاكرة للنماذج الكبيرة.

فهم إدارة الذاكرة في خدمة LLM

تعد الإدارة الفعالة للذاكرة أمرًا بالغ الأهمية لخدمة نماذج اللغات الكبيرة (LLMs) نظرًا للموارد الحسابية الواسعة المطلوبة. توضح الصور التالية الجوانب المختلفة لإدارة الذاكرة، والتي تعد جزءًا لا يتجزأ من تحسين أداء LLM.

مجزأة مقابل الذاكرة المقسمة إلى صفحات

يقارن هذان المخططان الذاكرة المقسمة وتقنيات إدارة الذاكرة المقسمة إلى صفحات، والتي تُستخدم بشكل شائع في أنظمة التشغيل (OS).

  • الذاكرة المجزأة: تقوم هذه التقنية بتقسيم الذاكرة إلى أجزاء مختلفة، كل منها يتوافق مع برنامج أو عملية مختلفة. على سبيل المثال، في سياق خدمة LLM، قد يتم تخصيص شرائح مختلفة لمكونات مختلفة من النموذج، مثل آليات الترميز والتضمين والاهتمام. يمكن لكل شريحة أن تنمو أو تتقلص بشكل مستقل، مما يوفر المرونة ولكن من المحتمل أن يؤدي إلى التجزئة إذا لم تتم إدارة الشرائح بشكل صحيح.
  • الذاكرة المقسمة إلى صفحات: هنا، يتم تقسيم الذاكرة إلى صفحات ذات حجم ثابت، والتي يتم تعيينها على الذاكرة الفعلية. يمكن تبديل الصفحات داخل وخارج حسب الحاجة، مما يسمح بالاستخدام الفعال لموارد الذاكرة. في خدمة LLM، يمكن أن يكون هذا أمرًا بالغ الأهمية لإدارة الكميات الكبيرة من الذاكرة المطلوبة لتخزين أوزان النماذج والحسابات المتوسطة.

إدارة الذاكرة في نظام التشغيل مقابل vLLM

تتناقض هذه الصورة بين إدارة ذاكرة نظام التشغيل التقليدية وأسلوب إدارة الذاكرة المستخدم في vLLM.

  • إدارة ذاكرة نظام التشغيل: في أنظمة التشغيل التقليدية، يتم تخصيص صفحات من الذاكرة للعمليات (مثل العملية أ والعملية ب) (الصفحة 0، الصفحة 1، وما إلى ذلك) في الذاكرة الفعلية. يمكن أن يؤدي هذا التخصيص إلى التجزئة بمرور الوقت أثناء طلب العمليات وتحرير الذاكرة.
  • إدارة الذاكرة vLLM: يستخدم إطار عمل vLLM ذاكرة التخزين المؤقت ذات القيمة الرئيسية (KV) لإدارة الذاكرة بشكل أكثر كفاءة. الطلبات (على سبيل المثال، الطلب A والطلب B) يتم تخصيص كتل لها في ذاكرة التخزين المؤقت KV (KV Block 0، KV Block 1، وما إلى ذلك). يساعد هذا الأسلوب على تقليل التجزئة وتحسين استخدام الذاكرة، مما يسمح بتقديم النماذج بشكل أسرع وأكثر كفاءة.

آلية الاهتمام في LLMs

آلية الانتباه في LLM

آلية الاهتمام في LLMs

تعد آلية الانتباه مكونًا أساسيًا في نماذج المحولات، والتي تستخدم بشكل شائع في LLMs. ويوضح هذا الرسم البياني صيغة الانتباه ومكوناتها:

  • استعلام (س): رمز جديد في خطوة فك التشفير أو الرمز الأخير الذي شاهده النموذج.
  • المفتاح (ك): السياق السابق الذي يجب أن يحضره النموذج.
  • القيمة (V): المبلغ المرجح على السياق السابق.

تحسب الصيغة درجات الانتباه عن طريق أخذ المنتج النقطي للاستعلام باستخدام المفاتيح، والقياس حسب الجذر التربيعي للبعد الرئيسي، وتطبيق وظيفة softmax، وأخيرًا أخذ المنتج النقطي مع القيم. تسمح هذه العملية للنموذج بالتركيز على الأجزاء ذات الصلة من تسلسل الإدخال عند إنشاء كل رمز مميز.

خدمة مقارنة الإنتاجية

vLLM: عرض LLM سهل وسريع ورخيص مع PagedAttention

vLLM: عرض LLM سهل وسريع ورخيص مع PagedAttention

تعرض هذه الصورة مقارنة إنتاجية الخدمة بين أطر عمل مختلفة (HF، TGI، وvLLM) باستخدام نماذج LLaMA على إعدادات الأجهزة المختلفة.

  • LLaMA-13B، A100-40 جيجابايت: يحقق vLLM إنتاجية أعلى بمقدار 14x - 24x من HuggingFace Transformers (HF) و2.2x - 2.5x إنتاجية أعلى من HuggingFace Text Generation Inference (TGI).
  • لاما-7B، A10G: لوحظت اتجاهات مماثلة، مع تفوق vLLM بشكل ملحوظ على كل من HF وTGI.

vLLM: بنية خدمة LLM جديدة

vLLM، تم تطويره بواسطة باحثين في جامعة كاليفورنيا في بيركلي، يمثل قفزة كبيرة إلى الأمام في تكنولوجيا خدمة LLM. دعنا نستكشف ميزاته وابتكاراته الرئيسية:

PagedAttention

في قلب vLLM يكمن PagedAttention، وهي خوارزمية اهتمام جديدة مستوحاة من إدارة الذاكرة الافتراضية في أنظمة التشغيل. وإليك كيف يعمل:

- تقسيم ذاكرة التخزين المؤقت ذات القيمة الرئيسية (KV).: بدلاً من تخزين ذاكرة التخزين المؤقت KV بالكامل بشكل متجاور في الذاكرة، يقوم PagedAttention بتقسيمها إلى كتل ذات حجم ثابت.
- تخزين غير متجاور: يمكن تخزين هذه الكتل بشكل غير متجاور في الذاكرة، مما يسمح بإدارة أكثر مرونة للذاكرة.
- التخصيص عند الطلب: يتم تخصيص الكتل فقط عند الحاجة إليها، مما يقلل من هدر الذاكرة.
- المشاركة الفعالة: يمكن للتسلسلات المتعددة مشاركة الكتل، مما يتيح تحسينات لتقنيات مثل أخذ العينات المتوازية والبحث عن الشعاع.

التوضيح:

"`
ذاكرة التخزين المؤقت KV التقليدية:
[الرمز المميز 1 كيلو فولت] [الرمز المميز 2 كيلو فولت] [الرمز المميز 3 كيلو فولت]...[الرمز المميز N KV]
(تخصيص الذاكرة المتجاورة)

PagedAttention KV ذاكرة التخزين المؤقت:
[الباقة 1] -> العنوان الفعلي أ
[الباقة 2] -> العنوان الفعلي ج
[الباقة 3] -> العنوان الفعلي ب
...
(تخصيص الذاكرة غير المتجاورة)
"`

يقلل هذا الأسلوب بشكل كبير من تجزئة الذاكرة ويسمح باستخدام ذاكرة GPU بشكل أكثر كفاءة.

الخلط المستمر

ينفذ vLLM الدمج المستمر، الذي يعالج الطلبات ديناميكيًا عند وصولها، بدلاً من انتظار تكوين دفعات ذات حجم ثابت. وهذا يؤدي إلى زمن وصول أقل وإنتاجية أعلى.

على سبيل المثال:
تخيل دفقًا من الطلبات الواردة:

"`
الوقت 0 مللي ثانية: وصول الطلب A
الوقت 10 مللي ثانية: بدء معالجة الطلب أ
الوقت 15 مللي ثانية: وصول الطلب B
الوقت 20 مللي ثانية: بدء معالجة الطلب ب (بالتوازي مع أ)
الوقت 25 مللي ثانية: وصول الطلب C
...
"`

من خلال التجميع المستمر، يمكن لـ vLLM البدء في معالجة كل طلب على الفور، بدلاً من انتظار تجميعها في دفعات محددة مسبقًا.

أخذ العينات الموازية الفعالة

بالنسبة للتطبيقات التي تتطلب عينات مخرجات متعددة لكل موجه (على سبيل المثال، مساعدي الكتابة الإبداعية)، تتألق إمكانات مشاركة الذاكرة الخاصة بـ vLLM. يمكنه إنشاء مخرجات متعددة أثناء إعادة استخدام ذاكرة التخزين المؤقت KV للبادئات المشتركة.

رمز المثال باستخدام vLLM:

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}")

يقوم هذا الكود بإنشاء عينات متعددة للموجه المحدد بكفاءة، مما يؤدي إلى الاستفادة من تحسينات vLLM.

قياس أداء vLLM

لتقدير تأثير vLLM حقًا، دعنا نلقي نظرة على بعض مقارنات الأداء:

مقارنة الإنتاجية

استنادًا إلى المعلومات المقدمة، يتفوق vLLM بشكل كبير على حلول العرض الأخرى:

- ما يصل إلى 24x إنتاجية أعلى مقارنة بمحولات الوجه المعانقة
- إنتاجية أعلى بمقدار 2.2x إلى 3.5x من استدلال إنشاء نص عناق الوجه (TGI)

التوضيح:

"`
الإنتاجية (الرموز / الثانية)
|
| ****
| ****
| ****
| **** ****
| **** **** ****
| **** **** ****
|————————
HF TGI vLLM
"`

كفاءة الذاكرة

ينتج عن PagedAttention الخاص بـ vLLM استخدامًا شبه مثالي للذاكرة:

– هدر للذاكرة حوالي 4% فقط، مقارنة بـ 60-80% في الأنظمة التقليدية
– تسمح هذه الكفاءة بتقديم نماذج أكبر أو التعامل مع المزيد من الطلبات المتزامنة بنفس الجهاز

الشروع في العمل مع vLLM

الآن وبعد أن اكتشفنا فوائد vLLM، فلنستعرض عملية إعداده واستخدامه في مشاريعك.

تثبيت 6.1

يعد تثبيت vLLM أمرًا سهلاً باستخدام النقطة:

!pip install vllm

6.2 الاستخدام الأساسي للاستدلال دون الاتصال بالإنترنت

فيما يلي مثال بسيط لاستخدام vLLM لإنشاء نص دون اتصال بالإنترنت:

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")

يوضح هذا البرنامج النصي كيفية تحميل نموذج وتعيين معلمات أخذ العينات وإنشاء نص لمطالبات متعددة.

6.3 إعداد خادم vLLM

بالنسبة للخدمة عبر الإنترنت، يوفر vLLM خادم API متوافق مع OpenAI. وإليك كيفية إعداده:

1. ابدأ الخادم:

python -m vllm.entrypoints.openai.api_server --model meta-llama/Llama-2-13b-hf

2. الاستعلام عن الخادم باستخدام الضفيرة:

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
}'

يتيح لك هذا الإعداد خدمة LLM الخاص بك من خلال واجهة متوافقة مع OpenAI's API، مما يجعل من السهل الاندماج في التطبيقات الحالية.

موضوعات متقدمة حول vLLM

بينما يقدم vLLM تحسينات كبيرة في خدمة LLM، هناك اعتبارات إضافية وموضوعات متقدمة لاستكشافها:

7.1 نموذج التكميم

للحصول على خدمة أكثر كفاءة، خاصة على الأجهزة ذات الذاكرة المحدودة، يمكن استخدام تقنيات التكميم. على الرغم من أن vLLM نفسه لا يدعم حاليًا التكميم، إلا أنه يمكن استخدامه مع النماذج الكمية:

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 الاستدلال الموزع

بالنسبة للنماذج الكبيرة للغاية أو التطبيقات ذات حركة المرور العالية، قد يكون الاستدلال الموزع عبر وحدات معالجة الرسومات أو الأجهزة المتعددة ضروريًا. على الرغم من أن vLLM لا يدعم هذا بشكل أساسي، إلا أنه يمكن دمجه في الأنظمة الموزعة باستخدام أطر عمل مثل 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 الرصد والملاحظة

عند خدمة LLMs في الإنتاج، فإن المراقبة أمر بالغ الأهمية. على الرغم من أن vLLM لا يوفر مراقبة مدمجة، يمكنك دمجها مع أدوات مثل Prometheus و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

يتيح لك هذا الإعداد تتبع المقاييس مثل وقت معالجة الطلب، والذي يمكن تصوره في لوحات معلومات Grafana.

الخاتمة

يعد تقديم نماذج اللغات الكبيرة بكفاءة مهمة معقدة ولكنها حاسمة في عصر الذكاء الاصطناعي. يمثل vLLM، مع خوارزمية PagedAttention المبتكرة والتنفيذ الأمثل، خطوة مهمة إلى الأمام في جعل نشر LLM أكثر سهولة وفعالية من حيث التكلفة.

من خلال تحسين الإنتاجية بشكل كبير، وتقليل هدر الذاكرة، وتمكين خيارات تقديم أكثر مرونة، يفتح vLLM إمكانيات جديدة لدمج نماذج اللغة القوية في مجموعة واسعة من التطبيقات. سواء كنت تقوم بإنشاء برنامج دردشة آلي، أو نظام إنشاء محتوى، أو أي تطبيق آخر يعمل بتقنية البرمجة اللغوية العصبية (NLP)، فإن فهم الأدوات والاستفادة منها مثل vLLM سيكون مفتاح النجاح.

لقد أمضيت السنوات الخمس الماضية منغمسًا في عالم رائع من التعلم الآلي والتعلم العميق. قادني شغفي وخبرتي إلى المساهمة في أكثر من 50 مشروعًا متنوعًا لهندسة البرمجيات ، مع التركيز بشكل خاص على الذكاء الاصطناعي / التعلم الآلي. جذبني فضولي المستمر أيضًا نحو معالجة اللغة الطبيعية ، وهو مجال أتوق لاستكشافه بشكل أكبر.