مواجهه با ارور CUDA out of memory درست وسط آموزش یک مدل هوش مصنوعی یا رندرگیری سنگین، یکی از کلافهکنندهترین تجربههای هر متخصصی است. برای آزادسازی حافظه GPU و رفع خطای پر شدن VRAM، سریعترین راه بستن پردازشهای درگیر (Process) ازطریق Task Manager در ویندوز یا دستور nvidia-smi در لینوکس است. اگر با کدنویسی پایتون سروکار دارید، استفاده از متد torch.cuda.empty_cache() در پایتورچ و فعالسازی Memory Growth در تنسورفلو میتواند در این مدیریت این فضا به شما کمک کند.
در این مقاله، بهجای تکرار راهحلهای موقت، مدیریت اصولی حافظه کارت گرافیک را بررسی میکنیم. مانند پیدا کردن پروسههای پنهان اشغالکننده VRAM تا رفع نشتی حافظه (Memory Leak) در پروژههای دیپلرنینگ؛ در ادامه این راهنمای ابر فردوسی، تمام ترفندهای کاربردی برای جلوگیری از پر شدن حافظه گرافیک را خواهید خواند.
فهرست مطالب
حافظه GPU چیست و چرا اهمیت دارد؟
وقتی درحال اجرای یک شبکه عصبی یا پردازشهای سنگین گرافیکی هستید، حافظه ویدئویی (VRAM) بهعنوان فضای کاری موقت کارت گرافیک شما عمل میکند. تمامی دیتاستها، وزنهای مدل و محاسبات لایههای میانی (Gradients) در این فضا ذخیره میشوند. اگر این فضا بهینهسازی نشود، خیلی زود با ارورهای کلافهکننده مواجه میشوید و نیاز به آزادسازی حافظه GPU پیدا میکنید.
البته، گاهی اوقات هرچقدر هم که بهینهسازی کنید، سختافزار فعلی جوابگوی ابعاد پروژه نیست؛ در چنین شرایطی، استفاده از سرور گرافیک ابری یا Cloud GPU بهترین راهکار برای جلوگیری از پُر شدن حافظه کارت گرافیک در پروژههای مقیاسبزرگ است. اما اگر یک توسعهدهنده هوش مصنوعی هستید، ماجرا کمی پیچیدهتر میشود. در فریمورکهای تخصصی رفتار کارت گرافیک کمی متفاوت است. مثل رفتار مدیر حافظه در پایتورچ.
تفاوت حافظه Allocated و Reserved در پایتورچ
بهگفتهی CUDA Semantics، مدیر حافظه برای جلوگیری از کند شدن سیستم، بخشی از VRAM را پیشاپیش رزرو میکند:
- حافظه تخصیصیافته (Allocated): مقدار VRAMای که در همان لحظه دقیقاً توسط تنسورها (Tensors) و متغیرهای شما اشغال شده است.
- حافظه رزرو شده (Reserved): فضایی که پایتورچ در اختیار گرفته اما خالی است و برای محاسبات بعدی در دسترس قرار دارد.
بنابراین وقتی ارور CUDA out of memory میگیرید، معمولاً به این معناست که حافظه Reserved پُر شده و سیستم نمیتواند فضای جدیدی تخصیص دهد.
مهمترین دلایل پُر شدن VRAM
چرا با GPU memory full مواجه میشویم؟ معمولاً پای یکی از دلایل زیر در میان است:
- بچسایز (Batch Size) بزرگ: ارسال حجم عظیمی از دادهها در هر مرحله از آموزش به گرافیک.
- تنسورهای رهاشده: نگه داشتن متغیرهای اضافی در حافظه (همان مشکل memory leak در GPU).
- پردازشهای پسزمینه: برنامههای دیگری که بدون اطلاع شما در حال مصرف VRAM هستند.
سریعترین روشهای خالی کردن VRAM

