Linux và Dòng lệnh (Command Line)¶
Dòng lệnh là giao diện chính cho kỹ thuật ML: các công việc huấn luyện, quản lý máy chủ, đường ống dữ liệu, và quản trị cụm đều diễn ra qua terminal. Tệp này trình bày shell, hệ thống tệp, quyền hạn, quản lý tiến trình, trình quản lý gói, biến môi trường, SSH, và các lệnh thiết yếu mà mọi kỹ sư ML dùng hàng ngày.
-
GUI thì tiện để lướt web. Nhưng chúng rất tệ để chạy một công việc huấn luyện trên cụm GPU từ xa lúc 2 giờ sáng. Dòng lệnh (hoặc terminal, hoặc shell) là công cụ mở rộng được: nó hoạt động trên mọi máy, có thể viết kịch bản, có tính kết hợp, và giống nhau trên laptop, máy ảo đám mây, và cụm HPC của bạn.
-
Nếu bạn là kỹ sư ML chỉ dùng Jupyter notebook và các nút của VS Code, bạn đang bỏ qua một năng suất khổng lồ. Mọi hệ thống ML sản xuất đều được triển khai, giám sát, và gỡ lỗi qua dòng lệnh.
Shell¶
-
Một shell là một chương trình đọc các lệnh từ bạn và thực thi chúng. Nó là trung gian giữa bạn và hệ điều hành (chương 13). Các shell phổ biến nhất là bash (mặc định trên hầu hết các hệ thống Linux) và zsh (mặc định trên macOS).
-
Một lệnh có dạng:
command [options] [arguments]
- Các tùy chọn sửa đổi hành vi (thường có tiền tố
-cho dạng ngắn hoặc--cho dạng dài).ls -lliệt kê định dạng dài,ls --allhiển thị các tệp ẩn. Nhiều tùy chọn có thể kết hợp:ls -langhĩa là-lvà-acùng nhau.
Điều hướng Thiết yếu¶
pwd # in thư mục làm việc (tôi đang ở đâu?)
ls # liệt kê các tệp trong thư mục hiện tại
ls -la # liệt kê mọi tệp (kể cả ẩn) với chi tiết
cd /path/to/dir # đổi thư mục
cd .. # lùi lên một cấp
cd ~ # về thư mục home
cd - # quay lại thư mục trước
Các Thao tác Tệp¶
cp source dest # sao chép tệp
cp -r dir1 dir2 # sao chép thư mục đệ quy
mv old new # di chuyển/đổi tên tệp
rm file # xóa tệp (không có thùng rác — mất vĩnh viễn)
rm -rf dir # xóa thư mục đệ quy (NGUY HIỂM — không xác nhận)
mkdir -p a/b/c # tạo các thư mục lồng nhau
touch file.txt # tạo tệp rỗng (hoặc cập nhật dấu thời gian)
cat file.txt # in nội dung tệp
head -n 20 file # 20 dòng đầu
tail -f logfile # theo dõi một tệp log theo thời gian thực (vô giá trị để giám sát huấn luyện)
- Cạm bẫy:
rm -rflà lệnh nguy hiểm nhất trong máy tính. Không có hoàn tác. Hãy kiểm tra đường dẫn ba lần trước khi nhấn enter. Không bao giờ chạyrm -rf /hayrm -rf ~.
Ống dẫn và Chuyển hướng (Pipes and Redirection)¶
-
Tính năng sát thủ của shell là tính kết hợp (composability): các lệnh nhỏ được nối với nhau để làm những việc phức tạp.
-
Ống dẫn (Pipe) (
|): gửi đầu ra của lệnh này làm đầu vào cho lệnh tiếp theo.
cat training.log | grep "loss" | tail -5 # 5 dòng cuối chứa "loss"
ps aux | grep python # tìm các tiến trình Python đang chạy
history | grep "docker" # tìm các lệnh docker trước đây
- Chuyển hướng: gửi đầu ra vào một tệp thay vì màn hình.
python train.py > output.log 2>&1 # stdout VÀ stderr vào tệp
python train.py >> output.log # thêm vào (không ghi đè)
echo "data" > file.txt # ghi đè tệp
echo "more" >> file.txt # thêm vào tệp
2>&1chuyển hướng stderr (mô tả tệp 2) sang stdout (mô tả tệp 1). Thiếu nó, các thông báo lỗi vẫn hiện trên màn hình trong khi chỉ đầu ra bình thường được ghi vào tệp.
Xử lý Văn bản¶
grep "error" logfile.txt # tìm các dòng chứa "error"
grep -r "import torch" src/ # tìm đệ quy trong thư mục
grep -i "warning" log.txt # tìm không phân biệt hoa/thường
grep -c "epoch" train.log # đếm các dòng khớp
wc -l file.txt # đếm dòng
wc -w file.txt # đếm từ
sort data.txt # sắp xếp các dòng theo bảng chữ cái
sort -n numbers.txt # sắp xếp theo số
sort -u data.txt # sắp xếp và xóa trùng lặp
uniq -c sorted.txt # đếm các dòng trùng lặp liên tiếp
cut -d',' -f2,3 data.csv # trích xuất cột 2 và 3 từ CSV
awk '{print $1, $3}' data.txt # in trường cách khoảng trắng thứ 1 và 3
sed 's/old/new/g' file.txt # thay thế mọi xuất hiện của "old" bằng "new"
- Chúng kết hợp tuyệt đẹp:
# Tìm 10 loại lỗi phổ biến nhất trong một tệp log
grep "ERROR" app.log | awk -F': ' '{print $2}' | sort | uniq -c | sort -rn | head -10
Tìm kiếm Tệp¶
find . -name "*.py" # tìm mọi tệp Python
find . -name "*.pyc" -delete # tìm và xóa các tệp Python đã biên dịch
find /data -size +100M # các tệp lớn hơn 100 MB
find . -mtime -1 # các tệp sửa đổi trong 24 giờ qua
which python # python executable ở đâu?
locate filename # tìm tệp nhanh (dùng chỉ mục đã xây dựng)
Phân cấp Hệ thống Tệp¶
- Linux tổ chức mọi thứ trong một cây duy nhất có gốc tại
/:
| Thư mục | Mục đích |
|---|---|
/ |
Gốc của toàn bộ hệ thống tệp |
/home/user |
Các tệp cá nhân, cấu hình, dự án của bạn |
/etc |
Các tệp cấu hình toàn hệ thống |
/usr |
Chương trình người dùng, thư viện, tài liệu |
/usr/local |
Phần mềm cài đặt cục bộ (không từ trình quản lý gói) |
/var |
Dữ liệu biến đổi: log (/var/log), cơ sở dữ liệu, bộ nhớ đệm |
/tmp |
Các tệp tạm thời (xóa khi khởi động lại) |
/opt |
Phần mềm bên thứ ba tùy chọn |
/proc |
Hệ thống tệp ảo phơi bày thông tin hạt nhân và tiến trình |
/dev |
Các tệp thiết bị (ổ đĩa, GPU xuất hiện ở đây) |
- Đối với ML: dữ liệu huấn luyện của bạn thường ở
/datahoặc/home/user/data, các mô hình ở/home/user/models, và CUDA nằm trong/usr/local/cuda. Các thiết bị GPU xuất hiện dưới dạng/dev/nvidia0,/dev/nvidia1, v.v.
Quyền hạn Tệp¶
- Mọi tệp và thư mục đều có ba loại quyền hạn cho ba lớp người dùng:
| Quyền hạn | Tệp | Thư mục |
|---|---|---|
| r (đọc) | Xem nội dung | Liệt kê nội dung |
| w (ghi) | Sửa đổi nội dung | Tạo/xóa tệp bên trong |
| x (thực thi) | Chạy như chương trình | Vào (cd vào) thư mục |
- Ba lớp người dùng: owner (u), group (g), others (o).
ls -l script.py
# -rwxr-xr-- 1 henry ml_team 2048 Mar 28 script.py
# ^^^ owner permissions: rwx (đọc, ghi, thực thi)
# ^^^ group permissions: r-x (đọc, thực thi, không ghi)
# ^^^ others permissions: r-- (chỉ đọc)
chmod 755 script.py # owner=rwx, group=rx, others=rx
chmod +x script.py # thêm quyền thực thi cho mọi người
chmod u+w,g-w file.txt # thêm ghi cho owner, bớt ghi cho group
chown henry:ml_team file # đổi owner và group
- Cạm bẫy: một script Python có
#!/usr/bin/env python3ở đầu cần quyền thực thi (chmod +x) để chạy như./script.py. Thiếu nó, bạn phải dùngpython3 script.py.
Quản lý Tiến trình¶
- Một tiến trình (process) là một chương trình đang chạy (chương 13). Shell cung cấp các công cụ để quản lý chúng:
ps aux # liệt kê mọi tiến trình đang chạy
ps aux | grep python # tìm các tiến trình Python
top # trình giám sát tiến trình thời gian thực (CPU, bộ nhớ)
htop # phiên bản tốt hơn của top (cài riêng)
nvidia-smi # mức dùng GPU (thiết yếu cho ML)
watch -n 1 nvidia-smi # làm mới nvidia-smi mỗi giây
kill PID # chấm dứt tiến trình nhẹ nhàng
kill -9 PID # ép buộc kill (dùng khi cách nhẹ nhàng thất bại)
killall python # kill mọi tiến trình Python
# Chạy ở nền
python train.py & # chạy ở nền
nohup python train.py > log.txt & # chạy ở nền, sống sót qua logout
-
nohuplà then chốt cho huấn luyện ML: thiếu nó, việc đóng kết nối SSH sẽ giết chết công việc huấn luyện.nohuptách tiến trình khỏi terminal. -
screenvàtmuxlà các bộ ghép kênh terminal (terminal multiplexers) tạo ra các phiên bền vững. Bạn có thể bắt đầu một công việc huấn luyện trong một phiên tmux, ngắt kết nối SSH, kết nối lại sau đó, và phiên (cùng công việc huấn luyện) vẫn đang chạy.
tmux new -s training # tạo phiên có tên
# ... bắt đầu huấn luyện ...
# Ctrl+B, rồi D # tách khỏi phiên
tmux attach -t training # gắn lại sau này (ngay cả sau khi reconnect SSH)
tmux ls # liệt kê các phiên
Các Trình quản lý Gói¶
- Gói hệ thống (phần mềm cấp OS):
# Debian/Ubuntu
sudo apt update # làm mới danh sách gói
sudo apt install htop # cài một gói
sudo apt upgrade # nâng cấp mọi gói
# macOS
brew install wget # cài qua Homebrew
- Gói Python:
pip install torch # cài từ PyPI
pip install -e . # cài dự án hiện tại ở chế độ có thể sửa
pip install -r requirements.txt # cài từ tệp requirements
pip freeze > requirements.txt # xuất các gói đã cài
# Conda (cho các phụ thuộc phức tạp như CUDA)
conda create -n myenv python=3.11
conda activate myenv
conda install pytorch torchvision cudatoolkit=12.1 -c pytorch
- Cạm bẫy: không bao giờ
pip installvào Python hệ thống. Luôn dùng một môi trường ảo (python -m venv env,conda create, hoặcuv venv). Python hệ thống được chia sẻ bởi các công cụ OS; phá nó có thể phá vỡ hệ thống của bạn.
Biến Môi trường¶
- Biến môi trường là các cặp khóa-giá trị mà mọi chương trình đều truy cập được. Chúng cấu hình hành vi mà không cần sửa code.
export CUDA_VISIBLE_DEVICES=0,1 # chỉ dùng GPU 0 và 1
export PYTHONPATH=/home/user/src # thêm vào đường dẫn import của Python
export WANDB_API_KEY=abc123 # khóa API cho Weights & Biases
echo $PATH # xem PATH hiện tại
export PATH=$PATH:/usr/local/cuda/bin # thêm CUDA vào PATH
-
.bashrc(hoặc.zshrc): các lệnh chạy mỗi khi bạn mở một shell. Hãy đặt các câu lệnhexportcủa bạn ở đây để chúng tồn tại lâu dài. -
Các tệp
.env: các biến riêng cho từng dự án được tải bởi các công cụ nhưpython-dotenv. Giữ các bí mật (khóa API, mật khẩu cơ sở dữ liệu) trong.envvà thêm.envvào.gitignore. Không bao giờ commit bí mật lên git.
SSH (Secure Shell)¶
- SSH kết nối bạn với các máy từ xa qua một kênh được mã hóa. Đây là cách bạn truy cập các máy ảo đám mây, máy chủ GPU, và các cụm HPC.
ssh user@hostname # kết nối với máy từ xa
ssh -i ~/.ssh/key.pem user@ip # kết nối với khóa cụ thể
ssh -L 8888:localhost:8888 user@server # chuyển tiếp cổng (Jupyter trên máy từ xa)
- Khóa SSH (cặp khóa công khai/riêng tư) thay thế mật khẩu:
ssh-keygen -t ed25519 # sinh cặp khóa
ssh-copy-id user@server # sao chép khóa công khai lên máy chủ
# giờ bạn có thể SSH mà không cần gõ mật khẩu
- Cấu hình SSH (
~/.ssh/config) lưu các chi tiết kết nối:
Host gpu-server
HostName 10.0.1.42
User henry
IdentityFile ~/.ssh/gpu_key
LocalForward 8888 localhost:8888
-
Giờ
ssh gpu-serverkết nối với tất cả các cài đặt đó tự động. -
scpvàrsynctruyền tệp giữa các máy:
scp model.pt user@server:/data/models/ # sao chép tệp lên máy từ xa
scp -r user@server:/data/results/ ./ # sao chép thư mục từ máy từ xa
rsync -avz --progress data/ user@server:/data/ # đồng bộ với tiến trình (thông minh hơn scp)
Tờ che (Cheat Sheet) các Lệnh ML Thiết yếu¶
# Giám sát GPU
nvidia-smi # ảnh chụp mức dùng GPU
watch -n 1 nvidia-smi # giám sát trực tiếp
gpustat # cái nhìn GPU sạch hơn (pip install gpustat)
# Quản lý huấn luyện
nohup python train.py > train.log 2>&1 & # huấn luyện nền sống sót qua logout
tail -f train.log # giám sát đầu ra huấn luyện
kill %1 # kill công việc nền cuối cùng
# Dùng đĩa (tập dữ liệu rất lớn)
df -h # không gian đĩa trên mọi mount
du -sh /data/* # kích thước của mỗi mục trong /data
du -sh --max-depth=1 . # kích thước các thư mục con
# Bộ nhớ
free -h # dùng RAM
cat /proc/meminfo # thông tin bộ nhớ chi tiết
# Mạng
curl -O https://example.com/dataset.tar.gz # tải tệp
wget https://example.com/model.bin # trình tải thay thế
curl -X POST http://localhost:8080/predict \
-H "Content-Type: application/json" \
-d '{"text": "hello"}' # test một endpoint phục vụ mô hình
# Lưu trữ
tar -czf archive.tar.gz directory/ # nén
tar -xzf archive.tar.gz # giải nén
zip -r archive.zip directory/ # zip
unzip archive.zip # unzip
# Kiểm tra dữ liệu nhanh
head -5 data.csv # 5 dòng đầu của CSV
wc -l data.csv # đếm dòng
cut -d',' -f1 data.csv | sort -u | wc -l # đếm các giá trị duy nhất trong cột 1