Saltar al contenido

Ajuste eficiente de hiperparámetros con Ray Tune y YOLOv8

El ajuste de hiperparámetros es vital para conseguir el máximo rendimiento del modelo, descubriendo el conjunto óptimo de hiperparámetros. Esto implica realizar ensayos con diferentes hiperparámetros y evaluar el rendimiento de cada ensayo.

Acelera la puesta a punto con Ultralytics YOLOv8 y Ray Tune

Ultralytics YOLOv8 incorpora Ray Tune para el ajuste de hiperparámetros, agilizando la optimización de los hiperparámetros del modelo YOLOv8 . Con Ray Tune, puedes utilizar estrategias de búsqueda avanzadas, paralelismo y detención temprana para agilizar el proceso de ajuste.

Ray Tune

Visión general de Ray Tune

Ray Tune es una biblioteca de ajuste de hiperparámetros diseñada para ser eficiente y flexible. Admite varias estrategias de búsqueda, paralelismo y estrategias de parada temprana, y se integra perfectamente con los marcos de aprendizaje automático más populares, incluido Ultralytics YOLOv8 .

Integración con Weights & Biases

YOLOv8 también permite la integración opcional con Weights & Biases para controlar el proceso de ajuste.

Instalación

Para instalar los paquetes necesarios, ejecuta

Instalación

# Install and update Ultralytics and Ray Tune packages
pip install -U ultralytics "ray[tune]"

# Optionally install W&B for logging
pip install wandb

Utilización

Utilización

from ultralytics import YOLO

# Load a YOLOv8n model
model = YOLO('yolov8n.pt')

# Start tuning hyperparameters for YOLOv8n training on the COCO8 dataset
result_grid = model.tune(data='coco8.yaml', use_ray=True)

tune() Parámetros del método

En tune() de YOLOv8 proporciona una interfaz fácil de usar para el ajuste de hiperparámetros con Ray Tune. Acepta varios argumentos que te permiten personalizar el proceso de sintonización. A continuación encontrarás una explicación detallada de cada parámetro:

Parámetro Tipo Descripción Valor por defecto
data str El archivo de configuración del conjunto de datos (en formato YAML) para ejecutar el sintonizador. Este archivo debe especificar las rutas de los datos de entrenamiento y validación, así como otros ajustes específicos del conjunto de datos.
space dict, optional Un diccionario que define el espacio de búsqueda de hiperparámetros para el Ajuste de Rayos. Cada clave corresponde a un nombre de hiperparámetro, y el valor especifica el rango de valores a explorar durante la sintonización. Si no se proporciona, YOLOv8 utiliza un espacio de búsqueda por defecto con varios hiperparámetros.
grace_period int, optional El período de gracia en épocas para el programador ASHA en Sintonía de Rayos. El programador no terminará ningún ensayo antes de este número de épocas, permitiendo que el modelo tenga un mínimo de entrenamiento antes de tomar una decisión sobre la parada anticipada. 10
gpu_per_trial int, optional El número de GPUs a asignar por prueba durante el ajuste. Esto ayuda a gestionar el uso de la GPU, especialmente en entornos multi-GPU. Si no se proporciona, el sintonizador utilizará todas las GPUs disponibles. Ninguno
iterations int, optional El número máximo de pruebas a ejecutar durante la sintonización. Este parámetro ayuda a controlar el número total de combinaciones de hiperparámetros probadas, garantizando que el proceso de ajuste no se ejecute indefinidamente. 10
**train_args dict, optional Argumentos adicionales para pasar al train() durante el ajuste. Estos argumentos pueden incluir ajustes como el número de épocas de entrenamiento, el tamaño del lote y otras configuraciones específicas del entrenamiento. {}

Personalizando estos parámetros, puedes ajustar el proceso de optimización de hiperparámetros para adaptarlo a tus necesidades específicas y a los recursos informáticos disponibles.

Espacio de búsqueda por defecto Descripción

La tabla siguiente enumera los parámetros por defecto del espacio de búsqueda para el ajuste de hiperparámetros en YOLOv8 con Ray Tune. Cada parámetro tiene un rango de valores específico definido por tune.uniform().

