Local AI

بیشینه‌سازی اندازه دسته‌های مدل‌های زبانی بزرگ محلی

استقرار مدل‌های زبانی بزرگ به صورت محلی بر روی کارت‌های گرافیک مصرفی چالش‌های منحصر‌به‌فردی ایجاد می‌کند. در حالی که شتاب‌دهنده‌های سطح بالا برای دیتاسنترها دارای حافظه‌های عظیم هستند، علاقه‌مندان معمولاً با محدودیت ۸ تا ۲۴ گیگابایت حافظه ویدیویی (VRAM) دست‌وپنج نرم می‌کنند. این محدودیت اغلب توسعه‌دهندگان را مجبور می‌کند تا بین سرعت استنتاج قابل قبول و اندازه دسته‌های قابل استفاده انتخاب کنند که اغلب منجر به بهره‌وری غیربهینه می‌شود. با این حال، با مدیریت استراتژیک حافظه و موتورهای استنتاج مدرن، امکان استخراج عملکرد بسیار بیشتر از سخت‌افزار شما بدون قربانی کردن کیفیت مدل وجود دارد.

درک گلوگاه‌های حافظه ویدیویی (VRAM)

قبل از ورود به راه‌حل‌ها، درک محل مصرف حافظه حیاتی است. یک مدل بارگذاری‌شده معمولاً حافظه را برای سه جزء متمایز مصرف می‌کند: وزن‌های مدل، حافظه پنهان کلید-مقدار (KV Cache) برای مکانیسم‌های توجه، و حافظه فعال‌سازی در طول عبورهای رو به جلو. کم‌بیت‌سازی (Quantization) عمدتاً وزن‌ها را هدف قرار می‌دهد، در حالی که تکنیک‌هایی مانند توجه صفحه‌بندی‌شده (Paged Attention) حافظه KV را مدیریت می‌کنند. نادیده گرفتن هر یک از این جنبه‌ها منجر به تکه‌تکه شدن حافظه و خطاهای کمبود حافظه هنگام مقیاس‌دهی به دسته‌های بزرگ‌تر می‌شود.

قدرت کم‌بیت‌سازی (Quantization)

بزرگ‌ترین سود فوری از استفاده از نسخه‌های کم‌بیت‌شده مدل حاصل می‌شود. حرکت از FP16 (نقطه شناور ۱۶ بیتی) به INT4 (عدد صحیح ۴ بیتی) ردپای حافظه وزن‌ها را تقریباً چهار برابر کاهش می‌دهد. این کار نه تنها بارگذاری مدل‌های بزرگ‌تر را امکان‌پذیر می‌کند، بلکه حافظه VRAM قابل توجهی را برای حافظه KV آزاد می‌کند که برای دسته‌بندی حیاتی است. کتابخانه‌های مدرن مانند Hugging Face Transformers و Optimum به راحتی با فرمت‌های AWQ (کم‌بیت‌سازی وزن آگاه از فعال‌سازی) و GGUF یکپارچه می‌شوند که پیاده‌سازی را ساده می‌سازد.
from transformers import AutoModelForCausalLM, AutoTokenizer

model_name = "meta-llama/Llama-2-7b-chat-hf"
tokenizer = AutoTokenizer.from_pretrained(model_name)

# بارگذاری با کم‌بیت‌سازی ۴ بیتی برای صرفه‌جویی در VRAM
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    load_in_4bit=True,
    bnb_4bit_compute_dtype="float16"
)

استفاده از vLLM برای دسته‌بندی پیوسته

در حالی که پایپ‌لاین‌های استاندارد Hugging Face درخواست‌ها را به صورت ترتیبی یا با دسته‌های ثابت پردازش می‌کنند، vLLM دسته‌بندی پیوسته (که به آن PagedAttention نیز گفته می‌شود) را معرفی می‌کند. این تکنیک به صورت پویا حافظه KV را مدیریت کرده و به سیستم اجازه می‌دهد تا چندین درخواست با طول‌های متفاوت را به طور کارآمد در فضای حافظه GPU یکسان فشرده کند. با جداسازی طول دنباله منطقی از تخصیص حافظه فیزیکی، vLLM می‌تواند بهره‌وری را به طور چشمگیری در مقایسه با پیاده‌سازی‌های ساده افزایش دهد.

بهینه‌سازی کد برای بهره‌وری

برای بیشینه‌سازی بهره‌وری، باید پارامترهای استنتاج خود را با دقت تنظیم کنید. غیرفعال کردن محاسبه گرادیان برای استنتاج غیرقابل مذاکره است، زیرا از PyTorch جلوگیری می‌کند تا مقادیر فعال‌سازی میانی مورد نیاز برای انتشار معکوس را ذخیره کند. علاوه بر این، فعال‌سازی هسته‌های تنسوری (Tensor Cores) در کارت‌های گرافیک NVIDIA تضمین می‌کند که ضرب‌های ماتریسی روی واحدهای سخت‌افزاری تخصصی که برای عملیات یادگیری عمیق با بهره‌وری بالا طراحی شده‌اند، اجرا شوند.
import torch

# اطمینان از فعال بودن حالت استنتاج برای غیرفعال‌سازی گرادیان‌ها
model.eval()
with torch.no_grad():
    # تولید خروجی‌ها بدون محاسبه گرادیان‌ها
    outputs = model.generate(
        input_ids,
        max_new_tokens=50,
        do_sample=True,
        temperature=0.7
    )

نتیجه‌گیری

بهینه‌سازی استقرار LLM محلی درباره خرید سخت‌افزار بهتر نیست؛ بلکه درباره احترام به محدودیت‌های سخت‌افزار موجود است. با ترکیب کم‌بیت‌سازی ۴ بیتی برای کاهش ردپای وزن، استفاده از PagedAttention از طریق موتورهایی مانند vLLM، و اطمینان از پیکربندی‌های دقیق حالت استنتاج، می‌توانید بهره‌وری در سطح تولید را بر روی کارت‌های گرافیک مصرفی به دست آورید. این تکنیک‌ها کارت گرافیک مصرفی را از یک اسباب‌بازی سرگرمی به یک دستگاه محاسبات لبه (Edge Computing) قابل اعتماد برای کاربردهای هوش مصنوعی مولد تبدیل می‌کنند.
Share: