1. 准备工作:连接你的远程“算力工厂”

嘿,朋友们,我是老张,在AI和硬件这块摸爬滚打了十来年。今天咱们来聊聊一个让很多新手朋友头疼又兴奋的事儿:怎么把那个大名鼎鼎的YOLOv5模型,放到远程服务器的GPU上去跑。你可能在学校实验室,或者用着某个云服务商的机器,看着那强大的显卡流口水,却不知道怎么用起来。别担心,这篇就是为你准备的“保姆级”手册,咱们从零开始,一步步来,我踩过的坑,你就不用再踩了。

首先,你得搞清楚你手里的“钥匙”是什么。使用学校的实验室服务器或者租用的云服务器,管理员通常会给你三样关键信息:服务器的IP地址(比如123.123.123.123)、端口号(通常是22,但也可能自定义)以及你的用户名和密码。这就好比你要去一个高级工厂(服务器)干活,IP和端口是工厂的地址和具体车间门牌,用户名密码就是你的工牌。没有这些,门都进不去。

拿到这些信息后,我们得准备两个趁手的工具。我强烈推荐使用 XshellXftp,它们是一家公司的产品,配合起来非常方便。Xshell用来输入命令,操作服务器;Xftp则像一个可视化的文件搬运工,让你能轻松地在你的电脑和服务器之间拖拽文件。去它们的官网下载家庭/学校免费版就够用了。安装过程就是一路“下一步”,和装普通软件没啥区别,这里就不赘述了。

工具装好,咱们就来建立连接。打开Xshell,点击“新建会话”,在“连接”选项卡里,主机栏填上你的IP地址,端口号填管理员给你的那个。然后转到“用户身份验证”,输入用户名和密码。一切填好后,给这个会话起个名字,比如“实验室GPU服务器”,方便以后直接双击连接。点击“连接”,如果一切正常,你就会看到一个黑色的命令行窗口,上面显示着类似 [yourname@server ~]$ 的提示符。恭喜你,你已经成功进入了远程服务器的世界!这个黑窗口就是你和服务器“对话”的地方,后面我们大部分操作都在这里进行。

2. 打造专属工作间:安装Anaconda与配置环境

成功登录服务器,就像你进了一个毛坯房。接下来,我们要把这个毛坯房装修成适合深度学习开发的精装工作室。第一步,就是安装 Anaconda。它是一个非常强大的Python发行版和管理工具,能帮你轻松创建多个独立的Python环境,避免不同项目之间的包版本冲突。这对于共用服务器来说尤其重要,因为你可能不知道其他同学装了什么奇怪的包。

我们直接在服务器上下载Anaconda。在Xshell里,输入以下命令,这会下载一个比较新的Linux版本(请以官网最新链接为准,这里是个示例):

wget https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.sh

如果服务器网络较慢,你也可以先在自己电脑浏览器里访问Anaconda官网,找到Linux版本(选择.sh结尾的安装包)下载下来,然后使用Xftp,像往U盘里拖文件一样,把它从左边(你的电脑)拖到右边(服务器的某个目录,比如/home/你的用户名/下)。

接下来,运行安装脚本。假设你把安装包放在了用户主目录下:

bash Anaconda3-2023.09-0-Linux-x86_64.sh

安装过程中,你会看到很多文字。一直按回车键阅读许可协议,直到问你“Do you accept the license terms?”,输入 yes 回车。接着它会问你安装路径,直接回车使用默认路径(通常是/home/你的用户名/anaconda3)就行。最后,安装程序会问你是否要初始化Anaconda,这里一定要输入 yes 回车!这会把Anaconda的启动命令添加到你的.bashrc文件里,这样每次登录Shell就能自动激活。

安装完成后,你需要让刚才的配置生效。关闭当前Xshell窗口,重新连接一次服务器。或者,直接在当前窗口输入:

source ~/.bashrc

