Path: blob/master/site/pt-br/datasets/beam_datasets.md
25115 views
Gerando grandes datasets com o Apache Beam
Alguns datasets são grandes demais para serem processados numa única máquina. tfds
oferece suporte à geração de dados em muitas máquinas usando o Apache Beam.
Este documento tem duas seções:
Para usuários que desejam gerar um dataset Beam existente
Para desenvolvedores que desejam criar um novo dataset Beam
Gerando um dataset Beam
Abaixo estão diferentes exemplos de geração de um dataset Beam, tanto na nuvem quanto localmente.
Importante: ao gerar o dataset com a CLI do tfds build
, certifique-se de especificar a configuração do dataset que deseja gerar ou o padrão será gerar todas as configurações existentes. Por exemplo, para wikipedia, use tfds build wikipedia/20200301.en
em vez de tfds build wikipedia
.
No Google Cloud Dataflow
Para executar o pipeline usando o Google Cloud Dataflow e aproveitar a computação distribuída, primeiro siga as Instruções de início rápido.
Assim que seu ambiente estiver configurado, você poderá executar a CLI do tfds build
usando um diretório de dados no GCS e especificando as opções necessárias para a flag --beam_pipeline_options
.
Para facilitar o lançamento do script, é útil definir as seguintes variáveis usando os valores reais da configuração do GCP/GCS e do dataset que você deseja gerar:
Em seguida, você precisará criar um arquivo para instruir o Dataflow a instalar tfds
nos workers:
Se você estiver usando tfds-nightly
, não deixe de copiar de tfds-nightly
caso o dataset tenha sido atualizado desde o último lançamento.
Finalmente, você pode iniciar a tarefa usando o comando abaixo:
Localmente
Para executar seu script localmente usando o executor padrão do Apache Beam (ele deve caber todos os dados na memória), o comando é o mesmo que para outros datasets:
Importante: os datasets Beam podem ser enormes (terabytes ou mais) e exigir uma quantidade significativa de recursos para serem gerados (pode levar semanas num computador local). Recomenda-se gerar os datasets usando um ambiente distribuído. Dê uma olhada na documentação do Apache Beam para uma lista de runtimes suportados.
Com o Apache Flink
Para executar o pipeline usando o Apache Flink você pode ler a documentação oficial. Certifique-se de que seu Beam esteja em conformidade com a Compatibilidade de Versão do Flink
Para facilitar o lançamento do script, é útil definir as seguintes variáveis usando os valores reais da configuração do Flink e do dataset que você deseja gerar:
Para executar num cluster Flink incorporado, você pode iniciar o trabalho usando o comando abaixo:
Com um script personalizado
Para gerar o dataset no Beam, a API é a mesma de outros datasets. Você pode personalizar o beam.Pipeline
usando os argumentos beam_options
(e beam_runner
) de DownloadConfig
.
Implementando um dataset Beam
Pré-requisitos
Para escrever datasets do Apache Beam, você precisa estar familiarizado com os seguintes conceitos:
Familiarize-se com o guia de criação de datasets
tfds
, pois a maior parte do conteúdo ainda se aplica aos datasets do Beam.Obtenha uma introdução ao Apache Beam com o Guia de programação do Beam.
Se você quiser gerar seu dataset usando o Cloud Dataflow, leia a documentação do Google Cloud e o Guia de dependências do Apache Beam.
Instruções
Se você estiver familiarizado com o guia de criação de datasets, adicionar um dataset Beam requer apenas a modificação da função _generate_examples
. A função deve retornar um objeto Beam, em vez de um gerador:
Dataset não Beam:
Dataset Beam:
Todo o resto pode ser 100% idêntico, incluindo os testes.
Algumas considerações adicionais:
Use
tfds.core.lazy_imports
para importar o Apache Beam. Ao usar uma dependência lazy, os usuários ainda poderão ler o dataset após ele ter sido gerado, sem precisar instalar o Beam.Tenha cuidado com os closures do Python. Ao executar o pipeline, as funções
beam.Map
ebeam.DoFn
são serializadas usandopickle
e enviadas a todos os workers. Não use objetos mutáveis dentro de umbeam.PTransform
se o estado tiver que ser compartilhado entre workers.Devido à forma como
tfds.core.DatasetBuilder
é serializado com pickle, a mutação detfds.core.DatasetBuilder
durante a criação de dados será ignorada nos workers (por exemplo, não é possível definirself.info.metadata['offset'] = 123
em_split_generators
e acessá-lo dos workers comobeam.Map(lambda x: x + self.info.metadata['offset'])
Se você precisar compartilhar alguns passos do pipeline entre os splits (divisões), você pode adicionar um kwarg
pipeline: beam.Pipeline
para_split_generator
e controlar o pipeline de geração completo. Consulte a documentação_generate_examples
detfds.core.GeneratorBasedBuilder
.
Exemplo
Aqui está um exemplo de um dataset Beam.
Executando seu pipeline
Para executar o pipeline, dê uma olhada na seção acima.
Observação: assim como para datasets não Beam, não se esqueça de registrar checksums de download com --register_checksums
(apenas na primeira vez para registrar os downloads).
Pipeline usando TFDS como entrada
Se você deseja criar um pipeline do Beam que recebe um dataset TFDS como fonte, você pode usar tfds.beam.ReadFromTFDS
:
Ele processará cada fragmento do dataset em paralelo.
Observação: isto exige que o dataset já tenha sido gerado. Para gerar datasets usando o Beam, veja as outras seções.