
vLLM یه کتابخونهی اوپنسورسه که برای اجرای سریع و بهینهی مدلهای زبانی بزرگ (LLMها) ساخته شده. خلاصه بگم، خیلی خوبه برای وقتی که میخوای مدل رو توی محیط پروداکشن و نه صرفا تستی اجرا کنی و تعداد درخواستها هم زیاده.
مدلهای زبانی معمولاً خیلی سنگینن، هم از نظر پردازش، هم مصرف حافظه. وقتی چندتا کاربر همزمان درخواست بدن، اوضاع بدتر هم میشه
روشهای قدیمی معمولاً کند بودن و حتی از سختافزار هم خوب استفاده نمیکردن.
اینجا بخش جذاب ماجراست
Paged Attention ایدهشو از حافظه مجازی سیستمعاملها گرفته. به این صورت که میاد مدیریت حافظهی اَتِنشِن رو خیلی بهینهتر میکنه.
به جای اینکه کل KV cache (همون key/valueها) رو تو یه فضای بزرگ و یکتکه نگه داره، میاد اونو تیکهتیکه (page) میکنه.
حافظه رو به بلوکهای کوچیک تقسیم میکنه (مثلاً چند تا توکن در هر بلاک)
یه جدول سبک نگه میداره که بگه هر داده کجا ذخیره شده
موقع اجرا، دقیق میره همون تیکههایی که لازم داره رو برمیداره
مثل این میمونه که به جای اینکه کل کتابخونه رو بگردی، دقیق بدونی هر کتاب کدوم قفسهست.
چون این تیکهها لازم نیست کنار هم باشن:
میتونه هزاران درخواست رو همزمان هندل کنه
حتی اگه سرعت تولید جوابها فرق داشته باشه
استفاده از GPU هم خیلی بهینهتر میشه

اول یه فولدر و محیط مجازی بساز:
mkdir vllm_trials cd vllm_trials python3 -m venv venv source venv/bin/activate
بعد نصب:
pip install vllm
مثلاً مدل Phi-1.5:
vllm serve microsoft/phi-1_5 --trust-remote-code
این دستور:
یه API لوکال مثل OpenAI بالا میاره
روی آدرس لوکال هاسن: پورت 8000
اون فلگ
--trust-remote-code
هم لازمه چون بعضی مدلها کد اختصاصی دارن.
نکته:
(برای GPUهای NVIDIA بهینه شده و روی Mac محدودیت داره)
from openai import OpenAI client = OpenAI( api_key="EMPTY", base_url="localhost:8000/v1", ) completion = client.completions.create( model="microsoft/phi-1_5", prompt="San Francisco is a" ) print(completion)
from vllm import LLM, SamplingParams llm = LLM(model="microsoft/phi-1_5") prompts = [ "Hello, my name is", "The capital of France is", ] params = SamplingParams(temperature=0.8, top_p=0.95) outputs = llm.generate(prompts, params) for out in outputs: print(out.outputs[0].text)
from langchain_community.llms import VLLM llm = VLLM( model="microsoft/phi-1_5", trust_remote_code=True, temperature=0.8, ) print(llm.invoke("What is the capital of France?"))

