پرش به محتوا
← همهٔ یادداشت‌ها

vLLM روی GPU ابری: اجرای مدل زبانی با API اختصاصی

·۸ دقیقه مطالعه·تیم جی‌پی‌یو

دو مبدل برق سفید با پین‌ها و سوکت‌های متفاوت، کنار هم روی یک میز چوبی روشن.

اگر می‌خواهید اجرای مدل زبانی را از حالت «چت در مرورگر» دربیاورید و آن را پشت اپلیکیشن خودتان بگذارید، vLLM همان حلقهٔ گمشده است. vLLM مدل باز را یک بار روی کارت گرافیک بالا می‌آورد و جلوی آن یک API سازگار با OpenAI می‌گذارد؛ یعنی هر کد یا کتابخانه‌ای که تا دیروز به سرویس‌های تجاری وصل می‌شد، فقط با عوض کردن آدرس پایه به سرور خودتان وصل می‌شود. کلید خصوصی، داده و لاگ هم دست خودتان می‌ماند.

در این آموزش یک ماشین با کارت ۲۴ گیگابایتی اجاره می‌کنیم، قالب vLLM را بالا می‌آوریم، مدل Qwen2.5 7B را سرو می‌کنیم و از ترمینال و پایتون به آن درخواست می‌فرستیم. کل کار حدود ۲۵ دقیقه طول می‌کشد که بیشترش صرف دانلود مدل می‌شود، و روی یک RTX 3090 چیزی حدود ۲۰ هزار تومان خرج برمی‌دارد.

پیش‌نیازها

  • یک حساب در جی‌پی‌یو. اگر هنوز ندارید، از صفحهٔ ثبت‌نام شروع کنید.
  • یک کلید عمومی SSH ثبت‌شده در بخش حساب کاربری. ورود به ماشین فقط با کلید انجام می‌شود و رمز عبوری وجود ندارد؛ مراحلش در شروع اجاره GPU: اولین ماشین در ۱۰ دقیقه آمده است.
  • موجودی کیف پول. برای شروع باید دست‌کم به اندازهٔ یک ساعت از نرخ همان ماشین موجودی داشته باشید؛ برای این آموزش ۵۰ هزار تومان راحت کافی است.
  • آشنایی مقدماتی با ترمینال. اگر قبلاً با اجرای مدل زبانی با Ollama روی GPU ابری کار کرده‌اید، این مسیر برایتان آشناست.

انتخاب ماشین مناسب برای vLLM

برخلاف ابزارهای سبک‌تر، vLLM بخش بزرگی از VRAM را از پیش برای حافظهٔ میانی (KV cache) رزرو می‌کند تا بتواند چند درخواست را هم‌زمان جواب بدهد. پس قاعدهٔ انتخاب کارت این است: وزن مدل را حساب کنید و بعد دست‌کم چند گیگابایت برای حافظهٔ میانی کنار بگذارید.

  • مدل ۷ تا ۸ میلیارد پارامتری با کوانتیزهٔ چهاربیتی (AWQ): وزن‌ها حدود ۵ تا ۶ گیگابایت جا می‌گیرند. یک کارت ۱۲ گیگابایتی مثل RTX 3060 با طول متن کوتاه از پسش برمی‌آید؛ قیمتش از حدود ۱۶ هزار تومان در ساعت شروع می‌شود (در زمان نوشتن این مطلب).
  • همان مدل با دقت کامل، یا یک مدل ۱۴ میلیاردی کوانتیزه: کارت ۱۶ گیگابایتی مثل RTX A4000 از حدود ۲۶ هزار تومان در ساعت گزینهٔ اقتصادی است (در زمان نوشتن این مطلب).
  • پیشنهاد متعادل این آموزش: RTX 3090 با ۲۴ گیگابایت VRAM، از حدود ۴۰ هزار تومان در ساعت (در زمان نوشتن این مطلب). هم برای مدل ۷ میلیاردی با دقت کامل جا دارد، هم برای مدل ۱۴ یا حتی ۳۲ میلیاردی کوانتیزه.
  • پیشنهاد سریع: RTX 4090 با همان ۲۴ گیگابایت ولی توان پردازشی بیشتر، از حدود ۱۰۵ هزار تومان در ساعت (در زمان نوشتن این مطلب). وقتی می‌خواهید هم‌زمان به ده‌ها درخواست جواب بدهید، تفاوتش را حس می‌کنید.

برای دیدن فهرست کامل و فیلتر کردن بر اساس حافظه و قیمت، سراغ بازار GPU بروید. قیمت ساعتی موقع اجاره قفل می‌شود و بعد از آن نوسان بازار روی هزینهٔ همان ماشین اثری ندارد.

اجاره و راه‌اندازی ماشین

در صفحهٔ بازار کارت مورد نظرتان را انتخاب کنید و موقع اجاره، قالب vLLM را بردارید. ماشین با همان نرم‌افزار بالا می‌آید و لازم نیست چیزی نصب کنید. بعد از چند دقیقه وضعیت ماشین «در حال اجرا» می‌شود.

