TRL documentation

تكامل vLLM

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v1.17.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

تكامل vLLM

ستوجّهك هذه الوثيقة عبر عملية استخدام vLLM مع TRL لتسريع التوليد في الأساليب التفاعلية مثل GRPO وOnline DPO. سنلخّص أولاً ملخصاً سريعاً (tl;dr) لكيفية استخدام vLLM مع TRL، ثم سنتعمق في التفاصيل حول آلية عمله داخلياً.

يدعم TRL حاليًا إصدارات vLLM من 0.23.0 إلى 0.33.x فقط. يرجى التأكد من تثبيت إصدار ضمن هذا النطاق لتجنب مشاكل التوافق.

تدعم المدربين التاليين حالياً التوليد باستخدام vLLM:

🚀 كيف يمكنني استخدام vLLM مع TRL لتسريع التدريب؟

💡 ملاحظة: الموارد المطلوبة لهذا المثال المحدد: عقدة واحدة مزودة بـ 8 وحدات معالجة رسومية (GPU).

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

أولاً، ثبّت vLLM باستخدام الأمر التالي:

pip install "trl[vllm]"

ثم شغّل الخادم على وحدات معالجة رسومية محددة (مثل وحدات المعالجة الرسومية 0-3):

CUDA_VISIBLE_DEVICES=0,1,2,3 VLLM_SERVER_DEV_MODE=1 vllm serve Qwen/Qwen2.5-7B --tensor-parallel-size 4 \
    --weight-transfer-config '{"backend": "nccl"}' \
    --logprobs-mode processed_logprobs \
    --max-logprobs -1

بمجرد تشغيل الخادم، يمكنك استخدامه لتوليد استكمالات للتدريب. في المثال أدناه، نستخدم المدربين المدعومين المختلفين مع خادم vLLM للتوليد. تتحكم الحجتان --tensor-parallel-size و--data-parallel-size في كيفية تقسيم النموذج والبيانات عبر وحدات معالجة الرسوميات.

في هذا المثال، نقسم نموذجًا واحدًا على 4 وحدات معالجة رسومية باستخدام توازي الموترات. ثم، نفّذ سكربت التدريب على وحدات معالجة رسومية مختلفة (مثل وحدات المعالجة الرسومية 4-7) عن طريق تمرير use_vllm=True في حُجج التدريب على النحو التالي:

مثال على سكربت train.py بسيط:

GRPO
OnlineDPO
RLOO
from datasets import load_dataset
from trl import GRPOTrainer, GRPOConfig
from trl.rewards import accuracy_reward

dataset = load_dataset("trl-lib/DeepMath-103K", split="train")

trainer = GRPOTrainer(
    model="Qwen/Qwen2.5-7B",
    args=GRPOConfig(use_vllm=True, vllm_mode="server"),
    reward_funcs=accuracy_reward,
    train_dataset=dataset,
)

trainer.train()

وأمر التدريب على وحدات معالجة رسومية منفصلة عن الخادم:

CUDA_VISIBLE_DEVICES=4,5,6,7 torchrun --nproc_per_node 4 train.py

لماذا استخدام vLLM؟

تولّد الأساليب عبر الإنترنت إكمالات أثناء التدريب، ويُعدّ توليدها باستخدام generate الخاص بالنموذج عنق الزجاجة. يقدّم vLLM تلك الإكمالات بسرعة أكبر بكثير، بفضل تقنيات مثل PagedAttention.

كيف يستخدم TRL الخادم 🔍

يطلب المدرب إكمالات من نقطة النهاية المتوافقة مع OpenAI وهي /v1/completions، مع إرسال معرفات رموز الموجه. أما الموجهات متعددة الوسائط فتتبع مسارًا مختلفًا: حيث تعالج الخوادم الصور بشكل مستقل، ثم تُقرَن الميزات الناتجة بنفس معرفات الرموز على /inference/v1/generate، إذ لا تقبل أي نقطة نهاية متوافقة مع OpenAI معرفات الرموز والصور في آنٍ واحد.

يُنتج الخادم فقط. بعد كل خطوة مُحسِّن، يبث المُدرِّب الأوزان المحدَّثة إليه عبر NCCL، مُعلناً عنها بـ/start_weight_update و/update_weights، ومُثبِّتها بـ/finish_weight_update.

الاستخدام المتقدم

🍷 خيارات تخصيص إضافية مع vLLM؟

يمكنك تخصيص إعدادات الخادم عن طريق تمرير أي حجة من حجج vllm serve، على سبيل المثال --tensor-parallel-size، --data-parallel-size، --max-model-len، --enable-prefix-caching، --enforce-eager، --kv-cache-dtype أو --trust-remote-code. شغّل vllm serve --help للحصول على القائمة الكاملة.

