Ejecutar TensorFlow distribuido en Compute Engine

Este instructivo muestra cómo usar una configuración distribuida de TensorFlow en múltiples instancias de Compute Engine para entrenar un modelo de red neuronal convolucional con un conjunto de datos MNIST. El conjunto de datos MNIST habilita el reconocimiento de dígitos escritos a mano y se usa ampliamente en el aprendizaje automático como un conjunto de entrenamiento para el reconocimiento de imágenes.

TensorFlow es la biblioteca de código abierto de Google para el aprendizaje automático, desarrollada por investigadores y por ingenieros de la organización de inteligencia artificial de Google, que forma parte de Research en Google. TensorFlow está diseñado para ejecutarse en varias computadoras y así distribuir cargas de trabajo de entrenamiento. En este instructivo, ejecutarás TensorFlow en varias instancias de máquinas virtuales de Compute Engine para entrenar el modelo. En su lugar, puedes usar Cloud Machine Learning Engine, que administra las tareas de asignación de recursos para ti y puede alojar tus modelos entrenados. Te recomendamos usar el motor de Cloud ML, a menos que tengas una razón específica para no hacerlo. Puedes obtener más información en la versión de este instructivo que usa Cloud ML Engine y Cloud Datalab.

El siguiente diagrama describe la arquitectura para ejecutar una configuración distribuida de TensorFlow en Compute Engine y usar Cloud ML Engine con Cloud Datalab para realizar predicciones con tu modelo entrenado.

imagen

Este instructivo te muestra cómo configurar y usar esta arquitectura, y explica algunos de los conceptos a lo largo del camino.

Objetivos

  • Configurar Compute Engine a fin de crear un clúster de máquinas virtuales (VM) para ejecutar el TensorFlow.
  • Obtener más información acerca de cómo ejecutar el código de ejemplo distribuido de TensorFlow en tu grupo de clústeres de Compute Engine para entrenar un modelo. El código de ejemplo usa las últimas bibliotecas y patrones de TensorFlow, por lo que puedes usarlo como referencia cuando diseñes tu propio código de entrenamiento.
  • Implementar el modelo entrenado en Cloud ML Engine a fin de crear una API personalizada para las predicciones y luego ejecutar las predicciones con un notebook de Cloud Datalab.

Costos

El precio estimado para ejecutar este instructivo, suponiendo que uses todos los recursos durante un día completo, es de aproximadamente $1.20 en función de esta calculadora de precios.

Antes de comenzar

  1. Accede a tu Cuenta de Google.

    Si todavía no tienes una cuenta, regístrate para obtener una nueva.

  2. Selecciona o crea un proyecto de GCP.

    Ir a la página Administrar recursos

  3. Asegúrate de tener habilitada la facturación para tu proyecto.

    Aprende a habilitar la facturación

  4. Habilita las Compute Engine y Cloud Machine Learning API necesarias.

    Habilita las API

Cómo crear la instancia de plantilla

Este instructivo usa Cloud Shell, un shell de Linux totalmente funcional en Google Cloud Platform Console.

  1. Ve a Cloud Shell.

    Abre Cloud Shell.

  2. Configura tu zona predeterminada de Compute Engine y tu proyecto predeterminado:

    gcloud config set compute/zone us-east1-c
    gcloud config set project [YOUR_PROJECT_ID]
  3. Clona el repositorio de GitHub:

    git clone https://github.com/GoogleCloudPlatform/cloudml-dist-mnist-example
    cd cloudml-dist-mnist-example
  4. Crea la instancia de VM inicial desde una imagen de Ubuntu Wily:

    gcloud compute instances create template-instance \
    --image-project ubuntu-os-cloud \
    --image-family ubuntu-1604-lts \
    --boot-disk-size 10GB \
    --machine-type n1-standard-1
  5. Usa SSH para conectarte a la VM:

    gcloud compute ssh template-instance
  6. Instala pip:

    sudo apt-get update
    sudo apt-get -y upgrade \
    && sudo apt-get install -y python-pip python-dev
  7. Instala TensorFlow:

    sudo pip install tensorflow
    
  8. Sigue los pasos para verificar tu instalación. (Opcional).

  9. Escribe exit para volver a Cloud Shell.

  10. Verifica la versión de TensorFlow que se ejecuta en tu instancia de Cloud Shell:

    sudo python -c 'import tensorflow as tf; print(tf.__version__)'
  11. Si la versión es inferior a 1.2.1, usa pip para actualizarla:

    sudo pip install --upgrade tensorflow

Cómo crear un depósito de Cloud Storage