قبلش گفتیم مدلها سنگینن، ولی اینجا دقیقتر میگه کجا گلوگاهه:
مدلها برای هر توکن یه KV cache نگه میدارن، که خیلی زود حافظه GPU رو میترکونه
مشکل اینجاست:
یه عالمه فضا رزرو میشه ولی کامل استفاده نمیشه
یه جاهایی هم فضای خالی ریز ریز ایجاد میشه که به درد هیچ درخواست جدیدی نمیخوره
نتیجه:
هزینه سختافزار بالا
تعداد درخواست همزمان کم
روشهای قدیمی اینطوری بودن:
یه batch درست میکنن
صبر میکنن همه تموم بشن
ولی مشکل:
خروجیها طولهای مختلف دارن
یکی زود تموم میشه، یکی دیر
پس GPU میشینه بیکار تا اون آخری تموم بشه
نتیجه:
تاخیر بالا
تعداد پردازش پایین
مکانیزم کارش اینه، به جای اینکه صبر کنه کل batch تموم شه:
هر لحظه وضعیت درخواستها رو چک میکنه
هر جا جا خالی شد، سریع با درخواست جدید پرش میکنه
مثل صف بانک نیست که همه با هم بیان جلو
بیشتر شبیه باجههای آزاد سوپرمارکته
GPU همیشه در حال کاره (بیکار نمیمونه)
سرعت پاسخ خیلی بهتر میشه
تعداد درخواست در ثانیه چند برابر میشه (حتی تا 24 برابر تو بعضی تستها)
این کتابخونه فقط دو تا ایده نیست، کلی ابزار هم داره:
اگه پروژهات بزرگه:
میتونی مدل رو بین چند GPU پخش کنی
حتی بین چند ماشین (کلاسترینگ)
با روشهایی مثل:
INT8
FP8
GPTQ
در نتیجه
حافظه کمتر مصرف میشه
سرعت بالاتر میره
خروجی رو دونهدونه میده (مثل ChatGPT)
تجربه کاربری خیلی بهتر
حس realtime بودن
اگه چندتا درخواست اولشون شبیه باشه:
مثلاً:
برام از هوش مصنوعی بگو
برام از یادگیری ماشین بگو
قسمت مشترک فقط یه بار محاسبه میشه
برای مدلهای فاینتیون شده:
راحت میتونی چندتا LoRA رو مدیریت کنی
بدون اینکه کل مدل رو دوباره لود کنی
از تکنیکهایی مثل:
Flash Attention
Flash Infer
استفاده میکنه برای سرعت بیشتر روی GPU
چندتا بخش مهم داره:
Scheduler : تصمیم میگیره کی چی اجرا شه
EngineCore : مغز اصلی اجرا
Model Runner : اجرای مدل روی GPU
KV Cache Manager : مدیریت حافظه
نکته مهم:
کارهای CPU و GPU جدا شدن: سرعت بالاتر
میتونی جواب رو تیکهتیکه بگیری:
stream=True
همون حس تایپ شدن جواب مثل چتباتها
این خیلی مهمه 👇
وقتی:
کاربر زیاد داری (high concurrency)
سرعت جواب مهمه (low latency)
میخوای هزینه GPU کمتر شه
میخوای مدل رو خودت host کنی (نه API خارجی)
یکی از ویژگیهای خیلی کاربردی vLLM اینه که میتونه توی محیطهای کاملاً آفلاین (Air-Gapped) اجرا بشه؛ یعنی هیچ نیازی به اینترنت نداره. این موضوع برای سازمانهایی مثل بانکها، مخابرات، صنایع دفاعی یا نهادهای دولتی خیلی مهمه، چون دادهها نباید از شبکه داخلی خارج بشن.
برای راهاندازی vLLM تو این شرایط، معمولاً روی یه سیستم که اینترنت داره، همه پکیجها و وابستگیها دانلود میشن و بعد منتقل میشن به سیستم مقصد. بعدش میتونی بدون هیچ اتصال اینترنتی، vLLM رو کامل نصب و اجرا کنی.
تو این مدل از استقرار، خود مدلها هم بهصورت لوکال (روی دیسک) اجرا میشن و هیچ وابستگیای به سرویسهای بیرونی ندارن. برای همین، این روش یکی از بهترین گزینهها برای محیطهای امن و سازمانیه.
یه نکته مهم هم اینه که برای جلوگیری از هر درخواست ناخواسته به اینترنت (مثلاً به Hugging Face)، میتونی حالت آفلاین رو فعال کنی تا همهچیز فقط از روی فایلهای محلی لود بشه.
بعد از اینکه vLLM رو راه انداختی، میتونی با یه درخواست ساده API (مثلاً با curl) چک کنی که همهچیز درست کار میکنه یا نه. این تست کمک میکنه مطمئن بشی:
API در دسترسه
مدل درست لود شده
inference بدون مشکل اجرا میشه
کل pipeline (حتی برای ورودیهای چندرسانهای) سالمه
vLLM فقط محدود به متن نیست و از مدلهای چندرسانهای (Multimodal) هم پشتیبانی میکنه. یعنی میتونی همزمان متن و تصویر بهش بدی و خروجی متنی بگیری. این قابلیت توی کارهایی مثل تحلیل تصویر، تولید کپشن یا ساخت سیستمهای هوشمند ترکیبی خیلی به درد میخوره.
برای اینکه بهترین performance رو بگیری، vLLM عملاً برای اجرا روی GPUهای NVIDIA ساخته شده. پس خیلی مهمه که نسخه CUDA با درایور کارت گرافیکت سازگار باشه
مثلاً سری 12.x.
این موضوع مستقیم روی سرعت و پایداری سیستم تاثیر میذاره.
یکی از مزیتهای مهم vLLM اینه که خیلی از کارهای پیچیده مثل batching، زمانبندی درخواستها و مدیریت GPU رو خودش انجام میده.در نتیجه، لازم نیست درگیر جزئیات سطح پایین بشی و میتونی بیشتر روی طراحی پرامپت و منطق خروجی تمرکز کنی.
در vLLM میتونی رفتار تولید متن رو با پارامترهایی مثل temperature و top-p کنترل کنی.
temperature مشخص میکنه خروجی چقدر خلاقانه یا تصادفی باشه
(عدد پایین: خروجی دقیقتر، عدد بالا : متنوعتر)
top-p مشخص میکنه مدل از بین چه محدودهای از کلمات انتخاب کنه
(مثلاً 0.9 یعنی فقط محتملترین گزینهها در نظر گرفته میشن)
این تنظیمات بهت کمک میکنن بسته به کاربرد، خروجی رو دقیقتر یا خلاقانهتر کنی.
وقتی با vLLM کار میکنی، در واقع فقط مدل رو لود نمیکنی؛
بلکه یه runtime کامل inference هم داری که شامل:
مدیریت درخواستها
batching خودکار
اجرای بهینه روی GPU
میشه.
برای همین، استفاده ازش خیلی سادهتر از اینه که خودت بخوای این سیستمها رو از صفر پیادهسازی کنی.
vLLM خیلی به درد میخوره وقتی:
مدل بزرگ داری
درخواستها زیاده
میخوای سریع و بهینه سرویس بدی
الانم تبدیل شده به یکی از ابزارهای محبوب برای deploy کردن LLMها در مقیاس بزرگ.