پرش به محتوا
← همهٔ یادداشت‌ها

مانیتور کردن GPU ابری با nvidia-smi: VRAM، دما و گلوگاه

·۷ دقیقه مطالعه·تیم جی‌پی‌یو

تابلوی چوبی موتورخانهٔ یک کشتی قدیمی با پنج فشارسنج برنجی عقربه‌دار و یک دورسنج و ساعت در کنارش.

برای مانیتور کردن GPU ابری کافی است روی ماشین دستور nvidia-smi را بزنید؛ همین یک ابزار دما، مصرف VRAM، درصد کار کارت گرافیک و توان مصرفی را نشان می‌دهد. در این آموزش یاد می‌گیرید این عددها را درست بخوانید، از آن‌ها لاگ بگیرید و بفهمید کارتان کجا گیر کرده است: خودِ GPU، حافظهٔ آن، یا پردازنده و دیسک.

این مهارت مستقیم به جیب شما مربوط است. وقتی ماشین را ساعتی اجاره می‌کنید، کارت گرافیکی که بیشتر وقتش بیکار است یعنی پولی که بی‌دلیل می‌رود. کل این آموزش روی هر ماشینی با هر قالبی کمتر از نیم ساعت طول می‌کشد و روی یک کارت ارزان چند هزار تومان بیشتر خرج ندارد.

پیش‌نیازها

انتخاب ماشین مناسب

برای یادگرفتن مانیتورینگ، کارت قوی لازم نیست. هر کارت NVIDIA همان nvidia-smi را دارد و عددها را به همان شکل نشان می‌دهد. پس اگر فقط می‌خواهید تمرین کنید، ارزان‌ترین کارت کافی است.

  • پیشنهاد اقتصادی: RTX 3060 با ۱۲ گیگابایت VRAM، در زمان نوشتن این مطلب از حدود ۲۱ هزار تومان در ساعت. اگر کمی حافظهٔ بیشتر می‌خواهید، RTX A4000 با ۱۶ گیگ در زمان نوشتن این مطلب از حدود ۳۳ هزار تومان در ساعت است.
  • پیشنهاد سریع: RTX 3090 با ۲۴ گیگ، در زمان نوشتن این مطلب از حدود ۵۲ هزار تومان در ساعت؛ یا RTX 4090 با ۲۴ گیگ، در زمان نوشتن این مطلب از حدود ۱۲۲ هزار تومان در ساعت.

اما اصل ماجرا جای دیگری است: مانیتورینگ همان ابزاری است که به شما می‌گوید کارت فعلی‌تان کم است یا زیاد. اگر VRAM همیشه پر است، کارت بزرگ‌تر لازم دارید؛ اگر GPU نصف وقت بیکار است، کارت گران‌تر هیچ کمکی نمی‌کند. فهرست کامل کارت‌ها و قیمت‌ها را در بازار GPU ببینید و برای حساب‌وکتاب حافظه راهنمای VRAM هر کار را بخوانید.

اجاره و راه‌اندازی

در بازار ماشین را انتخاب کنید و قالب PyTorch را بردارید؛ برای مثال‌های پایتونی این آموزش مناسب است. اگر کار اصلی‌تان با قالب دیگری است، مثلاً ComfyUI یا Ollama، همان را بردارید؛ nvidia-smi روی همهٔ قالب‌ها هست.

بعد از زدن دکمهٔ اجاره صبر کنید تا وضعیت ماشین «آماده» شود. در صفحهٔ ماشین، دستور SSH آماده را با یک کلیک کپی کنید و در ترمینال خودتان اجرا کنید. اگر Jupyter را ترجیح می‌دهید، لینک مستقیم آن هم در همان صفحه هست و می‌توانید از منوی آن یک ترمینال باز کنید.

خواندن خروجی nvidia-smi روی GPU ابری

اولین دستور ساده است:

nvidia-smi

یک جدول می‌بینید. مهم‌ترین ستون‌ها این‌هاست:

  • Temp: دمای کارت به درجهٔ سانتی‌گراد. زیر بار سنگین، عددهای ۷۰ تا ۸۰ عادی است.
  • Pwr:Usage/Cap: توان مصرفی فعلی و سقف آن به وات. وقتی کار سنگین است، این عدد نزدیک سقف می‌رود.
  • Memory-Usage: VRAM مصرف‌شده از کل. این همان عددی است که تعیین می‌کند مدل جا می‌شود یا نه.
  • GPU-Util: درصد زمانی که کارت در حال اجرای کار بوده است. عدد پایین در وسط آموزش یعنی کارت منتظر چیز دیگری است.
  • Perf: حالت کارایی، از P0 (حداکثر) تا P8 و پایین‌تر (بیکار).

