终端与 Shell:AI 工程师的主战场 本节摘要:终端(Terminal)是 AI 工程师生活的地方——在这里待得舒服,效率就高。你花在终端里的时间会比任何编辑器都多:训练任务、GPU 监控、日志跟踪、远程 SSH 会话、环境管理,每个 AI 工作流都触到 shell。在这里慢,到处都慢。本节只讲 AI 工作真正用得上的终端技能:用管道(pipe)、重定向与 过滤处理训练日志,用 tmux 建持久多窗格会话同时跑训练与监控(断开 SSH 也不中断),用 、 、 监控系统与 GPU 资源,用 SSH、 、 在本地与远程机器间传文件。读完本节,你能用一条命令搞定日志分析,用 tmux 让训练在你回家后继续跑,用端口转发把远程 Jupyter 当本地用。
本节摘要:终端(Terminal)是 AI 工程师生活的地方——在这里待得舒服,效率就高。你花在终端里的时间会比任何编辑器都多:训练任务、GPU 监控、日志跟踪、远程 SSH 会话、环境管理,每个 AI 工作流都触到 shell。在这里慢,到处都慢。本节只讲 AI 工作真正用得上的终端技能:用管道(pipe)、重定向与
grep过滤处理训练日志,用 tmux 建持久多窗格会话同时跑训练与监控(断开 SSH 也不中断),用htop、nvtop、nvidia-smi监控系统与 GPU 资源,用 SSH、scp、rsync在本地与远程机器间传文件。读完本节,你能用一条命令搞定日志分析,用 tmux 让训练在你回家后继续跑,用端口转发把远程 Jupyter 当本地用。
对应原课程:Phase 00 · Lesson 10 ·
terminal-and-shell(原英文phases/00-setup-and-tooling/10-terminal-and-shell/docs/en.md)。前置:第 01 节「开发环境」。
阅读完本节,你应当能够:
grep 从命令行过滤与处理训练日志。htop、nvtop、nvidia-smi 监控系统与 GPU 资源。scp、rsync 在本地与远程机器间传文件。你花在终端里的时间会比任何编辑器都多:训练任务、GPU 监控、日志跟踪、远程 SSH 会话、环境管理,每个 AI 工作流都触到 shell。在这里慢,到处都慢。
本节只讲 AI 工作真正用得上的终端技能——不讲 Unix 历史,不深入 Bash 脚本,只讲你需要的。
典型的 AI 终端工作场景:
三件事同时跑,一个终端窗口搞定。你可以断开(dettach),回家,SSH 重连,再接上(reattach)——训练一直在跑。
💡 这就是 tmux 的魔力:它把终端会话与你的 SSH 连接解耦。网络断了、笔记本合上了、下班回家了,会话里的进程都继续跑。这是远程 GPU 训练的标配。
echo $SHELL # 多数系统是 bash 或 zsh,本课程命令两者通用
最该先学的快捷键是历史搜索:Ctrl+R 然后输入之前命令的一部分,再按 Ctrl+R 在匹配间循环——这是你将用得最多的快捷键。其他必备:Ctrl+L 清屏,Ctrl+C 取消运行中命令,Ctrl+Z 挂起(用 fg 恢复)。
管道把命令串起来,这是你处理日志、过滤输出、串联工具的方式——会反复用到:
# 统计日志里 "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 # 标准输出与标准错误分别写两个文件 python train.py > output.log 2> errors.log # 都写进同一个文件 python train.py > train_full.log 2>&1
| 符号 | 作用 |
|---|---|
> |
标准输出写文件(覆盖) |
>> |
标准输出追加到文件 |
2> |
标准错误写文件 |
2>&1 |
标准错误送到与标准输出同一处 |
| ` | ` |
设计要点:
2>&1是把训练任务的日志(标准输出)与报错(标准错误)都收进一个文件的标准写法——训练出错时,你能在一个文件里同时看到进度日志与异常堆栈,定位快得多。
训练一跑就是几小时,你不想一直开着终端:
python train.py & # 后台跑(输出仍到终端) nohup python train.py > train.log 2>&1 & # 后台跑,关终端也死不了 jobs # 看后台在跑啥 ps aux | grep train.py # 找进程 fg %1 # 把后台任务调回前台 kill %1 # 杀后台任务 kill $(pgrep -f "train.py") # 按 PID 杀
| 方法 | 关终端能活? | 能重新接上? |
|---|---|---|
command & |
否 | 否 |
nohup command & |
是 | 否(看日志文件) |
screen / tmux |
是 | 是 |
超过几分钟的任务,用 tmux。
tmux 让你创建带多窗格的持久终端会话——这是管理训练任务最有用的单一工具:
tmux new -s training # 起一个命名会话 # Ctrl+B 再按 " 水平分屏 # Ctrl+B 再按 % 垂直分屏 # Ctrl+B 再按方向键 切窗格 # Ctrl+B 再按 d 断开(会话继续跑) tmux attach -t training # 重新接上 tmux ls # 列出会话 tmux kill-session -t training # 杀会话
典型 AI 工作流:
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
htop # 系统进程(比 top 好) nvtop # GPU 进程(NVIDIA 卡) nvidia-smi # 快速 GPU 检查 watch -n1 nvidia-smi # 每秒刷新 GPU 用量 nvidia-smi --query-compute-apps=pid,name,used_memory --format=csv # 看谁在用 GPU
htop 常用键:F6/> 按列排序(按内存排找泄漏),F5 切树视图,F9 杀进程,/ 搜索进程名。
租了云端 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/ # 同步整个目录(多文件更快) ssh -L 8888:localhost:8888 user@gpu-box-ip # 端口转发,远程 Jupyter 当本地用
把主机写进 ~/.ssh/config 后,直接 ssh gpu 一键连(见第 08 节)。
💡 端口转发是远程开发的杀手锏:
ssh -L 8888:localhost:8888之后,远程的 Jupyter/TensorBoard 就能在你本地浏览器localhost:8888打开,体感与本地无异。
把原课程 code/shell_aliases.sh 加进你的 ~/.bashrc 或 ~/.zshrc。关键几条:
alias gpu='nvidia-smi --query-gpu=index,name,utilization.gpu,memory.used,memory.total,temperature.gpu --format=csv,noheader' # GPU 一览 alias killtraining='pkill -f "python.*train"' # 杀所有训练进程 alias ae='source .venv/bin/activate' # 快速激活虚拟环境 alias watchloss='tail -f logs/*.log | grep --line-buffered "loss"' # 跟踪训练 loss
# 跑训练,全记日志,完成后通知 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 xzf dataset.tar.gz -C ./data/ # 统计所有 Python 文件行数(看项目多大) find . -name "*.py" | xargs wc -l | tail -1 # 看磁盘空间(训练数据很快塞满) df -h du -sh ./data/* # 训练前查环境变量 env | grep -i cuda env | grep -i torch
| 方式 | 关终端存活 | 能重新接上 | 适用 |
|---|---|---|---|
command & |
否 | 否 | 几秒的快速任务 |
nohup command & |
是 | 否(靠日志文件) | 几分钟到几小时 |
screen / tmux |
是 | 是 | 长训练、需要持续交互 |
💡 决策树:几秒 →
&;几分钟且不用回看 →nohup;长训练或要随时回去看 → tmux。AI 工作里 tmux 几乎是必装的,第 03 节讲的云端 GPU 训练,没 tmux 简直没法用。
本节产出(原课程 code/ 与 outputs/):
shell_aliases.sh:一组 AI 工作常用别名(gpu 一览、杀训练、激活 venv、看 loss 等),加进 shell 配置即可。htop,一个跑 watch -n1 date,一个跑个 Python 脚本;练习断开(dettach)与重新接上(reattach),确认断开后进程继续跑。code/shell_aliases.sh 的别名加进你的 shell 配置,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 值。localhost 练手)配一个 SSH config 条目,实现 ssh 短名 一键连;再用 rsync -avz 同步一个本地目录到远程,对比 scp 的速度差异;最后用 ssh -L 端口转发,在远程跑一个 Jupyter,本地浏览器打开。Ctrl+R 历史搜索:最该先学的快捷键,反复按在匹配间循环。| 串联命令、>/>>/2>/2>&1 重定向输出,日志处理的核心。2>&1 收齐日志:标准输出与标准错误进同一文件,出错时定位快。&(几秒)、nohup(几分钟、不回看)、tmux(长训练、要交互)。htop/nvtop/nvidia-smi:系统与 GPU 资源一目了然,watch -n1 每秒刷新。scp/rsync + 端口转发:连远程、传文件、远程 Jupyter 当本地用,远程 GPU 开发的三板斧。gpu、killtraining、ae、watchloss 这类高频命令写成别名。下一节,我们将进入「面向 AI 的 Linux」——在终端基础上,补齐 AI 工程师在 Linux 服务器上必须掌握的系统级知识与排障技能。