Ajuste direito

O recurso de ajuste direito usa dicas de recursos do Apache Beam para personalizar recursos de worker para um pipeline. A capacidade de direcionar vários recursos diferentes para etapas específicas do pipeline proporciona mais flexibilidade e capacidade do pipeline, além de possível economia de custos. É possível aplicar recursos mais caros às etapas do pipeline que os exigem e recursos menos caros a outras etapas do pipeline. Use o ajuste correto para especificar os requisitos de recursos para um pipeline inteiro ou para etapas específicas de pipeline.

Suporte e limitações

Ativar ajuste direito

Para ativar o ajuste direito, use uma ou mais dicas de recursos disponíveis no pipeline. Quando você usa uma dica de recurso no pipeline, o ajuste correto é ativado automaticamente. Para mais informações, consulte a seção Usar dicas de recursos deste documento.

Dicas de recursos disponíveis

As seguintes dicas de recurso estão disponíveis:

Dica de recurso Descrição
min_ram

A quantidade mínima de RAM em gigabytes para alocar aos workers. O Dataflow usa esse valor como um limite inferior ao alocar memória para novos workers (escalonamento horizontal) ou para workers existentes (escalonamento vertical).

Por exemplo:

min_ram=RAM_VALUEGB
  • Substitua RAM_VALUE pelo valor mínimo de memória do worker que o pipeline ou a etapa do pipeline exige.
  • min_ram é uma especificação agregada por worker. Não é uma especificação por vCPU. Por exemplo, se você definir min_ram=15GB, o Dataflow vai definir a memória agregada disponível em todas as vCPUs no worker como pelo menos 15 GB.
cpu_count

O número de vCPUs a serem alocadas por worker. Quando você usa essa dica de recurso, o Dataflow seleciona tipos de máquina que têm o número especificado de vCPUs e atendem aos requisitos de memória.

Exemplo:

cpu_count=CPU_VALUE
  • Substitua CPU_VALUE pelo número inteiro de vCPUs que o pipeline ou a etapa do pipeline exige por worker.
accelerator

Uma alocação de GPUs fornecida pelo usuário que permite controlar o uso e o custo de GPUs no pipeline e nas etapas dele. Especifique o tipo e o número de GPUs a serem anexadas aos workers do Dataflow como parâmetros à sinalização.

Por exemplo:

accelerator="type:GPU_TYPE;count:GPU_COUNT;machine_type:MACHINE_TYPE;CONFIGURATION_OPTIONS"
  • Substitua GPU_TYPE pelo tipo de GPU que será usado. Para uma lista de tipos de GPU compatíveis com o Dataflow, consulte Suporte do Dataflow para GPUs.
  • Substitua GPU_COUNT pelo número de GPUs a serem usadas.
  • Opcional: substitua MACHINE_TYPE pelo tipo de máquina que será usado com as GPUs.
    • O tipo de máquina precisa ser compatível com o tipo de GPU selecionado. Para detalhes sobre os tipos de GPU e os tipos de máquina compatíveis, consulte Plataformas de GPU.
    • Se você especificar um tipo de máquina na dica de recurso accelerator e na opção de pipeline do tipo de máquina de worker, a opção de pipeline será ignorada durante o ajuste direito.
  • Para usar GPUs NVIDIA com o Dataflow, defina a opção de configuração install-nvidia-driver.
    • As opções de versão do driver default e latest são compatíveis.
    • A opção de versão do driver precisa ser a mesma em todo o pipeline, mesmo que seja omitida. Não é possível misturar nenhuma versão de driver com a versão de driver default.

Para mais informações sobre o uso de GPUs, consulte GPUs com Dataflow.

Seleção automática de VM para tipos de máquina de worker

Quando você usa dicas de recursos min_ram ou cpu_count para etapas de pipeline que não exigem aceleradores, a Seleção Automática de VM é ativada automaticamente.

Com a seleção automática de VMs, os workers são provisionados de uma seleção de tipos de máquina compatíveis que atendem aos requisitos do pipeline, maximizando a confiabilidade e a disponibilidade de capacidade.

Para informações detalhadas sobre como a seleção automática de VMs funciona, as limitações e as recomendações sobre tipos de armazenamento, consulte Seleção automática de VMs.

Aninhamento de dica de recurso

As dicas de recurso são aplicadas à hierarquia de transformação do pipeline da seguinte maneira:

  • min_ram: o valor em uma transformação é avaliado como o maior valor de dica min_ram entre os valores definidos na própria transformação e todos os pais na hierarquia da transformação.
    • Exemplo: se uma dica de transformação interna definir min_ram como 16 GB, e a dica de transformação externa nos conjuntos de hierarquia min_ram como 32 GB, uma dica de 32 GB será usada em todas as etapas da transformação.
    • Exemplo: se uma dica de transformação interna definir min_ram como 16 GB, e a dica de transformação externa nos conjuntos de hierarquiamin_ram como 8 GB, uma dica de 8 GB é usada para todas as etapas na transformação externa que não estão na transformação interna, e uma dica de 16 GB será usada em todas as etapas da transformação interna.
  • accelerator: o valor mais interno na hierarquia da transformação tem precedência.
    • Exemplo: se uma dica accelerator de transformação interna for diferente de uma dica accelerator de transformação externa em uma hierarquia, a dica accelerator de transformação interna será usada para a transformação interna.

