配置使用云服务器训练神经网络模型——在阿里GPU服务器训练yolov5模型

前言

对于没有GPU训练机的人来讲,使用云服务器训练自己的模型应该最最优选择,只是在训练的时候开个按时计费的服务器,训练完成后保存环境镜像之后,可以完全停掉服务器,期间不产生任何费用,下次再训练时,启动环境就可以,很容易保护好自己的训练环境不受污染。

学习交流可加企鹅群:767133823

一、选择服务器

1.这里选择的是阿里有服务器,直接用支付宝账号登录。
2.选择配置,按量计费,我训练yolov5的模型,2万多的数据集,V100完全够用了。
在这里插入图片描述
3.选择系统和安装GPU启动
在这里插入图片描述
3.选择网络速度(上行下行的速度),之后确认订单就可以了。
在这里插入图片描述

二、配置服务器

1.连接服务器,直接点远程连接。
在这里插入图片描述
在这里插入图片描述
2.切换到root并安装需要的文件。

su
cd 
sudo apt-get install vim #vim
sudo apt-get install unzip #解压
sudo apt-get install zip #压缩
sudo apt-get install screen #保护进程会话

三、配置环境(使用Anaconda3)

1.先把Anaconda3下载到自己本地目录,之后用scp上传到服务器

 scp data/Anaconda3-5.3.0-Linux-x86_64.sh root@39.xxx.xx.xxx:/home/data/ 

等待上传完成之后,在服务器上安装Anaconda3,一路确认到安装完成。
在这里插入图片描述
把Anaconda3加到环境变量

sudo vim ~/.bashrc

把bin路径加到文件末尾,之后保存文件退出。

 export PATH=$PATH:/root/anaconda3/bin

在这里插入图片描述

使用环境生效

source ~/.bashrc

2.创建环境

 conda create --name yolov5 python=3.7
 conda activate yolov5

3.下载算法代码,可以直接从git上下载源码,也可以把自己改好的源码上传。
从git 上下载源码,yolov5s为例:

git下载

 git clone https://github.com/ultralytics/yolov5.git
 cd yolov5
 pip install -r requirements.txt

本地上传与手动安装依赖

scp data/yolov5.zip root@39.xxx.xx.xxx:/home/data/

等上传完成之后,切到服务器

unzip yolov5.zip
cd yolov5
conda install pytorch torchvision cudatoolkit=10.2 -c pytorch
pip install cython matplotlib tqdm opencv-python tensorboard scipy pillow onnx pyyaml pandas seaborn

四、数据处理

1.上传数据集到服务器

 scp data/dataset.zip root@39.xxx.xx.xxx:/home/data/yolov5 

2.上传完成之后,把数据分成训练集和测试集,这里面使用的coco数据格式,要转成yolov5的格式。

unzip dataset.zip
python generate_txt.py --img_path data/XXXXX/JPEGImages --xml_path data/XXXXX/Annotations --out_path data/XXXXX

数据转换与生成 generate_txt.py源码

import os
import glob
import argparse
import random
import xml.etree.ElementTree as ET
from PIL import Image
from tqdm import tqdm

def get_all_classes(xml_path):
    xml_fns = glob.glob(os.path.join(xml_path, '*.xml'))
    class_names = []
    for xml_fn in xml_fns:
        tree = ET.parse(xml_fn)
        root = tree.getroot()
        for obj in root.iter('object'):
            cls = obj.find('name').text
            class_names.append(cls)
    return sorted(list(set(class_names)))

def convert_annotation(img_path, xml_path, class_names, out_path):
    output = []
    im_fns = glob.glob(os.path.join(img_path, '*.jpg'))
    for im_fn in tqdm(im_fns):
        if os.path.getsize(im_fn) == 0:
            continue
        xml_fn = os.path.join(xml_path, os.path.splitext(os.path.basename(im_fn))[0] + '.xml')
        if not os.path.exists(xml_fn):
            continue
        img = Image.open(im_fn)
        height, width = img.height, img.width
        tree = ET.parse(xml_fn)
        root = tree.getroot()
        anno = []
        xml_height = int(root.find('size').find('height').text)
        xml_width = int(root.find('size').find('width').text)
        if height != xml_height or width != xml_width:
            print((height, width), (xml_height, xml_width), im_fn)
            continue
        for obj in root.iter('object'):
            cls = obj.find('name').text
            cls_id = class_names.index(cls)
            xmlbox = obj.find('bndbox')
            xmin = int(xmlbox.find('xmin').text)
            ymin = int(xmlbox.find('ymin').text)
            xmax = int(xmlbox.find('xmax').text)
            ymax = int(xmlbox.find('ymax').text)
            cx = (xmax + xmin) / 2.0 / width
            cy = (ymax + ymin) / 2.0 / height
            bw = (xmax - xmin) * 1.0 / width
            bh = (ymax - ymin) * 1.0 / height
            anno.append('{} {} {} {} {}'.format(cls_id, cx, cy, bw, bh))
        if len(anno) > 0:
            output.append(im_fn)
            with open(im_fn.replace('.jpg', '.txt'), 'w') as f:
                f.write('\n'.join(anno))
    random.shuffle(output)
    train_num = int(len(output) * 0.9)
    with open(os.path.join(out_path, 'train.txt'), 'w') as f:
        f.write('\n'.join(output[:train_num]))
    with open(os.path.join(out_path, 'val.txt'), 'w') as f:
        f.write('\n'.join(output[train_num:]))