Parámetro Rango de valores Descripción
lr0 tune.uniform(1e-5, 1e-1) Tasa de aprendizaje inicial
lrf tune.uniform(0.01, 1.0) Factor de tasa de aprendizaje final
momentum tune.uniform(0.6, 0.98) Impulso
weight_decay tune.uniform(0.0, 0.001) Decaimiento del peso
warmup_epochs tune.uniform(0.0, 5.0) Épocas de calentamiento
warmup_momentum tune.uniform(0.0, 0.95) Momento de calentamiento
box tune.uniform(0.02, 0.2) Caja pérdida peso
cls tune.uniform(0.2, 4.0) Clase pérdida peso
hsv_h tune.uniform(0.0, 0.1) Gama de aumento del tono
hsv_s tune.uniform(0.0, 0.9) Rango de aumento de la saturación
hsv_v tune.uniform(0.0, 0.9) Rango de aumento del valor (luminosidad)
degrees tune.uniform(0.0, 45.0) Rango de aumento de la rotación (grados)
translate tune.uniform(0.0, 0.9) Alcance del aumento de traducción
scale tune.uniform(0.0, 0.9) Rango de aumento de escala
shear tune.uniform(0.0, 10.0) Rango de aumento del cizallamiento (grados)
perspective tune.uniform(0.0, 0.001) Gama de aumento de perspectiva
flipud tune.uniform(0.0, 1.0) Probabilidad de aumento del volteo vertical
fliplr tune.uniform(0.0, 1.0) Probabilidad de aumento del volteo horizontal
mosaic tune.uniform(0.0, 1.0) Probabilidad de aumento del mosaico
mixup tune.uniform(0.0, 1.0) Probabilidad de aumento de la confusión
copy_paste tune.uniform(0.0, 1.0) Probabilidad de aumento de copia-pega

Ejemplo de espacio de búsqueda personalizado

En este ejemplo, demostramos cómo utilizar un espacio de búsqueda personalizado para el ajuste de hiperparámetros con Ray Tune y YOLOv8. Al proporcionar un espacio de búsqueda personalizado, puedes centrar el proceso de ajuste en hiperparámetros específicos de interés.

Utilización

from ultralytics import YOLO

# Define a YOLO model
model = YOLO("yolov8n.pt")

# Run Ray Tune on the model
result_grid = model.tune(data="coco8.yaml",
                         space={"lr0": tune.uniform(1e-5, 1e-1)},
                         epochs=50,
                         use_ray=True)

En el fragmento de código anterior, creamos un modelo YOLO con los pesos preentrenados "yolov8n.pt". A continuación, llamamos a la función tune() especificando la configuración del conjunto de datos con "coco8.yaml". Proporcionamos un espacio de búsqueda personalizado para la tasa de aprendizaje inicial lr0 utilizando un diccionario con la clave "lr0" y el valor tune.uniform(1e-5, 1e-1). Por último, pasamos argumentos de entrenamiento adicionales, como el número de épocas, directamente al método de ajuste como epochs=50.

Procesamiento de los resultados de la sintonización de rayos

Después de ejecutar un experimento de ajuste de hiperparámetros con Ray Tune, es posible que quieras realizar diversos análisis de los resultados obtenidos. Esta guía te llevará a través de flujos de trabajo comunes para procesar y analizar estos resultados.

Cargar los resultados de un experimento Tune desde un directorio

Después de realizar el experimento de ajuste con tuner.fit()puedes cargar los resultados desde un directorio. Esto es útil, sobre todo si realizas el análisis después de que haya salido el script de entrenamiento inicial.

experiment_path = f"{storage_path}/{exp_name}"
print(f"Loading results from {experiment_path}...")

restored_tuner = tune.Tuner.restore(experiment_path, trainable=train_mnist)
result_grid = restored_tuner.get_results()

Análisis básico a nivel experimental

Obtén una visión general del rendimiento de las pruebas. Puedes comprobar rápidamente si hubo algún error durante las pruebas.

if result_grid.errors:
    print("One or more trials failed!")
else:
    print("No errors!")

Análisis básico a nivel de prueba

Accede a las configuraciones individuales de los hiperparámetros de los ensayos y a las últimas métricas comunicadas.

for i, result in enumerate(result_grid):
    print(f"Trial #{i}: Configuration: {result.config}, Last Reported Metrics: {result.metrics}")

Trazar todo el historial de métricas notificadas de un ensayo

Puedes trazar el historial de las métricas comunicadas de cada ensayo para ver cómo evolucionan las métricas a lo largo del tiempo.

import matplotlib.pyplot as plt

for result in result_grid:
    plt.plot(result.metrics_dataframe["training_iteration"], result.metrics_dataframe["mean_accuracy"], label=f"Trial {i}")

plt.xlabel('Training Iterations')
plt.ylabel('Mean Accuracy')
plt.legend()
plt.show()

Resumen

En esta documentación, cubrimos los flujos de trabajo habituales para analizar los resultados de los experimentos realizados con Ray Tune utilizando Ultralytics. Los pasos clave incluyen la carga de los resultados del experimento desde un directorio, la realización de análisis básicos a nivel de experimento y a nivel de prueba, y el trazado de métricas.

Explora más a fondo la página de documentación Analizar resultados de Ray Tune para sacar el máximo partido a tus experimentos de ajuste de hiperparámetros.



Creado 2023-11-12, Actualizado 2024-05-06
Autores: glenn-jocher (5)

Comentarios