Path: blob/master/site/es-419/io/tutorials/kafka.ipynb
25118 views
Copyright 2020 The TensorFlow IO Authors.
Aprendizaje automático robusto en transmisión de datos con Kafka y Tensorflow-IO
Descripción general
Este tutorial se centra en la transmisión de datos desde un clúster de Kafka a un tf.data.Dataset
que luego se usa junto con tf.keras
para entrenamiento e inferencia.
Kafka es principalmente una plataforma distribuida de transmisión de eventos que proporciona transmisión de datos escalable y tolerante a fallas a través de canales de datos. Es un componente técnico esencial de una gran cantidad de empresas importantes donde la entrega de datos de misión crítica es un requisito principal.
NOTA: Una comprensión básica de los componentes de Kafka le ayudará a seguir el tutorial con facilidad.
NOTA: Se requiere un entorno de ejecución de Java para ejecutar este tutorial.
Preparación
Instalar los paquetes tensorflow-io y kafka necesarios
Importar paquetes
Validar importaciones tf y tfio
Descargar y configurar instancias de Kafka y Zookeeper
Para fines de demostración, las siguientes instancias se configuran localmente:
Kafka (Brokers: 127.0.0.1:9092)
Zookeeper (Node: 127.0.0.1:2181)
Se usan las configuraciones predeterminadas (proporcionadas por Apache Kafka) para activar las instancias.
Una vez que las instancias se inician como procesos demonio, busque con grep kafka
en la lista de procesos. Los dos procesos de Java corresponden a las instancias de zookeeper y kafka.
Cree los temas de Kafka con las siguientes especificaciones:
susy de entrenamiento: particiones = 1, factor de replicación = 1
susy de prueba: particiones=2, factor de replicación=1
Describa el tema para obtener detalles sobre la configuración.
El factor de replicación 1 indica que los datos no se están replicando. Esto se debe a la presencia de un único corredor en nuestra configuración de Kafka. En los sistemas de producción, la cantidad de servidores de arranque puede estar en el rango de cientos de nodos. Ahí es donde entra en escena la tolerancia a fallos mediante replicación.
Consulte los documentos para obtener más detalles.
Conjunto de datos SUSY
Kafka, al ser una plataforma de transmisión de eventos, permite escribir en ella datos de diversas fuentes. Por ejemplo:
Registros de tráfico web
Medidas astronómicas
Datos de sensores de IoT
Reseñas de productos y mucho más.
Para los fines de este tutorial, descargaremos el conjunto de datos SUSY e introduciremos los datos en Kafka manualmente. El objetivo de este problema de clasificación es distinguir entre un proceso de señal que produce partículas supersimétricas y un proceso de fondo que no lo hace.
Explorar el conjunto de datos
La primera columna es la etiqueta de clase (1 para señal, 0 para fondo), seguida de las 18 características (8 características de bajo nivel y luego 10 características de alto nivel). Las primeras 8 características son propiedades cinemáticas que miden los detectores de partículas en el acelerador. Las últimas 10 características son funciones de las primeras 8 características. Estas son características de alto nivel derivadas por los físicos para ayudar a discriminar entre las dos clases.
El conjunto de datos completo consta de 5 millones de filas. Sin embargo, para los fines de este tutorial, consideraremos solo una fracción del conjunto de datos (100 000 filas) para dedicar menos tiempo a mover los datos y más tiempo a comprender la funcionalidad de la API.
Dividir el conjunto de datos
Almacenar los datos de entrenamiento y de prueba en Kafka
El almacenamiento de datos en Kafka simula un entorno para la recuperación remota continua de datos con fines de entrenamiento e inferencia.
Definir el conjunto de datos de entrenamiento tfio
La clase IODataset
se usa para transmitir datos desde Kafka a tensorflow. La clase hereda de tf.data.Dataset
y, por lo tanto, tiene todas las funcionalidades útiles de tf.data.Dataset
listas para usar.
Construir y entrenar el modelo
Nota: No confunda el paso de entrenamiento con el entrenamiento en línea. Es un paradigma completamente diferente que se tratará en una sección más adelante.
Dado que solo se usa una fracción del conjunto de datos, nuestra precisión se limita a 78 % aproximadamente durante la fase de entrenamiento. Sin embargo, no dude en almacenar datos adicionales en Kafka para mejorar el rendimiento del modelo. Además, dado que el objetivo era simplemente demostrar la funcionalidad de los conjuntos de datos de tfio de kafka, se usó una red neuronal más pequeña y menos complicada. Sin embargo, se puede aumentar la complejidad del modelo, modificar la estrategia de aprendizaje, ajustar los hiperparámetros y más para seguir explorando. Para obtener un enfoque básico, consulte este artículo.
Inferir sobre los datos de prueba
Para inferir los datos de prueba adhiriéndose a la semántica de "exactamente una vez" junto con la tolerancia a fallas, se puede usar streaming.KafkaGroupIODataset
.
Definir el conjunto de datos de prueba tfio
El parámetro stream_timeout
se bloquea durante la duración especificada para que se transmitan nuevos puntos de datos al tema. Esto elimina la necesidad de crear nuevos conjuntos de datos si los datos se transmiten al tema de forma intermitente.
Aunque esta clase se puede usar con fines de entrenamiento, existen advertencias que deben abordarse. Una vez que se leen todos los mensajes de Kafka y se confirman las últimas compensaciones mediante streaming.KafkaGroupIODataset
, el consumidor no reinicia la lectura de los mensajes desde el principio. Por lo tanto, durante el entrenamiento, solo es posible entrenar para una única época con los datos fluyendo continuamente. Este tipo de funcionalidad tiene casos de uso limitados durante la fase de entrenamiento en los que, una vez que el modelo ha consumido un punto de datos, ya no es requerido y puede ser descartado.
Sin embargo, esta funcionalidad brilla cuando se trata de inferencia robusta con semántica de exactamente una vez.
Evaluar el rendimiento de los datos de prueba
Dado que la inferencia se basa en la semántica de "exactamente una vez", la evaluación en el conjunto de prueba solo se puede ejecutar una vez. Para volver a ejecutar la inferencia sobre los datos de prueba, se debe usar un nuevo grupo de consumidores.
Seguimiento del retraso de compensación del grupo de consumidores testcg
Una vez que el current-offset
coincide con el log-end-offset
para todas las particiones, quiere decir que los consumidores han completado la extracción de todos los mensajes del tema de Kafka.
Aprendizaje en línea
El paradigma del aprendizaje automático en línea es un poco diferente de la forma tradicional/convencional de entrenar modelos de aprendizaje automático. En el primer caso, el modelo continúa aprendiendo/actualizando incrementalmente sus parámetros tan pronto como los nuevos puntos de datos estén disponibles y se espera que este proceso continúe indefinidamente. Esto es diferente a los últimos enfoques, donde el conjunto de datos es fijo y el modelo lo itera n
veces. En el aprendizaje en línea, es posible que los datos que una vez consumió el modelo no estén disponibles para volver a entrenarlo.
Con streaming.KafkaBatchIODataset
, ahora es posible entrenar los modelos de esta manera. Seguiremos usando nuestro conjunto de datos SUSY para demostrar esta funcionalidad.
El conjunto de datos de entrenamiento tfio para el aprendizaje en línea
streaming.KafkaBatchIODataset
es similar a streaming.KafkaGroupIODataset
en su API. Además, se recomienda usar el parámetro stream_timeout
para configurar la duración durante la cual el conjunto de datos se bloqueará para recibir nuevos mensajes antes de que expire el tiempo de espera. En el siguiente ejemplo, el conjunto de datos está configurado con un stream_timeout
de 10000
milisegundos. Esto implica que, después de que se hayan consumido todos los mensajes del tema, el conjunto de datos esperará 10 segundos adicionales antes de agotar el tiempo de espera y desconectarse del clúster de Kafka. Si se transmiten nuevos mensajes al tema antes de que expire el tiempo de espera, el consumo de datos y el entrenamiento del modelo se reanudan para esos puntos de datos recién consumidos. Para bloquearlo indefinidamente, puede establecerlo en -1
.
Cada elemento que genera online_train_ds
es un tf.data.Dataset
en sí mismo. Por lo tanto, todas las transformaciones estándar se pueden aplicar como de costumbre.
El modelo entrenado incrementalmente se puede guardar de forma periódica (según casos de uso) y se puede usar para inferir los datos de prueba en modo en línea o fuera de línea.
Nota: streaming.KafkaBatchIODataset
y streaming.KafkaGroupIODataset
aún se encuentran en fase experimental y puede mejorarse según los comentarios de los usuarios.
Referencias:
Baldi, P., P. Sadowski, and D. Whiteson. “Searching for Exotic Particles in High-energy Physics with Deep Learning.” Nature Communications 5 (July 2, 2014)
Conjunto de datos SUSY: https://archive.ics.uci.edu/ml/datasets/SUSY#