Ejecuta TensorFlow distribuido en Compute Engine

En este instructivo, se muestra cómo usar una configuración distribuida de TensorFlow en varias instancias de Compute Engine para entrenar un modelo de red neuronal convolucional mediante el conjunto de datos MNIST. El conjunto de datos MNIST habilita el reconocimiento de dígitos de escritura a mano, y su uso es muy amplio en el aprendizaje automático como conjunto de entrenamiento para el reconocimiento de imágenes.

TensorFlow es una plataforma de código abierto de extremo a extremo para el aprendizaje automático. Cuenta con un ecosistema integral y flexible de herramientas, bibliotecas y recursos de la comunidad que permite a los investigadores impulsar innovaciones en el aprendizaje automático y a los desarrolladores compilar e implementar aplicaciones con tecnología de AA. TensorFlow se diseñó para ejecutarse en varias computadoras a fin de distribuir las cargas de trabajo de entrenamiento. En este instructivo, ejecutarás TensorFlow en varias instancias de máquina virtual (VM) de Compute Engine para entrenar el modelo. En su lugar, puedes usar AI Platform, que administra las tareas de asignación de recursos por ti y puede alojar los modelos entrenados. Te recomendamos que uses AI Platform, a menos que tengas un motivo específico para no hacerlo. Puedes obtener más información en la versión de este instructivo que usa AI Platform y Datalab.

En el siguiente diagrama, se describe la arquitectura para ejecutar una configuración distribuida de TensorFlow en Compute Engine y usar AI Platform con Datalab a fin de ejecutar predicciones con el modelo entrenado.

Diagrama de ejecución de Tensorflow en Compute Engine

En este instructivo, se muestra cómo configurar y usar esta arquitectura, y se explican algunos de los conceptos a lo largo del proceso.

Objetivos

  • Configurar Compute Engine a fin de crear un clúster de VM para ejecutar TensorFlow
  • Aprender a ejecutar el código de muestra distribuido de TensorFlow en un clúster de Compute Engine para entrenar un modelo. El código de ejemplo usa las bibliotecas y los patrones más recientes de TensorFlow, por lo que puedes usarlo como referencia cuando diseñes tu propio código de entrenamiento
  • Implementar el modelo entrenado en AI Platform a fin de crear una API personalizada para las predicciones y, luego, ejecutar las predicciones mediante un notebook de Datalab.

Costos

El precio estimado para ejecutar este instructivo, bajo la suposición de que uses todos los recursos durante un día completo, es de alrededor de $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. En la página de selección de proyectos de Cloud Console, selecciona o crea un proyecto de Cloud.

    Ir a la página Selector de proyectos

  3. Comprueba que la facturación esté habilitada en tu proyecto.

    Descubre cómo puedes habilitar la facturación

  4. Habilita las API de Compute Engine API, AI Platform Training and Prediction API, and Cloud Source Repositories.

    Habilita las API

Crea la instancia de la plantilla

En este instructivo, se usa Cloud Shell, un shell de Linux completamente funcional en Google Cloud Console.

  1. Ve a Cloud Shell.

    Abrir Cloud Shell

  2. Configura la zona predeterminada de Compute Engine y el proyecto predeterminado. Reemplaza [YOUR_PROJECT_ID] con el proyecto de Google Cloud.

    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 a partir de 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 python3-pip
  7. Instala TensorFlow:

    sudo pip3 install tensorflow==1.14.0 gast==0.2.2
    
  8. Escribe exit para volver a Cloud Shell.

Crea un depósito de Cloud Storage

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

  1. Crea un depósito regional de Cloud Storage para contener los archivos de datos de MNIST que se van a compartir entre las instancias de trabajador:

    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 de MNIST y cópialos en el depósito:

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

Crea la imagen de la plantilla y las instancias de entrenamiento

Para crear la instancia de trabajador, la principal y la de 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 para la VM template-instance, que conserva el disco cuando se borra la VM:

    gcloud compute instances set-disk-auto-delete template-instance \
    --device-name persistent-disk-0 --no-auto-delete
  2. Borra template-instance:

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

    gcloud compute images create template-image \
    --source-disk template-instance
  4. Crea las instancias adicionales. Para este instructivo, debes crear cuatro instancias llamadas master-0, worker-0, worker-1, y ps-0. El permiso storage-rw permite que las instancias accedan al 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.

Ejecuta el código de TensorFlow distribuido