def parse_args():
    parser = argparse.ArgumentParser('generate annotation')
    parser.add_argument('--img_path', type=str, help='input image directory')
    parser.add_argument('--xml_path', type=str, help='input xml directory')
    parser.add_argument('--out_path', type=str, help='output directory')
    args = parser.parse_args()
    return args

if __name__ == '__main__':
    args = parse_args()
    class_names = get_all_classes(args.xml_path)
    print(class_names)
    convert_annotation(args.img_path, args.xml_path, class_names, args.out_path)

五、训练模型

1.训练模型前,要先运行screen,以保证服务终端断线之后还能继续训练。

screen -S  yolo
yolo 是一个标记,可以自己随便填,用来分辨该窗口的用途,避免窗口多了自己混淆

screen 常用命令

screen -ls #查看进程
screen -r -d 1020  #后台运行的screen进程
kill -9 1020 #杀死不需要的进程
screen  -wipe #检查目前所有的screen作业,并删除已经无法使用的screen作业

2.重新激活环境

conda activate yolov5

3.训练模型

python train.py --cfg models/yolov5s.yaml --data data/ODID.yaml --hyp data/hyp.scratch.yaml --epochs 100 --multi-scale --device 0

在这里插入图片描述

六、Linux下常用的一些指令

  1. scp

从服务器下载文件

  scp username@IP:/remote_path/filename ~/local_destination

上传本地文件到服务器

  scp ~/local_path/local_filename username@IP:/remote_path  
从服务器下载整个目录
   scp -r username@servername:/remote_path/remote_dir/ ~/local_destination

上传目录到服务器

	scp  -r ~/local_dir username@servername:/remote_path/remote_dir
  1. vim配置
    系统级配置文件目录:/etc/vim/vimrc
    用户级配置文件目录:~/.vim/vimrc
    修改配置文件vimrc或者.vimrc

//显示行号

set nu
  1. 压缩与解压
    zip命令
    zip -r file.zip ./*
    将当前目录下的所有文件和文件夹全部压缩成file.zip文件,-r表示递归压缩子目录下所有文件.

unzip命令
unzip -o -d /home/sunny file.zip
把file.zip文件解压到 /home/sunny/
-o:不提示的情况下覆盖文件;
-d:-d /home/sunny 指明将文件解压缩到/home/sunny目录下;

其他
zip -d file.zip smart.txt
删除压缩文件中smart.txt文件
zip -m file.zip ./rpm_info.txt
向压缩文件中file.zip中添加rpm_info.txt文件

  1. 终端代理
export ALL_PROXY=socks5://127.0.0.1:4081 #端口号
curl -L cip.cc #验证是否成功
  1. 显卡驱动
nvidia-smi
### 设置和训练YOLO模型 #### 选择合适的云服务提供商 为了高效地训练YOLO模型,建议选择提供强大GPU支持的云服务平台,如AWS、Google Cloud Platform (GCP) 或者阿里云。这些平台提供了多种配置选项,可以根据具体需求选择具有适当内存大小和处理器能力的实例。 #### 配置环境 一旦选择了云服务商并启动了一个带有GPU加速功能的虚拟机实例之后,下一步就是安装必要的软件包以及依赖项来搭建适合YOLO开发的工作站。这通常涉及到: - 安装CUDA Toolkit 和 cuDNN 库以确保能够充分利用NVIDIA GPU硬件特性; - 构建Python虚拟环境用于隔离项目所需的库版本; - 利用pip工具安装PyTorch或其他深度学习框架作为基础运行时环境; 对于基于Keras实现的YOLOv8模型,则还需要额外安装TensorFlow及其相关组件[^1]。 ```bash # 更新系统包管理器索引 sudo apt-get update && sudo apt-get upgrade -y # 安装CUDA toolkit与cuDNN wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-keyring_1.0-1_all.deb sudo dpkg -i cuda-keyring_1.0-1_all.deb sudo apt-get install cuda-drivers # 创建并激活新的conda环境 conda create --name yolov8 python=3.9 source activate yolov8 # 安装tensorflow及相关依赖 pip install tensorflow==2.10.0 keras matplotlib opencv-python-headless albumentations pandas scikit-image pyyaml h5py imgaug ``` #### 准备数据集 收集足够的标注图片样本,并按照特定格式整理成目录结构以便于后续加载至程序中。一般情况下会分为`train`, `val`(验证),有时还包括`test`集合。每个子文件夹下放置对应类别的图像文件,同时准备好相应的标签信息(通常是`.txt`或`.xml`形式)。如果采用的是自定义的数据增强策略,像TPH-YOLOv5那样针对特殊场景做了调整的话,也需要在此阶段完成相应设置[^3]。 #### 编写训练脚本 编写一个Python脚本来读取上述准备好的数据源,初始化YOLO架构,设定超参数,最后执行实际的学习过程。当希望创建一个新的YOLOv8模型而非直接使用训练权重时,可以参照如下代码片段所示的方式通过YAML描述文件来进行构建[^2]: ```python from ultralytics import YOLO model = YOLO('path/to/yolov8n.yaml') results = model.train(data='custom_dataset', epochs=100, batch_size=16) ``` 此命令将会依据给定路径下的配置文档建立起全新的神经网络拓扑结构,并利用指定数量轮次迭代整个训练流程,在每一轮结束之际保存当前最佳状态点。 #### 训练监控与调试 在整个过程中应当密切监视各项指标的变化趋势,及时响应可能出现的问题。可以通过tensorboard等可视化工具观察损失函数下降情况以及其他重要统计量的表现。另外,考虑到长时间作业期间可能会遇到意外断电等情况影响进度,记得定期备份工作成果。
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知来者逆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值