A continuación, crea un depósito de Cloud Storage para almacenar tus archivos MNIST. Sigue los siguientes pasos:

  1. Crea un depósito de Cloud Storage regional para conservar los archivos de datos MNIST que se compartirán entre las instancias de trabajadores:

    MNIST_BUCKET="mnist-$RANDOM"
    gsutil mb -c regional -l us-east1 gs://${MNIST_BUCKET}
  2. Usa la siguiente secuencia de comandos para descargar los archivos de datos MNIST y copiarlos en el depósito.

    sudo ./scripts/create_records.py
    gsutil cp /tmp/data/train.tfrecords gs://${MNIST_BUCKET}/data/
    gsutil cp /tmp/data/test.tfrecords gs://${MNIST_BUCKET}/data/

Cómo crear la imagen de la plantilla y las instancias de entrenamiento

Para crear las instancias de trabajador, maestro y servidor de parámetros, convierte la instancia de la plantilla en una imagen y luego usa la imagen para crear cada instancia nueva.

  1. Desactiva la eliminación automática de la template-instance VM, la cual conserva el disco cuando se borra la VM:

    gcloud compute instances set-disk-auto-delete template-instance \
    --disk template-instance --no-auto-delete
  2. Borrar template-instance:

    gcloud compute instances delete template-instance
  3. Crea la imagen template-image desde el disco template-instance:

    gcloud compute images create template-image \
    --source-disk template-instance
  4. Crea las instancias adicionales. Para este instructivo, crea cuatro nombres de instancia master-0, worker-0,worker-1,andps-0. El alcance storage-rw permite que las instancias accedan a tu Depósito de Cloud Storage Asegúrate de delimitar los nombres de las instancias con espacios de la siguiente manera:

    gcloud compute instances create \
    master-0 worker-0 worker-1 ps-0 \
    --image template-image \
    --machine-type n1-standard-4 \
    --scopes=default,storage-rw

El clúster está listo para ejecutar TensorFlow distribuido.

Cómo ejecutar el código distribuido de TensorFlow

En esta sección, ejecutarás una secuencia de comandos a fin de indicar a todas tus instancias de VM que ejecuten el código TensorFlow para entrenar el modelo.

En Cloud Shell, ejecuta el siguiente comando desde el directorio cloudml-dist-mnist-example:

./scripts/start-training.sh gs://${MNIST_BUCKET}

La secuencia de comandos nombrada start-training.sh empuja el código a cada VM y envía los parámetros necesarios para iniciar el proceso TensorFlow en cada máquina para crear el clúster distribuido. La transmisión saliente en Cloud Shell muestra la pérdida y los valores de precisión para el conjunto de datos de prueba.

Valores de exactitud en la terminal

Cuando finaliza el entrenamiento, la secuencia de comandos imprime la ubicación de los archivos de modelo recién generados:

Trained model is stored in gs://${MNIST_BUCKET}/job_[TIMESTAMP]/export/Servo/[JOB_ID]/

Copia la ubicación de tu ruta de depósito para usarla en pasos posteriores.

Cómo publicar tu modelo para predicciones

Generaste correctamente un modelo nuevo que puedes usar para hacer predicciones. El entrenamiento de modelos más sofisticados requiere un código TensorFlow más complejo, pero la configuración de los recursos de procesamiento y almacenamiento es similar.

Entrenar al modelo es solo la mitad de la historia. Necesitas conectar tu modelo a tu aplicación o unir un servicio de API a su alrededor con autenticación, y finalmente hacer que todo se escale. Hay una cantidad relativamente significativa de trabajo de ingeniería para hacer que tu modelo sea útil.

Cloud ML Engine puede ayudar con una parte de este trabajo. Cloud ML Engine es una versión completamente administrada de TensorFlow que se ejecuta en Cloud Platform. Cloud ML Engine te ofrece todas las funciones potentes de TensorFlow sin necesidad de instalar algún software ni configurar alguna infraestructura adicional. Puedes escalar automáticamente tu entrenamiento distribuido para usar miles de CPU o GPU y pagar solo por lo que usas.

Debido a que Cloud ML Engine ejecuta TensorFlow en segundo plano, todo tu trabajo es portátil y no estás encerrado en una herramienta patentada.

Prueba el instructivo Uso de TensorFlow distribuido con Cloud Datalab a fin de usar el mismo código de ejemplo para entrenar a tu modelo mediante Cloud ML Engine.

También puedes configurar Cloud ML Engine a fin de alojar tu modelo para predicciones. Usa los siguientes pasos para publicar tu modelo en Cloud ML Engine. Alojar tu modelo puede darte la posibilidad de probar y aplicar rápidamente tu modelo a gran escala con todas las características de seguridad y confiabilidad que esperarías de un servicio administrado por Google.

