فاز 0 · درس 10

ترمینال و شل برای مهندسی هوش مصنوعی

نوع
مفهومی
زمان
حدود 35 دقیقه
زبان‌ها
--
یک مانیتور مشکی بزرگ با صفحه‌نمایش تقسیم‌شده به سه بخش که در هر کدام نمودارهای متنی، خط فرمان سبز رنگ و نمودار فعالیت سخت‌افزار در پس‌زمینه تاریک دیده می‌شود
فهرست مطالب
  1. اهداف یادگیری
  2. صورت مسئله
  3. مفاهیم پایه
  4. پیاده‌سازی از صفر
  5. گام 1: شل خود را بشناسید
  6. گام 2: پایپ و بازهدایت‌ها
  7. گام 3: فرایندهای پس‌زمینه
  8. گام 4: tmux
  9. گام 5: پایش با htop و nvtop
  10. گام 6: اتصال SSH به سیستم‌های دارای GPU راه‌دور
  11. گام 7: نام‌های مستعار (Alias) کاربردی برای کارهای هوش مصنوعی
  12. گام 8: الگوهای رایج ترمینال در هوش مصنوعی
  13. استفاده از ابزارهای واقعی
  14. تمرین‌ها
  15. راهنمایی‌ها
  16. اصطلاحات کلیدی

بخش عمده‌ای از زمان مهندسان یادگیری ماشین و هوش مصنوعی نه در ادیتورهای کد، بلکه در محیط خط فرمان می‌گذرد. اجرای پایپ‌لاین‌های سنگین آموزش مدل، اتصال به سرورهای ابری، بررسی لاگ‌های زنده و پایش مصرف حافظه کارت گرافیک، همگی نیازمند تسلط بی‌دردسر بر ترمینال و شل هستند. اگر در کار با خط فرمان کند باشید، تمام فرایند توسعه و آزمایش مدل‌های شما با تأخیر مواجه می‌شود.

در کار عملی، فرایندهای آموزش ساعت‌ها یا حتی روزها زمان می‌برند و نمی‌توان یک پنجره ترمینال را دائماً باز نگه داشت. استفاده از ابزارهایی مثل tmux این امکان را می‌دهد که نشست‌های ماندگار بسازید، چندین قاب برای پایش هم‌زمان منابع سیستم (CPU و GPU) باز کنید، بدون نگرانی از قطع ارتباط اینترنت از سرور جدا شوید و سپس دوباره به همان وضعیت بازگردید.

از طرفی برای کاربران ایرانی که دسترسی به سرویس‌های ابری خارجی و کارت‌های گرافیک قدرتمند به‌دلیل مسائل پرداخت ارزی دشوار و پرهزینه است، استفاده بهینه از سرورهای اختصاصی یا ماشین‌های محلی اهمیت دوچندانی دارد. مدیریت درست پروسه‌ها با دستوراتی مثل htop، nvtop و بازهدایت لاگ‌ها مانع از توقف‌های ناخواسته بر اثر کمبود حافظه (OOM) و هدررفت منابع پردازشی در دسترس می‌شود.

ترمینال خانه‌ی مهندسان هوش مصنوعی است. اینجا باید کاملاً احساس راحتی کنید.

اهداف یادگیری

  • استفاده از پایپ (Piping)، بازهدایت‌ها (Redirects) و grep برای فیلتر و پردازش لاگ‌های آموزش از خط فرمان
  • ساخت نشست‌های ماندگار tmux با چندین قاب (Pane) برای اجرای هم‌زمان آموزش و پایش GPU
  • پایش منابع سیستم و GPU با ابزارهای htop، nvtop و nvidia-smi
  • انتقال فایل بین سیستم محلی و مخزن راه‌دور با استفاده از SSH، scp و rsync

صورت مسئله

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

این درس مهارت‌هایی از ترمینال را پوشش می‌دهد که در کار هوش مصنوعی اهمیت دارند؛ نه تاریخچه‌ی یونیکس و نه کندوکاو عمیق در اسکریپت‌نویسی Bash؛ فقط همان چیزهایی که نیاز دارید.

مفاهیم پایه

نشست tmux: آموزشردیف بالابخش 1: اجرای آموزشpython train.pyEpoch 12/100 ...بخش 2: پایش GPUwatch -n1 nvidia-smiGPU: 78% | Mem: 14/24Gبخش 3: گزارش‌ها + آزمایش‌هاtail -f logs/train.log | grep loss