现在,你应该能看到命令行的最前面多了一个 (base) 字样。这说明你已经处于Anaconda的base基础环境下了。但我们强烈不建议在base环境里直接安装项目依赖包,因为这会污染全局环境。我们的最佳实践是:为每个项目创建一个独立的虚拟环境。

创建一个专用于YOLOv5的环境,比如叫 yolo_train,并指定Python版本为3.8(YOLOv5对3.8支持很好):

conda create -n yolo_train python=3.8

创建完成后,激活这个环境:

conda activate yolo_train

看到命令行提示符从 (base) 变成了 (yolo_train),就说明你已经成功切换到了这个干净的工作间。以后所有关于YOLOv5的包,都只安装在这个环境里,跟服务器上其他项目井水不犯河水。

3. 安装核心引擎:PyTorch与CUDA

环境准备好了,现在要安装最重要的“引擎”——PyTorch深度学习框架,并且确保它能调用服务器的GPU。这一步是性能的关键。首先,我们需要配置一下Conda的下载源,换成国内的镜像,速度会快非常多。在激活的 (yolo_train) 环境下,依次执行以下命令:

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
conda config --set show_channel_urls yes

接下来,去PyTorch官网(pytorch.org)生成安装命令。在官网首页,你会看到一个下拉选择框。根据你服务器的CUDA版本(可以问管理员,或者用 nvidia-smi 命令查看右上角的CUDA Version)进行选择。比如,如果你的CUDA版本是11.8,就选择:

  • PyTorch Build: Stable (1.13.1)
  • Your OS: Linux
  • Package: Conda
  • Language: Python
  • Compute Platform: CUDA 11.8

官网会生成类似下面这样的命令:

conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia

注意:由于我们已经配置了清华镜像,为了完全从国内源加速下载,建议去掉命令最后的 -c pytorch -c nvidia,变成:

conda install pytorch torchvision torchaudio pytorch-cuda=11.8

然后把这个命令粘贴到Xshell中执行。这个过程会比较慢,因为要下载好几个G的文件,请耐心等待。如果中途因为网络问题失败了,多试几次或者换个时间段。

安装完成后,我们来验证一下PyTorch是否能正确识别GPU。在Python交互环境中做个快速测试:

python -c "import torch; print(f'PyTorch版本: {torch.__version__}'); print(f'CUDA是否可用: {torch.cuda.is_available()}'); print(f'可用GPU数量: {torch.cuda.device_count()}'); print(f'当前GPU名称: {torch.cuda.get_device_name(0) if torch.cuda.is_available() else None}')"

如果一切顺利,你会看到类似这样的输出:

PyTorch版本: 1.13.1
CUDA是否可用: True
可用GPU数量: 1
当前GPU名称: NVIDIA GeForce RTX 4090

看到 CUDA是否可用: True,你的心就可以放下一大半了,这说明PyTorch已经成功抱上了GPU的大腿。如果显示是False,那就要检查一下CUDA版本和PyTorch版本是否匹配,或者驱动是否有问题了。

4. 部署YOLOv5项目并进行首次推理

引擎装好了,现在把“赛车”YOLOv5搬进来。我个人的习惯是,先在本地电脑上把项目跑通,解决掉一些常见的环境依赖问题,然后再上传到服务器,这样效率更高。你去YOLOv5的GitHub仓库(github.com/ultralytics/yolov5),点击 Code -> Download ZIP,把项目下载到本地。解压后,用你喜欢的IDE(比如PyCharm或VSCode)打开。

在本地,你也需要创建一个Conda虚拟环境(步骤和服务器上类似),然后在这个环境下,进入yolov5项目根目录,安装基础依赖:

pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

安装完成后,尝试运行一下官方的推理脚本,检测自带的图片:

python detect.py --source data/images/bus.jpg --weights yolov5s.pt

