با بالغتر شدن اکوسیستم مدلهای زبانی بزرگ (LLM)، گلوگاه از آموزش مدل به استقرار استنتاج تغییر کرده است. برای توسعهدهندگان و دانشمندان دادهای که به دنبال اجرای مدلها به صورت محلی روی کارتهای گرافیک مصرفی یا سختافزارهای سازمانی هستند، چارچوبهای سرویسدهی سنتی اغلب با ناکارآمدی حافظه و نرخ انتقال پایین دستوپنج نرم میکنند. در اینجا vLLM وارد میشود؛ یک کتابخانه متنباز که به طور خاص برای ارائه سرویسدهی LLM با نرخ انتقال بالا و کارایی حافظه مهندسی شده است.
این پست به بررسی معماری پشت vLLM، دلایل عملکرد بهتر آن نسبت به راهحلهای موجود مانند Transformers هابینگفیس یا Hugging Face Text Generation Inference (TGI) و نحوه یکپارچهسازی آن در گردش کار هوش مصنوعی محلی شما میپردازد.
چرا vLLM؟ معماری کارایی
vLLM تنها یک پوشش (wrapper) نیست؛ بلکه بازنویسی منطق اصلی سرویسدهی با چندین نوآوری کلیدی است که الگوهای دسترسی به حافظه خاص مدلهای زبانی خودتکرارشونده (autoregressive) را هدف قرار میدهند. سه ستون اصلی عملکرد آن عبارتند از:
- PagedAttention: برخلاف مدیریت استاندارد KV-cache، PagedAttention حافظه کش KV را به عنوان مجموعهای از صفحات حافظه در نظر میگیرد. این امر اجازه تخصیص پویای حافظه را میدهد، سربار پیشتخصیص بافرهای با اندازه ثابت را حذف میکند و امکان استفاده از ۲۴ برابر بیشتر از حافظه GPU را فراهم میسازد.
- Batching پیوسته (Continuous Batching): دستهبندی سنتی منتظر میماند تا طولانیترین دنباله در دسته تکمیل شود تا تکرار بعدی آغاز گردد. vLLM از دستهبندی پیوسته استفاده میکند که در هر گام، دنبالههای تکمیلشده را حذف کرده و دنبالههای جدیدی را اضافه میکند تا اشغالپذیری GPU به حداکثر برسد.
- هستههای CUDA بهینهشده: هستههای زیربنایی برای ساختارهای دادهای خاصی که در استنتاج LLM استفاده میشوند، تنظیم دقیق شدهاند که منجر به کاهش تأخیر میگردد.
نصب و راهاندازی
شروع کار با vLLM ساده است، به شرطی که یک GPU سازگار از نوع NVIDIA و درایورهای مناسب داشته باشید. این کتابخانه از طریق pip در دسترس است و نیاز به نصب CUDA دارد.
# نصب آخرین نسخه vLLM
pip install vllm
# بررسی نصب
python -c "import vllm; print(vllm.__version__)"
اطمینان حاصل کنید که سیستم شما دارای درایور NVIDIA و مجموعه ابزار CUDA مناسب نصب شده است. میتوانید در دسترس بودن GPU را با استفاده از قطعه کد زیر بررسی کنید:
import torch
print(torch.cuda.is_available()) # باید True را برگرداند
پیادهسازی عملی: سرویسدهی Llama-3 به صورت محلی
بیایید یک مثال عملی از سرویسدهی مدل Llama-3 متا را مرور کنیم. ما از رابط سرور داخلی vLLM برای ایجاد یک نقطه پایانی REST API استفاده خواهیم کرد که فرمت API اوپنایآی را تقلید میکند؛ این امر سازگاری با کلاینتهای موجود را تضمین میکند.
from vllm import LLM, SamplingParams
# راهاندازی مدل. 'meta-llama/Llama-3-8b-Instruct' یک مدل نماینده است.
# اگر چندین GPU دارید، 'tensor_parallel_size' را تنظیم کنید.
llm = LLM(model="meta-llama/Llama-3-8b-Instruct")
# تعریف پارامترهای نمونهبرداری
sampling_params = SamplingParams(
temperature=0.7,
top_p=0.9,
max_tokens=512
)
# نمونه درخواست (Prompt)
prompt = "Explain quantum computing in simple terms:"
# تولید خروجی
outputs = llm.generate([prompt], sampling_params)
# چاپ نتایج
for output in outputs:
generated_text = output.outputs[0].text
print(generated_text)
برای سناریوهای شبیه به تولید که به یک سرور پایدار نیاز دارید، میتوانید سرور vLLM را مستقیماً از خط فرمان راهاندازی کنید:
vllm serve meta-llama/Llama-3-8b-Instruct --host 127.0.0.1 --port 8000
پس از اجرا، میتوانید با استفاده از کلاینتهای HTTP استاندارد، آن را پرسوجو کنید:
curl http://localhost:8000/v1/completions \
-H "Content-Type: application/json" \
-d '{
"model": "meta-llama/Llama-3-8b-Instruct",
"prompt": "What is the capital of France?",
"max_tokens": 7,
"temperature": 0
}'
بهترین شیوهها برای استقرار محلی
- کوانتیزهسازی (Quantization): اگر محدودیت حافظه دارید، استفاده از پشتیبانی vLLM از AWQ (کوانتیزهسازی وزن آگاهانه از فعالسازی) یا GPTQ را در نظر بگیرید. این امر به شما امکان میدهد مدلهای کوانتیزه شده ۴ بیتی را با حداقل افت کیفیت اجرا کنید.
- توازی tensor: برای مدلهای بزرگتر از ۷۰ میلیارد پارامتر، از توازی tensor برای تقسیم مدل بین چندین GPU استفاده کنید. مقدار
tensor_parallel_sizeرا در پیکربندی خود برابر با تعداد GPUهای موجود تنظیم کنید. - پایش: استفاده از ابزارهایی مانند
nvidia-smiیاnvtopرا برای نظارت بر مصرف حافظه GPU در نظر بگیرید. اگرچه PagedAttention vLLM با تکهتکه شدن حافظه (fragmentation) به خوبی برخورد میکند، اما پایش به تنظیم اندازه دستهها کمک میکند.
نتیجهگیری
vLLم نمایانگر یک جهش بزرگ در دسترسیپذیری مدلهای قدرتمند LLM برای استقرار محلی است. با حل مسائل بنیادین تکهتکه شدن حافظه و دستهبندی ناکارآمد، این کتابخانه به توسعهدهندگان اجازه میدهد مدلهای بزرگ را روی سختافزاری که قبلاً ناکافی در نظر گرفته میشد، اجرا کنند. چه در حال ساخت یک پایپلاین RAG محلی، یک دستیار کدنویسی مبتنی بر هوش مصنوعی یا یک چتبات خصوصی باشید، vLLM پایه عملکردی لازم برای قابلیت اطمینان در سطح تولید را فراهم میکند. با ادامه تکامل حوزه هوش مصنوعی محلی، vLLM در موقعیتی قرار دارد که به ابزاری حیاتی در مجموعه ابزارهای توسعهدهنده باقی بماند.