1. 环境准备与资源选择
在阿里云ECS上部署YOLOv8训练任务,首先需要选择合适的计算资源和镜像。
1.1 实例规格选择
推荐使用GPU计算型实例,例如:
- ecs.gn7i-c8g1.2xlarge:配备1张NVIDIA A10 GPU (24GB显存),8 vCPU,30 GiB内存。
- ecs.gn6v-c8g1.2xlarge:配备1张NVIDIA V100 GPU (32GB显存),8 vCPU,32 GiB内存。
对于YOLOv8中等规模数据集训练,A10或V100均能提供良好的性能。
1.2 系统镜像选择
建议选择预装PyTorch和CUDA的官方镜像,以节省环境配置时间:
- 镜像名称:pytorch:2.4.1-gpu-py311-cu124-ubuntu22.04-accl
- 包含组件:Python 3.11, PyTorch 2.4.1, CUDA 12.4, Ubuntu 22.04。
该镜像已包含NVIDIA驱动和CUDA工具包,开箱即用。
2. 数据集准备与上传
将标注好的YOLO格式数据集上传至ECS实例。
2.1 数据集结构
确保数据集目录结构如下:
dataset/ ├── data.yaml # 数据集配置文件 ├── train/ │ ├── images/ # 训练集图片 │ └── labels/ # 训练集标签(.txt文件) └── val/ ├── images/ # 验证集图片 └── labels/ # 验证集标签(.txt文件)2.2 上传与解压
如果数据集已打包为ZIP文件,可使用以下Python脚本自动解压并定位配置文件:
import zipfile, os, glob 1. 找到zip包 zip_files = glob.glob("/mnt/data/*.zip") if not zip_files: raise FileNotFoundError("没找到zip数据集") zip_path = zip_files[0] extract_path = "/mnt/workspace/dataset" 2. 解压(只跑一次,已解压就跳过) data_yaml_path = None for candidate in [f"{extract_path}/data.yaml", f"{extract_path}/dataset_merged/data.yaml"]: if os.path.exists(candidate): data_yaml_path = candidate break if data_yaml_path is None: print(f"正在解压 {zip_path} → {extract_path} ...") os.makedirs(extract_path, exist_ok=True) with zipfile.ZipFile(zip_path, 'r') as zf: zf.extractall(extract_path) # 自动探测解压后的data.yaml位置 for candidate in [f"{extract_path}/data.yaml", f"{extract_path}/dataset_merged/data.yaml"]: if os.path.exists(candidate): data_yaml_path = candidate break DATA_YAML = data_yaml_path print(f"数据集配置文件路径: {DATA_YAML}")3. 训练脚本编写与配置
创建训练脚本train.py,包含完整的训练与导出逻辑。
3.1 完整训练脚本
from ultralytics import YOLO import torch import os ========== 配置 ========== MODEL_SIZE = "n" # n/s/m/l/x,按需选择 EPOCHS = 300 BATCH = 128 # A10可用32~64,V100用32 IMG_SIZE = 640 DATA_YAML = "/mnt/workspace/dataset/data.yaml" # 根据实际路径调整 OUTPUT_DIR = "/mnt/data/output" ========== 训练 ========== model = YOLO(f"yolov8{MODEL_SIZE}.pt") # 使用预训练权重 results = model.train( data=DATA_YAML, epochs=EPOCHS, batch=BATCH, imgsz=IMG_SIZE, device=0, # 使用GPU 0 workers=16, # 数据加载线程数 project=OUTPUT_DIR, name=f"v8{MODEL_SIZE}_smoke_phone", patience=50, # 早停轮数 save=True, save_period=10, # 每10轮保存一次权重 val=True, plots=True, cache=True, # 缓存图片到内存加速 amp=True, # 混合精度训练 cos_lr=True, # 余弦退火学习率 close_mosaic=10, # 最后10轮关闭mosaic增强 ) ========== 导出 ========== 导出为ONNX格式 model.export(format="onnx") print(f"训练完成!模型保存在: {OUTPUT_DIR}")3.2 关键参数说明
- MODEL_SIZE: 模型尺寸,可选 n/s/m/l/x,尺寸越大精度越高但速度越慢。
- BATCH: 批次大小,需根据GPU显存调整。A10 (24GB) 建议 32-64,V100 (32GB) 建议 32。
- device: 指定GPU编号,单卡训练设为0。
- amp: 启用混合精度训练,可大幅减少显存占用并加速训练。
- cos_lr: 余弦退火学习率调度,有助于模型收敛。
4. 执行训练与监控
4.1 启动训练
将训练脚本上传至ECS实例(例如/root/train/train.py),并执行以下命令:
# 安装ultralytics(如果镜像未预装) pip install ultralytics==8.2.103 运行训练脚本 python /root/train/train.py4.2 训练过程监控
训练开始后,Ultralytics会输出如下信息:
- 训练/验证损失曲线
- mAP、精度、召回率等指标
- 权重文件保存路径(默认在
runs/detect/下)
可以通过TensorBoard或直接查看日志文件监控训练进度。
5. 模型导出与部署
5.1 导出格式
训练完成后,脚本会自动将模型导出为ONNX格式,便于后续部署。导出的模型文件位于:
/mnt/data/output/v8n_smoke_phone/weights/best.onnx5.2 其他导出选项
如需导出其他格式,可在训练后单独执行:
# 导出为TensorRT、OpenVINO、CoreML等格式 model.export(format="engine") # TensorRT model.export(format="openvino") # OpenVINO model.export(format="coreml") # CoreML6. 常见问题与优化建议
6.1 显存不足
- 降低
batch大小(如改为32或16)。 - 启用
amp=True(混合精度训练)。 - 减小输入图像尺寸
imgsz(如从640改为416)。
6.2 训练速度慢
- 设置
cache=True将数据集缓存至内存。 - 增加
workers数量(建议为CPU核心数的2-4倍)。 - 确保使用GPU训练(
device=0)。
6.3 模型精度不佳
- 增加训练轮数
epochs。 - 使用更大的模型尺寸(如从
n改为s或m)。 - 检查数据集标注质量和类别平衡。
7. 总结
本文详细介绍了在阿里云ECS GPU实例上部署YOLOv8训练任务的完整流程,涵盖环境配置、数据集准备、训练脚本编写、参数调优及模型导出。通过使用预装PyTorch的镜像和优化后的训练参数,可以快速在云端完成目标检测模型的训练与部署。