Copyright 2018 The TensorFlow Authors.
En esta guía se muestra cómo realizar un entrenamiento básico en las Unidades de Procesamiento de Tensores (TPUs) y TPU Pods, una colección de dispositivos TPU conectados por interfaces de red de alta velocidad especializadas, con tf.keras
y bucles de entrenamiento personalizados.
Las TPU son circuitos integrados de aplicación específica (ASIC) desarrollados a medida por Google que se utilizan para acelerar las cargas de trabajo de aprendizaje automático. Están disponibles en Google Colab, TPU Research Cloud y Cloud TPU.
Preparación
Antes de ejecutar este bloc de notas de Colab, asegúrese de que su acelerador de hardware es un TPU verificando la configuración del bloc de notas: Runtime > Change runtime type > Hardware accelerator > TPU.
Importe algunas bibliotecas necesarias, incluyendo los conjuntos de datos de TensorFlow:
Inicialización de la TPU
Las TPUs normalmente son TPUs en la nube que trabajan, las cuales son diferentes del proceso local que ejecuta el programa Python del usuario. Por lo tanto, es necesario hacer algún trabajo de inicialización para conectarse al conjunto remoto e inicializar las TPUs. Tenga en cuenta que el argumento tpu
de tf.distribute.cluster_resolver.TPUClusterResolver
es una dirección especial sólo para Colab. Si está ejecutando su código en Google Compute Engine (GCE), debe pasar en su lugar el nombre de su TPU en la nube.
Nota: El código de inicialización del TPU tiene que estar al principio de su programa.
Colocación manual en el dispositivo
Después de inicializar la TPU, puede utilizar la colocación manual de dispositivos para situar el cálculo en un único dispositivo TPU:
Estrategias de distribución
Normalmente, su modelo se ejecuta en múltiples TPUs de forma paralela a los datos. Para distribuir su modelo en múltiples TPUs (así como múltiples GPUs o múltiples máquinas), TensorFlow ofrece la API tf.distribute.Strategy
. Puede reemplazar su estrategia de distribución y el modelo se ejecutará en cualquier dispositivo (TPU) dado. Obtenga más información en la guía Entrenamiento distribuido con TensorFlow.
El uso de la opción tf.distribute.TPUStrategy
implementa el entrenamiento distribuido sincronizado. Las TPUs proporcionan su propia implementación de operaciones eficientes de reducción total y otras operaciones colectivas entre varios núcleos de TPU, que se utilizan en TPUStrategy
.
Para demostrarlo, cree un objeto tf.distribute.TPUStrategy
:
Para replicar un cálculo de modo que pueda ejecutarse en todos los núcleos de la TPU, puede transferirlo a la API Strategy.run
. A continuación se muestra un ejemplo en el que todos los núcleos reciben las mismas entradas (a, b)
y realizan la multiplicación de matrices en cada núcleo de forma independiente. Las salidas serán los valores de todas las réplicas.
Clasificación en TPUs
Después de haber cubierto los conceptos básicos, considere un ejemplo más concreto. Esta sección muestra cómo utilizar la estrategia de distribución -tf.distribute.TPUStrategy
- para entrenar un modelo Keras en una TPU en la nube.
Definir un modelo Keras
Comenzamos con la definición de un modelo Sequential
de Keras para la clasificación de imágenes en el conjunto de datos MNIST. No es diferente de lo que utilizaría si estuviera entrenando en CPUs o GPUs. Tenga en cuenta que la creación del modelo Keras tiene que estar dentro del Strategy.scope
, por lo que las variables se pueden crear en cada dispositivo TPU. Otras partes del código no necesitan estar dentro del ámbito Strategy
.
Este modelo pone términos de regularización L2 en los pesos de cada capa, de modo que el bucle de entrenamiento personalizado de abajo puede mostrar cómo los recoge de Model.losses
.
Carga del conjunto de datos.
El uso eficiente de la API tf.data.Dataset
es fundamental cuando se utiliza una TPU en la nube. Puede obtener más información sobre el rendimiento de los conjuntos de datos en la Guía de rendimiento respecto a las canalizaciones de entrada.
Si está utilizando Nodos UTP, necesita almacenar todos los archivos de datos leídos por el Dataset
de TensorFlow en cubos de Google Cloud Storage (GCS). Si utiliza TPU VMs, puede almacenar los datos donde desee. Para obtener más información sobre los nodos TPU y las máquinas virtuales TPU, consulte la documentación Arquitectura del sistema TPU.
Para la mayoría de los casos de uso, se recomienda convertir los datos en el formato TFRecord
y utilizar un tf.data.TFRecordDataset
para leerlos. Consulte el tutorial TFRecord y tf.Example para obtener más detalles sobre cómo hacerlo. No es un requisito obligatorio y puede utilizar otros lectores de conjuntos de datos, como tf.data.FixedLengthRecordDataset
o tf.data.TextLineDataset
.
Puede cargar pequeños conjuntos de datos enteros en la memoria utilizando tf.data.Dataset.cache
.
Independientemente del formato de datos utilizado, se recomienda encarecidamente utilizar archivos de gran tamaño, del orden de 100 MB. Esto es particularmente importante en esta configuración en red, ya que la sobrecarga de abrir un archivo es significativamente mayor.
Como se muestra en el siguiente código, debe utilizar el módulo de conjuntos de datos de Tensorflow tfds.load
para obtener una copia de los datos de entrenamiento y prueba MNIST. Tenga en cuenta que try_gcs
es específico para utilizar una copia que esté disponible en un bucket GCS público. Si no se especifica esto, la TPU no podrá acceder a los datos descargados.
Entrene el modelo utilizando las API de alto nivel de Keras
Puede entrenar su modelo con las API de Keras Model.fit
y Model.compile
. . No hay nada específico de TPU en este paso: escriba el código si utiliza múltiples GPU y una MirroredStrategy
en vez de TPUStrategy
. Puede obtener más información en el tutorial Entrenamiento distribuido con Keras.
Para reducir la sobrecarga de Python y maximizar el rendimiento de su TPU, pase el argumento steps_per_execution
al comando Model.compile
de Keras. En este ejemplo, se aumenta el rendimiento en aproximadamente un 50%:
Entrene el modelo utilizando un bucle de entrenamiento personalizado
También puede crear y entrenar su modelo utilizando tf.function
y tf.distribute
directamente. Puede utilizar la API Strategy.experimental_distribute_datasets_from_function
para distribuir el tf.data.Dataset
dado una función de conjunto de datos. Tenga en cuenta que en el siguiente ejemplo el tamaño del lote que se pasa al Dataset
es el tamaño del lote por réplica en vez del tamaño del lote global. Para obtener más información, consulte el tutorial Entrenamiento personalizado con tf.distribute.Strategy
.
En primer lugar, cree el modelo, los conjuntos de datos y las tf.function
:
Después, ejecute el bucle de entrenamiento:
Cómo mejorar el rendimiento con varios pasos dentro de tf.function
Puede mejorar el rendimiento ejecutando varios pasos dentro de una tf.function
. Esto se consigue envolviendo la llamada Strategy.run
con un tf.range
dentro de tf.function
, y AutoGraph lo convertirá en un tf.while_loop
en el trabajador de la TPU. Puede obtener más información sobre tf.function
s en la guía Mejorar el rendimiento con tf.function
.
A pesar de mejorar el rendimiento, hay desventajas con este método en comparación con la ejecución de un solo paso dentro de un tf.function
. Ejecutar múltiples pasos en un tf.function
es menos flexible, no puede ejecutar cosas eagerly o un código Python arbitrario dentro de los pasos.
Siguientes pasos
Para obtener más información sobre las TPU en la nube y cómo utilizarlas:
Google Cloud TPU: La página de inicio de Google Cloud TPU.
Documentación de Google Cloud TPU: La documentación de Google Cloud TPU, incluye:
Introducción a las TPU en la nube: Una visión general del trabajo con TPUs en la nube.
Inicios rápidos de la TPU en la nube: Introducciones rápidas para trabajar con máquinas virtuales de la TPU en la nube utilizando TensorFlow y otros marcos principales de aprendizaje automático.
Los blocs de notas de Google Cloud TPU Colab: Ejemplos de entrenamiento de extremo a extremo.
Guía de rendimiento de Google Cloud TPU: Mejore aún más el rendimiento de la TPU en la nube ajustando los parámetros de la configuración de la TPU en la nube para su aplicación.
Incorporaciones para la TPU: TensorFlow incluye soporte especializado para el entrenamiento de incrustaciones en las TPUs mediante
tf.tpu.experimental.embedding
. Además, Recomendadores de TensorFlow tienetfrs.layers.embedding.TPUEmbedding
. Las incrustaciones proporcionan representaciones eficientes y densas, que capturan similitudes y relaciones complejas entre características. El soporte de incorporación específico de las TPU de TensorFlow le permite entrenar incorporaciones que son más grandes que la memoria de un solo dispositivo TPU, y utilizar entradas dispersas e irregulares en las TPU.Nube de investigación en la TPU (TRC): TRC permite a los investigadores solicitar acceso a un conjunto de más de 1,000 dispositivos de la TPU en la nube.