Utilice sus propios scripts de entrenamiento y seleccione automáticamente el mejor modelo mediante la optimización de hiperparámetros en Amazon SageMaker PlatoBlockchain Data Intelligence. Búsqueda vertical. Ai.

Utilice sus propios scripts de entrenamiento y seleccione automáticamente el mejor modelo mediante la optimización de hiperparámetros en Amazon SageMaker

El éxito de cualquier canalización de aprendizaje automático (ML) depende no solo de la calidad del modelo utilizado, sino también de la capacidad de entrenar e iterar sobre este modelo. Una de las formas clave de mejorar un modelo ML es elegir mejores parámetros ajustables, conocidos como hiperparámetros. Esto se conoce como optimización de hiperparámetros (HPO). Sin embargo, hacer este ajuste manualmente a menudo puede ser engorroso debido al tamaño del espacio de búsqueda, que a veces implica miles de iteraciones de entrenamiento.

Esta publicación muestra cómo Amazon SageMaker le permite no solo traer su propio algoritmo de modelo usando el modo de secuencia de comandos, sino también usar el algoritmo HPO incorporado. Aprenderá cómo generar fácilmente la métrica de evaluación de su elección para Reloj en la nube de Amazon, de donde puede extraer esta métrica para guiar el algoritmo HPO automático. A continuación, puede crear un trabajo de ajuste de HPO que orqueste varios trabajos de entrenamiento y recursos informáticos asociados. Al finalizar, puede ver el mejor trabajo de capacitación según la métrica de evaluación.

Resumen de la solución

Seguimos los siguientes pasos:

  1. Utilice el modo de secuencia de comandos de SageMaker para incorporar nuestro propio modelo a un contenedor administrado por AWS.
  2. Refactorice nuestro script de entrenamiento para imprimir nuestra métrica de evaluación.
  3. Busque la métrica en CloudWatch Logs.
  4. Extraiga la métrica de CloudWatch.
  5. Use HPO para seleccionar el mejor modelo ajustando esta métrica de evaluación.
  6. Monitoree el HPO y encuentre el mejor trabajo de capacitación.

Requisitos previos

Para este tutorial, debe tener los siguientes requisitos previos:

Use algoritmos personalizados en un contenedor administrado por AWS

Consulte Traiga su propio modelo con el modo de script de Amazon SageMaker para obtener una visión más detallada de cómo incorporar un modelo personalizado a SageMaker mediante un contenedor administrado por AWS.

Usamos la conjunto de datos MNIST para este ejemplo. MNIST es un conjunto de datos ampliamente utilizado para la clasificación de dígitos escritos a mano, que consta de 70,000 28 imágenes en escala de grises de 28 × 60,000 píxeles etiquetadas de dígitos escritos a mano. El conjunto de datos se divide en 10,000 10 imágenes de entrenamiento y XNUMX XNUMX imágenes de prueba, que contienen XNUMX clases (una para cada dígito).

  1. Abra la instancia de su cuaderno y ejecute el siguiente comando para descargar el mnist.py archivo:
    !wget https://raw.githubusercontent.com/aws/amazon-sagemaker-examples/main/hyperparameter_tuning/pytorch_mnist/mnist.py

    Antes de obtener y almacenar los datos, creemos una sesión de SageMaker. También debemos especificar el depósito y el prefijo de S3 que se usarán para el entrenamiento y los datos del modelo. Debe estar dentro de la misma región que la instancia del cuaderno, la capacitación y el hospedaje. El siguiente código utiliza el cubeta predeterminada si ya existe, o crea uno nuevo si no existe. También debemos incluir el ARN del rol de IAM para brindar capacitación y acceso de hospedaje a sus datos. Usamos get_execution_role() para obtener el rol de IAM que creó para su instancia de notebook.

  2. Cree una sesión con el siguiente código:
    import sagemaker
    from sagemaker.tuner import (
    IntegerParameter,
    CategoricalParameter,
    ContinuousParameter,
    HyperparameterTuner,
    )
    session = sagemaker.Session()
    bucket = session.default_bucket()
    prefix = "sagemaker/DEMO-custom-hpo"
    role = sagemaker.get_execution_role()

  3. Ahora obtengamos los datos, guárdelos en nuestra carpeta local /datay cárguelo en Amazon S3:
    from torchvision.datasets import MNIST
    from torchvision import transforms
    MNIST.mirrors = ["https://sagemaker-sample-files.s3.amazonaws.com/datasets/image/MNIST/"]
    MNIST(
    "data",
    download=True,
    transform=transforms.Compose(
    [transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))]
    ),
    )
    inputs = session.upload_data(path="data", bucket=bucket, key_prefix=prefix)

    Ahora podemos crear un estimador para configurar el trabajo de entrenamiento de PyTorch. No nos centramos en el código de entrenamiento real aquí (mnist.py) en gran detalle. Veamos cómo podemos invocar fácilmente este script de entrenamiento para inicializar un trabajo de entrenamiento.

  4. En el siguiente código, incluimos un script de punto de entrada llamado mnist.py que contiene nuestro código de entrenamiento personalizado:
    from sagemaker.pytorch import PyTorch
    estimator = PyTorch(
    entry_point="mnist.py",
    role=role,
    py_version="py3",
    framework_version="1.8.0",
    instance_count=1,
    instance_type="ml.c5.2xlarge",
    hyperparameters={"epochs": 5},
    )

  5. Para asegurarnos de que este trabajo de entrenamiento se haya configurado correctamente, con código de entrenamiento en funcionamiento, podemos iniciar un trabajo de entrenamiento ajustándolo a los datos que cargamos en Amazon S3. SageMaker garantiza que nuestros datos estén disponibles en el sistema de archivos local, por lo que nuestro script de entrenamiento solo puede leer los datos del disco:
    estimator.fit({"training": inputs})