As dicas definidas para todo o pipeline são tratadas como se fossem definidas em uma transformação externa separada.

Use dicas de recursos

É possível definir dicas de recursos em todo o pipeline ou nas etapas de pipeline.

Dicas de recursos do pipeline

É possível definir dicas de recursos em todo o pipeline quando você o executar na linha de comando.

gcloud

Para definir dicas de recursos ao executar um pipeline com um modelo flexível, use a flag --additional-pipeline-options com o comando gcloud dataflow flex-template run. O nome da opção de pipeline depende da linguagem do SDK. Por exemplo, para dicas de recursos:

  • Para pipelines em Java, use resourceHints.
  • Para pipelines do Python, use resource_hints.

O exemplo a seguir demonstra como definir dicas de recursos ao executar um pipeline de modelo flexível do Java:

gcloud dataflow flex-template run JOB_NAME \
    --template-file-gcs-location="gs://TEMPLATE_LOCATION" \
    --region="REGION" \
    --additional-pipeline-options=resourceHints=min_ram=RAM_VALUEGB \
    --additional-pipeline-options=resourceHints=cpu_count=CPU_VALUE \
    --parameters ...

O exemplo a seguir demonstra como definir dicas de recursos ao executar um pipeline de modelo flexível do Python:

gcloud dataflow flex-template run JOB_NAME \
    --template-file-gcs-location="gs://TEMPLATE_LOCATION" \
    --region="REGION" \
    --additional-pipeline-options=resource_hints=min_ram=RAM_VALUEGB \
    --additional-pipeline-options=resource_hints=cpu_count=CPU_VALUE \
    --parameters ...

Java

Para configurar o ambiente Java, consulte Criar um pipeline do Dataflow usando Java.

O exemplo a seguir demonstra como definir dicas de recursos ao executar um pipeline Java:

mvn -Pdataflow-runner compile exec:java \
    -Dexec.mainClass=com.example.MyPipeline \
    -Dexec.args="--runner=DataflowRunner \
    --resourceHints=min_ram=RAM_VALUEGB \
    --resourceHints=cpu_count=CPU_VALUE \
    ..."

Python

Para configurar o ambiente do Python, consulte o tutorial do Python.

O exemplo a seguir demonstra como definir dicas de recursos ao executar um pipeline do Python:

python my_pipeline.py \
    --runner=DataflowRunner \
    --resource_hints=min_ram=RAM_VALUEGB \
    --resource_hints=cpu_count=CPU_VALUE \
    ...

Dicas de recursos da etapa do pipeline

É possível definir dicas de recursos em etapas (transformações) do pipeline de forma programática.

Java

Para instalar o SDK do Apache Beam para Java, consulte Instalar o SDK do Apache Beam.

É possível definir dicas de recursos de maneira programática em transformações de pipeline usando a classe ResourceHints.

Veja no exemplo a seguir como definir dicas de recursos de maneira programática nas transformações de pipeline.

pcoll.apply(MyCompositeTransform.of(...)
    .setResourceHints(
        ResourceHints.create()
            .withMinRam("15GB")
            .withCpuCount(8)
            .withAccelerator(
    "type:nvidia-l4;count:1;install-nvidia-driver")))

pcoll.apply(ParDo.of(new BigMemFn())
    .setResourceHints(
        ResourceHints.create()
          .withMinRam("30GB")
          .withCpuCount(16)))

Para definir dicas de recursos de maneira programática em todo o pipeline, use a interface ResourceHintsOptions.

Python

Para instalar o SDK do Apache Beam para Python, consulte Instalar o SDK do Apache Beam.

É possível definir dicas de recursos de maneira programática em transformações de pipeline usando a classe PTransforms.with_resource_hints. Para saber mais, consulte a classe ResourceHint.

Veja no exemplo a seguir como definir dicas de recursos de maneira programática nas transformações de pipeline.

pcoll | MyPTransform().with_resource_hints(
    min_ram="4GB",
    cpu_count=8,
    accelerator="type:nvidia-tesla-l4;count:1;install-nvidia-driver")

pcoll | beam.ParDo(BigMemFn()).with_resource_hints(
    min_ram="30GB",
    cpu_count=16)

Para definir dicas de recursos em todo o pipeline, use a opção de pipeline --resource_hints ao executar o pipeline. Para ver um exemplo, consulte Dicas de recurso de pipeline.

Go

As dicas de recursos não são compatíveis com o Go.

Suporte a vários aceleradores