وقتی سیستم هنگ میکند و به بنبست میخورید، قبلاز تغییر کدهای پیچیده باید نفس کارت گرافیک را باز کنید! در این مواقع مدیریت حافظه کارت گرافیک به چند اقدام سریع اورژانسی برای خالی کردن VRAM در ویندوز و لینوکس خلاصه میشود. این روشها به شما کمک میکنند تا بدون ریاستارت کردن کل سیستم، پروسههای مزاحم را متوقف کرده و فضای اشغال شده را پس بگیرید.
بستن Processهای اضافی (توقف اجباری)
گاهی اوقات پروسههای پنهان یا مدلهایی که اجرایشان متوقف شده (اما حافظه را رها نکردهاند)، دلیل اصلی مشکل هستند.
- در ویندوز: Task Manager را باز کنید، به تب Performance بروید و برنامههای پرمصرف GPU را End Task کنید.
- در لینوکس: با دستور
fuser -v /dev/nvidia*میتوانید شناسه (PID) برنامههای درگیر را پیدا کنید و با kill -9 PID آنها را متوقف کنید تا شاهد کاهش مصرف VRAM باشید.
مانیتورینگ دقیق با nvidia-smi
برای مدیریت منابع GPU و اینکه دقیقاً بدانید چه اتفاقی درحال رخ دادن است، ابزار nvidia-smi خیلی کاربردی است. با بازکردن ترمینال (یا CMD) و اجرای این دستور، جدولی از وضعیت لحظهای کارت گرافیک میبینید.
اگر میخواهید این وضعیت بهصورت زنده بهروز شود، از دستور watch -n 1 nvidia-smi (در لینوکس) استفاده کنید. این کار به شما نشان میدهد کدام پروسه درحال ایجاد خطای out of memory GPU است تا سریعاً آن را حذف کنید.
ریست کردن درایور کارت گرافیک (ترفند ویندوز)
اگر در ویندوز هستید و فریزشدن سیستم اجازه هیچ کاری را به شما نمیدهد، نیازی به ریاستارت سختافزاری نیست. کلیدهای ترکیبی Win + Ctrl + Shift + B را همزمان فشار دهید. صفحه مانیتور شما یک لحظه سیاه میشود و صدای بیپ میشنوید. این کار درایور گرافیک را ریست میکند و باعث خالی کردن حافظه GPU از باگهای لحظهای میشود.
رفع خطای CUDA out of memory در PyTorch
وقتی صحبت از دیپلرنینگ میشود میبینیم که پایتورچ (PyTorch) بهشدت تشنه VRAM است. اگر درحال آموزش یک مدل سنگین هستید، دیر یا زود با پیام وحشتناک RuntimeError: CUDA out of memory روبهرو میشوید. بر اساس دستورالعملهای رسمی مدیریت حافظه پایتورچ، این ارور یعنی کارت گرافیک شما دیگر فضای خالی برای پردازش تنسورهای جدید ندارد.
برای رفع ارور CUDA out of memory و کاهش مصرف VRAM در PyTorch، همیشه نیازی به ارتقای سختافزار نیست؛ گاهی چند تغییر ساده نیز معجزه میکند. در ادامه ۴ روش کاملاً کاربردی را بررسی میکنیم.
۱. پاک کردن Cache (آزادسازی حافظه رزرو شده)
سادهترین کار برای پاک کردن cache در PyTorch، استفاده از دستور torch.cuda.empty_cache() است.
- این دستور چه کار میکند؟ فضاهای خالیِ رزرو شده (Reserved Memory) که درحال حاضر توسط هیچ تنسوری استفاده نمیشوند را آزاد میکند تا سایر برنامهها بتوانند از GPU استفاده کنند.
- چه کار نمیکند؟
این دستور تنسورهایی که در برنامهتان درحال استفاده هستند را پاک نمیکند! پس اگر مدل شما ذاتاً از حجم گرافیکتان بزرگتر است، این ترفند به تنهایی شما را نجات نمیدهد.
۲. کاهش Batch Size
یکی از اصلیترین دلایل پُر شدن حافظه، ارسال حجم زیادی از دادهها بهصورت همزمان به GPU است. کاهش batch size سریعترین راه برای پایین آوردن مصرف حافظه است.
اگر مدل شما با بچسایز ۶۴ ارور میدهد، آن را به ۳۲ یا حتی ۱۶ کاهش دهید. این کار باعث میشود متغیرهای کمتری در هر دور از آموزش (Iteration) در حافظه بارگذاری شوند. البته به یاد داشته باشید که کاهش شدید بچسایز ممکن است زمان آموزش مدل را طولانیتر کند.
۳. استفاده از Gradient Accumulation (جمعآوری گرادیانها)
اگر کاهش batch size باعث افت دقت مدل شما میشود، ترفند استفاده از gradient accumulation راهگشاست. در این روش ما بچسایز را کوچک میکنیم (تا در VRAM جا بشود)، اما بهجای اینکه بعداز هر قدم وزنهای مدل را آپدیت کنیم، گرادیانها را در چند قدم جمع میزنیم و سپس آپدیت را انجام میدهیم.
مقایسه حالت عادی و Gradient Accumulation:
| ویژگی | حالت عادی (Batch Size = 64) | Gradient Accumulation (Batch = 16، Steps = 4) |
|---|---|---|
| مصرف حافظه (VRAM) | بسیار بالا (احتمال خطای OOM) | پایین و بهینه |
| دقت آموزش مدل | استاندارد | برابر با حالت عادی |
| فشار بر کارت گرافیک | لحظهای و سنگین | تقسیمشده و سبک |
۴. استفاده از Mixed Precision (دقت ترکیبی)
بهطور پیشفرض، پایتورچ محاسبات را با دقت ۳۲ بیتی (Float32) انجام میدهد. با استفاده از mixed precision (ازطریق ماژول torch.amp)، سیستم شما بخش زیادی از محاسبات را با دقت ۱۶ بیتی (Float16) انجام میدهد. این کار به تنهایی میتواند مصرف VRAM را تا نزدیک به ۵۰٪ کاهش دهد و سرعت آموزش را هم بالا ببرد، بدون اینکه افت ملموسی در کیفیت یادگیری مدل هوش مصنوعی شما ایجاد شود.
نکته مهم: اگر با تمام این بهینهسازیها باز هم مدل شما روی سیستم لوکال اجرا نمیشود، وقت آن است که بهجای درگیری با کدهای پیچیده، با اجاره یک سرور از انواع سرورهای Cloud GPU در ابر فردوسی، توان پردازشی خود را متناسب با ابعاد پروژهتان ارتقا دهید.
آزادسازی حافظه GPU در TensorFlow
اگر با تنسورفلو کار کرده باشید، احتمالاً میدانید که این فریمورک ذاتاً برای مصرف حافظه بسیار حریص است! بنابه دستورالعمل رسمی TensorFlow GPU Guide، تنسورفلو درحالت پیشفرض تمام VRAM در دسترس کارت گرافیک را همان ابتدای کار اشغال (Map) میکند. دلیل این کار جلوگیری از پراکندگی حافظه است، اما همین ویژگی باعث میشود نتوانید دو مدل را همزمان اجرا کنید یا در کنار آموزش مدل، کار دیگری با سیستم انجام دهید.
برای آزادسازی حافظه GPU در TensorFlow و مدیریت حافظه GPU در deep learning، باید این رفتار پیشفرض را کنترل کنیم.
۱. فعال کردن Memory Growth (رشد پویای حافظه)
بهترین راهکار برای اینکه تنسورفلو تمام حافظه را نبلعد، روشن کردن قابلیت Memory Growth است. با این کار، تنسورفلو در ابتدا فقط مقدار کمی از VRAM را درگیر میکند و تنها زمانی که محاسبات سنگینتر شوند، بهصورت تدریجی فضای بیشتری را بهخود اختصاص میدهد.
مزایای فعالسازی این قابلیت:
- جلوگیری از انحصار منابع: اجازه میدهد برنامههای دیگر یا اسکریپتهای پایتونِ موازی هم از کارت گرافیک سهمی داشته باشند.
- کاهش خطاهای ناگهانی: از بروز ارورهای مربوط به مشکل VRAM در AI هنگام شروع پردازش جلوگیری میکند.
برای اجرای این حالت، کافیست از دستور tf.config.experimental.set_memory_growth(gpu, True) در کدهای راهاندازی (Initialization) خود استفاده کنید.
۲. حل مشکل Memory Leak با پاک کردن Session
یکی از کلافهکنندهترین مشکلات در نوتبوکها (مثل Jupyter یا Colab)، حل مشکل memory leak در GPU است. وقتی شما یک مدل را چندین بار با پارامترهای مختلف اجرا میکنید (مثلاً در فرایند Hyperparameter Tuning)، تنسورفلو گرافهای محاسباتی قبلی را در پسزمینه نگه میدارد. نتیجه؟ گرافیک شما بدون اینکه کار خاصی انجام دهد، پُر از دادههای سوخته میشود!
برای رفع این مشکل و دور ریختن اطلاعات بلااستفاده، باید بعداز اتمام هر حلقه یا آموزش مدل، از دستور زیر استفاده کنید:
tf.keras.backend.clear_session()
این دستور با نابودسازی تمام حالتهای پنهان (State) و مدلهای قبلی، باعث نفسگیری VRAM میشود.
خالی کردن VRAM در ویندوز و لینوکس
وقتی درحین پردازشهای سنگین با توقف ناگهانی عملیات مواجه میشویم، اولین سؤال این است که اصلاً چگونه حافظه GPU را آزاد کنیم؟ پاسخ به این سؤال و نحوه مدیریت منابع GPU ارتباط مستقیمی با سیستمعامل شما دارد. گاهی اصلیترین دلیل پر شدن GPU، برنامههایی هستند که در پسزمینه رها شدهاند و بخشی از VRAM را بلوکه کردهاند.
طبق راهنمای رسمی درایورهای انویدیا برای اوبونتو و ویندوز، مدیریت صحیح درایورها و پردازشها نقش کلیدی در آزادسازی حافظه GPU و افزایش کارایی کارت گرافیک دارد. در ادامه، دستورات واقعی (CLI + کد) را برای هر دو سیستمعامل بررسی میکنیم تا بتوانید با پاکسازی محیط، مسیر را برای اجرای مدل سنگین با GPU هموار کنید.
محیط ویندوز
در ویندوز، برای بستن processهای اضافی GPU میتوانید از محیط گرافیکی Task Manager (تب Details) استفاده کنید؛ اما وقتی با فریزشدن سیستم مواجه هستید، استفاده از خط فرمان و روشهای سریع (Quick Fix) بسیار کارآمدتر است. برای رفع خطای out of memory GPU در محیط ویندوز، باید شماره شناسایی پردازش (PID) را پیدا و آن را متوقف کنید:
- قدم اول: خط فرمان (CMD) یا PowerShell را با دسترسی Administrator باز کنید.
- قدم دوم: با اجرای دستور nvidia-smi لیستی از برنامههایی که درحال مصرف VRAM هستند را مشاهده کنید و شماره PID برنامه مزاحم را یادداشت کنید.
- قدم سوم: با دستور زیر، آن پردازش را بهصورت اجباری ببندید:
taskkill /F /PID [شماره PID]
با این کار، حافظه قفلشده بلافاصله آزاد میشود.
محیط لینوکس
لینوکس محیط اصلی توسعهدهندگان هوش مصنوعی است و در آن روشهای حرفهای (Optimized) برای مدیریت منابع وجود دارد. بهترین راهکار برای جلوگیری از پر شدن حافظه کارت گرافیک در سرورهای لینوکسی، مانیتورینگ با nvidia-smi است. اگر متوجه شدید برنامهای حافظه را اشغال کرده و رها نمیکند، میتوانید ازطریق ترمینال لینوکس آن را متوقف کنید:
- یافتن PID: ابتدا دستور nvidia-smi را در ترمینال اجرا کنید تا جدول مصرف منابع و ستون PID به شما نمایش داده شود.
- توقف یک پردازش خاص: برای بستن پردازشی که حافظه را گرفته است، از دستور زیر استفاده کنید:
sudo kill -9 [شماره PID]
- پاکسازی کامل (Kill All): اگر میخواهید تمام پردازشهای متصل به کارت گرافیک را بهیکباره متوقف کنید (مناسب برای زمانی که VRAM کاملاً قفل شده است)، این دستور قدرتمند را اجرا کنید:
sudo fuser -v -k /dev/nvidia*
(دقت کنید که دستور آخر، تمام برنامههای متصل به گرافیک را میبندد؛ بنابراین قبلاز اجرای آن مطمئن شوید که پردازش مهمی درحال اجرا ندارید).
یک نکته کلیدی در اجرای مدل سنگین با GPU
فراموش نکنید که دستورات نرمافزاری تا یک جایی پاسخگو هستند. گاهی اوقات مدل شما (مثلاً یک مدل زبانی بزرگ یا LLM) آنقدر پارامتر دارد که بههیچوجه در یک کارت گرافیک ۸ یا ۱۲ گیگابایتیِ سیستم محلی جا نمیشود. در چنین شرایطی، درگیری مداوم با کدها، کاهش Batch Size و پاککردن کش فقط اتلاف وقت است.
زمان ارتقا و استفاده از GPU قویتر
طبق راهنمای Scaling Deep Learning Workloads انویدیا، یکی از مهمترین مهارتها در مدیریت پروژههای AI این است که بدانید گلوگاه سیستم شما کجاست و چه زمانی باید منابع سختافزاری را اسکیل (Scale) کنید. وقتی متوجه شدید که بهینهسازی کدها دیگر کمکی به اجرای مدل نمیکند، پافشاری روی سختافزار فعلی صرفاً سرعت توسعه شما را فلج میکند.
برای جلوگیری از درگیری مداوم با خطاهای کمبود VRAM، اجاره gpu از ابر فردوسی یک راهکار پایدارتر و مقرونبهصرفهتر برای مدیریت پروژههای سنگین است. با این روش، شما نیازی به پرداخت هزینههای نجومی برای خرید کارت گرافیک ندارید؛ بلکه میتوانید معماری سیستم را متناسب با نیاز همان روزِ پروژه خود انتخاب کنید.
اگر میخواهید بدانید کدام پردازنده گرافیکی برای حجم کاری شما مناسبتر است، پیشنهاد میکنیم که راهنمای خرید زیر را مطالعه کنید.
با ابر فردوسی، دیگر نگران کمبود منابع نخواهید بود و میتوانید سرور گرافیکی خود را با مشخصات دلخواه بسازید و فقط برای زمان مصرف پول بدهید:
- تنوع بینظیر: دسترسی آنی به گرافیکهای سری RTX، Tesla (HBM2) و H-Series
- محیط آماده: نصب خودکار تمام نرمافزارهای پردازشی و هوش مصنوعی
- مدیریت هوشمند هزینه: امکان خاموش کردن سرور در زمان عدم استفاده
- شرایط ویژه: تست رایگان + ۱۰۰ هزار تومان اعتبار هدیه اولیه
جمعبندی
مدیریت حافظه کارت گرافیک و آزادسازی حافظه GPU، مرز بین پردازش روان و ساعتها کلافگی پشت خطاهای پیدرپی است. در این مقاله دیدیم که چطور میتوان با چند دستور ساده در خط فرمان (مثل nvidia-smi و kill) یا تغییرات نرمافزاری در فریمورکهایی مثل PyTorch و TensorFlow، فضای مسدودشده VRAM را آزاد کرد و فرایند پردازش را نجات داد. بااینحال، بهینهسازی نرمافزاری همیشه معجزه نمیکند و برای پروژههای مقیاسبزرگ، ارتقای منابع ابری تنها مسیر منطقی است.
شما معمولاً در چه پروژههایی (آموزش مدل، رندرینگ، یا توسعه بازی) بیشتر با خطای پُر شدن حافظه GPU مواجه میشوید؟ راهکار همیشگی شما برای دور زدن این مشکل چیست؟ تجربهتان را در بخش نظرات برای ما بنویسید.
منابع:
CUDA Semantics | TensorFlow GPU | developer.nvidia | pytorch | راهنمای درایورهای انویدیا برای اوبونتو | Scaling Deep Learning Workloads انویدیا
سؤالات متداول
چگونه حافظه GPU را آزاد کنیم؟
سریعترین روشها شامل بستن فرایندهای غیرضروری با دستور kill (در لینوکس) یا ازطریق Task Manager (در ویندوز)، مانیتورینگ با nvidia-smi و ریست کردن درایور گرافیک (با کلیدهای Win+Ctrl+Shift+B در ویندوز) است. برای توسعهدهندگان، راهکارهای تخصصیتری مانند پاک کردن کش در PyTorch (torch.cuda.empty_cache()) و فعالسازی Memory Growth در TensorFlow وجود دارد.
چرا VRAM بعد از بستن برنامه آزاد نمیشود؟
این اتفاق معمولاً بهدلیل وجود فرآیندهای سرگردان (Zombie Processes) رخ میدهد. گاهی اوقات، حتی پساز بستن یک برنامه، برخی از زیرشاخههای آن بهدرستی خاتمه پیدا نمیکنند و همچنان بخشی از حافظه GPU را در اشغال خود نگه میدارند. در این حالت، بهترین راه پیداکردن PID آن فرایند با دستور nvidia-smi و از بین بردن دستی آن است.
تفاوت allocated و reserved memory چیست؟
Reserved Memory: حافظهای است که فریمورک (مانند PyTorch) از سیستمعامل رزرو میکند تا در آینده استفاده کند. این بخش بزرگ و یکپارچه است تا از کندی تخصیصهای مکرر جلوگیری شود.
Allocated Memory: بخش کوچکتری از حافظه Reserved است که در لحظه توسط تنسورها و متغیرهای برنامه شما واقعاً استفاده میشود.
به همین دلیل، ممکن است nvidia-smi نشان دهد ۸ گیگابایت حافظه رزرو شده، اما برنامه شما در عمل فقط از ۳ گیگابایت آن استفاده (Allocate) کرده باشد.
آیا torch.cuda.empty_cache() برای آزادسازی حافظه مؤثر است؟
بهتنهایی مؤثر نیست. این دستور فقط کش حافظه غیرفعال را پاک میکند؛ یعنی بلوکهایی از حافظه که قبلاً توسط تنسورها استفاده شده و اکنون آزاد هستند اما PyTorch آنها را برای استفادههای بعدی نگه داشته است. این تابع، حافظهای که در همان لحظه توسط متغیرهای فعال شما اشغالشده (Allocated) را آزاد نمیکند.
چطور خطای OOM (Out of Memory) در PyTorch را کم کنیم؟
چند راهکار کلیدی و مؤثر وجود دارد:
کاهش اندازه بچ (Batch Size): اولین و سادهترین قدم
استفاده از Gradient Accumulation: بهجای آپدیت مدل در هر بچ، گرادیانها را برای چند بچ جمع کرده و یکباره آپدیت کنید.
استفاده از Mixed Precision: با فعالسازی torch.cuda.amp، برخی محاسبات با دقت پایینتر (FP16) انجام میشوند که مصرف VRAM را تقریباً نصف میکند.
چطور با nvidia-smi فرایندهای مصرفکننده VRAM را پیدا کنیم؟
کافی است در ترمینال یا Command Prompt دستور nvidia-smi را اجرا کنید. در جدول پایینی خروجی، لیستی از تمام فرایندهایی که درحال استفاده از GPU هستند به همراه شناسه (PID) و میزان مصرف VRAM هر کدام نمایش داده میشود. با این اطلاعات میتوانید فرایند موردنظر را شناسایی و متوقف کنید.
آیا تکهتکه شدن (Fragmentation) حافظه باعث خطا میشود؟
بله، قطعاً. Fragmentation زمانی اتفاق میافتد که حافظه آزاد شما بهصورت بلوکهای کوچک و پراکنده در سراسر VRAM پخش شده باشد. در این حالت، حتی اگر مجموع حافظه آزاد زیاد باشد، سیستم نمیتواند یک بلوک بزرگ و یکپارچه برای تنسور جدید پیدا کند و در نتیجه، خطای CUDA out of memory رخ میدهد. این یکی از دلایلی است که فریمورکها سعی میکنند از ابتدا یک حافظه بزرگ را رزرو کنند.