Sin embargo, no estamos creando un solo trabajo de capacitación. Utilizamos la capacidad de ajuste automático de modelos de SageMaker mediante el uso de un trabajo de ajuste de hiperparámetros. El ajuste del modelo es completamente independiente del algoritmo del modelo real. Para obtener más información sobre todos los hiperparámetros que puede ajustar, consulte Realice el ajuste automático del modelo con SageMaker.

Para cada hiperparámetro que queramos optimizar, tenemos que definir lo siguiente:

  • Un nombre
  • Un tipo (los parámetros pueden ser enteros, continuos o categóricos)
  • Un rango de valores para explorar
  • Un tipo de escala (lineal, logarítmica, logarítmica inversa o automática); esto nos permite controlar cómo se explorará un rango de parámetros específico

También debemos definir la métrica para la que estamos optimizando. Puede ser cualquier valor numérico siempre que sea visible en el registro de entrenamiento y pueda pasar una expresión regular para extraerlo.

Si observamos la línea 181 en mnist.py, podemos ver cómo imprimimos en el registrador:

logger.info(
"Test set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)n".format(
test_loss, correct, len(test_loader.dataset), 100.0 * correct / len(test_loader.dataset)
)

De hecho, podemos ver este resultado en los registros del trabajo de entrenamiento que acabamos de ejecutar. Al abrir el grupo de registro /aws/sagemaker/TrainingJobs en la consola de CloudWatch, deberíamos tener un evento de registro que comience con pytorch-training- seguido de una marca de tiempo y un nombre generado.

La siguiente captura de pantalla destaca el registro que estamos buscando.

Ahora comencemos a construir nuestro trabajo de ajuste de hiperparámetros.

  1. Como se mencionó, primero debemos definir alguna información sobre los hiperparámetros, bajo el objeto de la siguiente manera:
    hyperparameter_ranges = {
    "lr": ContinuousParameter(0.001, 0.1),
    "batch-size": CategoricalParameter([32, 64, 128, 256, 512]),
    }

    Aquí definimos nuestros dos hiperparámetros. La tasa de aprendizaje (lr) es un parámetro continuo (por lo tanto, un valor continuo) en el rango de 0.001 y 0.1. El tamaño del lote (batch-size) es un parámetro categórico con los valores discretos anteriores.

    A continuación, especificamos la métrica objetiva que nos gustaría ajustar y su definición. Esto incluye la expresión regular (regex) necesaria para extraer esa métrica de los registros de CloudWatch del trabajo de entrenamiento que vimos anteriormente. También especificamos un nombre descriptivo pérdida de prueba promedio y el tipo de objetivo como Minimizar, por lo que el ajuste de hiperparámetro busca minimizar la métrica objetiva al buscar la mejor configuración de hiperparámetro.

  2. Especifique la métrica con el siguiente código:
    metric_definitions = [{"Name": "average test loss", "Regex": "Test set: Average loss: ([0-9.]+)"}]
    objective_metric_name = "average test loss"
    objective_type = "Minimize"

    Ahora estamos listos para crear nuestro HyperparameterTuner objeto. Además del nombre, el tipo y la definición de la métrica objetiva, pasamos el hyperparameter_ranges objeto y el estimador que creamos previamente. También especificamos el número de trabajos que queremos ejecutar en total, junto con el número que debe ejecutarse en paralelo. Hemos elegido 9 como número máximo de trabajos, pero normalmente optaría por un número mucho mayor (como 50) para un rendimiento óptimo.

  3. Crea el HyperparameterTuner objeto con el siguiente código:
    tuner = HyperparameterTuner(
    estimator,
    objective_metric_name,
    hyperparameter_ranges,
    metric_definitions,
    max_jobs=9,
    max_parallel_jobs=3,
    objective_type=objective_type,
    )

Antes de comenzar el trabajo de ajuste, vale la pena señalar cómo se determinan las combinaciones de hiperparámetros. Para obtener buenos resultados, debe elegir los rangos correctos para explorar. De forma predeterminada, se utiliza la estrategia de búsqueda bayesiana, que se describe más adelante en Cómo funciona el ajuste de hiperparámetros.

Con la optimización bayesiana, el ajuste de hiperparámetros se trata como un regresión problema. Para resolver este problema de regresión, hace conjeturas sobre qué combinaciones de hiperparámetros obtendrán los mejores resultados y ejecuta trabajos de entrenamiento para probar estos valores. Utiliza la regresión para elegir el siguiente conjunto de valores de hiperparámetros para probar. Hay una clara compensación de explotación/exploración que hace la estrategia de búsqueda aquí. Puede elegir valores de hiperparámetros cercanos a la combinación que dio como resultado el mejor trabajo de entrenamiento anterior para mejorar el rendimiento de forma incremental. O bien, puede elegir valores más lejanos, para tratar de explorar un nuevo rango de valores que aún no se comprende bien.

Sin embargo, puede especificar otras estrategias de búsqueda. Las siguientes estrategias son compatibles con SageMaker:

  • búsqueda de cuadrícula – Prueba todas las combinaciones posibles entre el rango de hiperparámetros que se especifica.
  • Búsqueda aleatoria – Intenta combinaciones aleatorias entre el rango de valores especificado. No depende de los resultados de los trabajos de entrenamiento anteriores, por lo que puede ejecutar la cantidad máxima de trabajos de entrenamiento simultáneos sin afectar el rendimiento del ajuste.
  • Búsqueda hiperbanda – Utiliza los resultados intermedios y finales de los trabajos de entrenamiento para reasignar épocas a configuraciones de hiperparámetros bien utilizadas y detiene automáticamente aquellas que tienen un rendimiento inferior.

También puede explorar traer su propio algoritmo, como se explica en Traiga su propio algoritmo de optimización de hiperparámetros en Amazon SageMaker.

  1. Luego lanzamos el entrenamiento en el propio objeto sintonizador (no en el estimador), llamando .fit() y pasando la ruta S3 a nuestro conjunto de datos de tren y prueba:
    tuner.fit({"training": inputs})

A continuación, podemos seguir el progreso de nuestro trabajo de ajuste en la consola de SageMaker, en la Trabajos de ajuste de hiperparámetros página. El trabajo de ajuste activa los recursos informáticos subyacentes necesarios al organizar cada ejecución de entrenamiento individual y su proceso asociado.

Luego, es fácil ver todos los trabajos de capacitación individuales que se completaron o están en progreso, junto con su valor de métrica objetivo asociado. En la siguiente captura de pantalla, podemos ver que se completó el primer lote de trabajos de capacitación, que contiene tres en total de acuerdo con nuestra especificación max_parallel_jobs valor de 3. Al finalizar, podemos encontrar el mejor trabajo de entrenamiento, el que minimiza la pérdida de prueba promedio, en el Mejor trabajo de entrenamiento .

Captura de pantalla de la lista de trabajos de formación

Limpiar

Para evitar incurrir en cargos futuros, elimine los recursos que inicializó. Estos son el depósito de S3, el rol de IAM y la instancia del cuaderno de SageMaker.

Conclusión

En esta publicación, discutimos cómo podemos traer nuestro propio modelo a SageMaker y luego usar la optimización automatizada de hiperparámetros para seleccionar el mejor trabajo de entrenamiento. Usamos el popular conjunto de datos MNIST para ver cómo podemos especificar una métrica objetiva personalizada para la cual se debe optimizar el trabajo de HPO. Al extraer esta métrica objetiva de CloudWatch y especificar varios valores de hiperparámetros, podemos iniciar y monitorear fácilmente el trabajo de HPO.

Si necesita más información o desea ver cómo nuestros clientes utilizan HPO, consulte Ajuste automático de modelos de Amazon SageMaker. Adapte su propio modelo para la optimización automatizada de hiperparámetros en SageMaker hoy.


Acerca del autor.

Utilice sus propios scripts de entrenamiento y seleccione automáticamente el mejor modelo mediante la optimización de hiperparámetros en Amazon SageMaker PlatoBlockchain Data Intelligence. Búsqueda vertical. Ai.precio de sam es un Consultor de Servicios Profesionales especializado en AI/ML y análisis de datos en Amazon Web Services. Trabaja en estrecha colaboración con clientes del sector público en el sector de la salud y las ciencias de la vida para resolver problemas desafiantes. Cuando no está haciendo esto, a Sam le gusta tocar la guitarra y el tenis, y ver a sus bandas indie favoritas.

Sello de tiempo:

Mas de Aprendizaje automático de AWS