Em um pipeline, diferentes transformações podem ter diferentes configurações de acelerador. Isso inclui configurações que exigem tipos de máquina diferentes. Essas configurações de acelerador no nível da transformação têm precedência sobre a configuração no nível do pipeline, se houver.

Ajuste direito e fusão

Em alguns casos, transformações definidas com diferentes dicas de recursos podem ser executadas em workers no mesmo pool de workers, como parte do processo de otimização de fusão. Quando as transformações são unidas, o Dataflow as executa em um ambiente que atende à união de dicas de recursos definidas nas transformações. Em alguns casos, isso inclui todo o pipeline.

Quando as dicas de recursos não podem ser mescladas, a fusão não ocorre. Por exemplo, as dicas de recursos para GPUs diferentes não podem ser mescladas. Portanto, essas transformações não são fundidas.

Para evitar a fusão, adicione uma operação ao pipeline que force o Dataflow a materializar um PCollection intermediário. Isso é especialmente útil ao tentar isolar recursos caros, como GPUs ou máquinas de alta memória, de etapas lentas ou computacionalmente caras que não precisam desses recursos especiais. Nesses casos, pode ser útil forçar uma quebra de fusão entre as etapas lentas vinculadas à CPU e as etapas que precisam de GPUs caras ou máquinas com muita memória e pagar o custo de materialização associado à quebra de fusão. Para saber mais, confira Evitar a fusão.

Ajuste direito de streaming

Para jobs de streaming, é possível ativar o ajuste correto definindo a opção de pipeline --experiments=enable_streaming_rightfitting.

O ajuste correto pode melhorar o desempenho do pipeline se ele envolver etapas com diferentes requisitos de recursos.

Exemplo: pipeline com estágio de uso intensivo de CPU e estágio que requer GPU

Um exemplo de pipeline que pode se beneficiar do ajuste correto é aquele que executa um estágio que exige muita CPU, seguido por um estágio que requer GPU. Sem o ajuste correto, um único pool de workers de GPU precisará ser configurado para executar todos os estágios do pipeline, incluindo o estágio que usa muita CPU. Isso pode levar à subutilização dos recursos da GPU quando o pool de workers estiver executando a etapa com uso intensivo de CPU.

Se o ajuste correto estiver ativado e uma dica de recurso for aplicada à etapa que requer GPU, o pipeline vai criar dois pools separados, de modo que o estágio que exige muita CPU seja executado pelo pool de workers de CPU, e o estágio que requer GPU seja executado pelo pool de workers de GPU.

Neste exemplo de pipeline, a tabela de escalonamento automático mostra que o pool de workers que executa o estágio de uso intensivo de CPU, Pool 0, é inicialmente escalonado para 99 workers e, depois, reduzido para 87 workers. O pool de workers que executa a etapa que requer GPU, Pool 1, é escalonado para 13 workers:

Tabela mostrando o escalonamento automático de dois pools.

O gráfico de utilização da CPU mostra que os workers em ambos os pools estão demonstrando uma alta utilização geral da CPU:

Gráfico mostrando o uso de CPU de workers de dois pools diferentes.

Resolver problemas de ajuste direito

Esta seção fornece instruções para solucionar problemas comuns relacionados ao ajuste direito.

Configuração inválida

Quando você tenta usar o ajuste direito, ocorre o seguinte erro:

Workflow failed. Causes: One or more operations had an error: 'operation-OPERATION_ID':
[UNSUPPORTED_OPERATION] 'CPU_VALUE vCpus with RAM_VALUE MiB memory is
an invalid configuration for GPU_COUNT count of 'GPU_TYPE' in family 'MACHINE_TYPE'.'.

Esse erro ocorre quando o tipo de GPU selecionado não é compatível com o tipo de máquina selecionado. Para resolver esse erro, selecione um tipo de GPU e de máquina compatíveis. Para detalhes de compatibilidade, consulte Plataformas de GPU.

Verificar ajuste direito

Para verificar se o ajuste correto está ativado, confira as métricas de escalonamento automático e verifique se a coluna Worker pool está visível e lista pools diferentes:

Tabela mostrando o histórico de workers de um pipeline com vários pools quando o ajuste correto está ativado.

Performance do ajuste correto de streaming

Os pipelines de streaming com o ajuste correto ativado nem sempre têm um desempenho melhor do que os pipelines sem o ajuste correto ativado. Exemplo:

  1. O pipeline está usando mais workers
  2. A latência do sistema é maior ou a capacidade de processamento é menor
  3. Os tamanhos do pool de workers estão mudando com mais frequência ou não estão se estabilizando

Se você observar isso no seu pipeline, desative o ajuste correto removendo a opção de pipeline --experiments=enable_streaming_rightfitting. Além disso, os pipelines de streaming com o ajuste correto ativado usando dicas de recursos de acelerador podem usar mais aceleradores do que o desejado. Se você observar isso no pipeline, configure um número máximo de aceleradores usados pelo pipeline definindo a opção de pipeline --experiments=max_num_accelerators=MAX_NUM_ACCELERATORS.