در صفحهٔ ماشین این‌ها را می‌بینید، همه با یک کلیک قابل کپی: دستور آمادهٔ SSH، لینک مستقیم Jupyter به همراه توکن آن، دستور «تونل امن» برای باز کردن رابط وب از مسیر SSH، و فهرست «پورت‌های منتشرشده». دستور SSH را کپی کنید و در ترمینال خودتان اجرا کنید تا وارد ماشین شوید.

اولین کاری که بعد از ورود انجام می‌دهید، مطمئن شدن از دیده شدن کارت گرافیک است:

nvidia-smi

باید نام کارت، مقدار VRAM و نسخهٔ درایور را ببینید. اگر قالب دیگری مثل PyTorch گرفته‌اید و می‌خواهید vLLM را دستی نصب کنید، مستندات رسمی این مسیر را می‌دهد:

uv venv --python 3.12 --seed
source .venv/bin/activate
uv pip install vllm --torch-backend=auto

اجرای مدل زبانی با vLLM روی ماشین

قبل از هر چیز سرور را داخل یک نشست tmux اجرا کنید، وگرنه با قطع شدن SSH فرایند هم کشته می‌شود:

apt-get update && apt-get install -y tmux
tmux new -s vllm

حالا مدل را سرو کنید. این‌جا از نسخهٔ چهاربیتی Qwen2.5 7B استفاده می‌کنیم که هم سریع دانلود می‌شود و هم جای زیادی نمی‌گیرد:

vllm serve Qwen/Qwen2.5-7B-Instruct-AWQ \
  --max-model-len 8192 \
  --gpu-memory-utilization 0.92 \
  --port 8000

بار اول حدود ۶ گیگابایت از Hugging Face دانلود می‌شود. چون ماشین خارج از ایران است، این دانلود با سرعت گیگابیتی روی خود ماشین انجام می‌شود و معمولاً یکی دو دقیقه بیشتر طول نمی‌کشد؛ به اینترنت شما هیچ ربطی ندارد.

چند نکته دربارهٔ همین دستور:

  • --max-model-len طول متن (ورودی به‌علاوهٔ خروجی) را تعیین می‌کند. اگر مشخصش نکنید، از تنظیمات خود مدل خوانده می‌شود که ممکن است خیلی بزرگ باشد و همهٔ VRAM را برای حافظهٔ میانی ببلعد. اگر به متن بلند نیاز ندارید، همین ۸۱۹۲ را نگه دارید.
  • --gpu-memory-utilization می‌گوید چه کسری از حافظهٔ کارت در اختیار موتور قرار بگیرد. مقدار پیش‌فرضش ۰٫۹ است.
  • اگر می‌خواهید مدل با نام کوتاه‌تری در API شناخته شود، --served-model-name my-model را اضافه کنید.

وقتی سرور آماده شد، در خروجی پیام بالا آمدن روی پورت ۸۰۰۰ را می‌بینید. با Ctrl+b و بعد d از tmux بیرون بیایید؛ سرور در پس‌زمینه زنده می‌ماند.

آزمایش API از داخل ماشین

در یک ترمینال دوم (یا نشست SSH دوم) سلامت سرور و فهرست مدل‌ها را بگیرید:

curl http://localhost:8000/health
curl http://localhost:8000/v1/models

حالا یک درخواست واقعی بفرستید:

curl http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "Qwen/Qwen2.5-7B-Instruct-AWQ",
    "messages": [
      {"role": "system", "content": "You are a helpful assistant."},
      {"role": "user", "content": "در یک جمله بگو چرا آسمان آبی است."}
    ]
  }'

پاسخ دقیقاً همان ساختار آشنای OpenAI را دارد: یک آرایهٔ choices که داخلش message.content جواب مدل است.

وصل شدن از لپ‌تاپ خودتان

سرور روی پورت ۸۰۰۰ ماشین گوش می‌دهد. امن‌ترین راه رسیدن به آن، همان دستور «تونل امن» در صفحهٔ ماشین است که پورت را از مسیر SSH به لپ‌تاپ شما می‌آورد؛ بعد از اجرای آن، localhost:8000 روی دستگاه خودتان همان سرور است. اگر به جایش می‌خواهید مستقیم وصل شوید، فهرست «پورت‌های منتشرشده» در صفحهٔ ماشین را ببینید و سرور را با --host 0.0.0.0 بالا بیاورید.

در هر دو حالت، کد پایتون شما فقط یک خط فرق می‌کند:

from openai import OpenAI

client = OpenAI(api_key="EMPTY", base_url="http://localhost:8000/v1")

resp = client.chat.completions.create(
    model="Qwen/Qwen2.5-7B-Instruct-AWQ",
    messages=[{"role": "user", "content": "یک جملهٔ کوتاه دربارهٔ تهران بنویس."}],
)
print(resp.choices[0].message.content)

اگر پورت را بیرون منتشر می‌کنید، حتماً سرور را با کلید محافظت کنید:

vllm serve Qwen/Qwen2.5-7B-Instruct-AWQ --api-key sk-my-secret-key --max-model-len 8192

بعد از آن همان کلید را به جای EMPTY در api_key بگذارید.

