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:
- Fornecendo código Python e dependências como pacote fonte
- [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:
- Estão familiarizados com empacotamento Python e
- 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 dotensorflow/tfx
:
- Para usuários que (1) usam
# 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([...])