这个过程会自动下载一个预训练好的小模型(yolov5s.pt)。你可能会遇到一些报错,这太正常了。比如,我最近一次就遇到了 PIL 库版本兼容性问题,报错信息里提示某个函数找不到。解决方法就是指定一个兼容的版本:

pip uninstall Pillow -y
pip install Pillow==9.5.0

在本地反复调试,直到 python detect.py 能够成功运行,并在 runs/detect/exp 目录下生成带有检测框的结果图片。本地调试通过的最大好处是,你熟悉了项目的运行流程,并把大部分环境问题在本地(有图形界面,查错方便)就解决了。

接下来,把整个调试好的 yolov5 项目文件夹压缩成 zip 格式。打开Xftp,连接你的服务器,导航到你想存放项目的目录(比如 /home/你的用户名/projects/),然后将本地的zip文件拖拽上传。回到Xshell,进入该目录并解压:

cd ~/projects
unzip yolov5.zip -d yolov5

现在,在服务器上进入你的项目目录,并激活我们之前创建好的虚拟环境:

cd ~/projects/yolov5
conda activate yolo_train

在服务器环境里,再次安装一遍依赖(确保所有包都适配Linux环境):

pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

安装完毕后,我们就可以在服务器上执行第一次推理了,感受一下GPU的速度:

python detect.py --source data/images/bus.jpg --weights yolov5s.pt

你会发现,在强大的服务器GPU上,推理过程几乎是一瞬间就完成了,比你在本地CPU上跑快了不知道多少倍。这第一次成功的推理,会给你巨大的信心。你可以多试试其他图片或者视频源,比如 --source data/images/zidane.jpg

5. 开始模型训练:用自己的数据教AI认东西

跑通检测只是热身,真正的重头戏是训练——让你自己的模型学会识别你感兴趣的东西。YOLOv5训练自己的数据集需要系统性地准备几个东西:标注好的图片配置文件。假设我们要训练一个识别“猫”和“狗”的模型。

第一步:准备数据集。 你需要很多包含猫和狗的图片。然后,使用标注工具(如LabelImg、Makesense.ai等)将这些图片中的猫和狗用矩形框框出来,并打上标签(catdog)。标注完成后,每个图片会生成一个同名的 .txt 标注文件,里面记录了物体类别和框的位置。将你的所有图片(.jpg)和标注文件(.txt)按比例分成三份:训练集(train)、验证集(val)和可选的测试集(test)。在服务器上,建议你建立一个清晰的目录结构,比如:

~/datasets/my_pet/
├── images/
│   ├── train/  (存放训练图片)
│   └── val/    (存放验证图片)
└── labels/
    ├── train/  (存放训练标注)
    └── val/    (存放验证标注)

第二步:创建数据集配置文件。 在YOLOv5项目根目录下,找到一个叫 data 的文件夹,里面有很多 .yaml 文件,这些都是数据集配置文件。我们仿照 coco128.yaml 创建一个自己的,比如 my_pet.yaml

# 数据集路径(相对于yolov5根目录,或绝对路径)
path: /home/yourname/datasets/my_pet
# 训练/验证/测试图片的目录(相对于path)
train: images/train
val: images/val
# 类别数
nc: 2
# 类别名称列表
names: ['cat', 'dog']

第三步:修改模型配置文件。 我们选择YOLOv5s这个小模型来训练。找到 models 目录下的 yolov5s.yaml,我们只需要修改一处:将 nc: 80 改成你的类别数 nc: 2。其他结构保持不变。

第四步:开始训练! 在Xshell中,确保你在yolov5目录下,并且 yolo_train 环境已激活。执行训练命令:

python train.py --img 640 --batch 16 --epochs 100 --data ./data/my_pet.yaml --cfg ./models/yolov5s.yaml --weights yolov5s.pt --name my_first_pet_detector