پایین جدول بخش Processes است. روی ماشین‌های کانتینری این بخش اغلب خالی است یا «No running processes found» می‌نویسد، حتی وقتی برنامهٔ شما در حال اجراست. دلیلش جدا بودن فضای پردازه‌های کانتینر است، نه خرابی. به Memory-Usage نگاه کنید؛ آن عدد درست است.

نمایش زنده

برای دیدن تغییرها هر ثانیه:

watch -n 1 nvidia-smi

با Ctrl+C خارج شوید. اگر watch نصب نبود، خود nvidia-smi حالت تکرار دارد:

nvidia-smi -l 1

گرفتن لاگ برای تحلیل بعدی

جدول زنده برای نگاه کردن خوب است، اما وقتی آموزش چند ساعت طول می‌کشد، لاگ لازم دارید. این دستور فقط ستون‌های لازم را هر ثانیه به‌صورت CSV می‌نویسد:

nvidia-smi --query-gpu=timestamp,name,temperature.gpu,utilization.gpu,memory.used,memory.total,power.draw,power.limit,pstate --format=csv -l 1

برای این‌که در پس‌زمینه اجرا شود و در فایل ذخیره شود، حتی اگر اتصال SSH قطع شد:

nohup nvidia-smi --query-gpu=timestamp,temperature.gpu,utilization.gpu,memory.used,power.draw --format=csv -l 5 > gpu-log.csv 2>&1 &

این‌جا هر ۵ ثانیه یک خط ثبت می‌شود که برای کارهای طولانی کافی است و فایل را حجیم نمی‌کند. هر وقت خواستید متوقفش کنید:

pkill -f "nvidia-smi --query-gpu"

فایل gpu-log.csv را بعداً با pandas یا حتی یک صفحه‌گسترده باز کنید و نمودار مصرف VRAM و درصد کار را ببینید.

نمای فشرده با dmon

اگر جدول کامل برایتان شلوغ است، dmon در هر ثانیه یک خط می‌دهد: توان و دما، درصد کار، فرکانس‌ها و حافظه.

nvidia-smi dmon -s pucm

نمای گرافیکی با nvitop

ابزار nvitop همین اطلاعات را با نمودار و رنگ در ترمینال نشان می‌دهد و برای ماشین‌های چندکارته خیلی خواناتر است. نصبش با pip است:

pip3 install --upgrade nvitop
nvitop

با q خارج شوید. اگر فقط یک گزارش لحظه‌ای می‌خواهید، مثل nvidia-smi:

nvitop -1

اگر بعد از نصب پیغام command not found گرفتید، python3 -m nvitop را بزنید. مستندات کامل در گیت‌هاب nvitop است.

پیدا کردن گلوگاه

حالا که عددها را دارید، این سه الگو بیشتر موقعیت‌ها را توضیح می‌دهند:

GPU-Util بالای ۹۰ درصد و VRAM پر نیست: کارت گرافیک واقعاً مشغول است و گلوگاه خودِ GPU است. برای سرعت بیشتر، کارت قوی‌تر بگیرید یا اندازهٔ batch را بزرگ‌تر کنید تا از حافظهٔ خالی استفاده شود.

GPU-Util پایین یا بالا و پایین‌رونده (مثلاً بین ۰ و ۶۰): کارت منتظر داده است. معمولاً پردازنده یا دیسک داده را دیر آماده می‌کند. با top نگاه کنید پردازه‌های پایتون CPU را پر کرده‌اند یا نه، و با nproc ببینید ماشین چند هسته دارد. در PyTorch، بالا بردن num_workers در DataLoader و pin_memory=True اغلب همین مشکل را حل می‌کند.

VRAM نزدیک سقف و خطای حافظه: مدل یا batch برای این کارت بزرگ است. batch کوچک‌تر، دقت پایین‌تر (fp16 یا bf16)، یا کارتی با VRAM بیشتر راه‌حل است.

دیدن مصرف حافظه از داخل PyTorch

عدد nvidia-smi کل حافظهٔ رزروشده را نشان می‌دهد، نه فقط تنسورهای شما. برای دقیق‌تر دیدن، داخل کد خودتان این‌ها را چاپ کنید:

import torch

free, total = torch.cuda.mem_get_info()
print(f"free: {free/1e9:.1f} GB / total: {total/1e9:.1f} GB")
print(f"allocated: {torch.cuda.memory_allocated()/1e9:.2f} GB")
print(f"reserved:  {torch.cuda.memory_reserved()/1e9:.2f} GB")
print(f"peak:      {torch.cuda.max_memory_allocated()/1e9:.2f} GB")