سه برنامه هم‌زمان در یک ترمینال اجرا می‌شوند. می‌توانید از نشست جدا شوید (Detach)، به خانه بروید، دوباره با SSH وصل شوید و مجدداً به نشست متصل شوید (Reattach). فرایند آموزش همچنان به کارش ادامه می‌دهد.

پایپ‌ها جریان داده را محدود می‌کنندهر دستور خروجی دستور قبلی را خوانده و مقدار کمتری را تحویل می‌دهد
PIPES NARROW THE STREAMA pipe hands one command's stdout to the next command's stdin, no temp files in between. The log stream enters whole, grep drops every line without "loss", and awk keeps only column 8, so a firehose of training output becomes a clean series of numbers you can watch or plot live.tail -f train.loggrep lossawk '{print $8}'||سطرهای نامنطبق حذف شدند0.342تمام سطرهافقط عدد
یک پایپ خروجی استاندارد (stdout) یک دستور را بدون نیاز به فایل‌های موقت به ورودی استاندارد (stdin) دستور بعدی می‌فرستد. جریان لاگ به‌طور کامل وارد می‌شود، دستور grep تمام سطرهای بدون "loss" را حذف می‌کند و awk تنها ستون 8 را نگه می‌دارد؛ بدین ترتیب سیل انبوه خروجی آموزش به مجموعه‌ای تمیز از اعداد تبدیل می‌شود که می‌توانید زنده مشاهده کرده یا رسم کنید.

پیاده‌سازی از صفر

گام 1: شل خود را بشناسید

بررسی کنید در حال حاضر کدام شل در حال اجراست:

echo $SHELL

بیشتر سیستم‌ها از bash یا zsh استفاده می‌کنند. هر دو کاملاً مناسب‌اند. دستورات این دوره هم در هر دو شل کار می‌کنند.

نکات کلیدی که باید بدانید:

# جابه‌جایی در خط فرمان
cd ~/projects/ai-engineering-from-scratch
pwd
ls -la

# جستجو در تاریخچه (مفیدترین کلید میان‌بری که یاد می‌گیرید)
# زدن Ctrl+R و سپس تایپ بخشی از دستور قبلی
# فشردن مجدد Ctrl+R برای پیمایش بین نتایج

# پاک کردن ترمینال
clear   # or Ctrl+L

# لغو یک دستور در حال اجرا
# Ctrl+C

# تعلیق دستور در حال اجرا (ادامه با fg)
# Ctrl+Z

گام 2: پایپ و بازهدایت‌ها

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

# شمارش دفعات تکرار "loss" در یک فایل لاگ
cat train.log | grep "loss" | wc -l

# استخراج فقط مقادیر loss از خروجی آموزش
grep "loss:" train.log | awk '{print $NF}' > losses.txt

# مشاهده لحظه‌ای تغییرات فایل لاگ، با فیلتر کردن خطاها
tail -f train.log | grep --line-buffered "ERROR"

