TRL documentation
تكامل vLLM
تكامل 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 بسيط:
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()from datasets import load_dataset
from trl.experimental.online_dpo import OnlineDPOConfig, OnlineDPOTrainer
from trl.rewards import accuracy_reward
dataset = load_dataset("trl-lib/DeepMath-103K", split="train")
trainer = OnlineDPOTrainer(
model="Qwen/Qwen2.5-7B",
args=OnlineDPOConfig(use_vllm=True, vllm_mode="server"),
reward_funcs=accuracy_reward,
train_dataset=dataset,
)
trainer.train()from datasets import load_dataset
from trl import RLOOTrainer, RLOOConfig
from trl.rewards import accuracy_reward
dataset = load_dataset("trl-lib/DeepMath-103K", split="train")
trainer = RLOOTrainer(
model="Qwen/Qwen2.5-7B",
args=RLOOConfig(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-out | vLLM 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 الخاصة بالتدريب. هذا هو الوضع الافتراضي.
مثال على التهيئة:
from trl import GRPOConfig
training_args = GRPOConfig(
...,
use_vllm=True, # vllm_mode="colocate" by default
)from trl.experimental.online_dpo import OnlineDPOConfig
training_args = OnlineDPOConfig(
...,
use_vllm=True, # vllm_mode="colocate" by default
)from trl import RLOOConfig
training_args = RLOOConfig(
...,
use_vllm=True, # vllm_mode="colocate" by default
)وضع الخادم
في وضع الخادم، يعمل vLLM كعملية مستقلة على وحدات معالجة رسومية مخصصة ويتواصل مع المدرب عبر HTTP. هذا الإعداد مثالي إذا كانت لديك وحدات معالجة رسومية مخصصة للاستدلال.
مثال على التهيئة:
from trl import GRPOConfig
training_args = GRPOConfig(
...,
use_vllm=True,
vllm_mode="server",
)from trl.experimental.online_dpo import OnlineDPOConfig
training_args = OnlineDPOConfig(
...,
use_vllm=True,
vllm_mode="server",
)from trl import RLOOConfig
training_args = RLOOConfig(
...,
use_vllm=True,
vllm_mode="server",
)راجع توثيق المُدرِّب الذي تستخدمه للحصول على تفاصيل محددة حول استخدام vLLM والمعاملات.
Update on GitHubللتقليل من استهلاك ذاكرة وحدة معالجة الرسوميات (GPU) عند تشغيل vLLM، فكّر في تفعيل وضع السكون لـ vLLM.