وقتی یک مدل زبانی باید به دهها یا صدها درخواست همزمان پاسخ دهد، ابزارهای ساده دیگر جوابگو نیستند. vLLM یک موتور متنباز برای سرویسدهی مدلهای زبانی با توان عملیاتی بالاست که با تکنیک PagedAttention و Continuous Batching، از همان GPU درخواستهای بسیار بیشتری را پاسخ میدهد. در این راهنما توضیح میدهیم vLLM چیست، چطور کار میکند و چطور یک API سازگار با OpenAI با آن راهاندازی کنیم.
فهرست مطالب
vLLM چیست و چه مشکلی را حل میکند؟
vLLM یک کتابخانه متنباز پایتونی با هسته بهینهشده CUDA است که در دانشگاه UC Berkeley توسعه یافت و امروز یکی از رایجترین موتورهای سرویسدهی LLM در محیط عملیاتی است. مشکل اصلی که vLLM حل میکند، استفاده ناکارآمد از حافظه GPU در سرویسدهی همزمان است. در روشهای سنتی، برای هر درخواست بخش بزرگی از حافظه برای حداکثر طول متن ممکن رزرو میشد و بیشتر آن خالی میماند. نتیجه، تعداد کم درخواست همزمان و هدر رفتن ظرفیت GPU بود.
PagedAttention؛ مدیریت هوشمند حافظه
مدلهای زبانی برای هر درخواست حافظهای به نام KV Cache نگه میدارند که با طول متن رشد میکند. PagedAttention، با الهام از صفحهبندی حافظه در سیستمعاملها، این حافظه را به بلوکهای کوچک تقسیم میکند که لازم نیست پشت سر هم باشند و فقط به اندازه نیاز واقعی تخصیص داده میشوند. نتیجه:
- هدررفت حافظه KV Cache تقریباً حذف میشود.
- درخواستهایی که پیشوند مشترک دارند، مثل یک پیام سیستمی ثابت، میتوانند بلوکهای حافظه را به اشتراک بگذارند (Prefix Caching).
- روی همان GPU، تعداد درخواست همزمان بسیار بیشتری جا میشود.
Continuous Batching
vLLM در هر مرحله تولید توکن، درخواستهای تمامشده را از دسته خارج و درخواستهای جدید را وارد میکند. GPU همیشه مشغول است و هیچ درخواستی منتظر طولانیترین درخواست دسته نمیماند. ترکیب این روش با PagedAttention باعث شده است که در سرویسدهی همزمان، توان عملیاتی vLLM چند برابر روشهای ساده باشد. بنچمارکهای منتشرشده توسط توسعهدهندگان و مستقل، این برتری را در بار همزمان زیاد نشان میدهند؛ هرچند عدد دقیق به مدل، سختافزار و الگوی درخواستها بستگی دارد. جزئیات سرویسدهی چندکاربره در اجرای LLM برای چند کاربر همزمان آمده است.
نصب vLLM
vLLM روی لینوکس با GPU انویدیا اجرا میشود. سادهترین روشها:
# با pip در یک محیط مجازی پایتون
python3 -m venv ~/vllm-env
source ~/vllm-env/bin/activate
pip install vllm
یا با Docker، بدون درگیری با نسخههای پایتون و CUDA:
docker run -d --gpus all --ipc=host \
-v ~/.cache/huggingface:/root/.cache/huggingface \
-p 127.0.0.1:8000:8000 \
vllm/vllm-openai:latest \
--model Qwen/Qwen2.5-7B-Instruct
برای روش Docker باید NVIDIA Container Toolkit نصب باشد؛ مراحل آن را در نصب Ollama روی سرور GPU آوردهایم. برخی مدلها مثل Llama در Hugging Face نیاز به پذیرش مجوز و توکن دسترسی دارند که با متغیر HF_TOKEN تنظیم میشود.
راهاندازی API سازگار با OpenAI
vllm serve Qwen/Qwen2.5-7B-Instruct \
--host 127.0.0.1 --port 8000 \
--gpu-memory-utilization 0.90 \
--max-model-len 8192 \
--api-key "$(cat ~/.vllm-key)"
سرور، مسیرهای استاندارد /v1/chat/completions، /v1/completions و /v1/models را ارائه میکند. پارامتر --api-key یک کلید ساده برای درخواستها الزامی میکند. با این حال، برای دسترسی از اینترنت، سرور را روی 127.0.0.1 نگه دارید و پشت Nginx با HTTPS و محدودیت نرخ قرار دهید؛ پیکربندی آن در ساخت OpenAI-Compatible API امن.
ارسال درخواست با پایتون
کدهایی که با کتابخانه رسمی OpenAI نوشته شدهاند، فقط با تغییر base_url به vLLM وصل میشوند:
from openai import OpenAI
client = OpenAI(base_url="http://127.0.0.1:8000/v1", api_key="YOUR_VLLM_KEY")
response = client.chat.completions.create(
model="Qwen/Qwen2.5-7B-Instruct",
messages=[
{"role": "system", "content": "پاسخها را دقیق و به زبان فارسی بنویس."},
{"role": "user", "content": "PagedAttention را در دو پاراگراف توضیح بده."},
],
temperature=0.3,
)
print(response.choices[0].message.content)
پارامترهای مهم
| پارامتر | کاربرد |
|---|---|
--gpu-memory-utilization |
سهم VRAM قابل استفاده (پیشفرض ۰٫۹)؛ پس از بارگذاری مدل، باقیمانده به KV Cache میرسد |
--max-model-len |
حداکثر طول متن هر درخواست؛ مقدار کمتر یعنی درخواست همزمان بیشتر |
--max-num-seqs |
حداکثر درخواست همزمان در هر دسته |
--quantization |
اجرای مدلهای کوانتایزشده مثل AWQ، GPTQ یا FP8 |
--kv-cache-dtype fp8 |
کاهش حافظه KV Cache تقریباً به نصف |
--enable-prefix-caching |
استفاده مجدد از کش پیشوندهای مشترک |
--served-model-name |
نام دلخواه مدل در API |
اگر هنگام شروع خطای کمبود حافظه گرفتید، --max-model-len را کاهش دهید؛ vLLM باید بتواند حداقل یک درخواست با حداکثر طول را در کش جا دهد. درباره فرمتهای کوانتایز، Quantization چیست را بخوانید.
اجرای مدل روی چند GPU
برای مدلهایی که در یک کارت جا نمیشوند، vLLM وزنها را بین چند کارت تقسیم میکند:
vllm serve meta-llama/Llama-3.3-70B-Instruct \
--tensor-parallel-size 2 \
--max-model-len 16384
تعداد کارتها معمولاً باید توانی از ۲ باشد. کارتهای متصل با NVLink (مثل H100 SXM) کارایی بسیار بهتری نسبت به ارتباط از طریق PCIe دارند. اگر مدل در یک کارت جا میشود، اجرای چند نسخه مستقل روی چند کارت معمولاً توان عملیاتی بیشتری از تقسیم یک مدل دارد.
نکات محیط عملیاتی
- vLLM را بهصورت سرویس systemd یا کانتینر با سیاست ریاستارت اجرا کنید.
- مسیر
/metricsآمار Prometheus مثل تعداد درخواست در صف، استفاده از KV Cache و زمان تا اولین توکن را ارائه میکند؛ آن را در Grafana پایش کنید. - بارگذاری مدلهای بزرگ چند دقیقه طول میکشد؛ در بهروزرسانیها این زمان را در نظر بگیرید.
- نسخه vLLM را ثابت کنید؛ این پروژه سریع تغییر میکند و برخی پارامترها بین نسخهها عوض میشوند.
سوالات متداول
آیا vLLM از مدلهای کوانتایزشده پشتیبانی میکند؟
بله؛ AWQ، GPTQ، FP8 و فرمتهای دیگر پشتیبانی میشوند. پشتیبانی از GGUF هم وجود دارد، اما برای این فرمت، Ollama و llama.cpp بالغتر هستند.
تفاوت اصلی vLLM و Ollama چیست؟
Ollama برای سادگی نصب و مدیریت مدلها طراحی شده و برای استفاده شخصی و تیمهای کوچک عالی است. vLLM برای حداکثر توان عملیاتی در سرویسدهی به تعداد زیادی کاربر همزمان طراحی شده است. مقایسه کامل در Ollama یا vLLM.
آیا vLLM بدون GPU اجرا میشود؟
نسخههایی برای CPU و سختافزارهای دیگر وجود دارد، اما vLLM اساساً برای GPU طراحی شده و مزیت اصلی آن روی کارتهای گرافیک دیتاسنتری است.
چه کارتی برای vLLM مناسب است؟
برای مدلهای ۷ تا ۱۴ میلیاردی، کارتهای ۲۴ تا ۴۸ گیگابایتی مثل L40S؛ برای مدلهای ۷۰ میلیاردی و کاربران زیاد، H100. راهنمای کامل در بهترین GPU برای LLM.
سرور GPU برای سرویسدهی پرسرعت LLM
با سرورهای GPU تراست هاست و کارتهای دیتاسنتری، vLLM را با حداکثر توان عملیاتی برای کاربران سازمان یا مشتریان خود اجرا کنید.