我来解释一下这几个关键参数:

  • --img 640:输入图片会统一缩放到640x640像素。
  • --batch 16:每次扔给GPU16张图片进行学习。这个值可以根据你GPU的显存大小调整,显存小就调小(如8,4),显存大可以调大(如32,64),越大通常训练越快。
  • --epochs 100:整个数据集从头到尾学习100遍。
  • --data:指向你刚创建的数据集配置文件。
  • --cfg:指向你修改好的模型结构配置文件。
  • --weights yolov5s.pt:加载预训练的权重,这是非常重要的,能大大加快训练速度并提升效果(这叫迁移学习)。
  • --name:给你的这次训练任务起个名字,所有结果会保存在 runs/train/你的名字 下面。

命令回车后,你会看到屏幕上开始疯狂滚动日志。第一行通常就会显示 Using CUDA device0,确认了GPU正在工作。训练过程中,你可以看到损失(loss)在逐渐下降,这意味着模型正在学习。训练结束后,最好的模型权重会保存在 runs/train/my_first_pet_detector/weights/best.pt。你可以直接用这个权重进行推理:

python detect.py --source /path/to/your/test_image.jpg --weights runs/train/my_first_pet_detector/weights/best.pt

看到模型准确地框出了你图片里的猫猫狗狗,那种成就感是无与伦比的。这就是深度学习的魅力,你亲手教会了机器“看”世界。

6. 避坑指南与效能提升技巧

走完整个流程,你可能已经成功了,但也可能遇到了各种稀奇古怪的报错。别慌,我把我遇到过的一些典型问题和优化技巧分享给你。

常见坑点一:numpy 版本兼容性问题。 在训练时,你可能会遇到类似 AttributeError: module 'numpy' has no attribute 'int' 的错误。这是因为新版本NumPy废弃了 np.int 这种写法。解决方法很简单,找到报错提示的文件(通常是 utils/datasets.py),用编辑器打开,搜索 np.int 并将其全部替换为 int 即可。这是一个经典问题,搜索一下就能找到很多答案。

常见坑点二:显存不足(CUDA out of memory)。 这是新手最常遇到的“甜蜜的烦恼”,说明你的模型或数据太大了。解决方法有几个:1) 减小 --batch-size 参数(比如从16降到8或4);2) 减小 --img 尺寸(比如从640降到416);3) 使用更小的模型,比如 yolov5n.yaml(纳米级模型)。你可以从小的batch和图片尺寸开始,确保能跑起来,再逐步调大。

效能提升技巧一:使用 nohup 让训练在后台运行。 你不可能一直开着Xshell盯着训练,万一网络断了就前功尽弃。这时可以用 nohup 命令让进程在后台持续运行,并把输出日志保存到文件:

nohup python train.py ...(你的所有参数) > training.log 2>&1 &

这条命令末尾的 & 表示后台运行。nohup 保证即使你关闭了终端,训练也不会停止。所有屏幕输出会被重定向到 training.log 文件里。你可以随时用 tail -f training.log 来查看最新的训练日志。

效能提升技巧二:监控GPU状态。 训练时,想知道GPU是不是在卖力干活?在另一个Xshell窗口里,输入 watch -n 1 nvidia-smi。这个命令会每秒刷新一次GPU使用情况。你可以看到显存占用、GPU利用率(Volatile GPU-Util)等。如果利用率长期在80%以上,说明GPU正在全力计算;如果很低,可能是数据读取(IO)成了瓶颈,可以考虑使用更快的硬盘或者调整数据加载的线程数(--workers 参数)。

最后的小建议:养成好习惯。 每次开始新项目,都创建一个新的Conda环境。训练时,多用 --name 参数给实验起个清晰的名字。重要的训练命令和参数,可以保存在一个脚本文件(比如 train.sh)里。这样,你的服务器工作会变得井井有条,复现结果也变得非常容易。深度学习实验就像做菜,步骤清晰、记录详实,才能不断做出好菜。好了,流程和技巧都交给你了,接下来就放手去折腾吧,服务器上的GPU正等着你去“压榨”呢。

更多推荐