بخش عمدهای از زمان مهندسان یادگیری ماشین و هوش مصنوعی نه در ادیتورهای کد، بلکه در محیط خط فرمان میگذرد. اجرای پایپلاینهای سنگین آموزش مدل، اتصال به سرورهای ابری، بررسی لاگهای زنده و پایش مصرف حافظه کارت گرافیک، همگی نیازمند تسلط بیدردسر بر ترمینال و شل هستند. اگر در کار با خط فرمان کند باشید، تمام فرایند توسعه و آزمایش مدلهای شما با تأخیر مواجه میشود.
در کار عملی، فرایندهای آموزش ساعتها یا حتی روزها زمان میبرند و نمیتوان یک پنجره ترمینال را دائماً باز نگه داشت. استفاده از ابزارهایی مثل tmux این امکان را میدهد که نشستهای ماندگار بسازید، چندین قاب برای پایش همزمان منابع سیستم (CPU و GPU) باز کنید، بدون نگرانی از قطع ارتباط اینترنت از سرور جدا شوید و سپس دوباره به همان وضعیت بازگردید.
از طرفی برای کاربران ایرانی که دسترسی به سرویسهای ابری خارجی و کارتهای گرافیک قدرتمند بهدلیل مسائل پرداخت ارزی دشوار و پرهزینه است، استفاده بهینه از سرورهای اختصاصی یا ماشینهای محلی اهمیت دوچندانی دارد. مدیریت درست پروسهها با دستوراتی مثل htop، nvtop و بازهدایت لاگها مانع از توقفهای ناخواسته بر اثر کمبود حافظه (OOM) و هدررفت منابع پردازشی در دسترس میشود.
ترمینال خانهی مهندسان هوش مصنوعی است. اینجا باید کاملاً احساس راحتی کنید.
اهداف یادگیری
- استفاده از پایپ (Piping)، بازهدایتها (Redirects) و
grepبرای فیلتر و پردازش لاگهای آموزش از خط فرمان - ساخت نشستهای ماندگار tmux با چندین قاب (Pane) برای اجرای همزمان آموزش و پایش GPU
- پایش منابع سیستم و GPU با ابزارهای
htop،nvtopوnvidia-smi - انتقال فایل بین سیستم محلی و مخزن راهدور با استفاده از SSH،
scpوrsync
صورت مسئله
بیشتر از هر محیط ویرایشگری، در ترمینال وقت خواهید گذراند: اجرای فرایندهای آموزش، پایش GPU، دنبال کردن لحظهای لاگها، نشستهای SSH راهدور و مدیریت محیطها. تکتک جریانهای کاری هوش مصنوعی با شل (Shell) سروکار دارند. اگر اینجا کند باشید، همهجا کند خواهید بود.
این درس مهارتهایی از ترمینال را پوشش میدهد که در کار هوش مصنوعی اهمیت دارند؛ نه تاریخچهی یونیکس و نه کندوکاو عمیق در اسکریپتنویسی Bash؛ فقط همان چیزهایی که نیاز دارید.
مفاهیم پایه
سه برنامه همزمان در یک ترمینال اجرا میشوند. میتوانید از نشست جدا شوید (Detach)، به خانه بروید، دوباره با SSH وصل شوید و مجدداً به نشست متصل شوید (Reattach). فرایند آموزش همچنان به کارش ادامه میدهد.
پیادهسازی از صفر
گام 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) | صرفهجویی در زمان برای دستورات تکراری |
تمرینها
- ابزار tmux را نصب کنید، نشستی با سه قاب بسازید و در یکی
htop، در دومیwatch -n1 dateو در سومی یک اسکریپت پایتون را اجرا کنید. از نشست خارج شوید (Detach) و دوباره به آن وصل شوید (Reattach). - نامهای مستعار موجود در
code/shell_aliases.shرا به تنظیمات شل خود اضافه و باsource ~/.zshrc(یا~/.bashrc) دوباره بارگذاری کنید. - با دستور
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 را بیرون بکشید. - یک مدخل پیکربندی 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)؛ پروتکلی رمزگذاریشده برای اجرای دستورها روی یک مخزن راهدور |
