مرحبًا بك في الدليل الشامل حول vLLM! إذا كنت مشغولًا في عالم نماذج اللغة الكبيرة (LLMs)، فمن المحتمل أنك واجهت تحديات سرعة الاستدلال وإنتاجية العمل. يمكن أن تكون خدمة هذه النماذج الضخمة بكفاءة عقبة. هنا يأتي دور vLLM كحل مبتكر. سيوجهك هذا الدليل عبر كل ما تحتاج لمعرفته كمبتدئ: ما هو vLLM، ولماذا هو مهم، وكيفية تثبيته، وكيفية استخدامه لكل من المعالجة المجمعة في وضع عدم الاتصال والخدمة عبر الإنترنت.
ما هو vLLM بالضبط؟
في جوهره، vLLM هو مكتبة عالية الإنتاجية وفعالة من حيث الذاكرة مصممة خصيصًا لاستدلال نماذج اللغة الكبيرة (LLM) وخدمتها. تم تطويرها من قبل باحثين ومهندسين يهدفون إلى التغلب على القيود المتعلقة بالأداء لأنظمة الخدمة الحالية، يقوم vLLM بشكل ملحوظ بتسريع عملية الحصول على التنبؤات (الاستدلال) من LLMs.
غالبًا ما تواجه الطرق التقليدية لاستدلال LLM صعوبة في إدارة بصمة الذاكرة الكبيرة لآلية الانتباه الخاصة بالنموذج (على وجه الخصوص، ذاكرة KV) وتجميع الطلبات الواردة بكفاءة. يقدم vLLM تقنيات جديدة، ليس أقلها PagedAttention، للتعامل مع هذه التحديات بشكل مباشر. إنه يسمح بإنتاجية أعلى بكثير (عدد أكبر من الطلبات المعالجة في الثانية) ويمكنه خدمة النماذج بسرعة وبتكلفة فعالة مقارنة بالعديد من تنفيذات Hugging Face Transformers القياسية أو أطر الخدمة الأخرى عند التعامل مع الطلبات المتزامنة.
فكر في vLLM كمحرك محسن للغاية لتشغيل LLMs المدربة مسبقًا. أنت تقدم النموذج والمطالبات، ويتولى vLLM المهمة المعقدة لإنشاء النص بسرعة وفعالية، سواء لمجموعة كبيرة واحدة من المطالبات أو للعديد من المستخدمين المتزامنين الذين يتفاعلون مع نموذج تم نشره.
لماذا تختار vLLM لاستدلال LLM؟
هناك عدة أسباب مقنعة تجعل vLLM خيارًا مفضلًا للمطورين والمنظمات التي تعمل مع LLMs:
- أداء رائد في هذا المجال: يوفر vLLM إنتاجية أعلى بكثير مقارنة بالعديد من تنفيذات الأساس. وهذا يعني أنه يمكنك التعامل مع المزيد من طلبات المستخدمين في وقت واحد أو معالجة مجموعات بيانات كبيرة بشكل أسرع بنفس الأجهزة.
- إدارة الذاكرة بكفاءة: يعمل الابتكار الرئيسي، PagedAttention، على تقليل الفاقد من الذاكرة بشكل كبير من خلال إدارة ذاكرة KV بشكل أكثر فعالية. وهذا يسمح لك بتناسب نماذج أكبر على وحدات معالجة الرسومات الخاصة بك أو خدمة النماذج الحالية مع وجود حمل ذاكرة أقل، مما قد يقلل من تكاليف الأجهزة.
- التجميع المستمر: على عكس التجميع الثابت (حيث ينتظر الخادم مجموعة كاملة قبل المعالجة)، يستخدم vLLM التجميع المستمر. يعالج الطلبات ديناميكيًا عند وصولها، مما يحسن بشكل كبير استغلال وحدة معالجة الرسومات ويقلل من الكمون للطلبات الفردية.
- خادم متوافق مع OpenAI: يشمل vLLM خادمًا مدمجًا يحاكي واجهة برمجة التطبيقات OpenAI. وهذا يجعل من السهل جدًا استخدام vLLM كبديل مباشر للتطبيقات التي تم بناؤها بالفعل باستخدام عميل OpenAI Python أو الأدوات المتوافقة. يمكنك غالبًا تغيير عنوان URL الخاص بنقطة النهاية ومفتاح واجهة برمجة التطبيقات، وسينجح الكود الحالي الخاص بك مع مثيل vLLM المستضاف ذاتيًا.
- سهولة الاستخدام: على الرغم من تعقيداته الداخلية، يوفر vLLM واجهة برمجة تطبيقات بسيطة نسبيًا لكل من الاستدلال في وضع عدم الاتصال (
LLM
class) وخدمة الإنترنت (vllm serve
command). - توافق واسع مع النماذج: يدعم vLLM مجموعة واسعة من نماذج LLM مفتوحة المصدر الشهيرة المتاحة على Hugging Face Hub (وربما ModelScope).
- تطوير نشط ومجتمع: يعد vLLM مشروعًا مفتوح المصدر يتم صيانته بنشاط مع مجتمع متنامٍ، مما يضمن تحسينات مستمرة، وإصلاحات للأخطاء، ويدعم نماذج وميزات جديدة.
- نوى محسنة: يستخدم vLLM نوى CUDA المحسنة للغاية لمجموعة متنوعة من العمليات، مما يعزز الأداء على وحدات معالجة الرسومات NVIDIA.
إذا كانت السرعة والكفاءة وقابلية التوسع أمرًا بالغ الأهمية لتطبيق LLM الخاص بك، فإن vLLM هو تقنية يجب أن تأخذها في الاعتبار بجدية.
ما النماذج التي يدعمها vLLM؟
يدعم vLLM مجموعة واسعة من النماذج المعتمدة على المحولات والتي تستضيفها Hugging Face Hub. يشمل ذلك العديد من المتغيرات:
- Llama (Llama، Llama 2، Llama 3)
- Mistral و Mixtral
- Qwen و Qwen2
- GPT-2، GPT-J، GPT-NeoX
- OPT
- Bloom
- Falcon
- MPT
- والعديد من الآخرين، بما في ذلك النماذج متعددة الوسائط.
القائمة تنمو باستمرار. للحصول على أحدث وأكمل قائمة للنماذج المدعومة رسميًا، يرجى دائمًا الرجوع إلى الوثائق الرسمية لـ vLLM:
قائمة النماذج المدعومة في vLLM
إذا لم يكن نموذج ما مدرجًا بشكل صريح، فقد يعمل إذا كانت بنيته مشابهة لواحدة مدعومة، لكن التوافق ليس مضمونًا بدون دعم رسمي أو اختبار. عادة ما يتطلب إضافة بنى نماذج جديدة مساهمات كود لمشروع vLLM.
بعض المصطلحات الرئيسية في vLLM:
بينما يعد vLLM سهل الاستخدام من حيث الشكل، فإن فهم بضع مفاهيم أساسية يساعد على تقدير لماذا هو فعال جدًا:
- PagedAttention: هذه هي ميزة vLLM الأساسية. تتطلب آليات الانتباه التقليدية، ذاكرة كي-قيمة (KV) (التي تخزن النتائج الوسيطة للتوليد) كتل ذاكرة متجاورة. وهذا يؤدي إلى التجزئة وإهدار الذاكرة (الداخلية والخارجية). يعمل PagedAttention مثل الذاكرة الافتراضية في أنظمة التشغيل. إنه يقسم ذاكرة KV إلى كتل غير متجاورة (صفحات)، مما يسمح بإدارة ذاكرة أكثر مرونة وكفاءة. يقلل بشكل كبير من حمل الذاكرة (بما يصل إلى 90٪ في بعض الحالات التي أبلغ عنها المطورون) ويمكنه تمكين ميزات مثل البادئات المشتركة بدون تكرار في الذاكرة.
- التجميع المستمر: بدلاً من الانتظار وصول عدد ثابت من الطلبات قبل بدء الحساب (التجميع الثابت)، يسمح التجميع المستمر لمحرك vLLM ببدء معالجة تسلسلات جديدة بمجرد انتهاء التسلسلات القديمة من إنشاء الرموز داخل مجموعة. هذا يبقي وحدة معالجة الرسومات مشغولة باستمرار، مما يزيد من الإنتاجية ويقلل من متوسط أوقات الانتظار للطلبات.
تعمل هاتان التقنيتان معًا بشكل متكامل لتوفير خصائص الأداء المذهلة لـ vLLM.
قبل البدء باستخدام vLLM، عليك التحقق من:
قبل أن تتمكن من تثبيت وتشغيل vLLM، تأكد من أن نظامك يلبي المتطلبات التالية:
- نظام التشغيل: Linux هو نظام التشغيل المدعوم الرئيسي. رغم أنه قد توجد جهود مجتمعية لأنظمة التشغيل الأخرى (مثل WSL2 على Windows أو macOS)، إلا أن Linux يوفر التجربة الأكثر بساطة ودعماً رسمياً.
- إصدار Python: يتطلب vLLM Python 3.9 أو 3.10 أو 3.11 أو 3.12. يوصى بشدة باستخدام بيئة افتراضية لإدارة تبعيات Python الخاصة بك.
- وحدة معالجة الرسومات NVIDIA مع CUDA: للحصول على أداء مثالي والوصول إلى الميزات الأساسية، تحتاج إلى وحدة معالجة الرسومات NVIDIA مع قدرة حسابية مدعومة بواسطة PyTorch ووجود مجموعة أدوات CUDA اللازمة مثبتة. يعتمد vLLM بشكل كبير على CUDA لنقاطه المحسنة. بينما تتوفر الاستدلال بالمعالج المركزي فقط ودعم لمسرعات أخرى (مثل وحدات معالجة الرسومات AMD أو AWS Inferentia/Trainium) أو قيد التطوير، فإن المسار الرئيسي يتضمن الأجهزة من NVIDIA. تحقق من الموقع الرسمي لـ PyTorch للتأكد من توافق CUDA مع إصدار برنامج تشغيل GPU المحدد لديك.
- PyTorch: تم بناء vLLM على PyTorch. عادةً ما تتولى عملية التثبيت تثبيت إصدار متوافق، ولكن تأكد من أن لديك تثبيتًا عمليًا لجهاز PyTorch متوافق مع إصدار CUDA الخاص بك إذا واجهت أي مشكلات.
دليل خطوة بخطوة لتثبيت vLLM
الطريقة الموصى بها لتثبيت vLLM هي استخدام مدير الحزم ضمن بيئة افتراضية. هذا يمنع حدوث تعارضات مع مشاريع Python الأخرى. إليك الخطوات باستخدام الأدوات الشائعة:
استخدام pip مع vLLM
pip
هو المثبت القياسي لحزم Python.
إنشاء وتفعيل بيئة افتراضية (موصى بها):
python -m venv vllm-env
source vllm-env/bin/activate
# على Windows استخدم: vllm-env\\\\Scripts\\\\activate
تثبيت vLLM:
pip install vllm
سيعمل هذا الأمر على تنزيل وتثبيت الإصدار الثابت الأحدث من vLLM وتبعيّاته الأساسية، بما في ذلك إصدار متوافق من PyTorch لإعداد CUDA الذي تم اكتشافه لديك (إذا كان ذلك ممكنًا).
استخدام Conda مع vLLM
Conda هو مدير بيئة وحزم شهير آخر، خاصة في مجتمع علوم البيانات.
إنشاء وتفعيل بيئة Conda:
conda create -n vllm-env python=3.11 -y # أو استخدم 3.9، 3.10، 3.12
conda activate vllm-env
تثبيت vLLM باستخدام pip داخل Conda: يُوصى عمومًا باستخدام pip
لتثبيت vLLM حتى داخل بيئة Conda لضمان الحصول على أحدث إصدار متوافق بسهولة.
pip install vllm
قد تحتاج إلى تثبيت PyTorch بشكل منفصل عبر Conda أولاً إذا كنت تفضل إدارة ذلك بهذه الطريقة، مما يضمن التوافق: conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia
(عدل إصدار CUDA حسب الحاجة). ثم قم بتشغيل pip install vllm
.
استخدام uv مع vLLM
uv
هو مثبت حزم بايثون جديد وسريع للغاية.
تثبيت uv (إذا لم يكن مثبتًا بالفعل): اتبع التعليمات في الوثائق الرسمية لـ uv
.
إنشاء وتفعيل بيئة باستخدام uv:
uv venv vllm-env --python 3.12 --seed # أو استخدم 3.9، 3.10، 3.11
source vllm-env/bin/activate
# على Windows استخدم: vllm-env\\\\Scripts\\\\activate
تثبيت vLLM باستخدام uv:
uv pip install vllm
التحقق من تثبيت vLLM الخاص بك
بعد التثبيت، يمكنك التحقق منه بسرعة من خلال محاولة استيراد vLLM في مترجم بايثون أو تشغيل أمر أساسي:
# قم بتنشيط بيئتك الافتراضية أولاً (مثل source vllm-env/bin/activate)
python -c "import vllm; print(vllm.__version__)"
يجب أن يطبع ذلك إصدار vLLM المثبت دون أخطاء.
بدلاً من ذلك، حاول أمر المساعدة للخادم (يتطلب التثبيت الناجح):
vllm --help
أداء الاستدلال المجمّع في وضع عدم الاتصال باستخدام vLLM
يشير الاستدلال المجمّع في وضع عدم الاتصال إلى إنشاء نص لمجموعة مسبقة من المطالبات في وقت واحد. هذا مفيد لمهام مثل تقييم نموذج، وإنشاء استجابات لمجموعة بيانات، أو حساب النتائج مسبقًا. يجعل vLLM هذا فعالًا باستخدام فئة LLM
.
فهم فئة LLM
في vLLM
فئة vllm.LLM
هي نقطة الدخول الرئيسية للاستدلال في وضع عدم الاتصال. يمكنك تهيئتها من خلال تحديد النموذج الذي تريد استخدامه.
from vllm import LLM
# قم بتهيئة محرك LLM باستخدام نموذج من Hugging Face Hub
# تأكد من أن لديك ذاكرة GPU كافية للنموذج المختار!
# مثال: استخدام نموذج أصغر مثل OPT-125m
llm = LLM(model="facebook/opt-125m")
# مثال: استخدام نموذج أكبر مثل Llama-3-8B-Instruct (يتطلب ذاكرة GPU كبيرة)
# llm = LLM(model="meta-llama/Meta-Llama-3-8B-Instruct")
print("تم تهيئة محرك vLLM.")
بشكل افتراضي، يقوم vLLM بتنزيل النماذج من Hugging Face Hub. إذا كان نموذجك مستضافًا على ModelScope، تحتاج إلى ضبط متغير بيئة VLLM_USE_MODELSCOPE=1
قبل تشغيل سكربت بايثون الخاص بك.
تهيئة معلمات أخذ العينات في vLLM
للتحكم في كيفية إنشاء النص، يمكنك استخدام فئة vllm.SamplingParams
. يتيح لك ذلك ضبط معلمات مثل:
temperature
: يتحكم في العشوائية. القيم المنخفضة (مثل 0.2) تجعل الناتج أكثر تحديدًا وتركيزًا؛ بينما القيم الأعلى (مثل 0.8) تزيد من العشوائية.top_p
(أخذ العينات النووية): يأخذ فقط الرموز الأكثر احتمالًا التي تتجاوز احتمالية مجموعهاtop_p
. قيمة شائعة هي 0.95.top_k
: يأخذ فقطtop_k
من الرموز الأكثر احتمالًا في كل خطوة.max_tokens
: الحد الأقصى لعدد الرموز التي سيتم إنشاؤها لكل مطالبة.stop
: قائمة من السلاسل التي، عند إنشائها، ستتوقف عملية الإنشاء لتلك المطالبة المحددة.
from vllm import SamplingParams
# تعريف معلمات أخذ العينات
# إذا لم يتم تحديدها، فقد يستخدم vLLM الافتراضية من ملف generation_config.json الخاص بالنموذج
sampling_params = SamplingParams(
temperature=0.7,
top_p=0.9,
max_tokens=100, # تحديد طول النص الناتج
stop=["\\\\n", " الإنسان:", " المساعد:"] # توقف عن الإنشاء إذا ظهرت هذه الرموز
)
print("تم تكوين معلمات أخذ العينات.")
ملاحظة مهمة: بشكل افتراضي، يحاول vLLM تحميل واستخدام الإعدادات من ملف generation_config.json
المرتبط بالنموذج على Hugging Face Hub. إذا كنت ترغب في تجاهل ذلك واستخدام معلمات أخذ العينات الافتراضية في vLLM ما لم يتم تجاوزها بواسطة كائن SamplingParams
الخاص بك، قم بتهيئة فئة LLM
مثل هذا: llm = LLM(model="...", generation_config="vllm")
. إذا قدمت كائن SamplingParams
لطريقة generate
، فإن تلك المعلمات ستأخذ دائمًا الأولوية على تكوين النموذج وافتراضات vLLM.
تشغيل أول وظيفة vLLM المجمعة لك
الآن، دعنا نجمع كائن LLM
، وSamplingParams
، وقائمة من المطالبات لإنشاء النص.
from vllm import LLM, SamplingParams
# 1. تحديد مطالبات الإدخال الخاصة بك
prompts = [
"عاصمة فرنسا هي",
"اشرح نظرية النسبية بمصطلحات بسيطة:",
"اكتب قصيدة قصيرة عن يوم ممطر:",
"ترجم 'مرحبًا، عالم!' إلى الألمانية:",
]
# 2. تهيئة معلمات أخذ العينات
sampling_params = SamplingParams(temperature=0.7, top_p=0.95, max_tokens=150)
# 3. تهيئة محرك vLLM (استخدم نموذج مناسب للأجهزة الخاصة بك)
try:
# استخدام نموذج صغير وقابل
llm = LLM(model="mistralai/Mistral-7B-Instruct-v0.1")
# أو للأجهزة الصغيرة:
# llm = LLM(model="facebook/opt-1.3b")
# llm = LLM(model="facebook/opt-125m")
except Exception as e:
print(f"خطأ أثناء تهيئة LLM: {e}")
print("يرجى التأكد من أن لديك ذاكرة GPU كافية وأن CUDA مهيأة بشكل صحيح.")
exit()
# 4. إنشاء نص للمطالبات
# تأخذ طريقة generate قائمة من المطالبات ومعلمات أخذ العينات
print("إنشاء استجابات...")
outputs = llm.generate(prompts, sampling_params)
print("اكتمل الإنشاء.")
# 5. طباعة النتائج
# الإخراج هو قائمة من كائنات RequestOutput
for output in outputs:
prompt = output.prompt
generated_text = output.outputs[0].text # الحصول على النص من أول تسلسل منشأ
print("-" * 20)
print(f"المطالبة: {prompt!r}")
print(f"النص الناتج: {generated_text!r}")
print("-" * 20)
هذا السكربت يهيئ vLLM، ويحدد المطالبات والمعلمات، ويجري عملية الإنشاء بكفاءة في مجموعة، ثم يطبع الإخراج لكل مطالة. يقوم استدعاء llm.generate()
بإدارة تعقيدات التجميع والتنفيذ على GPU داخليًا.
إعداد خادم vLLM المتوافق مع OpenAI
واحدة من أقوى ميزات vLLM هي قدرته على العمل كخادم خلفية عالي الأداء يتحدث نفس لغة واجهة برمجة التطبيقات OpenAI. وهذا يسمح لك بسهولة استضافة نماذجك مفتوحة المصدر الخاصة ودمجها في التطبيقات المصممة لـ OpenAI.
بدء خادم vLLM
بدء الخادم بسيط باستخدام أمر vllm serve
في الطرفية لديك.
قم بتفعيل بيئتك الافتراضية حيث تم تثبيت vLLM.
source vllm-env/bin/activate
قم بتشغيل أمر vllm serve
: تحتاج إلى تحديد النموذج الذي تريد خدمته.
# مثال باستخدام Mistral-7B-Instruct
vllm serve mistralai/Mistral-7B-Instruct-v0.1
# مثال باستخدام نموذج أصغر مثل Qwen2-1.5B-Instruct
# vllm serve Qwen/Qwen2-1.5B-Instruct
سيعمل هذا الأمر على:
- تنزيل النموذج المحدد (إذا لم يكن مخزنًا بالفعل).
- تحميل النموذج على وحدة معالجة الرسومات الخاصة بك.
- بدء خادم ويب (يستخدم Uvicorn بشكل افتراضي).
- الاستماع لطلبات واجهة برمجة التطبيقات الواردة، عادةً عند
http://localhost:8000
.
خيارات شائعة:
-model <اسم_أو_مسار_النموذج>
: (مطلوب) النموذج الذي تريد خدمته.-host <عنوان_IP>
: عنوان IP الذي يرتبط به الخادم (مثل0.0.0.0
لجعله accessible على الشبكة الخاصة بك). الافتراضي هوlocalhost
.-port <رقم_المنفذ>
: المنفذ للاستماع. الافتراضي هو8000
.-tensor-parallel-size <N>
: لخدمة متعددة وحدات معالجة الرسومات، يقسم النموذج عبر N وحدات معالجة الرسومات.-api-key <مفتاحك>
: إذا تم تعيينه، سيتوقع الخادم هذا المفتاح API في رأسAuthorization: Bearer <مفتاحك>
للطلبات الواردة. يمكنك أيضًا تعيين متغير البيئةVLLM_API_KEY
.-generation-config vllm
: استخدم معلمات أخذ العينات الافتراضية لـ vLLM بدلاً منgeneration_config.json
الخاص بالنموذج.-chat-template <path_to_template_file>
: استخدم ملف قالب دردشة Jinja مخصص بدلاً من ذلك المحدد في تكوين المحلل.
سيقوم الخادم بإخراج سجلات تشير إلى أنه يعمل وجاهز لاستقبال الطلبات.
التفاعل مع خادم vLLM: واجهة برمجة التطبيقات للاستكمالات
بمجرد تشغيل الخادم، يمكنك إرسال الطلبات إلى نقطة النهاية /v1/completions
الخاصة به، تمامًا كما تفعل مع واجهة برمجة التطبيقات للاستكمالات الأقدم من OpenAI.
باستخدام curl
:
curl <http://localhost:8000/v1/completions> \\\\
-H "Content-Type: application/json" \\\\
-d '{
"model": "mistralai/Mistral-7B-Instruct-v0.1",
"prompt": "سان فرانسيسكو هي مدينة في",
"max_tokens": 50,
"temperature": 0.7
}'
(استبدل "mistralai/Mistral-7B-Instruct-v0.1"
بالنموذج الفعلي الذي تقوم بخدمته)
باستخدام مكتبة openai
بايثون:
from openai import OpenAI
# وجه العميل إلى نقطة نهاية خادم vLLM الخاصة بك
client = OpenAI(
api_key="EMPTY", # استخدم "EMPTY" أو مفتاحك الفعلي إذا قمت بتعيين واحد مع --api-key
base_url="<http://localhost:8000/v1>"
)
print("إرسال طلب إلى خادم vLLM (استكمالات)...")
try:
completion = client.completions.create(
model="mistralai/Mistral-7B-Instruct-v0.1", # يجب أن يتطابق اسم النموذج مع ما يتم خدمته
prompt="اشرح فوائد استخدام vLLM:",
max_tokens=150,
temperature=0.5
)
print("الاستجابة:")
print(completion.choices[0].text)
except Exception as e:
print(f"حدث خطأ: {e}")
(تذكر استبدال اسم النموذج إذا كنت تخدم نموذجًا مختلفًا)
التفاعل مع خادم vLLM: واجهة برمجة التطبيقات لاستكمالات الدردشة
يدعم vLLM أيضًا نقطة النهاية الأكثر حداثة /v1/chat/completions
، المناسبة للنماذج المحادثة وهيكل الرسائل المنسقة (دور النظام، المستخدم، المساعد).
باستخدام curl
:
curl <http://localhost:8000/v1/chat/completions> \\\\
-H "Content-Type: application/json" \\\\
-d '{
"model": "mistralai/Mistral-7B-Instruct-v0.1",
"messages": [
{"role": "system", "content": "أنت مساعد مفيد."},
{"role": "user", "content": "ما هي الميزة الرئيسية لـ PagedAttention في vLLM؟"}
],
"max_tokens": 100,
"temperature": 0.7
}'
(استبدل اسم النموذج حسب الحاجة)
باستخدام مكتبة openai
بايثون:
from openai import OpenAI
# وجه العميل إلى نقطة نهاية خادم vLLM الخاصة بك
client = OpenAI(
api_key="EMPTY", # استخدم "EMPTY" أو مفتاحك الفعلي
base_url="<http://localhost:8000/v1>"
)
print("إرسال طلب إلى خادم vLLM (استكمالات الدردشة)...")
try:
chat_response = client.chat.completions.create(
model="mistralai/Mistral-7B-Instruct-v0.1", # يجب أن يتطابق اسم النموذج مع ما يتم خدمته
messages=[
{"role": "system", "content": "أنت مساعد برمجي مفيد."},
{"role": "user", "content": "اكتب دالة بايثون بسيطة لحساب العوامل."}
],
max_tokens=200,
temperature=0.5
)
print("الاستجابة:")
print(chat_response.choices[0].message.content)
except Exception as e:
print(f"حدث خطأ: {e}")
(تذكر استبدال اسم النموذج إذا لزم الأمر)
يعد استخدام الخادم المتوافق مع OpenAI طريقة قوية لنشر نقاط الاستدلال عالية الأداء لـ LLM مع تغييرات ضئيلة في منطق تطبيقك الحالي.
دعنا نتحدث عن خلفيات الانتباه في vLLM
يستخدم vLLM "خلفيات" متخصصة لحساب آلية الانتباه بكفاءة. تمثل هذه الخلفيات تنفيذات محسنة تعتمد على مكتبات أو تقنيات مختلفة، تستهدف بشكل أساسي وحدات معالجة الرسومات NVIDIA. يمكن أن تؤثر الاختيارات بين الخلفيات على الأداء واستخدام الذاكرة. تشمل الخلفيات الرئيسية:
- FlashAttention: يستخدم مكتبة FlashAttention (الإصدارات 1 و 2). FlashAttention هو خوارزمية انتباه محسنة للغاية تسرع بشكل كبير الحساب وتقلل من استخدام الذاكرة من خلال تجنب الحاجة إلى تشكيل مصفوفة الانتباه الكبيرة الوسيطة في ذاكرة وحدة معالجة الرسومات عالية النطاق الترددي (HBM). غالبًا ما تكون الخيار الأسرع لكثير من وحدات معالجة الرسومات الحديثة (مثل معماريات Ampere، Hopper) وأطوال التسلسل. يتضمن vLLM عادةً عجلات مسبقة البناء مع دعم FlashAttention.
- Xformers: يستفيد من مكتبة xFormers، التي طورتها Meta AI. يوفر xFormers أيضًا تنفيذات انتباه محسنة وفعالة من حيث الذاكرة (مثل
MemoryEfficientAttention
). تقدم توافقًا واسعًا عبر مختلف معماريات وحدات معالجة الرسومات ويمكن أن تكون بديلاً جيدًا أو وسيلة للتراجع إذا لم يكن FlashAttention متاحًا أو جذابًا لسيناريو محدد. في الغالب تشمل التثبيتات القياسية لـ vLLM دعم لـ xFormers. - FlashInfer: خيار جديد أكثر حداثة يستخدم مكتبة FlashInfer. يوفر FlashInfer نوى محسنة بشكل كبير مصممة خصيصًا لنشر LLMs، مع التركيز على سيناريوهات الملء المسبق وفك التشفير، بما في ذلك ميزات مثل فك التشفير الاستباقي والتعامل الفعال مع ذاكرات KV المصفحة. عادةً لا تحتوي عجلات vLLM المسبقة البناء على FlashInfer، مما يعني أنك يجب أن تثبته بشكل منفصل في بيئتك قبل أن يتمكن vLLM من استخدامه. راجع الوثائق الرسمية لـ FlashInfer أو ملفات Docker الخاصة بـ vLLM للحصول على تعليمات التثبيت إذا كنت تنوي استخدام هذه الخلفية.
اختيار الخلفية التلقائي: بشكل افتراضي، يكتشف vLLM تلقائيًا أكثر الخلفيات فعالية وملاءمة للاستخدام بناءً على معداتك (معمارية GPU)، والمكتبات المثبتة (هل FlashAttention/xFormers/FlashInfer متاحة؟)، والنموذج المحدد قيد الاستخدام. يقوم بإجراء فحوصات لضمان التوافق ويهدف إلى توفير أفضل أداء جاهز للاستخدام بدون تكوين يدوي.
اختيار الخلفية يدويًا: في بعض الحالات المتقدمة أو لأغراض القياس، قد ترغب في إجبار vLLM على استخدام خلفية معينة. يمكنك القيام بذلك عن طريق ضبط متغير البيئة VLLM_ATTENTION_BACKEND
قبل بدء عملية vLLM الخاصة بك (سواء كان السكربت غير المتصل أو الخادم).
# مثال: فرض استخدام FlashAttention (إذا تم تثبيته ومتوافق) export VLLM_ATTENTION_BACKEND=FLASH_ATTN python your_offline_script.py # أو # export VLLM_ATTENTION_BACKEND=FLASH_ATTN # vllm serve your_model ... # مثال: فرض استخدام xFormers export VLLM_ATTENTION_BACKEND=XFORMERS python your_offline_script.py # مثال: فرض استخدام FlashInfer (يتطلب تثبيتًا مسبقًا) export VLLM_ATTENTION_BACKEND=FLASHINFER python your_offline_script.py
ينصح معظم المبتدئين بالاعتماد على اختيار vLLM التلقائي للخلفية. يرتبط ضبط الخلفية يدويًا عادةً بالتجريب أو حل مشكلات الأداء المحددة.
تحري مشاكل التثبيت والاستخدام الشائعة في vLLM
بينما يسعى vLLM لسهولة الاستخدام، قد تواجه بعض العقبات الشائعة، خاصةً أثناء الإعداد. إليك بعض المشكلات الشائعة وحلولها المحتملة:
- أخطاء نفاد الذاكرة من CUDA (OOM):
- المشكلة: ترى أخطاء مثل
torch.cuda.OutOfMemoryError: CUDA out of memory
. - السبب: يتطلب LLM الذي تحاول تحميله VRAM GPU أكثر مما هو متاح على جهازك. تستهلك النماذج الأكبر (مثل 7B معلمات وما فوق) ذاكرة كبيرة.
- الحلول:
- استخدم نموذجًا أصغر: حاول أولاً تحميل متغير أصغر (مثل
opt-1.3b
،Qwen/Qwen2-1.5B-Instruct
) للتأكيد على أن إعدادك يعمل. - تقليل حجم المجموعة (الخادم): في حين أن vLLM تتعامل مع التجميع ديناميكيًا، فإن عددًا مرتفعًا للغاية من الطلبات المتزامنة يمكن أن يتجاوز الذاكرة. راقب الاستخدام.
- استخدم التكميم: قم بتحميل إصدارات مضغوطة من النموذج (مثل AWQ و GPTQ و GGUF - تحقق من الوثائق الخاصة بـ vLLM لمعرفة أنواع التكميم المدعومة). يقلل التكميم من بصمة الذاكرة، غالبًا بتكلفة بسيطة في الدقة. مثال:
llm = LLM(model="TheBloke/Mistral-7B-Instruct-v0.1-AWQ")
. لاحظ أن المكتبات الخاصة بالتكميم قد تحتاج إلى تثبيت. - التوازي عبر النوايا: إذا كان لديك عدة وحدات معالجة الرسومات، استخدم المعامل
-tensor-parallel-size N
عند إطلاق الخادم أوtensor_parallel_size=N
عند تهيئة فئةLLM
لتوزيع النموذج عبر N وحدات معالجة الرسومات. - تحقق من وجود عمليات أخرى: تأكد من عدم وجود تطبيقات أخرى تستهلك ذاكرة GPU كبيرة. استخدم
nvidia-smi
في الطرفية للتحقق من استخدام الذاكرة.
- أخطاء التثبيت (توافق CUDA/PyTorch):
- المشكلة: يفشل
pip install vllm
مع أخطاء تتعلق بـ CUDA أو PyTorch أو تجميع الامتدادات. - السبب: عدم التوافق بين إصدار برنامج التشغيل NVIDIA المثبت، وإصدار مجموعة أدوات CUDA، وإصدار PyTorch الذي يحاول vLLM تثبيته أو استخدامه.
- الحلول:
- تحقق من التوافق: تأكد من أن إصدار برنامج التشغيل NVIDIA الخاص بك يدعم إصدار مجموعة أدوات CUDA المطلوبة من بناء PyTorch الذي تنوي استخدامه. راجع مصفوفة التثبيت على موقع PyTorch.
- تثبيت PyTorch يدويًا: في بعض الأحيان، يساعد تثبيت إصدار متوافق من PyTorch بشكل صريح قبل تثبيت vLLM. انتقل إلى الموقع الرسمي لـ PyTorch، وحدد نظام التشغيل الخاص بك، ومدير الحزم (pip/conda)، ومنصة الحوسبة (إصدار CUDA)، وابحث عن الأمر المقدم. بعد ذلك،
pip install vllm
. - استخدم صورة Docker الرسمية: يمكنك التفكير في استخدام صور Docker الرسمية لـ vLLM. تأتي هذه مكونة مسبقًا بإصدارات متوافقة من CUDA وPyTorch وvLLM، مما يتجنب صعوبات التثبيت المحلية. تحقق من Docker Hub للحصول على
vllm/vllm-openai
. - تحقق من أدوات البناء: تأكد من أن لديك أدوات البناء الضرورية المثبتة (
build-essential
على Debian/Ubuntu، أو ما يعادلها).
- فشل تحميل النموذج:
- المشكلة: يفشل vLLM في تحميل النموذج المحدد، ربما مع أخطاء "غير موجودة" أو مشكلات في التكوين.
- السبب: اسم/مسار النموذج غير صحيح، يحتاج النموذج إلى تشغيل كود عن بعد موثوق به، مشكلات تنسيق النموذج، أو مشكلات في الشبكة تمنع التنزيل.
- الحلول:
- تحقق من اسم النموذج: تحقق مرة أخرى من المعرف المحدد على Hugging Face Hub (مثل
mistralai/Mistral-7B-Instruct-v0.1
). - الثقة في كود عن بعد: تتطلب بعض النماذج تنفيذ كود مخصص يتم تحديده في مستودعها. بالنسبة لفئة
LLM
، استخدمtrust_remote_code=True
. بالنسبة للخادم، استخدم علامة-trust-remote-code
:vllm serve my_model --trust-remote-code
. قم بذلك فقط إذا كنت تثق في مصدر النموذج. - استخدام مسار محلي: إذا كان لديك النموذج تم تنزيله محليًا، قدم المسار إلى الدليل الذي يحتوي على ملفات النموذج وتكوين المحلل:
llm = LLM(model="/path/to/local/model")
. - تحقق من مساحة القرص: تأكد من أن لديك مساحة كافية على القرص لتنزيل أوزان النموذج (يمكن أن تكون عشرات الجيجابايت).
- مشكلات الشبكة: تحقق من اتصال الإنترنت لديك. إذا كنت خلف وكيل، قم بتكوين متغيرات البيئة
HTTP_PROXY
وHTTPS_PROXY
.
- أداء بطيء:
- المشكلة: سرعة الاستدلال أقل بكثير مما كان متوقعًا.
- السبب: الخلفية المختارة غير مثالية، العودة إلى المعالج المركزي، معلمات أخذ عينات غير فعالة، اختناقات في النظام.
- الحلول:
- تحقق من استخدام GPU: استخدم
nvidia-smi
أوnvtop
لمعرفة ما إذا كانت وحدة معالجة الرسوميات مستخدمة بشكل كامل أثناء الاستدلال. إذا لم يكن الأمر كذلك، قد تكون الاختناقات في مكان آخر (معالجة المعالج المركزي، تحميل البيانات). - تحديث vLLM & التبعيات: تأكد من أنك تستخدم أحدث الإصدارات من vLLM وPyTorch وسائقي CUDA والمكتبات مثل FlashAttention/xFormers.
- جرب خلفيات الانتباه: بينما يكون الاختيار التلقائي جيدًا عادة، حاول تعيين
VLLM_ATTENTION_BACKEND
يدويًا (راجع القسم السابق) لمعرفة ما إذا كانت خلفية أخرى تؤدي بشكل أفضل على نوع المعدات/النموذج المحدد. - راجع معلمات أخذ العينات: يمكن أن تؤدي القيم الكبيرة جدًا لـ
max_tokens
إلى زيادة أوقات الإنشاء لكل طلب.
- الإخراج غير صحيح أو غير مفهوم:
- المشكلة: تولد النموذج نصًا غير منطقي، أو يتكرر بشكل مفرط، أو لا يتبع التعليمات.
- السبب: تنسيق غير صحيح للمطالبة (خاصة لنماذج التعليمات/الدردشة)، معلمات أخذ عينات غير مناسبة، مشكلات في أوزان النموذج نفسها، أو تطبيق غير صحيح لقالب الدردشة.
- الحلول:
- تحقق من تنسيق المطالبة: تأكد من أن المطالبات الخاصة بك تتوافق مع التنسيق الذي تم تدريب النموذج عليه (مثل استخدام الرموز الخاصة مثل
[INST]
،<s>
،</s>
لنماذج التعليمات Llama/Mistral). تحقق من بطاقة النموذج على Hugging Face للحصول على تعليمات التنسيق. - تعديل معلمات أخذ العينات: يمكن أن تؤدي
temperature
العالية إلى عدم الاتساق. قد تؤدي درجة حرارة منخفضة جدًا إلى التكرار. جربtemperature
وtop_p
وtop_k
وrepetition_penalty
. - تحقق من النموذج: جرب نموذجًا مختلفًا ومعروفًا جيدًا لاستبعاد المشكلات المتعلقة بأوزان النموذج المحدد الذي قمت بتنزيله.
- قوالب الدردشة (الخادم): عند استخدام واجهة برمجة التطبيقات لاستكمالات الدردشة، تأكد من تطبيق قالب الدردشة الصحيح. يقوم vLLM عادةً بتحميل هذا من تكوين المحلل. إذا استمرت المشاكل، فقد تحتاج إلى تقديم قالب مخصص باستخدام معامل
-chat-template
أثناء إطلاق الخادم.
من المفيد استشارة