En esta sección, debes ejecutar una secuencia de comandos para indicarle a todas las instancias de VM que ejecuten el código de TensorFlow a fin de entrenar el modelo.

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

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

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

    Valores de precisión en la terminal

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

    Trained model is stored in gs://${MNIST_BUCKET}/job_[TIMESTAMP]/export/Servo/[JOB_ID]/
  2. Copia la ubicación de tu ruta de acceso al depósito para usarla en pasos posteriores.

Publica tu modelo para predicciones

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

Entrenar el modelo es solo la mitad de la historia. Debes conectar el modelo a la aplicación o unir un servicio de API con autenticación y, por último, hacer que todo escale. Se requiere una cantidad bastante significativa de trabajo de ingeniería para que el modelo sea útil.

AI Platform puede ayudar con una parte de este trabajo. Proporciona una versión completamente administrada de TensorFlow que se ejecuta en Google Cloud. AI Platform te brinda todas las funciones potentes de TensorFlow sin necesidad de configurar ninguna infraestructura adicional ni instalar ningún software. Puedes escalar de forma automática el entrenamiento distribuido para usar todas las CPU o GPU que necesites, y solo pagas por lo que usas.

Debido a que AI Platform ejecuta TensorFlow en segundo plano, todo el trabajo es portátil, y no estás limitado a una herramienta patentada.

Prueba el instructivo Usa TensorFlow distribuido con Datalab a fin de usar el mismo código de ejemplo para entrenar el modelo mediante AI Platform.

También puedes implementar el modelo en AI Platform para obtener predicciones. Sigue los pasos a continuación para implementar el modelo en AI Platform. Implementar el modelo te permite probar y aplicar el modelo con rapidez y a gran escala, con todas las funciones de seguridad y confiabilidad que esperarías de un servicio administrado por Google.

En los siguientes pasos, se usa la ruta de acceso del depósito del modelo que la secuencia de comandos llamada start-training.sh mostró antes.

  1. Recupera la ruta de acceso del resultado al depósito de Cloud Storage con los modelos generados. Está en el siguiente formato, en el que [JOB_ID] es el ID de trabajo. Usa esta ruta de acceso en el siguiente paso:

    MODEL_BUCKET: gs://${MNIST_BUCKET}/job_[TIMESTAMP]/export/Servo/[JOB_ID]
  2. Define una versión v1 nueva del modelo mediante la herramienta de línea de comandos de gcloud y apúntala a los archivos del modelo en el depósito. El siguiente comando puede llevar varios minutos en completarse. Reemplaza [YOUR_BUCKET_PATH] por la ruta de acceso del resultado del paso anterior. La ruta de acceso comienza con gs://.

    MODEL="MNIST"
    MODEL_BUCKET=[YOUR_BUCKET_PATH]
    gcloud ai-platform models create ${MODEL} --regions us-east1
    gcloud ai-platform versions create \
     --origin=${MODEL_BUCKET} --model=${MODEL} v1
  3. Configura la versión predeterminada del modelo en v1:

    gcloud ai-platform versions set-default --model=${MODEL} v1

El modelo ahora se ejecuta mediante AI Platform y puede procesar predicciones. En la siguiente sección, debes usar Datalab para crear y visualizar predicciones.

Ejecuta predicciones con Datalab

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

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

    datalab create mnist-datalab
    
  2. En Cloud Shell, inicia la página de la lista de notebooks de Datalab. Para ello, haz clic en Vista previa web de Cloud Shell (el ícono cuadrado en la parte superior derecha).

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

  4. En la aplicación de Datalab, haz clic en + Notebook en la esquina superior derecha para crear un notebook nuevo.

  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 Predicción en línea example.ipynb. La secuencia de comandos copia el contenido del notebook remoto en el notebook actual.

  7. Vuelve a cargar la página del navegador para que se cargue el contenido del notebook nuevo. Luego, selecciona la primera celda que contenga 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, luego, en la flecha hacia abajo que se encuentra junto al botón Ejecutar en la parte superior y selecciona Ejecutar desde esta celda.

    El resultado 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 ese índice coincida con el dígito que ingresaste. Puedes ver que la posición 3 destacada en la lista es muy cercana a 1 y, por lo tanto, tiene una alta probabilidad de coincidir con 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]

En la última celda del notebook, se muestra un gráfico de barras que indica con claridad que se predijo el número, que en este caso era 3.

El gráfico de barras muestra que se seleccionó el número 3.

Realiza una 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 ai-platform versions delete v1 --model=MNIST
  2. Borra el modelo:

    gcloud ai-platform models delete MNIST
  3. Borra el depósito de Cloud Storage:

    gsutil rm -r gs://${MNIST_BUCKET}
  4. Borra las VM, incluido Datalab:

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

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

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

Próximos pasos