چقدر حافظه GPU نیاز داریم؟
هنگامی که با دنیای وسیع مدلهای یادگیری ماشین، بهویژه مدلهای زبانی بزرگ (LLM) مانند LLaMA، سروکار دارید، یکی از پرسشهای اساسی که همواره مطرح میشود این است: چه مقدار حافظه گرافیکی (VRAM) برای کار من لازم است؟ درک دقیق این نیاز، نه تنها به شما در انتخاب سختافزار مناسب کمک میکند، بلکه در بهینهسازی مدل، انتخاب معماری صحیح و حتی طراحی کد، نقشی حیاتی ایفا میکند.
این راهنما، با بیانی ساده به شما کمک میکند تا عوامل مؤثر بر مصرف VRAM را بشناسید، روشهای تخمین آن را بیاموزید و با یک مثال کاربردی از مدل LLaMA در فریمورک Transformers، دیدی عملی پیدا کنید.
عوامل مؤثر بر مصرف VRAM
مصرف حافظه VRAM تحت تأثیر چندین عامل کلیدی قرار دارد:
۱. اندازه مدل (Model Size)
هر پارامتر در یک مدل یادگیری ماشین نیازمند فضایی در حافظه است. به همین دلیل، مدلهایی با تعداد پارامترهای بیشتر، به VRAM بیشتری نیاز دارند. جدول زیر تفاوت در حجم حافظه مورد نیاز برای مدلهای مختلف را با دقت float32
نشان میدهد:
اسم مدل | تعداد پارامتر | حجم توی float32 |
---|---|---|
BERT-base | 110M | حدود 440 مگابایت |
GPT-2 | 1.5B | حدود 6 گیگابایت |
LLaMA 2–7B | 7B | حدود 28 گیگابایت |
توجه داشته باشید: استفاده از دقتهای پایینتر مانند float16
یا int8
میتواند حجم مدل را به شکل قابل توجهی کاهش دهد.
۲. مرحله کار: آموزش (Training) در مقابل استنتاج (Inference)
نیاز به حافظه VRAM بسته به اینکه مدل در مرحله آموزش است یا استنتاج، به شدت متفاوت است.
استنتاج (Inference): در مرحله استنتاج، عمدتاً تنها وزنهای مدل و حافظه موقت برای محاسبات نیاز است که به مراتب سبکتر است.
آموزش (Training): در این مرحله، علاوه بر وزنهای مدل، حافظه برای ذخیره گرادیانها، فعالسازیها (activations) و وضعیت بهینهساز (optimizer states) نیز مورد نیاز است. این فرآیند به مراتب VRAM بیشتری مصرف میکند.
یک قانون کلی:
- آموزش: حدوداً ۳ تا ۴ برابر اندازه مدل در دقت کامل (float32). در برخی موارد، بسته به بهینهساز و پیچیدگی مدل، این مقدار میتواند تا ۸ برابر نیز افزایش یابد.
- استنتاج: حدوداً ۱.۲ تا ۱.۵ برابر اندازه مدل به علاوه حافظه مورد نیاز برای کشکردن Attention (KV Cache).
۳. اندازه دسته (Batch Size) و طول ورودیها (Sequence Length)
Sequence Length: در مدلهای مبتنی بر ترنسفورمر، مانند LLaMA، مصرف حافظه بر اساس مربع طول توالی ورودی (textsequencelength^2) رشد میکند. این بدان معناست که اگر طول ورودی دو برابر شود، حافظه مورد نیاز میتواند تا چهار برابر افزایش یابد. این رشد تصاعدی، مدیریت sequence length
را در مدلهای ترنسفورمر حیاتی میسازد.
Batch Size: افزایش batch size
به معنای پردازش تعداد نمونههای بیشتر به صورت موازی است که مستقیماً به افزایش مصرف VRAM منجر میشود.
4. نوع دقت عددی (Precision)
انتخاب دقت عددی برای نمایش وزنها و محاسبات، تأثیر بسیار زیادی بر مصرف VRAM دارد:
فرمت | مصرف حافظه | توضیح |
---|---|---|
float32 | 4 بایت (32 bit) | دقت بسیار بالا، اما مصرف حافظه و قدرت پردازش بالایی دارد. |
float16 | 2 بایت (16 bit) | مناسب برای اکثر کارتهای گرافیک مدرن، افت دقت ناچیز در بسیاری از موارد. |
int8 | 1 بایت (8 bit) | با تکنیک کوانتایز کردن (Quantization) مدل استفاده میشود. |
4-bit | 0.5 بایت (4 bit) | بسیار سبک، اما ممکن است افت دقت کمی را به همراه داشته باشد. |
یک مثال واقعی از محاسبه حافظه مورد نیاز برای استنتاج
فرض کنید قصد دارید مدل LLaMA 7B را برای استنتاج (نه آموزش) با مشخصات زیر اجرا کنید:
- دقت:
float16
- Batch Size: ۱
- طول توالی (Sequence Length): ۲۰۴۸
بیایید مراحل محاسبه را گام به گام بررسی کنیم:
۱. وزنهای مدل:
مدل LLaMA 7B دارای ۷ میلیارد پارامتر است. با استفاده از دقت float16
، هر پارامتر ۲ بایت (۱۶ بیت) فضا اشغال میکند:
2 (byte) * 7 * 10**9 (parameter) / 1024**3 = 14GB
۲. حافظه KV Cache (Key-Value Cache):
در مدلهای ترنسفورمر، برای هر توکن تولید شده، جفتهای Key و Value در حافظه کش میشوند تا از محاسبات تکراری Attention جلوگیری شود. این کش به نام KV Cache شناخته میشود. فرمول تقریبی برای محاسبه آن به صورت زیر است:
batch × num_heads × seq_len × head_dim × 2 × bytes
برای LLaMA 7B (بر اساس معماری ترنسفورمر با ۳۲ هِد و ابعاد هِد ۱۲۸):
1 × 32 × 2048 × 128 × 2 × 2 = حدود 33.5 مگابایت
۳. سربار (Overhead) و حافظه موقت:
مقدار مشخصی حافظه نیز برای بارگذاری embeddingها، فعالسازیهای موقت و سایر فرآیندهای داخلی مدل نیاز است. معمولاً ۱ گیگابایت برای این بخش تخمین زده میشود.
مجموع نهایی:
وزن مدل: 14 GB
KV Cache: 0.03 GB
سربار: 1 GB
→ مجموع حدوداً 15 GB
با این محاسبات، میتوانید مدل LLaMA 7B را با دقت float16
و طول توالی ۲۰۴۸ بر روی یک کارت گرافیک ۱۶ گیگابایتی بدون مشکل اجرا کنید.
چگونه مدل LLaMA را با Transformers در حالت کمحافظه بارگذاری کنیم؟
اگر کارت گرافیک شما حافظه VRAM محدودی دارد، میتوانید از تکنیکهای کوانتایزیشن (Quantization) استفاده کنید. کتابخانههایی مانند bitsandbytes
این امکان را فراهم میکنند که مدل را به صورت 4-bit
یا 8-bit
بارگذاری کنید که به شدت مصرف حافظه را کاهش میدهد.
نصب کتابخانههای مورد نیاز:
pip install transformers accelerate bitsandbytes
کد برای بارگذاری مدل کوانتایز شده:
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
model_id = "meta-llama/Llama-2-7b-hf"
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_use_double_quant=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype="float16",
)
model = AutoModelForCausalLM.from_pretrained(
model_id,
quantization_config=bnb_config,
device_map="auto",
trust_remote_code=True
)
tokenizer = AutoTokenizer.from_pretrained(model_id)
prompt = "Explain entropy in information theory."
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
with torch.no_grad():
outputs = model.generate(**inputs, max_new_tokens=100)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
جمعبندی و توصیههای نهایی
استفاده از Offloading: در صورت نیاز، میتوانید بخشی از مدل را روی CPU بارگذاری کنید و از GPU فقط برای لایههای حیاتیتر استفاده کنید. این تکنیک با device_map="auto"
در کتابخانه accelerate
(که در کد بالا استفاده شده) به صورت خودکار مدیریت میشود.
آموزش مدل: اگر قصد آموزش یک مدل را دارید، نیاز به VRAM به مراتب بیشتر خواهد بود. در مدلهای بزرگ، این نیاز میتواند به ۸۰ گیگابایت یا حتی بیشتر نیز برسد.
استنتاج مدل: برای استنتاج، با بهینهسازیهایی مانند کوانتایزیشن (quantization)، میتوانید مدلهای بزرگ را روی کارتهای گرافیک با حافظه ۸ تا ۱۶ گیگابایت نیز اجرا کنید.
کاهش دقت عددی (Precision): همواره تلاش کنید از دقتهای پایینتر (float16
یا 4-bit
) استفاده کنید، مگر اینکه دقت float32
برای کاربرد شما ضروری باشد.
مدیریت Batch Size: batch size
را تا حد امکان پایین نگه دارید تا مصرف VRAM کنترل شود.
امیدواریم این توضیحات جامع، به شما در درک عمیقتر و مدیریت بهتر حافظه GPU برای پروژههای یادگیری ماشین کمک کند. همچنین در صورتی که علاقه داشتین میتونین این پست درباره تفاوتهای CPU و GPU رو بخونین.