عدد peak مهم‌ترین است: می‌گوید کارتان در بدترین لحظه چقدر VRAM لازم داشته. با آن می‌توانید دفعهٔ بعد کارتی بگیرید که دقیقاً اندازه است.

کند شدن به خاطر دما یا توان

اگر سرعت وسط کار بدون دلیل افت کرد، این دستور دلیل پایین آمدن فرکانس کارت را نشان می‌دهد:

nvidia-smi -q -d PERFORMANCE

در خروجی، هر دلیلی که جلویش Active نوشته شده فعال است؛ مثلاً محدودیت توان یا دمای بالا. Idle هم وقتی کارت بیکار است فعال می‌شود که طبیعی است.

اگر به مشکل خوردید

  • پیغام command not found برای nvidia-smi: مطمئن شوید دستور را در ترمینال خودِ ماشین اجاره‌ای می‌زنید، نه روی لپ‌تاپ خودتان. اگر روی ماشین هم این پیغام را دیدید، از صفحهٔ پشتیبانی تیکت بزنید.
  • CUDA out of memory: با nvidia-smi ببینید پردازهٔ قبلی (مثلاً یک کرنل Jupyter فراموش‌شده) حافظه را نگه نداشته باشد. کرنل را restart کنید یا batch را کوچک کنید.
  • VRAM پر است ولی هیچ پردازه‌ای نشان داده نمی‌شود: همان محدودیت کانتینر است. با ps aux | grep python پردازه‌های پایتون را پیدا کنید و آن‌چه لازم نیست را ببندید.
  • لاگ بعد از قطع SSH متوقف شد: دستور را بدون nohup و & اجرا کرده‌اید. دوباره با همان شکلی که بالا آمد اجرا کنید، یا از tmux استفاده کنید.

هزینه و صرفه‌جویی

خواندن خروجی و راه انداختن لاگ ده دقیقه وقت می‌گیرد. اما فایدهٔ اصلی بعداً است: اگر لاگ نشان دهد GPU-Util بیشتر وقت زیر ۳۰ درصد است، یا کد را اصلاح کنید یا کارت ارزان‌تری بگیرید؛ چون دارید پول کارتی را می‌دهید که از آن استفاده نمی‌کنید.

هزینه دقیقه‌ای از کیف پول کم می‌شود و ماشین متوقف‌شده هزینه ندارد. پس وقتی کار تمام شد، ماشین را متوقف یا حذف کنید. یادتان باشد دیسک ماشین با حذف پاک می‌شود؛ فایل gpu-log.csv و خروجی‌های کارتان را قبل از حذف دانلود کنید.

قدم بعدی

حالا که می‌دانید کارتان چقدر VRAM و توان لازم دارد، جدول VRAM و انتخاب کارت گرافیک برای مدل زبانی را بخوانید. اگر با نوت‌بوک کار می‌کنید، Jupyter روی GPU ابری هم برای کنار هم دیدن کد و مانیتورینگ به کارتان می‌آید.

پرسش‌های متداول

چطور مصرف VRAM کارت گرافیک را ببینم؟

دستور nvidia-smi را بزنید و ستون Memory-Usage را نگاه کنید. برای دیدن زنده از watch -n 1 nvidia-smi استفاده کنید. داخل PyTorch هم torch.cuda.max_memory_allocated() اوج مصرف کد خودتان را می‌گوید.

دمای عادی GPU زیر بار چقدر است؟

برای بیشتر کارت‌ها زیر بار سنگین ۷۰ تا ۸۰ درجه عادی است. اگر سرعت افت کرد، با nvidia-smi -q -d PERFORMANCE ببینید محدودیت دمایی فعال شده یا نه.

چرا GPU-Util پایین است در حالی که کد در حال اجراست؟

معمولاً کارت منتظر داده است و گلوگاه پردازنده یا دیسک است. تعداد workerهای بارگذاری داده را زیاد کنید و با top مصرف CPU را بررسی کنید.

چرا nvidia-smi پردازهٔ من را نشان نمی‌دهد؟

روی ماشین‌های کانتینری، فضای پردازه‌ها جداست و بخش Processes اغلب خالی می‌ماند. عدد Memory-Usage همچنان درست است؛ پردازه‌ها را با ps aux پیدا کنید.

آیا مانیتور کردن GPU هزینهٔ جداگانه دارد؟

نه. nvidia-smi روی همهٔ ماشین‌ها هست و nvitop رایگان است. فقط زمان روشن بودن ماشین حساب می‌شود.

تصویر کاور: «Virginia V (ship, 1922) engine room 06 - engine gauges» اثر Joe Mabel، از ویکی‌مدیا کامنز، لایسنس CC BY-SA 4.0.