Los siguientes pasos usan la ruta de depósito del modelo que fue saliente anteriormente por la secuencia de comandos nombrada start-training.sh.

  1. Recuerda la ruta de salida a tu depósito de Cloud Storage con los modelos generados. Está en el siguiente formato, en el que [JOB_ID] es el ID de trabajo. Usarás esta ruta en el siguiente paso:

    MODEL_BUCKET: gs://${MNIST_BUCKET}/job_[TIMESTAMP]/export/Servo/[JOB_ID]
  2. Define una nueva versión v1 de tu modelo con la herramienta de línea de comandos de gcloud y dirígela a los archivos de modelo en tu depósito. El siguiente comando puede tardar varios minutos en completarse. Reemplaza [YOUR_BUCKET_PATH] con la ruta de salida del paso anterior. La ruta empieza con gs://.

    MODEL="MNIST"
    MODEL_BUCKET=[YOUR_BUCKET_PATH]
    gcloud ml-engine models create ${MODEL} --regions us-east1
    gcloud ml-engine versions create \
     --origin=${MODEL_BUCKET} --model=${MODEL} v1
  3. Establece la versión predeterminada de tu modelo en "v1":

    gcloud ml-engine versions set-default --model=${MODEL} v1

Ahora, el modelo se ejecuta con Cloud ML y es capaz de procesar predicciones. En la siguiente sección, usarás Cloud Datalab para hacer y visualizar predicciones.

Cómo ejecutar predicciones con Cloud Datalab

A fin de probar tus predicciones, crea una instancia de Cloud Datalab que use Jupyter Notebooks interactivos para ejecutar el código.

  1. En Cloud Shell, ingresa el siguiente comando para crear una instancia de Cloud Datalab:

    datalab create mnist-datalab
    
  2. Desde Cloud Shell, inicia la página de la lista de notebook de Cloud Datalab haciendo clic en Vista previa de Cloud Shell Web (el ícono cuadrado en la parte superior derecha).

  3. Selecciona Cambiar puerto y selecciona Puerto 8081 para iniciar una pestaña nueva en tu navegador.

  4. En la aplicación Cloud Datalab, crea un nuevo notebook haciendo clic en el ícono +Notebook en la esquina superior derecha.

  5. Pega el siguiente texto en la primera celda del notebook nuevo:

    %%bash
    wget https://raw.githubusercontent.com/GoogleCloudPlatform/cloudml-dist-mnist-example/master/notebooks/Online%20prediction%20example.ipynb
    cat Online\ prediction\ example.ipynb > Untitled\ Notebook.ipynb
  6. Haz clic en Ejecutar en la parte superior de la página para descargar el notebook de Predicción en línea example.ipynb. La secuencia de comandos copia el contenido del notebook remoto en el notebook actual.

  7. Actualiza la página del navegador para cargar el contenido del notebook nuevo. A continuación, selecciona la primera celda que contiene el código JavaScript y haz clic en Ejecutar para ejecutarlo.

  8. Desplázate hacia abajo en la página hasta que veas el panel de dibujo de números y dibuja un número con el cursor:

    El número 3 dibujado con un cursor.

  9. Haz clic en la siguiente celda para activarla y luego en la flecha hacia abajo junto con el botón Ejecutar en la parte superior y selecciona Ejecutar desde esta celda.

  10. La salida de la predicción es un arreglo de longitud 10 en el que cada índice, 0-9, contiene un número correspondiente a ese dígito. Cuanto más cercano sea el número a 1, más probable es que el índice coincida con el dígito que ingresaste. Puedes ver que la posición número 3 resaltada en la lista es muy cercana a 1 y, por lo tanto, tiene una alta probabilidad de hacer coincidir el dígito.

    PROBABILITIES
    [4.181503356903704e-07,
    7.12400151314796e-07,
    0.00017898145597428083,
    0.9955494403839111,
    5.323939553103507e-11,
    0.004269002005457878,
    7.927398321116996e-11,
    1.2688398953741853e-07,
    1.0825967819982907e-06,
    2.2037748692582682e-07]

La última celda del notebook señala un gráfico de barras que muestra claramente que predijo tu número, que en este caso era 3.

El gráfico de barras muestra que el número 3 fue seleccionado.

Limpieza

Sigue estos pasos para evitar que se apliquen cargos a tu cuenta de Google Cloud Platform por los recursos que usaste en este instructivo:

  1. Borra la versión de tu modelo:

    gcloud ml-engine versions delete v1 --model=MNIST
  2. Borra el modelo:

    gcloud ml-engine models delete MNIST
  3. Borra tu depósito de Cloud Storage

    gsutil rm -r gs://${MNIST_BUCKET}
  4. Borra tus máquinas virtuales, incluida Cloud Datalab:

    gcloud compute instances delete master-0 worker-0 worker-1 ps-0 mnist-datalab
  5. Borra la imagen de tu plantilla de VM:

    gcloud compute images delete template-image
  6. Borra tu disco persistente de Cloud Datalab:

    gcloud compute disks delete mnist-datalab-pd --zone us-east1-c

¿Qué sigue?

¿Te sirvió esta página? Envíanos tu opinión:

Enviar comentarios sobre…