YOLO从零到论文:模型改进与科研实战全攻略
YOLO基础篇 · A12
作者:迪菲赫尔曼
大家好,我是迪菲赫尔曼。
我们已经有两样东西:A10 创建的课程环境,以及 A11 放到服务器上的官方源码。走到这里,模型还没开始训练,准备工作却已经做了不少,你可能也想赶紧看到结果了。
偏偏环境安装又很容易让人着急:看到报错就搜一条命令,装完这个又升级那个,最后连原来能运行的部分也出了问题。命令执行了很多,自己却说不清到底改了哪份环境。
这也是我想把这一课拆开讲的原因。我们先认清当前 Python、已有依赖和源码的位置,检查能用的部分,再完成需要的安装。后面遇到问题时,就能沿着检查结果往回找。
今天把"装在哪里、导入哪份源码、GPU 能不能真正计算"这几件事对上,后面的训练才有一个清楚的起点。 下面就把现有环境和源码接起来。
本篇统一在远端 Linux 终端执行。 镜像已有能使用 GPU 的 PyTorch,我们先核对并复用。这里不再同时给 Windows、Mac 和 CPU 安装分支,避免你不知道到底该复制哪一组。
1. 每次开始,都先确定两件事
bash
cd /root/lanyun-tmp/yolo-study
source env/bin/activate
pwd
python -c "import sys; print(sys.executable)"
前者应是课程根目录,后者应是课程 env/bin/python。
别把这两个检查合成一个印象:目录正确不保证环境正确,环境正确也不保证安装目标正确。
再确认 A11 的源码:
bash
ls code/ultralytics-8.4.183/pyproject.toml
如果没有这个文件,先修正解压层级;不要去安装名叫 pyproject 的包。
2. PyTorch、torchvision 和 Ultralytics 分别做什么?
PyTorch 提供张量计算、神经网络层与自动求导。后面反向传播、参数更新,都要用到它。
torchvision 提供视觉相关功能,并与 PyTorch 有版本配合关系。它不是 YOLO 代码的另一个名字。
Ultralytics 在这些能力之上组织模型、数据、训练与结果。我们后面修改的就是这份项目源码。
可以先记住这个依赖方向:
text
你的训练脚本 → Ultralytics → PyTorch 等依赖 → CPU/GPU 与系统驱动
它只表示主要关系,不是全部内部调用。编辑器只是帮助你保存和发起运行,不在这条链上代替 PyTorch 计算。
3. 先看版本和 GPU 可用状态
bash
python -c "import torch, torchvision; print(torch.__version__); print(torchvision.__version__); print(torch.version.cuda); print(torch.cuda.is_available())"
我这里的结果是:
text
2.7.1+cu128
0.22.1+cu128
12.8
True
这组结果来自本次实例,不要求其他镜像逐字相同。但是本专栏跟做路线要求你确认当前环境确实可以使用 NVIDIA GPU。
如果驱动看得到显卡,当前 Python 却返回 False,可能是用了错误解释器或不合适的 PyTorch 构建。先把当前路径与错误保存下来,不能看到 False 就无条件升级所有软件。
4. 为什么两个 CUDA 版本数字不同?
在远端输入:
bash
nvidia-smi
我这台机器的驱动页面显示 CUDA 13.0,而 torch.version.cuda 是 12.8。
前者表示驱动支持的 CUDA 版本能力,后者说明这份 PyTorch 的 CUDA 构建版本。两个数字用途不同,不需要仅为了让它们看起来相同就重装驱动 。字段含义见 NVIDIA 官方 nvidia-smi 说明。
基础学习阶段,我们不修改宿主机驱动。容器里能够列出 GPU、PyTorch 能够执行 GPU 计算,才是当前要确认的结果。
5. 别只看 True,做一次真正的 GPU 计算
在服务器课程根目录新建 gpu_check.py,保存下面代码:
python
import torch
print("PyTorch:", torch.__version__)
print("CUDA available:", torch.cuda.is_available())
if not torch.cuda.is_available():
raise RuntimeError("CUDA unavailable: check the selected Python and server image first")
x = torch.tensor([1.0, 2.0, 3.0], device="cuda:0")
y = x * 2
print("GPU:", torch.cuda.get_device_name(0))
print("Device:", y.device)
print("Values:", y.cpu().tolist())
运行:
bash
python gpu_check.py
关键输出应包含:
text
Device: cuda:0
Values: [2.0, 4.0, 6.0]
这里 cuda:0 是当前进程能看到的第 0 张 GPU;x * 2 才是实际计算。最后 cpu().tolist() 将结果复制回 CPU,转成方便阅读的 Python 列表。不是所有数据都从此永远留在 GPU。
raise RuntimeError 是主动结束不符合当前前提的流程,让错误明确地停在这里。不要删除它来掩盖 GPU 不可用。
6. 用当前 Python 安装刚才那份源码
仍站在课程根目录执行:
bash
python -m pip install -e ./code/ultralytics-8.4.183
拆开看:
python -m pip:由当前课程解释器执行安装工具。install:执行安装。-e:可编辑安装,环境与这份源码建立联系。- 最后的路径:A11 解压出的、包含
pyproject.toml的项目根目录。
后面修改这份源码时,Python 能读到它。这不是把任意一个 .py 文件复制进 env,也不是安装浏览器里的云端 API。
把安装时用的 Python 和运行时读到的源码放在同一张图上核对。

课程解释器通过可编辑安装关联课程源码;最终用 ultralytics.file 核对实际导入位置。
版本号相同仍可能是两份项目;最终以 ultralytics.file 指向的真实路径为准。
安装过程可能下载缺少的依赖,先等待完整结束。看到 Successfully installed 是一个检查点,但不是最终验收。
如果下载失败,看清具体包名与网络错误,保留完整日志。不要在已经失败的安装后直接开始训练,再把缺包误认为模型代码问题。
7. 打印真正导入的位置
安装结束后执行:
bash
python -c "import ultralytics; print(ultralytics.__version__); print(ultralytics.__file__)"
按 A11 的目录摆放,应看到:
text
8.4.183
/root/lanyun-tmp/yolo-study/code/ultralytics-8.4.183/ultralytics/__init__.py
版本正确但路径指向另一份项目,依然没有完成本篇任务。
我按随文 ZIP 安装后,打印了完整的导入位置,A13 的截图可以对照。以这套主线的目录关系为准,不能只看版本相同就忽略路径。
8. 为什么暂时不每天升级 PyTorch?
我们正在建立能复现的教学环境。源码固定,依赖组合也要记录,不是包名相同就自动代表运行条件相同。
本次复用镜像中的 GPU PyTorch,在课程环境补装项目依赖;没有让你执行 pip install --upgrade torch。如果镜像与这里不同,需要先对照 PyTorch 官方安装入口 选择支持的组合,再记录新的验证环境。
这不是说新版本不好,而是升级也属于实验条件变更。先留住能运行的组合,再在独立环境验证变化。
9. 把环境记录保存下来
bash
python -m pip freeze > requirements-server.txt
这会在当前课程目录写出依赖记录。同名文件会更新,需要保留旧实验时先复制备份。
这个文件不包含完整操作系统、驱动或所有镜像信息,也不包含你的数据。它是环境记录的一部分,不能单独代替完整复现材料。
今天结束时,你应该能回答:解释器在哪里、GPU 是否真能计算、导入的是哪份源码。下一篇用一个集中自检脚本把这些结果写成报告,再运行最早保存的代码。