# مرتب‌سازی آزمایش‌ها بر اساس دقت نهایی
grep "final_accuracy" results/*.log | sort -t= -k2 -n -r

# هدایت stdout و stderr به فایل‌های جداگانه
python train.py > output.log 2> errors.log

# هدایت هر دو به یک فایل یکسان
python train.py > train_full.log 2>&1

چهار عملگر بازهدایت و پایپی که نیاز دارید:

نماد کاربرد
> نوشتن خروجی استاندارد (stdout) در فایل (بازنویسی)
>> الحاق خروجی استاندارد به انتهای فایل
2> نوشتن خطای استاندارد (stderr) در فایل
2>&1 ارسال stderr به همان مقصد خروجی استاندارد
| ارسال stdout یک دستور به‌عنوان ورودی استاندارد (stdin) به دستور بعدی

گام 3: فرایندهای پس‌زمینه

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

# اجرا در پس‌زمینه (خروجی همچنان به ترمینال می‌آید)
python train.py &

# اجرا در پس‌زمینه و ضد قطع ارتباط (بستن ترمینال آن را متوقف نمی‌کند)
nohup python train.py > train.log 2>&1 &

# بررسی پردازه‌های در حال اجرا در پس‌زمینه
jobs
ps aux | grep train.py

# آوردن جاب پس‌زمینه به پیش‌زمینه
fg %1

# متوقف کردن یک پردازه پس‌زمینه
kill %1
# یا یافتن PID پردازه و کشتن آن
kill $(pgrep -f "train.py")

تفاوت بین &، nohup و screen/tmux:

روش ماندگاری پس از بستن ترمینال؟ امکان اتصال دوباره (Reattach)؟
command & خیر خیر
nohup command & بله خیر (باید فایل لاگ را بررسی کنید)
screen / tmux بله بله

برای کارهایی که بیش از چند دقیقه زمان می‌برند، سراغ tmux بروید.

گام 4: tmux

ابزار tmux امکان ساخت نشست‌های ترمینالی ماندگار با چندین قاب را به شما می‌دهد. این ابزار تک‌خالِ مدیریت فرایندهای آموزش است.

# Install
# macOS
brew install tmux
# Ubuntu
sudo apt install tmux

# شروع یک نشست نام‌گذاری‌شده
tmux new -s training

# تقسیم افقی پنجره
# کلید Ctrl+B و سپس "

# تقسیم عمودی پنجره
# کلید Ctrl+B و سپس %

# جابه‌جایی بین بخش‌ها
# کلید Ctrl+B و سپس کلیدهای جهت‌نما

# Detach (session keeps running)
# کلید Ctrl+B و سپس d

# Reattach
tmux attach -t training

# فهرست کردن نشست‌ها
tmux ls

# بستن و خاتمه دادن به یک نشست
tmux kill-session -t training

یک نشست نمونه برای جریان کاری هوش مصنوعی:

tmux new -s train

# بخش 1: شروع آموزش
python train.py --epochs 100 --lr 1e-4

# کلید Ctrl+B و سپس " برای تقسیم افقی، سپس اجرای مانیتور GPU
watch -n1 nvidia-smi

# کلید Ctrl+B و سپس % برای تقسیم عمودی، سپس مشاهده دنباله لاگ‌ها
tail -f logs/experiment.log

# حالا جدا شدن از نشست با Ctrl+B و d
# خروج از SSH، نوشیدن یک قهوه و بازگشت
# tmux attach -t train

گام 5: پایش با htop و nvtop

# پردازه‌های سیستم (بهتر از top)
htop

# پردازه‌های GPU (اگر پردازنده گرافیکی NVIDIA دارید)
# نصب: sudo apt install nvtop (در اوبونتو) یا brew install nvtop (در مک)
nvtop

# بررسی سریع وضعیت GPU بدون nvtop
nvidia-smi

# مشاهده لحظه‌ای و ثانیه‌به‌ثانیه مصرف GPU
watch -n1 nvidia-smi

# مشاهده پردازه‌هایی که از GPU استفاده می‌کنند
nvidia-smi --query-compute-apps=pid,name,used_memory --format=csv

کلیدهای میان‌بر پرکاربرد در htop:

  • F6 یا > برای مرتب‌سازی بر اساس ستون (برای پیدا کردن نشتی حافظه، بر اساس Memory مرتب کنید)
  • F5 برای جابه‌جایی به نمای درختی (دیدن فرایندهای فرزند)
  • F9 برای کشتن یک فرایند (Kill)
  • / برای جستجوی نام فرایند

گام 6: اتصال SSH به سیستم‌های دارای GPU راه‌دور

وقتی یک GPU ابری (مثل Lambda، RunPod یا Vast.ai) اجاره می‌کنید، از طریق SSH به آن وصل می‌شوید.

# اتصال پایه
ssh user@gpu-box-ip

# با یک کلید مشخص
ssh -i ~/.ssh/my_gpu_key user@gpu-box-ip

# کپی فایل‌ها به مخزن راه‌دور
scp model.pt user@gpu-box-ip:~/models/

# کپی فایل‌ها از مخزن راه‌دور
scp user@gpu-box-ip:~/results/metrics.json ./

# همگام‌سازی یک دایرکتوری کامل (سریع‌تر برای فایل‌های پرتعداد)
rsync -avz ./data/ user@gpu-box-ip:~/data/

# ارسال پورت (دسترسی محلی به Jupyter یا TensorBoard در سرور راه‌دور)
ssh -L 8888:localhost:8888 user@gpu-box-ip
# اکنون localhost:8888 را در مرورگر خود باز کنید

# کانفیگ SSH برای راحتی کار
# افزودن این خطوط به ~/.ssh/config:
# Host gpu
#     HostName 192.168.1.100
#     User ubuntu
#     IdentityFile ~/.ssh/gpu_key
#
# سپس تنها کافی است اجرا کنید:
# ssh gpu

گام 7: نام‌های مستعار (Alias) کاربردی برای کارهای هوش مصنوعی

این موارد را به ~/.bashrc یا ~/.zshrc خود اضافه کنید:

source phases/00-setup-and-tooling/10-terminal-and-shell/code/shell_aliases.sh

یا فقط آن‌هایی را که می‌خواهید کپی کنید. نام‌های مستعار کلیدی:

# وضعیت GPU در یک نگاه
alias gpu='nvidia-smi --query-gpu=index,name,utilization.gpu,memory.used,memory.total,temperature.gpu --format=csv,noheader'

# متوقف کردن تمام پردازه‌های آموزش پایتون
alias killtraining='pkill -f "python.*train"'

# فعال‌سازی سریع محیط مجازی
alias ae='source .venv/bin/activate'

# مشاهده لحظه‌ای loss در آموزش
alias watchloss='tail -f logs/*.log | grep --line-buffered "loss"'

برای دیدن مجموعه‌ی کامل، فایل code/shell_aliases.sh را بررسی کنید.

گام 8: الگوهای رایج ترمینال در هوش مصنوعی

این الگوها در عمل مکرراً پیش می‌آیند:

# اجرای آموزش، ثبت تمام لاگ‌ها، ارسال اعلان پس از اتمام
python train.py 2>&1 | tee train.log; echo "DONE" | mail -s "Training complete" you@email.com

# مقایسه کنار هم لاگ‌های دو آزمایش مختلف
diff <(grep "accuracy" exp1.log) <(grep "accuracy" exp2.log)

# یافتن بزرگ‌ترین فایل‌های مدل (برای آزادسازی فضای دیسک)
find . -name "*.pt" -o -name "*.safetensors" | xargs du -h | sort -rh | head -20

# دانلود یک مدل از Hugging Face
wget https://huggingface.co/model/resolve/main/model.safetensors

# استخراج دیتاست از فایل فشرده tar
tar xzf dataset.tar.gz -C ./data/

# شمارش خطوط در تمام فایل‌های پایتون (بررسی حجم کد پروژه)
find . -name "*.py" | xargs wc -l | tail -1

# بررسی فضای دیسک (داده‌های آموزش سریعاً دیسک را پر می‌کنند)
df -h
du -sh ./data/*

# بررسی متغیرهای محیطی قبل از شروع آموزش
env | grep -i cuda
env | grep -i torch

استفاده از ابزارهای واقعی

در طول این دوره، هر ابزار در این موقعیت‌ها به کار می‌آید:

ابزار زمان استفاده
tmux تمام فرایندهای آموزش (فازهای 3 به بعد)
tail -f + grep پایش لاگ‌های آموزش
nohup / & کارهای سریع در پس‌زمینه
htop / nvtop خطایابی کندی آموزش و خطاهای کمبود حافظه (OOM)
SSH + rsync کار روی GPUهای ابری
پایپ + بازهدایت پردازش نتایج آزمایش‌ها
نام‌های مستعار (Aliases) صرفه‌جویی در زمان برای دستورات تکراری

تمرین‌ها

  1. ابزار tmux را نصب کنید، نشستی با سه قاب بسازید و در یکی htop، در دومی watch -n1 date و در سومی یک اسکریپت پایتون را اجرا کنید. از نشست خارج شوید (Detach) و دوباره به آن وصل شوید (Reattach).
  2. نام‌های مستعار موجود در code/shell_aliases.sh را به تنظیمات شل خود اضافه و با source ~/.zshrc (یا ~/.bashrc) دوباره بارگذاری کنید.
  3. با دستور for i in $(seq 1 100); do echo "epoch $i loss: $(echo "scale=4; 1/$i" | bc)"; sleep 0.1; done > fake_train.log یک فایل لاگ آموزش ساختگی درست کنید و سپس با استفاده از grep، tail و awk فقط مقادیر Loss را بیرون بکشید.
  4. یک مدخل پیکربندی SSH برای سروری که به آن دسترسی دارید بسازید (یا برای تمرین ساختار، از localhost استفاده کنید).

راهنمایی‌ها

تمرین 1. کار را با tmux new -s practice شروع کنید، سپس با پیشوند Ctrl+B و بعد کلیدهای " و % صفحه را تقسیم کنید و با Ctrl+B و کلیدهای جهت‌نما بین قاب‌ها جابه‌جا شوید. با فشردن Ctrl+B و سپس d از نشست خارج شوید، tmux ls را بزنید و با tmux attach -t practice دوباره به آن وصل شوید؛ هر سه برنامه باید همچنان در حال اجرا باشند.

تمرین 2. خطوط موجود در code/shell_aliases.sh را به انتهای ~/.zshrc یا ~/.bashrc کپی کنید و سپس دستور source را روی آن فایل اجرا کنید. دستور alias یا type <name> را برای یکی از نام‌های مستعار جدید اجرا کنید تا مطمئن شوید شل آن را شناخته است.

تمرین 3. ابتدا دستور tail -5 fake_train.log را اجرا کنید تا ساختار خط‌ها را ببینید. سپس با grep loss فیلتر کنید و با دستور awk '{print $NF}' فقط فیلد آخر را چاپ کنید؛ خروجی باید شامل 100 عدد باشد که مقدارشان مرتباً کمتر می‌شود.

تمرین 4. بلوک Host gpu را از متن درس در ~/.ssh/config کپی کنید و مقادیر HostName و User را به سرور خود یا به localhost و نام کاربری‌تان تغییر دهید. دستور ssh -G gpu را اجرا کنید تا تنظیماتی را که SSH استفاده خواهد کرد چاپ کند. اگر سرور SSH در دسترس دارید که کلید شما را می‌پذیرد، با ssh gpu متصل شوید.

اصطلاحات کلیدی

اصطلاح به زبان عامیانه مفهوم واقعی
شل (Shell) «همان ترمینال» برنامه‌ای که دستورهای شما را تفسیر می‌کند (bash، zsh، fish)
tmux «مالتی‌پلکسر ترمینال» برنامه‌ای که اجرای هم‌زمان چندین نشست ترمینال را درون یک پنجره، با امکان جدا شدن و اتصال مجدد، ممکن می‌سازد
پایپ (Pipe) «همان خط عمودی» عملگر | که خروجی یک دستور را به‌عنوان ورودی به دستور دیگر می‌فرستد
PID «کد فرایند» شناسه عددی یکتایی که به هر فرایند در حال اجرا اختصاص می‌یابد و برای پایش یا بستن آن به کار می‌رود
nohup «بدون قطعی» (No hangup) دستوری را بدون تأثیرپذیری از سیگنال قطع ارتباط اجرا می‌کند؛ بنابراین بستن ترمینال فرایند را متوقف نخواهد کرد
SSH «وصل شدن به سرور» پوسته امن (Secure Shell)؛ پروتکلی رمزگذاری‌شده برای اجرای دستورها روی یک مخزن راه‌دور

خودآزمایی

به سؤال‌ها جواب بدهید تا ببینید چقدر از درس در ذهنتان مانده است.

  1. پیش از درسعملگر پایپ '|' در دستورات شل چه کاری انجام می‌دهد؟
  2. پیش از درسوقتی ترمینالی که فرایندی را آغاز کرده می‌بندید، چه اتفاقی برای آن فرایند در حال اجرا می‌افتد؟
  3. پس از درسمزیت کلیدی tmux در مقایسه با استفاده از 'nohup command &' برای کارهای طولانی آموزش چیست؟
  4. پس از درسدستور 'python train.py > output.log 2>&1' چه کاری انجام می‌دهد؟
  5. پس از درسکدام دستور به شما امکان می‌دهد از مرورگر محلی خود به نوت‌بوک Jupyter که روی پورت 8888 سرور GPU اجرا می‌شود دسترسی پیدا کنید؟

سؤالات متداول

تفاوت اصلی بین دستور &، nohup و ابزار tmux چیست؟

دستور & فرایند را در پس‌زمینه اجرا می‌کند اما با بستن ترمینال متوقف می‌شود. nohup مانع از بسته‌شدن برنامه با بستن پنجره می‌شود اما امکان اتصال مجدد تعاملی ندارد. اما tmux نشستی ماندگار می‌سازد که می‌توان از آن جدا شد (Detach)، ارتباط را قطع کرد و بعداً دوباره به همان ترمینال متصل شد (Reattach).

چگونه در ابزار htop پروسه‌هایی که بیشترین رم را مصرف می‌کنند پیدا کنیم؟

با فشردن کلید F6 یا کلید < پنجره مرتب‌سازی بر اساس ستون‌ها باز می‌شود که با انتخاب ستون MEM می‌توانید فرایندها را بر اساس مصرف حافظه مرتب کرده و پروسه‌های سنگین یا نشتی حافظه را بیابید.

نماد 2>&1 در خط فرمان چه کاربردی دارد؟

این دستور جریان خطای استاندارد (stderr یا کانال 2) را به همان کانالی که خروجی استاندارد (stdout یا کانال 1) ارسال می‌شود هدایت می‌کند تا هم خطاها و هم خروجی‌های معمولی در یک مسیر یا فایل لاگ ذخیره شوند.

ما رو توی گوگل بیشتر ببین

با افزودن نکست ادمین به «منابع ترجیحی» گوگل، درس‌ها و مطالب ما را در بخش اخبار برتر جستجو بیشتر می‌بینید.