Configure y use el servidor en la nube para entrenar el modelo de red neuronal: entrene el modelo yolov5 en el servidor Ali GPU

prefacio

Para aquellos que no tienen una máquina de entrenamiento de GPU, usar un servidor en la nube para entrenar su modelo debería ser la opción más óptima. Simplemente abra un servidor que se facture por hora durante el entrenamiento. Una vez que se completa el entrenamiento y la imagen del entorno es guardado, el servidor se puede detener por completo. No hay costo durante el período, y la próxima vez que entrene nuevamente, simplemente inicie el entorno, y es fácil proteger su entorno de entrenamiento de la contaminación.

1. Seleccione un servidor

1. El servidor de Alibaba se selecciona aquí y puede iniciar sesión directamente con su cuenta de Alipay.
2. Seleccione la configuración y pague sobre la marcha. Entrené el modelo yolov5 con un conjunto de datos de más de 20,000, y el V100 es completamente suficiente.
inserte la descripción de la imagen aquí
3. Seleccione el sistema e instale la GPU para comenzar
inserte la descripción de la imagen aquí
3. Seleccione la velocidad de la red (velocidad de enlace ascendente y descendente) y luego confirme el pedido.
inserte la descripción de la imagen aquí

Dos, configurar el servidor

1. Para conectarse al servidor, haga clic en Conexión remota directamente.
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
2. Cambie a raíz e instale los archivos necesarios.

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

3. Configurar el entorno (usando Anaconda3)

1. Primero descargue Anaconda3 a su directorio local y luego cárguelo al servidor con scp

 scp data/Anaconda3-5.3.0-Linux-x86_64.sh [email protected]:/home/data/ 

Después de esperar a que se complete la carga, instale Anaconda3 en el servidor y confirme hasta que se complete la instalación.
inserte la descripción de la imagen aquí
Agregue Anaconda3 a la variable de entorno.

sudo vim ~/.bashrc

Agregue la ruta bin al final del archivo, luego guarde el archivo y salga.

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

inserte la descripción de la imagen aquí

Usa el entorno para tener efecto

source ~/.bashrc

2. Crea el ambiente

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

3. Descargue el código del algoritmo, puede descargar el código fuente directamente desde git o cargar el código fuente que ha cambiado.
Descarga el código fuente de git, yolov5s como ejemplo:

descargar git

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

Dependencias de carga local e instalación manual

scp data/yolov5.zip [email protected]:/home/data/

Una vez completada la carga, cambie al servidor

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

4. Tratamiento de datos

1. Cargue el conjunto de datos en el servidor

 scp data/dataset.zip [email protected]:/home/data/yolov5 

2. Una vez completada la carga, divida los datos en un conjunto de entrenamiento y un conjunto de prueba. El formato de datos coco utilizado aquí debe convertirse al formato yolov5.

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

Conversión de datos y generación de código fuente 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)

5. Modelo de formación

1. Antes de entrenar el modelo, ejecute screen primero para asegurarse de que el entrenamiento pueda continuar después de desconectar el terminal de servicio.

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

pantalla de comandos comunes

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

2. Reactivar el medio ambiente

conda activate yolov5

3. Modelo de formación

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

inserte la descripción de la imagen aquí

6. Algunos comandos de uso común en Linux

  1. scp

descargar archivo del servidor

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

Subir archivos locales al servidor

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

Subir directorio al servidor

	scp  -r ~/local_dir username@servername:/remote_path/remote_dir
  1. configuración de vim
    directorio del archivo de configuración a nivel del sistema: /etc/vim/vimrc
    directorio del archivo de configuración a nivel del usuario: ~/.vim/vimrc
    modificar el archivo de configuración vimrc o .vimrc

//mostrar numero de linea

set nu

  1. Comando zip de compresión y descompresión
    zip -r file.zip ./*
    Comprime todos los archivos y carpetas en el directorio actual en un archivo file.zip, -r significa comprimir recursivamente todos los archivos en subdirectorios.

El comando de descompresión
unzip -o -d /home/sunny file.zip
descomprime el archivo file.zip en /home/sunny/
-o: sobrescribe el archivo sin preguntar;
-d:-d /home/sunny especifica que se descomprima el archivo Comprímalo en el directorio /home/sunny;

Otros
zip -d file.zip smart.txt
elimina el archivo smart.txt en el archivo comprimido
zip -m file.zip ./rpm_info.txt
agrega el archivo rpm_info.txt a file.zip en el archivo comprimido

  1. agente terminal
export ALL_PROXY=socks5://127.0.0.1:4081 #端口号
curl -L cip.cc #验证是否成功
  1. controlador de gráficos
nvidia-smi

Supongo que te gusta

Origin blog.csdn.net/matt45m/article/details/125121570
Recomendado
Clasificación