Apache Beam e TFX

O Apache Beam fornece uma estrutura para executar tarefas de processamento de dados em lote e streaming que são executadas em vários mecanismos de execução. Várias bibliotecas do TFX usam o Beam para executar tarefas, o que permite um alto grau de escalabilidade em clusters de computação. O Beam inclui suporte para uma variedade de mecanismos de execução ou "executores", incluindo um executor direto que é executado em um único nó de computação e é muito útil para desenvolvimento, teste ou pequenas implantações. O Beam fornece uma camada de abstração que permite que o TFX seja executado em qualquer executor compatível sem modificações de código. O TFX usa a API Beam Python, portanto, é limitado aos executores compatíveis com a API Python.

Implantação e escalabilidade

À medida que os requisitos de carga de trabalho aumentam, o Beam pode ser dimensionado para implantações muito grandes em grandes clusters de computação. Isto é limitado apenas pela escalabilidade do executor subjacente. Os executores em grandes implantações normalmente serão implantados em um sistema de orquestração de contêineres, como Kubernetes ou Apache Mesos, para automatizar a implantação, o dimensionamento e o gerenciamento de aplicativos.

Consulte a documentação do Apache Beam para obter mais informações sobre o Apache Beam.

Para usuários do Google Cloud, o Dataflow é o executor recomendado, que fornece uma plataforma sem servidor e econômica por meio de escalonamento automático de recursos, rebalanceamento dinâmico de trabalho, integração profunda com outros serviços do Google Cloud, segurança integrada e monitoramento.

Código Python personalizado e dependências

Uma complexidade notável do uso do Beam em um pipeline TFX é lidar com código personalizado e/ou as dependências necessárias de módulos Python adicionais. Aqui estão alguns exemplos de quando isso pode ser um problema:

  • preprocessing_fn precisa se referir ao próprio módulo Python do usuário
  • um extrator personalizado para o componente Avaliador
  • módulos personalizados que são subclassificados de um componente TFX

O TFX conta com o suporte do Beam para gerenciar dependências de pipeline do Python para lidar com dependências do Python. Atualmente existem duas maneiras de gerenciar isso:

  1. Fornecendo código Python e dependências como pacote fonte
  2. [Somente Dataflow] Usando uma imagem de contêiner como trabalhador

Estes são discutidos a seguir.

Fornecendo código Python e dependências como um pacote fonte

Isso é recomendado para usuários que:

  1. Estão familiarizados com empacotamento Python e
  2. Use apenas código-fonte Python (ou seja, sem módulos C ou bibliotecas compartilhadas).

Siga um dos caminhos em Gerenciando dependências de pipeline do Python para fornecer isso usando um dos seguintes beam_pipeline_args:

  • --setup_file
  • --extra_package
  • --requirements_file

Aviso: Em qualquer um dos casos acima, certifique-se de que a mesma versão do tfx esteja listada como uma dependência.

[Somente Dataflow] Usando uma imagem de contêiner para um trabalhador

O TFX 0.26.0 e versões posteriores têm suporte experimental para o uso de imagem de contêiner personalizada para trabalhadores do Dataflow.

Para usar isso, você deve:

  • Crie uma imagem Docker que tenha tfx e o código personalizado e as dependências dos usuários pré-instalados.
    • Para usuários que (1) usam tfx>=0.26 e (2) usam python 3.7 para desenvolver seus pipelines, a maneira mais fácil de fazer isso é estendendo a versão correspondente da imagem oficial do tensorflow/tfx :
# You can use a build-arg to dynamically pass in the
# version of TFX being used to your Dockerfile.

ARG TFX_VERSION
FROM tensorflow/tfx:${TFX_VERSION}
# COPY your code and dependencies in
  • Envie a imagem criada para um registro de imagem de contêiner que pode ser acessado pelo projeto usado pelo Dataflow.
    • Os usuários do Google Cloud podem considerar o uso do Cloud Build , que automatiza perfeitamente as etapas acima.
  • Forneça o seguinte beam_pipeline_args :
beam_pipeline_args.extend([
    '--runner=DataflowRunner',
    '--project={project-id}',
    '--worker_harness_container_image={image-ref}',
    '--experiments=use_runner_v2',
])

TODO(b/171733562): remova use_runner_v2 quando ele for padrão para o Dataflow.

TODO(b/179738639): Crie documentação sobre como testar o contêiner personalizado localmente após https://issues.apache.org/jira/browse/BEAM-5440

Argumentos do pipeline de feixe

Vários componentes do TFX dependem do Beam para processamento distribuído de dados. Eles são configurados com beam_pipeline_args , que é especificado durante a criação do pipeline:

my_pipeline = Pipeline(
    ...,
    beam_pipeline_args=[...])

O TFX 0.30 e superior adiciona uma interface, with_beam_pipeline_args , para estender os argumentos do feixe de nível do pipeline por componente:

example_gen = CsvExampleGen(input_base=data_root).with_beam_pipeline_args([...])