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

تعتبر النماذج اللغوية الكبيرة (LLM) التي يتم نشرها على التطبيقات الحقيقية تواجه تحديات فريدة، خاصة فيما يتعلق بالموارد الحسابية والكفاءة والlatency. في هذا الدليل الشامل، سنستكشف مشهد خدمة LLM، مع التركيز على vLLM (نموذج اللغة المتجه)، وهو حل يغير الطريقة التي نشر ونتفاعل مع هذه النماذج القوية.
تحديات نشر النماذج اللغوية الكبيرة
قبل الغوص في الحلول المحددة، دعونا ننظر إلى التحديات الرئيسية التي تجعل خدمة LLM مهمة معقدة:
الموارد الحسابية
تتميز النماذج اللغوية الكبيرة بوجود معاملات ضخمة، تتراوح من مليارات إلى مئات المليارات. على سبيل المثال، يحتوي GPT-3 على 175 مليار معامل، بينما النماذج الأحدث مثل GPT-4 يُقدر أنها تحتوي على المزيد من المعاملات. هذا الحجم الهائل يترجم إلى متطلبات حسابية كبيرة للاستدلال.
مثال:
افترض نموذج LLM معقول مع 13 مليار معامل، مثل LLaMA-13B. حتى هذا النموذج يتطلب:
– حوالي 26 جيجابايت من الذاكرة فقط لتخزين معاملات النموذج (افتراض دقة 16 بت)
– ذاكرة إضافية لآليات الانتباه والعمليات الحسابية المتوسطة
– قدرة حسابية كبيرة لمعالجة الوقت الفعلي
الطول
في العديد من التطبيقات، مثل محادثات الدردشة أو توليد المحتوى في الوقت الفعلي، تكون الكفاءة الفعلية مهمة لتحقيق تجربة مستخدم جيدة. ومع ذلك، يمكن أن يؤدي تعقيد النماذج اللغوية الكبيرة إلى أوقات معالجة كبيرة، خاصة للتواليات الأطول.
مثال:
افترض محادثة الدردشة التي يتم تشغيلها بواسطة نموذج LLM. إذا استغرق كل رد بضع ثوان لإنشائه، فإن المحادثة سوف تشعر بالغير طبيعية والمزعجة للمستخدمين.
التكلفة
يمكن أن تكون الأجهزة المطلوبة لتشغيل النماذج اللغوية الكبيرة على نطاق واسع باهظة الثمن. غالبًا ما تكون معالجات الرسومات عالية الأداء أو وحدات المعالجة التензور مطلوبة، واستهلاك الطاقة لهذه الأنظمة كبير.
مثال:
تشغيل кластер من وحدات معالجة الرسومات NVIDIA A100 (غالبًا ما يتم استخدامها لاستدلال LLM) يمكن أن يكلف آلاف الدولارات في اليوم في رسوم الحوسبة السحابية.
المنهجيات التقليدية لخدمة LLM
قبل استكشاف الحلول المتقدمة، دعونا نلقي نظرة سريعة على بعض المنهجيات التقليدية لخدمة LLM:
النشر البسيط باستخدام Hugging Face Transformers
يوفر مكتبة Hugging Face Transformers طريقة مباشرة لنشر النماذج اللغوية الكبيرة، ولكنها ليست محسنة لخدمة الإنتاجية العالية.
مثال رمز:
من 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(“مستقبل الذكاء الاصطناعي هو”))
على الرغم من أن هذا النهج يعمل، إلا أنه لا يصلح للتطبيقات ذات الحركة المرورية الكبيرة بسبب استخدام الموارد غير الفعال وعدم وجود تحسينات لخدمة.
استخدام TorchServe أو إطارات مشابهة
توفر إطارات مثل TorchServe قدرات خدمة أكثر متانة، بما في ذلك تحسين الحمل ونسخ النموذج. ومع ذلك، لا تزال لا ت解决 التحديات المحددة لخدمة LLM، مثل إدارة الذاكرة الفعالة للنماذج الكبيرة.
فهم إدارة الذاكرة في خدمة LLM
تعتبر إدارة الذاكرة الفعالة حاسمة لخدمة النماذج اللغوية الكبيرة بسبب الموارد الحسابية الكبيرة المطلوبة. تظهر الصور التالية جوانب مختلفة من إدارة الذاكرة، التي هي أساسية لتحسين أداء LLM.
الذاكرة المقسّمة مقابل الذاكرة المصفوفة
صورة توضيحية: إدارة الذاكرة في نظام التشغيل مقابل vLLM
صورة توضيحية: إدارة الذاكرة في نظام التشغيل مقابل vLLM
تتمثل هذه الصورتان في تقنيات إدارة الذاكرة المقسّمة والذاكرة المصفوفة، التي يتم استخدامها بشكل شائع في أنظمة التشغيل.
- الذاكرة المقسّمة: يتم تقسيم الذاكرة إلى مقاطع مختلفة، لكل منها برنامج أو عملية مختلفة. على سبيل المثال، في سياق خدمة LLM، قد يتم تخصيص مقاطع مختلفة لمكونات مختلفة من النموذج، مثل التokenization و Embedding وآليات الانتباه. يمكن أن تنمو أو تقلص كل مقطع بشكل مستقل، مما يوفر مرونة ولكن قد يؤدي إلى تجزئة إذا لم يتم إدارة المقاطع بشكل صحيح.
- الذاكرة المصفوفة: هنا، يتم تقسيم الذاكرة إلى صفحات ثابتة الحجم، والتي يتم تعيينها على الذاكرة الفعلية. يمكن تبادل الصفحات عند الحاجة، مما يسمح باستخدام ذاكرة فعال. في خدمة LLM، يمكن أن يكون هذا حاسمًا لإدارة الكميات الكبيرة من الذاكرة المطلوبة لتخزين أوزان النموذج والعمليات الحسابية المتوسطة.
إدارة الذاكرة في نظام التشغيل مقابل vLLM
تظهر هذه الصورة التباين بين إدارة الذاكرة التقليدية في نظام التشغيل وتقنية إدارة الذاكرة المستخدمة في vLLM.
- إدارة الذاكرة في نظام التشغيل: في الأنظمة التقليدية، يتم تخصيص صفحات الذاكرة (صفحة 0، صفحة 1، إلخ) للعمليات (مثل عملية A وعمية B) في الذاكرة الفعلية. يمكن أن يؤدي هذا التخصيص إلى تجزئة مع مرور الوقت كما تطلب العمليات الذاكرة وتفرجها.
- إدارة الذاكرة في vLLM
: يستخدم إطار vLLM ذاكرة مؤقتة Key-Value (KV) لإدارة الذاكرة بشكل أكثر فعالية. يتم تخصيص كتلة من ذاكرة KV (KV Block 0، KV Block 1، إلخ) لطلبات (مثل الطلب A والطلب B). يساعد هذا النهج في تقليل التجزئة ويتحسين استخدام الذاكرة، مما يسمح بمعالجة نموذج أسرع وأكثر كفاءة.
آلية الانتباه في LLM
صورة توضيحية: آلية الانتباه في LLM
تعتبر آلية الانتباه مكونًا أساسيًا من مكونات نماذج Transformer، التي يتم استخدامها بشكل شائع لخدمة LLM. توضح هذه الصورة صيغة الانتباه ومكوناتها:
- الاستفسار (Q): رمز جديد في خطوة الديكودر أو الرمز الأخير الذي رأته النموذج.
- المفتاح (K): السياق السابق الذي يجب على النموذج الانتباه إليه.
- القيمة (V): مجموع مرجح على السياق السابق.
تحسب صيغة الانتباه درجات الانتباه عن طريق أخذ حاصل الضرب القياسي للاستفسار مع المفاتيح، وتطبيق دالة Softmax، وأخيرًا حاصل الضرب القياسي مع القيم. هذا العملية يسمح للنموذج بالتركيز على أجزاء ذات الصلة من التسلسل عند توليد كل رمز.
مقارنة الإنتاجية
صورة توضيحية: vLLM: خدمة LLM السهلة والسريعة والرخيصة مع PagedAttention
تُقدم هذه الصورة مقارنة للإنتاجية بين إطارات مختلفة (HF وTGI وvLLM) باستخدام نماذج LLaMA على إعدادات أجهزة مختلفة.
- LLaMA-13B، A100-40GB: يصل vLLM إلى 14 ضعفًا إلى 24 ضعفًا من الإنتاجية أكثر من HuggingFace Transformers (HF) و2.2 ضعفًا إلى 2.5 ضعفًا من الإنتاجية أكثر من HuggingFace Text Generation Inference (TGI).
- LLaMA-7B، A10G: تُلاحظ اتجاهات مماثلة، حيث يتفوق vLLM بشكل كبير على كلا HF وTGI.
vLLM: هندسة جديدة لخدمة LLM
يمثل vLLM، الذي تم تطويره بواسطة باحثين في جامعة كاليفورنيا، بيركلي، قفزة كبيرة إلى الأمام في تقنية خدمة LLM. دعونا نستكشف ميزاته الرئيسية والابتكارات:
PagedAttention
تعتبر PagedAttention، خوارزمية الانتباه الجديدة التي تم إلهامها من إدارة الذاكرة الافتراضية في أنظمة التشغيل، في قلب vLLM. إليك كيف تعمل:
– تقسيم ذاكرة KV: بدلاً من تخزين ذاكرة KV بالكامل بشكل متواصل في الذاكرة، يقسم PagedAttentionها إلى كتل ثابتة الحجم.
– تخزين غير متواصل: يمكن تخزين هذه الكتل بشكل غير متواصل في الذاكرة، مما يسمح بإدارة ذاكرة أكثر مرونة.
– تخصيص عند الطلب: يتم تخصيص الكتل فقط عند الحاجة، مما يقلل من هدر الذاكرة.
– المشاركة الفعالة: يمكن للتواليات المتعددة مشاركة الكتل، مما يسمح بالتحسينات لتقنيات مثل العينة المتوازي والبحث الشعاعي.
صورة توضيحية:
“`
الذاكرة التقليدية KV:
[Token 1 KV][Token 2 KV][Token 3 KV]…[Token N KV]
(تخصيص ذاكرة متواصل)
“
PagedAttention KV الذاكرة:
[Block 1] -> Physical Address A
[Block 2] -> Physical Address C
[Block 3] -> Physical Address B
…
(تخصيص ذاكرة غير متواصل)
“
ينقص هذا النهج من تجزئة الذاكرة بشكل كبير ويمكن أن يستخدم الذاكرة بشكل أكثر فعالية.
التركيب المستمر
يطبق vLLM التركيب المستمر، الذي يعالج الطلبات بشكل ديناميكي كما تصل، بدلاً من انتظار تشكيل مجموعات ثابتة الحجم. يؤدي هذا إلى انخفاض في الكفاءة والانتاجية.
مثال:
افترض تدفقًا من الطلبات الواردة:
“`
الوقت 0 مللي ثانية: الطلب A يصل
الوقت 10 مللي ثانية: يبدأ معالجة الطلب A
الوقت 15 مللي ثانية: الطلب B يصل
الوقت 20 مللي ثانية: يبدأ معالجة الطلب B (في متوازي مع A)
الوقت 25 مللي ثانية: الطلب C يصل
…
“
باستخدام التركيب المستمر، يمكن لـvLLM البدء في معالجة كل طلب على الفور، بدلاً من انتظار تجميعهم في مجموعات محددة.
عينة متوازي فعالة
للتطبيقات التي تتطلب عدة عينات للإخراج لكل محفز (مثل مساعدي الكتابة الإبداعية)، تتميز قدرات مشاركة الذاكرة في vLLM. يمكنه توليد عدة مخرجات مع إعادة استخدام ذاكرة KV للسابقة المشتركة.
رمز مثال باستخدام vLLM:
من vllm import LLM, SamplingParams
llm = LLM(model=”meta-llama/Llama-2-13b-hf”)
prompts = [“مستقبل الذكاء الاصطناعي هو”]
# توليد 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}”)
[/code]
يولد هذا الرمز عدة عينات بشكل فعال للمحفز المعطى، مع الاستفادة من تحسينات vLLM.
اختبار أداء vLLM
للتقدير الحقيقي لتأثير vLLM، دعونا نلقي نظرة على بعض مقارنات الأداء:
مقارنة الإنتاجية
بناءً على المعلومات المقدمة، يتفوق vLLM بشكل كبير على حلول الخدمة الأخرى:
– حتى 24 ضعفًا من الإنتاجية أكثر من Hugging Face Transformers
– 2.2 إلى 3.5 ضعفًا من الإنتاجية أكثر من Hugging Face Text Generation Inference (TGI)
صورة توضيحية:
“`
الإنتاجية (رموز/ثانية)
|
| ****
| ****
| ****
| **** ****
| **** **** ****
| **** **** ****
|————————
HF TGI vLLM
“
كفاءة الذاكرة
ينتج PagedAttention في vLLM استخدام ذاكرة قريب من الأمثل:
– فقط حوالي 4% من هدر الذاكرة، مقارنة بـ 60-80% في الأنظمة التقليدية
– تسمح هذه الكفاءة بخدمة نماذج أكبر أو معالجة طلبات متزامنة أكثر مع نفس الأجهزة
بدء استخدام vLLM
الآن بعد أن استكشفنا فوائد vLLM، دعونا نلقي نظرة على عملية تثبيته واستخدامه في مشاريعك.
6.1 التثبيت
تثبيت vLLM بسيط باستخدام pip:
!pip install vllm
6.2 الاستخدام الأساسي للاستدلال غير المتصل
هنا مثال بسيط لاستخدام vLLM لتوليد نص غير متصل:
من 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”)
[/code]
يظهر هذا النص كيفية تحميل النموذج، تعيين معاملات العينة، وتوليد نص لمحفزات متعددة.
6.3 إعداد خادم vLLM
لخدمة عبر الإنترنت، يوفر vLLM خادم API متوافق مع OpenAI. إليك كيفية إعداده:
1.
ابدأ الخادم:
python -m vllm.entrypoints.openai.api_server –model meta-llama/Llama-2-13b-hf
2.
استفسار الخادم باستخدام 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 تحسينات كبيرة في خدمة LLM، هناك اعتبارات و مواضيع متقدمة لاستكشافها:
7.1 كمية النموذج
لخدمة أكثر كفاءة، خاصة على الأجهزة ذات الذاكرة المحدودة، يمكن استخدام تقنيات الكمية. على الرغم من أن vLLM نفسه لا يدعم الكمية حاليًا، يمكن استخدامه مع نماذج مخفضة:
من transformers import AutoModelForCausalLM, AutoTokenizer
import torch
# تحميل نموذج مخفض
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)
# استخدام النموذج المخفض مع 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)
# تهيئة LLMs الموزعة
llm1 = DistributedLLM.remote(“meta-llama/Llama-2-13b-hf”)
llm2 = DistributedLLM.remote(“meta-llama/Llama-2-13b-hf”)
# استخدامهم في متوازي
result1 = llm1.generate.remote(“المحفز 1”, sampling_params)
result2 = llm2.generate.remote(“المحفز 2”, sampling_params)
# استرجاع النتائج
print(ray.get([result1, result2]))
7.3 المراقبة والرؤية
عند خدمة LLMs في الإنتاج، تكون المراقبة حاسمة. على الرغم من أن vLLM لا يوفر مراقبة مدمجة، يمكن دمجه مع أدوات مثل Prometheus وGrafana:
من prometheus_client import start_http_server, Summary
from vllm import LLM
# تعريف معايير
REQUEST_TIME = Summary(‘request_processing_seconds’, ‘الوقت المستغرق في معالجة الطلب’)
# تهيئة vLLM
llm = LLM(model=”meta-llama/Llama-2-13b-hf”)
# تعرض المعايير
start_http_server(8000)
# استخدام النموذج مع المراقبة
@REQUEST_TIME.time()
def process_request(prompt):
return llm.generate(prompt)
# حلقة الخدمة هنا
الختام
خدمة النماذج اللغوية الكبيرة بفعالية هي مهمة معقدة ولكن حاسمة في عصر الذكاء الاصطناعي. يعتبر vLLM، مع خوارزمية PagedAttention الجديدة وتنفيذه المُحسّن، خطوة كبيرة إلى الأمام في جعل نشر LLM أكثر سهولة وتكلفة.
من خلال تحسين الإنتاجية بشكل كبير، وتقليل هدر الذاكرة، وتمكين خيارات خدمة أكثر مرونة، يفتح vLLM إمكانيات جديدة لدمج نماذج لغة قوية في مجموعة واسعة من التطبيقات. سواء كنت تبني محادثة دردشة أو نظام توليد محتوى أو أي تطبيق آخر مدعوم باللغة الطبيعية، فإن فهم واستخدام أدوات مثل vLLM سيكون مفتاح النجاح.












