
简介面向Linux服务器上使用Ultralytics YOLOv8进行多卡训练自定义数据集的完整项目代码包适合有一定Python基础、希望在具体实践中掌握目标检测模型训练的开发者。内容覆盖从环境配置CUDA、PyTorch、Miniconda3、数据集预处理JPG/XML转YOLO格式的txt文本、dataset.yaml配置文件到单卡与多卡训练、常见CUDA报错排查和模型验证的完整链路并针对学习率、批大小、训练轮次等参数调整给出具体建议。整个资源打包为zip共11个文件压缩包大小约5.71MB核心包含4个Python脚本如train.py用于模型训练、preprocess.py用于数据预处理、demo_yolov8.py用于推理演示、2个YAML配置文件、1个yolov8n.pt预训练权重、示例图片、.gitignore与说明文档目录结构清晰便于按模块对照学习。README中还提供了从环境搭建到模型验证的步骤说明遇到CUDA版本不匹配、显存不足等问题时可参考其中的排错思路。目前已有111人学习下载对需要快速搭建LinuxYOLOv8训练环境并完成多卡并行训练的用户具有实用参考价值。 如果你手里刚好有一台Linux机器或者刚在Windows上装好WSL2、双系统想跑通YOLOv8训练自己的数据集那这篇内容是给你准备的。网上YOLOv8的教程不少但大多数默认你在Windows上点鼠标完成一切真正从Linux终端从零开始、一步步把环境、数据、训练、评估串起来的反而少。我自己做深度学习有个固执的习惯所有训练一律丢到Linux环境里跑Windows只干两件事——标注数据和用SSH连服务器。为什么因为Linux下没有乱七八糟的路径问题、权限问题后台跑训练也比Windows稳得多。这篇文章会从一个干净的系统开始带你走完YOLOv8的完整训练流程包括环境搭建、数据集准备、参数配置、训练监控和结果评估顺便把我踩过的坑一并交代清楚。1. 动手之前先想清楚你的机器到底能不能训YOLOv81.1 没有NVIDIA显卡能不能训练先把结论放这儿能但大概率你不会想用CPU训练。YOLOv8官方文档里写了CPU可以训练但速度会让人崩溃。一个COCO 128张图的迷你数据集CPU训练YOLOv8n可能都要几分钟一个epoch换成自己的几千张图、几百个epoch等一个晚上可能才跑完几个epoch。所以如果你只是临时体验一下CPU没问题真想训练自己的数据集老老实实准备NVIDIA显卡没有就租云服务器。那什么样的显卡够用我个人经验YOLOv8n/s级别6GB显存比如GTX 1660 Ti、RTX 2060就能跑batch size调到8左右没问题YOLOv8m以上建议8GB起步否则batch size被压得太小训练不稳定。显存不是唯一指标但它直接决定你能用多大的batch size而batch size又影响训练的收敛效果。显卡驱动装好后用nvidia-smi就能看到显存大小和驱动状态。1.2 Linux系统准备与最基础检查系统建议Ubuntu 20.04或22.04LTS版本别折腾冷门发行版。深度学习生态基本默认Ubuntu遇到问题别人能帮你冷门发行版只能自己扛。装好系统之后先执行几条最基础的Linux命令确认环境nvidia-smi df -h free -hnvidia-smi有输出说明NVIDIA驱动已经装好同时它会显示驱动版本和CUDA版本号。df -h看磁盘空间训练数据集加模型权重加虚拟环境50GB是比较稳妥的起步空间。free -h看内存建议16GB以上8GB会有点紧张。提示如果你是在虚拟机或者WSL2里做这件事GPU透传单独说。WSL2在Windows下训练也是可行的但如果你是双系统用户我个人建议直接原生Linux少一层抽象少一堆问题。这里还有个容易踩的坑nvidia-smi显示的CUDA版本和你后面安装的CUDA Toolkit/PyTorch版本不是一回事。nvidia-smi里的版本是驱动支持的“最大CUDA版本”只要PyTorch要求的CUDA版本不高于它就行。比如驱动显示CUDA 12.2那PyTorch装cu121版本完全没问题。2. 搭建Python训练环境从Miniconda到PyTorch2.1 用conda创建虚拟环境别碰系统Python很多新手上来就在系统Python里pip install一堆包最后把系统环境搞乱pip list里几十个包都不知道谁装的。我的建议是第一步就装Miniconda然后为YOLOv8单独创建一个虚拟环境。wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh装完之后重新打开终端确认conda命令可用然后创建环境conda create -n yolov8 python3.10 -y conda activate yolov8把环境名定为yolov8Python版本选3.10对YOLOv8和PyTorch都很友好。虚拟环境的好处是哪怕你把这个环境里的包全整坏了删掉重建一个就行对系统完全没有影响。2.2 安装PyTorchCUDA版本决定一切YOLOv8底层是PyTorch所以训练环境核心就是装一个GPU版的PyTorch。不要直接pip install torch那样默认装CPU版本或者一个不一定匹配你显卡的版本。正确做法是去PyTorch官网选好版本命令。当前主流选择是CUDA 11.8或12.1你可以根据第1章里nvidia-smi显示的驱动版本来判断。pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121装完之后一定要验证GPU是否真的能用这一步很多人跳过结果训练的时候才发现用的是CPUpython -c import torch; print(torch.__version__); print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0))如果输出True和你的显卡型号说明环境通了。我曾经遇到过torch.cuda.is_available()返回False的情况折腾半天发现是驱动版本太老升级驱动后就好了。这个输出是你后续所有训练的地基务必确认清楚。如果这步有问题先Google报错信息大概率是驱动、CUDA Toolkit、PyTorch三者版本不匹配不要急着重装系统。3. 拉取YOLOv8项目代码安装ultralytics并跑通第一次推理3.1 克隆仓库还是pip安装YOLOv8的项目代码托管在GitHub上可以用两种方式获取。第一种是克隆整个仓库git clone https://github.com/ultralytics/ultralytics.git cd ultralytics pip install -e .第二种更简单直接pip安装pip install ultralytics两种方式本质没区别装完都是一个叫ultralytics的Python包。但我个人推荐第一种克隆仓库的好处是你本地有一份完整的源码后面想看看模型结构、改某个模块、做结构改进换检测头、加注意力机制都方便直接pip安装的话改源码还要去site-packages里找文件麻烦。3.2 第一次推理验证用官方模型跑通全流程环境装好后先别急着碰自己的数据先用官方模型做一次推理验证。YOLOv8首次运行会自动下载预训练权重一般几百MB存放位置在~/.config/ultralytics/或者当前目录的weights/下。yolo predict modelyolov8n.pt sourcehttps://ultralytics.com/images/bus.jpg这行命令会下载YOLOv8n的预训练权重对官方示例图bus.jpg做目标检测然后把带有检测框的图片保存到runs/detect/predict/。如果你能看到输出结果说明ultralytics包、PyTorch、预训练权重下载机制全部正常。这一步非常关键。我见过不少人在自己数据集上训练报错排查到最后发现是ultralytics包版本问题或者某个依赖没装全。先用官方demo把链路跑通后面再出问题才能确定是你数据或参数的问题而不是环境的问题。4. 准备自己的数据集这一步直接决定模型的上限4.1 标注工具与YOLO格式说明YOLOv8训练自己的数据集第一步是准备数据和标注。数据就是你的图片标注则是每张图片里每个目标的位置和类别。标注工具有很多LabelImg是老牌选择Labelme适合多边形标注X-AnyLabeling在Linux下用起来很舒服。选一个用就行导出格式尽量选YOLO格式。YOLO格式的标注是每个图片对应一个同名txt文件文件里每一行代表一个目标格式为class_id x_center y_center width height注意后面的四个数全部是相对于图片宽高的归一化值范围0到1。比如一张640x640的图里一个目标中心在(320, 320)宽高都是100像素那么这行就是0 0.5 0.5 0.15625 0.15625。这个细节很重要很多人标注完转换时把绝对坐标直接写进去训练出来的模型完全没法用。4.2 目录结构组织与data.yaml编写标注完成后按下面的目录结构组织你的数据集dataset/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ └── data.yaml图片放images标注txt放labelstrain和val子目录分开。比例一般按8:2或者9:1分配val集不能太小至少要能反映模型的真实效果。然后写data.yamlpath: /home/user/dataset train: images/train val: images/val nc: 2 names: [person, car]path是数据集的绝对路径train和val是相对路径nc是类别数量names是类别名称列表顺序要和标注文件的class_id一一对应。如果你标注时person是0、car是1names就必须按这个顺序写写反了模型训得再好部署出来也是乱的。4.3 训练前必做的数据集检查数据集准备好后我强烈建议先做一次可视化和统计检查。用下面这段代码随机抽查几张图片看看标注框是否正确贴合目标from PIL import Image import os img_dir dataset/images/train label_dir dataset/labels/train for f in os.listdir(img_dir)[:5]: img_path os.path.join(img_dir, f) label_path os.path.join(label_dir, f.replace(.jpg, .txt)) print(img_path, os.path.getsize(label_path))更直接的做法是用ultralytics自带的可视化功能直接把标注画在图上。我每次标注完一批数据都会抽查几十张经常能发现诸如“框太小”“类别标错”“txt和图片名字对不上”之类的问题。这类低级错误如果带着进训练损失函数收敛得再漂亮实际效果也是虚的。另外一个容易被忽视的点如果你做的是小目标检测比如远景里的小人、小车辆YOLOv8的默认检测头对大一点的目标更友好你可能需要考虑加P2小目标检测头或者对模型结构做一些改进。这个属于进阶玩法先把基础流程跑通再谈改进。5. 训练参数详解跑起来之前先把参数吃透5.1 模型规模怎么选n/s/m/l/xYOLOv8提供了五种规模的模型nnano、ssmall、mmedium、llarge、xxlarge。它们网络结构一样只是深度和宽度不同参数量、推理速度、精度依次递增。我整理过一张对照表模型参数量(M)大小(MB)适合场景YOLOv8n3.26.2快速验证、边缘设备YOLOv8s11.221.5一般项目首选YOLOv8m25.949.7精度优先、显存充足YOLOv8l43.783.7追求高精度YOLOv8x68.2130.5数据集大且复杂我的习惯是第一轮先用YOLOv8n或者YOLOv8s把整个流程跑通确认数据没问题、loss能降再根据时间和显存换更大的模型。直接上YOLOv8x训练跑到一半发现数据有问题白烧几小时电费。5.2 核心训练参数epochs、batch-size、imgsz训练命令长这样yolo train data/home/user/dataset/data.yaml \ modelyolov8s.pt \ epochs100 \ imgsz640 \ batch16 \ device0 \ workers4 \ patience20 \ nametrain_first几个核心参数说清楚model传yolov8s.pt表示加载预训练权重这是迁移学习比随机初始化收敛快得多。第一次用就让它自动下载。epochs训练轮数。数据量小100轮足以数据量大可以200到300轮配合patience早停。imgsz输入图片尺寸。默认640显存不够可以降到512甚至416精度会有点损失。batch每次迭代喂进网络的图片数。batch越大显存占用越高训练越稳。显存不够就调小16不行就88不行就4。patience早停参数验证集指标连续patience个epoch没有提升就提前结束训练。device0指定用第一张GPU。多卡可以用0,1,2,3但新手阶段先单卡跑通。还有一个很容易忽略的workers参数它决定数据加载的进程数。显存够但GPU利用率上不去很多时候就是workers太少数据加载成了瓶颈。一般来说4到8比较合适具体看CPU核心数。5.3 关于数据增强YOLOv8默认带了一整套数据增强策略包括马赛克增强、随机翻转、色彩抖动等。训练的时候你不需要手动配置默认就很好用。如果你的数据集比较小比如只有几百张默认增强能帮你把有效样本量放大很多倍。我试过在小数据集上关掉马赛克增强效果反而变差所以新手阶段不建议动增强相关参数。等后面精度上不去了再去研究hsv_h、mosaic、mixup这些参数的调整也不迟。6. 训练过程怎么看日志、loss曲线与问题排查6.1 终端输出信息解读训练启动后终端会每行打印一个epoch的信息核心字段大概是这样的Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size 1/100 5.2G 1.184 1.732 1.235 37 640box_loss是边框回归损失cls_loss是分类损失dfl_loss是分布焦点损失三者都应该是整体下降趋势。不需要盯着每一轮的波动看重点是看趋势前几十个epoch下降明显后面慢慢趋于平缓这是正常现象。训练结束或者每个epoch结束会在runs/detect/train_first/目录下生成一堆文件包括权重文件best.pt和last.pt、验证集检测结果图片、还有训练过程的指标曲线图。6.2 画损失函数曲线图YOLOv8训练完会自动在训练输出目录下生成results.png里面包含了loss曲线、精度、召回率、mAP等所有关键指标随epoch的变化曲线。如果你用的是云服务器或者远程连接可以用scp把runs目录拉回本地看也可以直接用results.csv自己画图。这个文件里每一行对应一个epoch的指标用pandas加matplotlib十几行代码就能画出自己想要的曲线网上很多画loss曲线的教程都是基于这个csv来的。有两个信号值得注意。第一train loss一直在降但val loss开始回升说明过拟合了解决办法是增大数据量、加早停或者换小一点的模型。第二loss曲线长时间震荡不降很可能是学习率不合适或者数据标注质量太差先检查数据再考虑调学习率。6.3 常见的几个训练报错第一个是CUDA out of memory。这个最好解决batch调小或者imgsz调小再不行换小模型。还有一个技巧是设workers0或者4有时候数据加载进程也会占用显存。第二个是loss为nan。我遇到过一次是因为数据集里有一张全黑的图片配合某些增强操作算出了异常值。排查方法是把训练集里异常图片删掉或者临时关掉某些增强项。第三个是训练中途服务器断了。这也是为什么我强烈建议用nohup或者tmux跑训练的原因tmux new -s train yolo train ...断网、SSH断开都不会影响训练进程。这个习惯救过我太多次了强烈建议养成。训练跑起来之后按CtrlB再按D可以脱离tmux会话关掉SSH窗口也没事。想回去看训练状态tmux attach -t train就行。7. 训练完成后评估模型、导出格式与部署思路7.1 验证集评估结果怎么看训练结束后终端会打印最终在验证集上的评估结果Precision、Recall、mAP50、mAP50-95。mAP50表示IoU阈值0.5下的平均精度是目标检测最常用的指标mAP50-95是更严格的综合指标在不同IoU阈值下取平均专业论文里一般看这个。新手最容易犯的错是只看训练loss不看验证集mAP。loss是训练集上的拟合程度mAP是模型在没见过的数据上的真实表现。只有mAP达到你预期的模型才值得保留best.pt就是依据验证集指标选出来的最优权重。7.2 导出ONNX和TensorRT部署场景和训练不同比如RK3588、Jetson Orin Nano这类边缘设备跑PyTorch的.pt权重效率很低一般要转成ONNX、TensorRT engine或者RKNN格式。用一行命令就能导出ONNXyolo export modelbest.pt formatonnx导出TensorRT需要本机有TensorRT环境yolo export modelbest.pt formatengine device0导出模型前记得用同一个验证集做一次推理比对保证导出前后精度没有明显下降。INT8量化会损失一些精度但换来的是推理速度快好几倍在RK3588这种NPU设备上int8几乎是必须的。Jetson Orin Nano上的TensorRT部署同理核心都是先用best.pt导出engine再写推理脚本做前后处理。7.3 部署到摄像头场景的一个提醒热搜词里有一条“运动的物体经过摄像头只识别一次”这其实就是目标跟踪的典型需求。单帧检测模型每帧独立做检测同一辆车连续几十帧都会被识别出来如果业务上要“一辆车只算一次”光靠YOLOv8训练是不够的需要配合ByteTrack或DeepSORT这类跟踪算法对跨帧的目标做ID关联再按ID去重。YOLOv8也内置了track模式yolo track modelbest.pt sourcexxx.mp4就能跑通一个基础版本但实际项目里要把ID管理、区域计数这些逻辑自己写好。回到训练这件事本身我的经验是第一次在Linux上跑通YOLOv8不要追求一次到位先用手头最小、最干净的数据集把整个流程走通确认环境、数据、训练、评估这一条链路上每个环节都正常再逐步加数据、换大模型、调参数。这样即使后面出了问题你也知道该去哪一环排查。环境装坏了就重建虚拟环境数据不行就回头改标注模型精度不够就上更大的模型——每一步都有明确的退路这才是Linux上做深度学习该有的节奏。本文还有配套的精品资源点击获取