اگر به مشکل خوردید

  • CUDA out of memory هنگام بالا آمدن: یا --max-model-len را کم کنید (مثلاً ۴۰۹۶)، یا --gpu-memory-utilization را پایین بیاورید، یا سراغ نسخهٔ کوانتیزهٔ همان مدل بروید. اگر باز هم جا نشد، کارت بزرگ‌تری اجاره کنید.
  • سرور با قطع شدن SSH می‌میرد: یعنی داخل tmux اجرایش نکرده‌اید. با tmux attach -t vllm به نشست قبلی برگردید یا از نو داخل tmux اجرا کنید.
  • پاسخ ۴۰۱ یا Unauthorized: سرور را با --api-key بالا آورده‌اید ولی درخواست کلید ندارد. هدر Authorization: Bearer <کلید> را اضافه کنید.
  • از لپ‌تاپ به پورت ۸۰۰۰ نمی‌رسید: تا وقتی تونل امن برقرار نیست، پورت فقط داخل ماشین در دسترس است. اول دستور تونل را از صفحهٔ ماشین اجرا کنید.
  • دانلود مدل نیمه‌کاره ماند: دستور vllm serve را دوباره اجرا کنید؛ دانلود از همان‌جا ادامه پیدا می‌کند و فایل‌های کامل‌شده دوباره گرفته نمی‌شوند.

هزینه و صرفه‌جویی

یک دور کامل این آموزش — اجاره، دانلود مدل، بالا آمدن سرور و چند درخواست آزمایشی — روی RTX 3090 حدود نیم ساعت وقت می‌گیرد، یعنی چیزی نزدیک ۲۰ هزار تومان. هزینه دقیقه‌ای از کیف پول کم می‌شود و ماشین متوقف‌شده هزینه‌ای ندارد.

سه عادت که پول نگه می‌دارد: اول، تا وقتی دارید روی کد سمت کلاینت کار می‌کنید و مدل بی‌کار است، ماشین را متوقف کنید. دوم، --max-model-len را بی‌دلیل بزرگ نگذارید؛ حافظهٔ میانی گران‌ترین بخش ماجراست. سوم، قبل از حذف ماشین خروجی‌ها و فایل‌های پیکربندی‌تان را دانلود کنید، چون دیسک ماشین با حذف آن پاک می‌شود و فضای ذخیره‌سازی دائمی وجود ندارد.

قدم بعدی

حالا که یک API سازگار با OpenAI در اختیار دارید، می‌توانید هر کلاینتی را به آن وصل کنید. اگر رابط چت آماده می‌خواهید، قالب Open Webui را امتحان کنید؛ و اگر هنوز مطمئن نیستید چه کارتی برای چه اندازه مدلی لازم است، انتخاب کارت گرافیک هوش مصنوعی: راهنمای VRAM هر کار را بخوانید.

پرسش‌های متداول

فرق vLLM با Ollama چیست؟

Ollama برای راه‌اندازی سریع و استفادهٔ شخصی ساخته شده و با یک دستور مدل را بالا می‌آورد. vLLM روی توان عبوری تمرکز دارد: چند درخواست را هم‌زمان دسته‌بندی می‌کند و حافظهٔ میانی را بهینه مدیریت می‌کند. برای چت شخصی Ollama کافی است؛ برای اپلیکیشنی که چند کاربر هم‌زمان دارد، vLLM.

آیا برای اجرای vLLM به کارت گرافیک نیاز است؟

بله. vLLM برای اجرا روی GPU ساخته شده و بدون کارت گرافیک عملاً استفاده‌ای ندارد. اگر کارت ندارید، ساده‌ترین راه اجارهٔ ساعتی یک ماشین از بازار GPU است.

چقدر VRAM برای اجرای مدل زبانی با vLLM لازم است؟

به اندازهٔ مدل و نوع کوانتیزه‌سازی بستگی دارد. یک مدل ۷ میلیاردی چهاربیتی با ۱۲ گیگابایت راه می‌افتد، همان مدل با دقت کامل ۲۴ گیگابایت می‌خواهد، و مدل‌های ۳۲ میلیاردی کوانتیزه هم روی ۲۴ گیگابایت جا می‌شوند. همیشه چند گیگابایت برای حافظهٔ میانی کنار بگذارید.

آیا می‌توانم کد فعلی‌ام را بدون تغییر به vLLM وصل کنم؟

اگر کدتان با کتابخانهٔ رسمی OpenAI نوشته شده، معمولاً فقط کافی است base_url را به آدرس سرور خودتان و api_key را به کلید دلخواهتان تغییر بدهید. نام مدل را هم باید به همان نامی که به vllm serve داده‌اید عوض کنید.

بعد از خاموش کردن ماشین، مدل دانلودشده می‌ماند؟

تا وقتی ماشین را فقط متوقف کرده‌اید، دیسک و مدل دانلودشده سر جایشان هستند. ولی با حذف ماشین، دیسک کامل پاک می‌شود و دفعهٔ بعد مدل دوباره دانلود می‌شود.

تصویر کاور: «Two AC Converter Adapters» اثر Fructibus، از ویکی‌مدیا کامنز، لایسنس CC0.