Path: blob/master/site/es-419/guide/core/distribution.ipynb
25118 views
Copyright 2022 The TensorFlow Authors.
Entrenamiento distribuido con las API del núcleo y DTensor
Introducción
Este bloc de notas utiliza las API de bajo nivel TensorFlow Core y DTensor para demostrar un ejemplo de entrenamiento distribuido paralelo de datos. Visite la sección Descripción general de las API Core para obtener más información sobre TensorFlow Core y sus casos de uso previstos. Consulte la guía Descripción general de DTensor y el tutorial Entrenamiento distribuido con DTensors para obtener más información sobre DTensor.
En este ejemplo se utiliza el mismo modelo y optimizador que se mostró en el tutorial perceptrones multicapa. Vea este tutorial primero para familiarizarse con la escritura del flujo de trabajo para aprendizaje automático de extremo a extremo con las API Core.
Nota: DTensor todavía es una API experimental de TensorFlow, lo cual significa que sus funciones están disponibles para pruebas, y su uso está previsto únicamente en entornos de prueba.
Descripción general del entrenamiento paralelo de datos con DTensor
Antes de construir un MLP que admita la distribución, tómese un momento para explorar los fundamentos de DTensor para el entrenamiento paralelo de datos.
DTensor permite ejecutar entrenamientos distribuidos por medio de dispositivos para mejorar la eficiencia, la confiabilidad y la escalabilidad. DTensor distribuye el programa y los tensores de acuerdo con las directivas de fragmentación mediante un procedimiento denominado Expansión de programa único, datos múltiples (SPMD). Una variable de una capa consciente de DTensor
se crea como dtensor.DVariable
, y los constructores de objetos de capa conscientes de DTensor
toman entradas adicionales Layout
además de los parámetros habituales de la capa.
Las ideas principales para el entrenamiento paralelo de datos son las siguientes:
Las variables del modelo se reproducen en N dispositivos cada una.
Un lote global se divide en N lotes por réplica.
Cada lote por réplica se entrena en el dispositivo de réplica.
El gradiente se reduce antes de que la ponderación de los datos se realice colectivamente en todas las réplicas.
El entrenamiento paralelo de datos ofrece una aceleración casi lineal con respecto al número de dispositivos.
Preparación
DTensor forma parte de la versión 2.9.0 de TensorFlow.
Configure 8 CPUs virtuales para este experimento. DTensor también se puede utilizar con dispositivos GPU o TPU. Dado que este bloc de notas utiliza dispositivos virtuales, el aumento de la velocidad obtenido del entrenamiento distribuido no es perceptible.
El conjunto de datos MNIST
El conjunto de datos está disponible en TensorFlow Datasets. Divida los datos en conjuntos de entrenamiento y prueba. Utilice solo 5,000 ejemplos para el entrenamiento y las pruebas, esto le permitirá ahorrar tiempo.
Preprocesamiento de los datos
Preprocese los datos dándoles forma bidimensional y reescalándolos para que se ajusten al intervalo unitario [0,1].
Cree la MLP
Construya un modelo MLP con capas conscientes del DTensor.
La capa densa
Comience por crear un módulo de capa densa que soporte DTensor. La función dtensor.call_with_layout
se puede utilizar para llamar a una función que toma una entrada DTensor y produce una salida DTensor. Esto es útil para inicializar una variable DTensor, dtensor.DVariable
, con una función soportada por TensorFlow.
El modelo secuencial de MLP
Ahora cree un módulo MLP que ejecute las capas densas secuencialmente.
Realizar un entrenamiento "data-parallel" con DTensor es equivalente a tf.distribute.MirroredStrategy
. Para ello cada dispositivo ejecutará el mismo modelo en un fragmento del lote de datos. Así que necesitará lo siguiente:
Un
dtensor.Mesh
con una única dimensión""batch"
Un
dtensor.Layout
para todos los pesos que los replica en toda la malla (usandodtensor.UNSHARDED
para cada eje)Un
dtensor.Layout
para los datos que dividen la dimensión del lote a lo largo de la malla
Cree una malla DTensor que consista en una única dimensión de lote, donde cada dispositivo se convierte en una réplica que recibe un fragmento del lote global. Utilice esta malla para instanciar un modo MLP con la siguiente arquitectura:
Siguiente paso: ReLU (784 x 700) x ReLU (700 x 500) x Softmax (500 x 10)
Métricas de entrenamiento
Utilice la función de pérdida de entropía cruzada y la métrica de precisión para realizar el entrenamiento.
Optimizador
El uso de un optimizador puede resultar en una convergencia significativamente más rápida en comparación con el descenso del gradiente estándar. El optimizador Adam se implementa a continuación y se configuró para que sea compatible con DTensor. Para utilizar optimizadores de Keras con DTensor, consulte el módulo experimentaltf.keras.dtensor.experimental.optimizers
.
Empaquetado de datos
Comience escribiendo una función de ayuda para transferir datos al dispositivo. Esta función debería usar dtensor.pack
para enviar (y sólo enviar) el fragmento del lote global que está destinado para una réplica al dispositivo que respalda la réplica. Para simplificar, supongamos una aplicación de un solo cliente.
Después, escriba una función que la utilice para empaquetar los lotes de datos de entrenamiento en DTensors fragmentados a lo largo del eje del lote (primero). Esto garantizará que DTensor distribuya uniformemente los datos del entrenamiento en la dimensión de la malla del "lote". Tenga en cuenta que en DTensor, el tamaño del lote siempre se refiere al tamaño global del lote; por lo tanto, el tamaño del lote debe ser elegido de tal manera que pueda ser dividido uniformemente por el tamaño de la dimensión de la malla del lote. Se están planeando APIs de DTensor adicionales para simplificar la integración de tf.data
, así que permanezca atento.
Entrenamiento
Escribe una función rastreable que ejecute un único paso de entrenamiento dado un lote de datos. Esta función no requiere ninguna anotación de DTensor especial. También escriba una función que ejecute un paso de prueba y devuelva las métricas de rendimiento apropiadas.
Ahora, entrene el modelo MLP durante 3 épocas con un tamaño de lote de 128.
Evaluación del desempeño
Empiece por escribir una función para visualizar las pérdidas y la precisión del modelo durante el entrenamiento.
Guarde su modelo
La integración de tf.saved_model
y DTensor está todavía en desarrollo. A partir de TensorFlow 2.9.0, tf.saved_model sólo acepta modelos de DTensor con variables totalmente replicadas. Como una solución, se puede convertir un modelo de DTensor a uno totalmente replicado mediante la recarga de un punto de control. Sin embargo, después de guardar un modelo, todas las anotaciones de DTensor se pierden y las firmas guardadas sólo se pueden utilizar con tensores normales. Este tutorial se actualizará para mostrar la integración una vez que se solidifique.
Conclusión
Este bloc de notas proporciona una visión general de la formación distribuida con DTensor y las APIs de TensorFlow Core. Aquí hay algunos consejos más que pueden ayudar:
Las APIs de TensorFlow Core pueden utilizarse para construir flujos de trabajo de aprendizaje automático altamente configurables con soporte para el entrenamiento distribuido.
La guía de los conceptos de DTensor y el tutorial de Entrenamiento distribuido con DTensors que contienen la información más actualizada sobre DTensor y sus integraciones.
Para obtener más ejemplos sobre el uso de las API de TensorFlow Core, consulte la guía. Si desea obtener más información sobre la carga y preparación de datos, consulte los tutoriales sobre la carga de datos de imagen o la carga de datos CSV.