Path: blob/master/site/pt-br/io/tutorials/kafka.ipynb
25118 views
Copyright 2020 The TensorFlow IO Authors.
Aprendizado de máquina robusto com transmissão de dados usando o Kafka e o Tensorflow IO
Visão geral
Este tutorial aborda a transmissão de dados de um cluster Kafka para um tf.data.Dataset
que depois é usado em conjunto com tf.keras
para treinamento e inferência.
Kafka é principalmente uma plataforma de transmissão de eventos distribuída que conta com transmissão de dados com escalabilidade e tolerância a falhas entre pipelines de dados. É um componente técnico essencial de diversas grandes empresas em que a entrega de dados críticos é um requisito importante.
OBSERVAÇÃO: ter uma compreensão básica dos componentes do Kafka ajudará a acompanhar o tutorial com facilidade.
OBSERVAÇÃO: é necessário ter um ambiente de runtime do Java para este tutorial.
Configuração
Instale os pacotes do TensorFlow IO e Kafka obrigatórios
Importe os pacotes
Valide as importações de tf e tfio
Baixe e configure as instâncias do Kafka e do Zookeeper
Para fins de demonstração, as seguintes instâncias são configuradas localmente:
Kafka (Brokers: 127.0.0.1:9092)
Zookeeper (Nó: 127.0.0.1:2181)
Use as configurações padrão (fornecidas pelo Apache Kafka) para iniciar as instâncias.
Após as instâncias serem inicializadas como processos daemon, use o comando grep kafka
na lista de processos. Os dois processos Java correspondem às instâncias do Kafka e do Zookeeper.
Crie os tópicos Kafka com as seguintes especificações:
susy-train: partitions=1, replication-factor=1
susy-test: partitions=2, replication-factor=1
Descreva o tópico para ver os detalhes da configuração:
O fator de replicação 1 indica que os dados não estão sendo replicados devido à presença de um único broker em nossa configuração do Kafka. Em sistemas de produção, o número dos servidores de inicialização pode chegar a centenas de nós. É aí que entra a tolerância a falhas usando replicação.
Confira mais detalhes na documentação.
Dataset SUSY
Como o Kafka é uma plataforma de transmissão de dados, permite que dados de várias fontes sejam gravados nele. Por exemplo:
Logs de tráfego web
Medidas astronômicas
Dados de sensores IoT
Avaliações de produtos e muito mais
Neste tutorial, vamos baixar o dataset SUSY e alimentar o Kafka com dados manualmente. O objetivo deste problema de classificação é distinguir entre um processo de sinal que produz partículas supersimétricas e um processo em segundo plano que não as produz.
Explore o dataset
A primeira coluna é o rótulo de classe (1 para sinal, 0 para segundo plano), seguida por 18 características (8 de baixo nível seguidas por 10 de alto nível). As primeiras 8 características são propriedades cinemáticas mensuradas pelos detectores de partículas no acelerador. As últimas 10 características são funções das 8 primeiras e são características de alto nível derivadas pelos físicos para ajudar a diferenciar entre as duas classes.
O dataset inteiro contém 5 milhões de linhas. Entretanto, para este tutorial, vamos considerar somente uma fração do dataset (100 mil linhas) para que seja gasto menos tempo movimentando os dados e mais tempo compreendendo a funcionalidade da API.
Divida o dataset
Armazene os dados de treinamento e teste no Kafka
Ao armazenar os dados no Kafka, é simulado um ambiente para recuperação contínua de dados remotos para treinamento e inferência.
Defina o dataset de treinamento tfio
A classe IODataset
é usada para transmitir dados do Kafka para o TensorFlow. A classe herda de tf.data.Dataset
e, portanto, tem todas as funcionalidades úteis de tf.data.Dataset
de forma integrada.
Compile e treine o modelo
Observação: não confunda o passo de treinamento com o treinamento online. É um paradigma inteiramente diferente que será abordado em uma seção mais adiante.
Como somente uma fração do dataset está sendo utilizada, nossa exatidão está limitada a cerca de 78% durante a fase de treinamento. Porém, fique à vontade para adicionar dados adicionais ao Kafka para melhorar o desempenho do modelo. Além disso, como o objetivo era apenas demonstrar a funcionalidade dos datasets tfio no Kafka, uma rede neural menor e menos complicada foi usada. Porém, é possível aumentar a complexidade do modelo, modificar a estratégia de aprendizado, ajustar os hiperparâmetros, etc., para fins de experimentação. Confira uma estratégia de linha de base neste artigo.
Faça a inferência com os dados de teste
Para fazer a inferência com os dados de teste se atendo à semântica "exatamente uma vez" juntamente com tolerância a falhas, pode-se usar streaming.KafkaGroupIODataset
.
Defina o dataset de teste tfio
O parâmetro stream_timeout
impede que novos pontos de dados sejam transmitidos para o tópico pela duração fornecida, o que remove a necessidade de criar novos datasets se os dados forem transmitidos para o tópico de forma intermitente.
Embora essa classe possa ser usada para fins de treinamento, é preciso tratar algumas ressalvas. Quando todas as mensagens são lidas no Kafka e os últimos deslocamentos são realizados usando-se streaming.KafkaGroupIODataset
, o consumidor não reinicia a leitura de mensagens do começo. Portanto, durante o treinamento, só é possível treinar uma única época com dados chegando continuamente. Esse tipo de funcionalidade tem casos de uso limitados durante a fase de treinamento, em que, após um ponto de dados ser consumido pelo modelo, ele não é mais necessário e pode ser descartado.
Entretanto, essa funcionalidade é excelente para inferência robusta com semântica "exatamente uma vez".
Avalie o desempenho com os dados de teste
Como a inferência é baseada na semântica "exatamente uma vez", a avaliação com o conjunto de teste pode ser executada somente uma vez. Para executar a inferência novamente com os dados de teste, um novo grupo consumidor deve ser usado.
Monitore o atraso de deslocamento do grupo consumidor testcg
Quando current-offset
coincide com log-end-offset
para todas as partições, isso indica que os consumidores concluíram a busca de todas as mensagens do tópico Kafka.
Treinamento online
O paradigma de aprendizado de máquina online é um pouco diferente da forma tradicional/convencional de treinar modelos de aprendizado de máquina. No primeiro caso, o modelo continua aprendendo/atualizando incrementalmente seus parâmetros assim que novos pontos de dados ficam disponíveis, e espera-se que esse processo continue indefinidamente. Isso é diferente da segunda estratégia, em que o dataset é fixo e o modelo faz a iteração n
vezes. No aprendizado online, após os dados serem consumidos pelo modelo, talvez eles não fiquem disponíveis novamente para treinamento.
Ao utilizar streaming.KafkaBatchIODataset
, agora é possível treinar os modelos dessa forma. Vamos continuar usando o dataset SUSY para demonstrar essa funcionalidade.
Dataset de treinamento tfio para aprendizado online
streaming.KafkaBatchIODataset
é similar streaming.KafkaGroupIODataset
em sua API. Além disso, é recomendável utilizar o parâmetro stream_timeout
(tempo limite da transmissão) para configurar a duração em que o dataset impedirá novas mensagens antes de atingir o tempo limite. No caso abaixo, o dataset está configurado com stream_timeout
de 10000
milissegundos. Isso implica que, após todas as mensagens do tópico terem sido consumidas, o dataset aguardará 10 segundos antes de atingir o tempo limite e se desconectar do cluster Kafka. Se novas mensagens forem transmitidas para o tópico antes do tempo limite, o consumo de dados e o treinamento do modelo são retomados para esses pontos de dados recém-consumidos. Para impedir por tempo indeterminado, defina como -1
.
Todo item que online_train_ds
gera é um tf.data.Dataset
. Portanto, todas as transformações padrão podem ser aplicadas como sempre.
O modelo treinado de forma incremental pode ser salvo periodicamente (baseado nos casos de uso) e pode ser utilizado para fazer inferência com os dados de teste nos modos online e offline.
Observação: streaming.KafkaBatchIODataset
e streaming.KafkaGroupIODataset
ainda estão em fase experimental e podem ser melhorados com base no feedback dos usuários.
Referências:
Baldi, P., P. Sadowski e D. Whiteson. “Searching for Exotic Particles in High-energy Physics with Deep Learning.” (Busca de partículas exóticas em física de alta energia com aprendizado profundo). Nature Communications 5 (2 de julho de 2014)
Dataset SUSY: https://archive.ics.uci.edu/ml/datasets/SUSY#