必须在Sublime构建系统中显式调用bash -i -c "conda activate dl && python train.py"并加-i参数以加载conda环境;tqdm需禁用动态刷新或改用logging写入文件;训练卡顿时需结合nvidia-smi和tail -f train.log诊断,不能仅依赖Sublime Build输出。

conda activate dl 是你启动训练前必须做的第一件事,否则所有依赖(如 torch、tqdm、matplotlib)都会报错或版本不匹配。
Sublime 本身不运行训练,它只编辑代码;真正执行训练的是终端里的 Python 解释器——所以环境激活和日志输出路径必须对齐。
如何在 Sublime 中确保 conda activate dl 生效
Sublime 的构建系统默认调用的是系统 shell(通常是 /bin/bash 或 zsh),但 conda 环境变量只在交互式 shell 中自动加载。如果你直接配置 Sublime 构建为 python train.py,大概率会提示 ModuleNotFoundError: No module named 'torch'。
- 不要依赖 Sublime 内置的“Build System”自动识别 conda 环境
- 改用显式调用:在 Sublime 的 Build System 中写完整命令,例如:
{ "cmd": ["bash", "-i", "-c", "conda activate dl && python train.py"], "shell": true, "working_dir": "${project_path}" } -
-i参数关键:让 bash 以交互模式启动,从而加载~/.bashrc里的 conda 初始化逻辑 - 如果用 zsh,把
bash换成zsh,并确认~/.zshrc已执行过conda init zsh
tqdm 进度条在 Sublime 终端里不刷新?
Sublime 的内置终端(Tools > Build)本质是只读输出流,不支持光标回退和覆盖重绘——而 tqdm 默认使用 sys.stdout 并依赖 \r 控制符实现行内刷新。结果就是每 epoch 打印一整行,堆满屏幕,失去“进度感”。
- 训练脚本中初始化
tqdm时,强制禁用动态刷新:tqdm(train_loader, desc=f'Epoch {epoch+1}', dynamic_ncols=True, leave=True, file=sys.stdout) - 更稳妥的做法:改用日志方式替代实时进度条,尤其适合 Sublime 场景:
import logging logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(message)s', handlers=[logging.FileHandler('train.log')]) # 训练循环中 logging.info(f'Epoch {epoch+1}/{num_epochs} | loss: {loss:.4f} | acc: {acc:.3f}') - 配合 VSCode 或系统终端看
tail -f train.log,比硬塞进 Sublime 终端更可靠
为什么不能只靠 Sublime 的 Build 输出判断训练是否卡住
PyTorch 训练中常见假死现象:GPU 显存占满但没报错、数据加载器卡在 __getitem__、pin_memory=True 遇到共享内存不足——这些都不会抛出 Python 异常,print 或 tqdm 也停在某一行不动。
- 务必在训练循环开头加一个轻量级健康检查:
if batch_idx == 0: print(f'[INFO] GPU memory: {torch.cuda.memory_allocated()/1024**2:.1f} MB') - 观察
nvidia-smi输出:如果GPU-Util长期为 0%,说明卡在数据加载或 CPU 侧;如果持续 90%+ 但 loss 不降,可能是梯度爆炸或学习率过高 - Sublime 的 Build 窗口无法执行
nvidia-smi,得另开终端查——这点容易被忽略
真正卡住时,Sublime 的 Build 输出往往静默几秒就断掉,而不是持续滚动。别盯着那一行 Epoch 1/100 看,先去终端敲 nvidia-smi 和 tail -f train.log。

