يتطلب TRL ما يلي فقط:

الإعدادلماذا
VLLM_SERVER_DEV_MODE=1يكشف نقاط النهاية الخاصة بنقل الأوزان وكاش البادئة المستخدمة لدفع أوزان التدريب إلى الخادم. كما يكشف نقاط النهاية الأخرى الخاصة بتطوير vLLM، لذا يُنصح بإبقاء الخادم على شبكة موثوقة.
--weight-transfer-config '{"backend": "nccl"}'يُفعّل محرك نقل الأوزان NCCL. استخدم "ipc" بدلاً من ذلك عندما يتشارك المدرب والخادم وحدة معالجة رسومية (GPU) واحدة.
--logprobs-mode processed_logprobsيعيد قيم logprobs بعد تطبيق تحجيم درجة الحرارة ومعالجة logit، وهو ما تتوقعه تصحيح أخذ العينات حسب الأهمية.
--max-logprobs -1يرفع الحد الأقصى المتوافق مع OpenAI البالغ 20 قيمة logprobs لكل رمز، وهو شرط مطلوب لطلب توزيع المعلم top-k لأغراض التقطير.
--enable-scale-outvLLM 0.30.0 وما بعده، للموجّهات متعددة الوسائط فقط: يسجّل /v1/chat/completions/render و/inference/v1/generate، حيث يستخدمها المُدرِّب لمعالجة الصور. ترفض الإصدارات الأقدم هذا العلم.

أصبح trl vllm-serve غير مستخدم: فهو الآن يبني هذا الأمر فقط ويشغّل خادم vLLM. يطبع الأمر vllm serve الدقيق الذي يشغّله، بحيث يمكنك نسخه والتخلّص من الغلاف.

💆🏻‍♀️ ما هو أفضل تكوين موزّع؟

قم بتوسيع التوليد باستخدام --tensor-parallel-size. لم يعد توازي البيانات مفيدًا للنماذج الكثيفة: فمنذ vLLM PR #30739 (الصادر في 0.14.0)، لا يُدعم توسيع توازي البيانات دون اتصال للنماذج غير MoE.

vLLM مع واجهة Transformers

يمكن لـ vLLM استخدام واجهة Transformers لتنفيذ النماذج، وهي تعمل مع نماذج اللغة الكبيرة (LLMs) ونماذج اللغة البصرية (VLMs). لتفعيل ذلك، اضبط vllm_model_impl="transformers" في إعداداتك أو مرره عبر معامل سطر الأوامر.

لمزيد من التفاصيل، راجع واجهة vLLM Transformers.

مثال:

CUDA_DEVICE_ORDER=PCI_BUS_ID CUDA_VISIBLE_DEVICES=0 VLLM_SERVER_DEV_MODE=1 vllm serve Qwen/Qwen2.5-VL-3B-Instruct \
    --tensor-parallel-size 1 --port 8000 --enforce-eager --model-impl transformers \
    --weight-transfer-config '{"backend": "nccl"}' \
    --logprobs-mode processed_logprobs \
    --max-logprobs -1 \
    --enable-scale-out  # vLLM 0.30.0 and later, drop on earlier versions

أنماط استخدام vLLM أثناء التدريب

يدعم TRL وضعين لدمج vLLM أثناء التدريب: وضع colocate (الافتراضي) ووضع server.

وضع التجميع

في وضع التشارك، يعمل vLLM داخل عملية المدرب ويتشارك ذاكرة GPU مع نموذج التدريب. يتجنب هذا إطلاق خادم منفصل ويمكن أن يحسّن استخدام GPU، لكنه قد يؤدي إلى تنافس على الذاكرة في وحدات GPU الخاصة بالتدريب. هذا هو الوضع الافتراضي.

مثال على التهيئة:

GRPO
OnlineDPO
RLOO
from trl import GRPOConfig

training_args = GRPOConfig(
    ...,
    use_vllm=True,  # vllm_mode="colocate" by default
)

وضع الخادم

في وضع الخادم، يعمل vLLM كعملية مستقلة على وحدات معالجة رسومية مخصصة ويتواصل مع المدرب عبر HTTP. هذا الإعداد مثالي إذا كانت لديك وحدات معالجة رسومية مخصصة للاستدلال.

مثال على التهيئة:

GRPO
OnlineDPO
RLOO
from trl import GRPOConfig

training_args = GRPOConfig(
    ...,
    use_vllm=True,
    vllm_mode="server",
)

راجع توثيق المُدرِّب الذي تستخدمه للحصول على تفاصيل محددة حول استخدام vLLM والمعاملات.

للتقليل من استهلاك ذاكرة وحدة معالجة الرسوميات (GPU) عند تشغيل vLLM، فكّر في تفعيل وضع السكون لـ vLLM.

Update on GitHub