بخش عمدهی پروژهها و زیرساختهای هوش مصنوعی روی توزیعهای لینوکس اجرا میشوند. حتی اگر روی سیستمعامل مک یا ویندوز کدنویسی کنید، بهمحض اتصال به یک سرور ابری مجهز به پردازندهی گرافیکی (GPU) یا راهاندازی سرور استنتاج، محیط گرافیکی ناپدید میشود و فقط یک پنجرهی سیاه ترمینال پیش روی شماست.
تهیهی کارتهای گرافیک قدرتمند یا اجارهی سرورهای ابری خارجی هزینهبر و دشوار است؛ بنابراین اتلاف وقت برای یادگیری مقدمات ترمینال حین کار با سرورهای پردازشی، مستقیماً به هدررفت منابع منجر میشود. این درس شما را دقیقاً با همان دستورهای کلیدی، مدیریت دسترسیها، تمیزکاری دیسک و ابزارهایی مثل tmux آشنا میکند تا سرور را بهراحتی کنترل کنید و فرایندهای طولانی آموزش مدل متوقف نشوند.
بیشتر پردازشهای هوش مصنوعی روی لینوکس اجرا میشوند. باید در حدی لینوکس بلد باشید که کارتان لنگ نماند.
اهداف یادگیری
- پیمایش در ساختار فایل لینوکس و انجام کارهای ضروری با فایلها از طریق خط فرمان
- مدیریت دسترسی فایلها با
chmodوchownبرای برطرف کردن خطاهای «Permission denied» - نصب بستههای سیستمی با
aptو راهاندازی یک ماشین مجهز به GPU خام برای کارهای هوش مصنوعی - شناسایی تفاوتهای macOS با لینوکس که معمولاً توسعهدهندگان را هنگام کار روی ماشینهای راهدور به دردسر میاندازند
صورت مسئله
شما روی macOS یا Windows کد میزنید؛ اما بهمحض اینکه به یک ماشین ابری مجهز به پردازندهی گرافیکی (GPU) متصل میشوید (از طریق SSH)، نمونهای در Lambda اجاره میکنید یا ماشینی در EC2 بالا میآورید، با Ubuntu روبهرو میشوید. ترمینال تنها رابط کاربری شماست. خبری از Finder، Explorer یا هیچ رابط گرافیکی نیست. اگر نتوانید در فایلسیستم جابهجا شوید، بستهها را نصب کنید و پردازهها را از خط فرمان مدیریت کنید، پای پرداخت هزینهی ساعتهای بیاستفادهی GPU میمانید، درحالیکه دارید عبارت «how to unzip a file in Linux» را گوگل میکنید.
این متن یک راهنمای بقاست. دقیقاً به همان چیزهایی میپردازیم که برای کار با یک ماشین لینوکسی راهدور در پروژههای هوش مصنوعی لازم دارید؛ نه کمتر و نه بیشتر.
ساختار فایلسیستم
لینوکس همهچیز را زیر یک ریشهی واحد به نام / سازماندهی میکند. در لینوکس خبری از درایو C:\ یا /Volumes نیست. پوشههایی که واقعاً با آنها سروکار خواهید داشت:
پوشهی خانگی (Home directory) شما ~ یا همان /home/your-username است. تقریباً تمام کارهای شما در همین پوشه انجام میشود.
دستورهای ضروری
این 13 دستور بخش عمدهی کارهایی را که روی یک ماشین GPU راهدور نیاز دارید، پوشش میدهند.
جابهجایی در مسیرها
pwd # Where am I?
ls # What's here?
ls -la # What's here, including hidden files with details?
cd /path/to/dir # Go there
cd ~ # Go home
cd .. # Go up one level
فایلها و پوشهها
mkdir my-project # Create a directory
mkdir -p a/b/c # Create nested directories in one shot
cp file.txt backup.txt # Copy a file
cp -r src/ src-backup/ # Copy a directory (recursive)
mv old.txt new.txt # Rename a file
mv file.txt /tmp/ # Move a file
rm file.txt # Delete a file (no trash, it's gone)
rm -rf my-dir/ # Delete a directory and everything inside
دستور rm -rf غیرقابلبازگشت است؛ راهی برای بازگردانی وجود ندارد. قبل از زدن کلید اینتر، حتماً مسیر را دوباره بررسی کنید.
خواندن فایلها
cat file.txt # Print entire file
head -20 file.txt # First 20 lines
tail -20 file.txt # Last 20 lines
tail -f log.txt # Follow a log file in real time (Ctrl+C to stop)
less file.txt # Scroll through a file (q to quit)
جستجو
grep "error" training.log # Find lines containing "error"
grep -r "learning_rate" . # Search all files in current directory
grep -i "cuda" config.yaml # Case-insensitive search
find . -name "*.py" # Find all Python files under current dir
find . -name "*.ckpt" -size +1G # Find checkpoint files larger than 1GB
دسترسیها
هر فایلی در لینوکس یک مالک (Owner) و بیتهای دسترسی (Permission bits) دارد. معمولاً زمانی با این موضوع روبهرو میشوید که اسکریپتها اجرا نمیشوند یا اجازهی نوشتن در پوشهای را ندارید.
ls -l train.py
# -rwxr-xr-- 1 user group 2048 Mar 19 10:00 train.py
# ^^^ مجوزهای مالک: خواندن، نوشتن، اجرا
# ^^^ مجوزهای گروه: خواندن، اجرا
# ^^ سایر کاربران: فقط خواندن
راهحلهای رایج:
chmod +x train.sh # Make a script executable
chmod 755 deploy.sh # Owner: full, others: read+execute
chmod 644 config.yaml # Owner: read+write, others: read only
chown user:group file.txt # Change who owns a file (needs sudo)
وقتی سیستم پیام «Permission denied» میدهد، تقریباً همیشه پای مشکل دسترسی در میان است. در بیشتر موارد دستور chmod +x یا استفاده از sudo مشکل را برطرف میکند.
مدیریت بستهها (apt)
سیستمعامل Ubuntu از apt استفاده میکند. با این دستور نرمافزارهای سطح سیستم را نصب میکنید.
sudo apt update # Refresh the package list (always do this first)
sudo apt install -y htop # Install a package (-y skips confirmation)
sudo apt install -y build-essential # C compiler, make, etc. Needed by many Python packages
sudo apt install -y tmux # Terminal multiplexer (keep sessions alive after disconnect)
apt list --installed # What's installed?
sudo apt remove htop # Uninstall
بستههای متداولی که روی یک ماشین GPU تازه نصب خواهید کرد:
sudo apt update && sudo apt install -y \
build-essential \
git \
curl \
wget \
tmux \
htop \
unzip \
python3-venv
کاربران و sudo
معمولاً با یک حساب کاربری عادی وارد سیستم میشوید؛ اما برخی کارها به دسترسی root (مدیر سیستم) نیاز دارند.
whoami # What user am I?
sudo command # Run a single command as root
sudo su # Become root (exit to go back, use sparingly)
روی نمونههای GPU در ابر، معمولاً تنها کاربر ماشین هستید و از قبل دسترسی sudo دارید. لازم نیست همهچیز را با root اجرا کنید؛ فقط در صورت ضرورت به سراغ sudo بروید.
پردازهها و systemd
زمانی که فرایند آموزش مدل متوقف میشود یا میخواهید پردازههای در حال اجرا را بررسی کنید:
htop # Interactive process viewer (q to quit)
ps aux | grep python # Find running Python processes
kill 12345 # Gracefully stop process with PID 12345
kill -9 12345 # Force kill (use when graceful doesn't work)
nvidia-smi # GPU processes and memory usage
سیستم systemd وظیفهی مدیریت سرویسها (دیمونهای پسزمینه) را بر عهده دارد. در صورتی که سرور استنتاج اجرا کنید، با آن سروکار خواهید داشت:
sudo systemctl start nginx # Start a service
sudo systemctl stop nginx # Stop it
sudo systemctl restart nginx # Restart it
sudo systemctl status nginx # Check if it's running
sudo systemctl enable nginx # Start automatically on boot
فضای دیسک
ماشینهای GPU معمولاً فضای دیسک محدودی دارند. مدلها و مجموعههای داده خیلی سریع این فضا را پر میکنند.
df -h # Disk usage for all mounted drives
df -h /home # Disk usage for /home specifically
du -sh * # Size of each item in current directory
du -sh ~/.cache # Size of your cache (pip, huggingface models land here)
du -sh /data/checkpoints/ # Check how big your checkpoints are
# یافتن بزرگترین فایلها و پوشههای اشغالکننده دیسک
du -h --max-depth=1 / 2>/dev/null | sort -hr | head -20
راههای متداول برای آزادسازی فضا:
# پاکسازی کَش pip
pip cache purge
# پاکسازی کَش apt
sudo apt clean
# حذف چکپوینتهای قدیمی و بلااستفاده
rm -rf checkpoints/epoch_01/ checkpoints/epoch_02/
شبکه
دانلود مدلها، انتقال فایلها و ارسال درخواست به APIها، همگی از خط فرمان انجام خواهند شد.
# دانلود فایلها
wget https://example.com/model.bin # Download a file
curl -O https://example.com/data.tar.gz # Same thing with curl
curl -s https://api.example.com/health | python3 -m json.tool # Hit an API, pretty-print JSON
# انتقال فایلها بین ماشینها
scp model.bin user@remote:/data/ # Copy file to remote machine
scp user@remote:/data/results.csv . # Copy file from remote to local
scp -r user@remote:/data/checkpoints/ ./local-dir/ # Copy directory
# همگامسازی دایرکتوریها (سریعتر از scp برای حجمهای بالا، با قابلیت ادامهی انتقال پس از خطا)
rsync -avz --progress ./data/ user@remote:/data/
rsync -avz --progress user@remote:/results/ ./results/
برای فایلهای حجیم به جای scp حتماً از rsync استفاده کنید؛ این ابزار فقط بایتهای تغییریافته را جابهجا میکند و قطعی اتصال را هم تاب میآورد.
ابزار tmux: زنده نگه داشتن نشستها
وقتی با SSH به یک ماشین راهدور وصل میشوید، بستن لپتاپ اجرای آموزش مدل را متوقف میکند. ابزار tmux دقیقاً جلوی همین مشکل را میگیرد.
tmux new -s train # Start a new session named "train"
# ... آموزش را آغاز کنید، سپس:
# Ctrl+B و سپس D # جدا شدن (آموزش همچنان در حال اجرا میماند)
tmux ls # List sessions
tmux attach -t train # Reattach to session
# داخل tmux:
# Ctrl+B و سپس % # تقسیم عمودی پنل
# Ctrl+B و سپس " # تقسیم افقی پنل
# Ctrl+B و سپس کلیدهای جهتنما # جابهجایی بین پنلها
کارهای طولانی آموزش مدل را همیشه داخل tmux اجرا کنید؛ همیشه.
ابزار WSL2 برای کاربران ویندوز
اگر از ویندوز استفاده میکنید، WSL2 بدون نیاز به راهاندازی بوت دوگانه (Dual-boot)، یک محیط لینوکس واقعی در اختیارتان میگذارد.
# در محیط PowerShell (با دسترسی ادمین)
wsl --install -d Ubuntu-24.04
# پس از ریاستارت، Ubuntu را از منوی Start باز کنید
sudo apt update && sudo apt upgrade -y
ابزار WSL2 از یک کرنل واقعی لینوکس استفاده میکند؛ بنابراین تمام نکات این درس داخل آن هم کار میکنند. فایلهای ویندوز شما از درون WSL در مسیر /mnt/c/Users/YourName/ در دسترس خواهند بود.
دسترسی مستقیم به پردازندهی گرافیکی (GPU passthrough) با درایورهای NVIDIA نصبشده در سمت ویندوز ممکن است. فقط درایور NVIDIA ویندوز را نصب کنید (نه نسخهی لینوکس)؛ با این کار CUDA درون WSL2 در دسترس خواهد بود.
نکات و تلهها: انتقال از macOS به لینوکس
مواردی که اگر از سیستمعامل macOS آمده باشید ممکن است شما را به اشتباه بیندازند:
| macOS | لینوکس | توضیحات |
|---|---|---|
brew install |
sudo apt install |
گاهی اوقات نام بستهها با هم تفاوت دارد. مثلاً دستورهای brew install htop و sudo apt install htop عملکرد یکسانی دارند؛ اما brew install readline در لینوکس معادل sudo apt install libreadline-dev است. |
open file.txt |
xdg-open file.txt |
البته روی یک ماشین راهدور، رابط گرافیکی وجود ندارد؛ پس از cat یا less استفاده کنید. |
pbcopy / pbpaste |
در دسترس نیست | روی بستر SSH امکان هدایت مستقیم جریان به حافظهی کلیپبورد یا خواندن از آن وجود ندارد. |
~/.zshrc |
~/.bashrc |
شل پیشفرض macOS ابزار zsh است؛ درحالیکه بیشتر سرورهای لینوکس از bash استفاده میکنند. |
/opt/homebrew/ |
/usr/bin/، /usr/local/bin/ |
محل قرارگیری فایلهای اجرایی (باینریها) متفاوت است. |
sed -i '' 's/a/b/' file |
sed -i 's/a/b/' file |
دستور sed در macOS بعد از فلگ -i به یک رشتهی خالی نیاز دارد؛ اما در لینوکس نیازی به آن نیست. |
| فایلسیستم حساس به بزرگی و کوچکی حروف نیست | فایلسیستم حساس به بزرگی و کوچکی حروف است | دو فایل Model.py و model.py در لینوکس کاملاً دو فایل متمایز از یکدیگرند. |
کاراکترهای پایان خط \n |
کاراکترهای پایان خط \n |
یکسان است؛ اما ویندوز از \r\n استفاده میکند که باعث شکستن اجرای اسکریپتهای bash میشود. برای حل این مشکل از دستور dos2unix استفاده کنید. |
برگهی تقلب دستورها
Navigation: pwd, ls, cd, find
Files: cp, mv, rm, mkdir, cat, head, tail, less
Search: grep, find
Permissions: chmod, chown, sudo
Packages: apt update, apt install
Processes: htop, ps, kill, nvidia-smi
Services: systemctl start/stop/restart/status
Disk: df -h, du -sh
Network: curl, wget, scp, rsync
Sessions: tmux new/attach/detach
تمرینها
- با SSH به یک ماشین لینوکسی متصل شوید (یا WSL2 را باز کنید) و به پوشهی خانگی خود بروید. یک پوشهی جدید برای پروژه بسازید، سه فایل خالی داخل آن با دستور
touchایجاد کنید، سپس فهرست آنها را باls -laببینید. - بستهی
htopرا با apt نصب و اجرا کنید، سپس ببینید کدام پردازه بیشترین حافظه را مصرف میکند. - یک نشست tmux جدید باز کنید، دستور
sleep 300را درون آن اجرا کنید، از آن خارج شوید (Detach)، نشستهای موجود را فهرست کنید و در نهایت دوباره به آن متصل شوید. - با دستور
df -hمیزان فضای خالی دیسک را بررسی کنید؛ سپس با دستورdu -sh ~/.cache/*ببینید چه مواردی فضای حافظهی موقت (Cache) را پر کردهاند. - فایلی را با
scpاز سیستم خود به ماشین راهدور بفرستید؛ سپس همان فایل را باrsyncمنتقل کنید و تجربهی کار با هر دو را مقایسه کنید.
راهنماییها
تمرین 1. از cd ~، mkdir و cd برای ورود به پوشهی جدید استفاده کنید و جلوی دستور touch نام سه فایل را بنویسید. در خروجی ls -la بررسی کنید که حجم این سه فایل برابر با 0 باشد و نام کاربری شما به عنوان مالک آنها ثبت شده باشد.
تمرین 2. برنامه را با دستور sudo apt install -y htop نصب کرده و آن را اجرا کنید؛ سپس کلید F6 را بزنید (یا روی نام ستون کلیک کنید) تا پردازهها بر اساس MEM% مرتب شوند. اولین پردازه در بالای این فهرست، بیشترین مصرف حافظه را دارد.
تمرین 3. طبق متن درس با دستور tmux new -s train یک نشست بسازید، sleep 300 را اجرا کنید و با زدن کلیدهای Ctrl+B و سپس d از نشست خارج شوید. با دستور tmux ls نشستها را بررسی کنید و با tmux attach -t train دوباره به آن وصل شوید؛ دستور sleep هنوز باید در حال اجرا باشد.
تمرین 4. دستور df -h را اجرا کنید و ستون Avail را برای فایلسیستمی که پوشهی خانگی شما را در خود نگه میدارد بخوانید. سپس دستور du -sh ~/.cache/* | sort -h را اجرا کنید تا بزرگترین پوشه در سطر آخر خروجی نمایش داده شود.
تمرین 5. فایل را با دستور scp file.txt user@host:~/ کپی کنید؛ بعد برای همان فایل دستور rsync -avP file.txt user@host:~/ را به کار ببرید. اگر دستور rsync را برای بار دوم اجرا کنید، میبینید که تقریباً هیچ دادهای جابهجا نمیشود؛ زیرا فایل روی مخزن راهدور تغییری نکرده است.
