با افزایش تقاضا برای اجرای مدلهای زبانی بزرگ (LLM) به صورت محلی، محدودیت حافظه ویدیویی (VRAM) به اصلیترین مانع برای توسعهدهندگان تبدیل شده است. در حالی که پیکربندیهای تک GPU برای مدلهای کوچکتر کافی هستند، مدیریت پنجرههای زمینه بزرگ با مدلهای بیش از 70 میلیارد پارامتر اغلب نیازمند هماهنگی پیچیده چند GPU است. در این پست، ما استراتژیهای پیشرفتهای را برای حداکثر کردن نرخ انتقال داده و حداقل کردن خطاهای کمبود حافظه (OOM) از طریق Offloading هوشمند VRAM بررسی میکنیم.
درک سلسله مراتب Offloading
در هسته اصلی، Offloading حافظه ویدیویی شامل توزیع وزنهای مدل در چندین لایه سختافزاری است: حافظه GPU (VRAM)، حافظه سیستم (RAM) و ذخیرهسازی دیسک. کارایی این توزیع سرعت استنتاج (Inference) را تعیین میکند. یک رویکرد ساده ممکن است کل مدل را تا زمان کرش کردن روی یک GPU بارگذاری کند، یا لایهها را بدون در نظر گرفتن محلی بودن دادهها به طور مساوی تقسیم کند. استراتژیهای پیشرفته از ویژگیهای خاص هر جزء سختافزاری بهره میبرند.
کلید بهینهسازی در نگه داشتن لایههایی است که بیشترین دسترسی را دارند (معمولاً لایههای جاسازی و لایه خروجی نهایی) روی سریعترین دستگاه، در حالی که لایههای میانی با دسترسی کمتر به RAM سیستم یا یک GPU ثانویه با پهنای باند بالا Offload میشوند.
پیادهسازی خاص چارچوب: Ollama و GGUF
برای کاربرانی که از Ollama استفاده میکنند، Offloading از طریق پارامتر num_gpu در Modelfile مدیریت میشود. برای Offload کردن در چندین GPU، میتوانید مقداری بالاتر از تعداد لایههای یک GPU واحد مشخص کنید، به شرطی که لایهها بتوانند بین دستگاههای موجود تقسیم شوند.
# مثال Modelfile برای Offload چند GPU
FROM llama3.1:70b
# اجبار به استفاده از تمام GPUهای موجود
PARAMETER num_gpu 999
# تنظیم دما برای پایداری
PARAMETER temperature 0.7
با این حال، تنظیم ساده num_gpu 999 همیشه بهینه نیست. برای مدلهایی مانند Llama-3-70B، ممکن است بخواهید به صورت دستی تعیین کنید که چند لایه روی GPU 0 و چند لایه روی GPU 1 قرار گیرند تا بار به تعادل برسد. اگر یک GPU حافظه VRAM بیشتری نسبت به دیگری دارد، لایههای بیشتری را به GPU بزرگتر اختصاص دهید.
هوشمندسازی Hugging Face و نقشه دستگاه
هنگام استفاده از کتابخانه Hugging Face Transformers، کتابخانه accelerate ابزارهای قدرتمندی برای مدیریت چند GPU ارائه میدهد. آرگومان device_map="auto" تلاش میکند مدل را به طور بهینه توزیع کند، اما برای کنترل دقیقتر، میتوانید نقشه دستگاه را به صراحت تعریف کنید.
from transformers import AutoModelForCausalLM, AutoTokenizer
from accelerate import dispatch_model, infer_auto_device_map
model_id = "meta-llama/Llama-3-70b"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
model_id,
torch_dtype="auto",
device_map="auto"
)
# بررسی اینکه کدام لایهها روی کدام دستگاه قرار دارند
for name, module in model.named_modules():
if hasattr(module, 'device'):
print(f"{name}: {module.device}")
برای پنجرههای زمینه بزرگ، در نظر بگیرید استفاده از max_memory برای محدود کردن استفاده از حافظه در هر دستگاه، اطمینان حاصل کنید که کش KV (Key-Value) در حین تولید به RAM سیستم سرریز نمیشود، زیرا این امر باعث افزایش قابل توجه تأخیر میگردد.
بهینهسازی برای پنجرههای زمینه بزرگ
پنجرههای زمینه بزرگ (مثلاً 32k یا 128k توکن) به طور چشمگیری ردپای حافظه کش Key-Value (KV) را افزایش میدهند. حتی با Offload کامل وزنهای مدل، کش KV میتواند گیگابایتها از VRAM را مصرف کند. برای کاهش این مشکل، تکنیکهای زیر را پیادهسازی کنید:
- Flash Attention 2: این مکانیسم توجه بهینهشده را فعال کنید تا استفاده از حافظه در حین استنتاج کاهش یابد.
- کوانتیزهسازی کش KV: کش KV را به جای FP32 در INT8 یا FP16 ذخیره کنید تا نیازهای حافظه را به نصف کاهش دهید.
- Paged Attention: از چارچوبهایی استفاده کنید که از PagedAttention پشتیبانی میکنند (مانند vLLM) تا از تکهتکه شدن حافظه مدیریت کرده و استفاده کارآمدتری از کش را امکانپذیر سازند.
نتیجهگیری
بهینهسازی بارهای کاری چند GPU برای پنجرههای زمینه بزرگ کمتر درباره قدرت خام و بیشتر درباره کارایی معماری است. با درک سلسله مراتب Offload و بهرهگیری از ابزارهای خاص چارچوب مانند Modelfile Ollama یا Accelerate Hugging Face، توسعهدهندگان میتوانند مرزهای هوش مصنوعی محلی را جابجا کنند. همیشه استفاده از حافظه خود را با ابزارهایی مانند nvidia-smi پایش کنید و حلقههای استنتاج خود را پروفایلبندی کنید تا گلوگاهها را شناسایی نمایید. آینده هوش مصنوعی محلی چند دستگاهی است و تسلط بر این استراتژیهای Offload برای هر کسی که جدی به استقرار مدلهای بزرگ روی سختافزارهای سطح مصرفکننده میاندیشد، ضروری است.