Adattabilità

La funzionalità di adattabilità utilizza gli hint di risorse di Apache Beam per personalizzare le risorse dei worker per una pipeline. La possibilità di indirizzare più risorse diverse a passaggi specifici della pipeline offre maggiore flessibilità e capacità alla pipeline, oltre a potenziali risparmi sui costi. Puoi applicare risorse più costose ai passaggi della pipeline che le richiedono e risorse meno costose ad altri passaggi della pipeline. Utilizza l'adattabilità per specificare i requisiti delle risorse per un'intera pipeline o per passaggi specifici della pipeline.

Supporto e limitazioni

  • Gli hint di risorse sono supportati con gli SDK Apache Beam Java e Python, versioni 2.31.0 e successive.
  • L'adattabilità è supportata con le pipeline in modalità batch.
  • L'adattabilità è supportata con le pipeline in modalità flusso con la scalabilità automatica orizzontale abilitata.

  • L'adattabilità supporta Dataflow Prime.

  • L'adattabilità non supporta FlexRS.

  • Quando utilizzi l'adattabilità, non utilizzare l'opzione del worker_accelerator servizio.

Abilitare l'adattabilità

Per attivare l'adattabilità, utilizza uno o più degli hint di risorse disponibili nella pipeline. Quando utilizzi un hint di risorse nella pipeline, l'adattabilità viene abilitata automaticamente. Per saperne di più, consulta la sezione Utilizzare gli hint di risorse di questo documento.

Hint di risorse disponibili

Sono disponibili i seguenti hint di risorse.

Hint di risorse Descrizione
min_ram

La quantità minima di RAM in gigabyte da allocare ai worker. Dataflow utilizza questo valore come limite inferiore quando alloca memoria ai nuovi worker (scalabilità orizzontale) o ai worker esistenti (scalabilità verticale).

Ad esempio:

min_ram=NUMBERGB
  • Sostituisci NUMBER con il valore minimo della memoria dei worker richiesta dalla pipeline o dal passaggio della pipeline.
  • min_ram è una specifica aggregata per worker. Non è una specifica per vCPU. Ad esempio, se imposti min_ram=15GB, Dataflow imposta la memoria aggregata disponibile su tutte le vCPU del worker su almeno 15 GB.
cpu_count

Il numero di vCPU da allocare per worker. Quando utilizzi questo hint di risorse, Dataflow seleziona i tipi di macchine che hanno il numero specificato di vCPU e soddisfano i requisiti di memoria.

Ad esempio:

cpu_count=NUMBER
  • Sostituisci NUMBER con il numero intero di vCPU richieste dalla pipeline o dal passaggio della pipeline per worker.
accelerator

Un'allocazione di GPU fornita dall'utente che ti consente di controllare l'utilizzo e il costo delle GPU nella pipeline e nei relativi passaggi. Specifica il tipo e il numero di GPU da collegare ai worker Dataflow come parametri del flag.

Ad esempio:

accelerator="type:GPU_TYPE;count:GPU_COUNT;machine_type:MACHINE_TYPE;CONFIGURATION_OPTIONS"
  • Sostituisci GPU_TYPE con il tipo di GPU da utilizzare. Per un elenco dei tipi di GPU supportati da Dataflow, consulta Supporto di Dataflow per le GPU.
  • Sostituisci GPU_COUNT con il numero di GPU da utilizzare.
  • (Facoltativo) Sostituisci MACHINE_TYPE con il tipo di macchina da utilizzare con le GPU.
    • Il tipo di macchina deve essere compatibile con il tipo di GPU tipo selezionato. Per informazioni dettagliate sui tipi di GPU e sui tipi di macchine compatibili, consulta Piattaforme GPU.
    • Se specifichi un tipo di macchina sia nell'accelerator hint di risorse sia nell'opzione della pipeline del tipo di macchina worker , l'opzione della pipeline viene ignorata durante l'adattabilità.
  • Per utilizzare le GPU NVIDIA con Dataflow, imposta l' install-nvidia-driver opzione di configurazione.

Per saperne di più sull'utilizzo delle GPU, consulta GPU con Dataflow.

Selezione automatica delle VM per i tipi di macchine worker

Quando utilizzi gli hint di risorse min_ram o cpu_count per i passaggi della pipeline che non richiedono acceleratori, la flessibilità delle istanze (selezione automatica delle VM) viene abilitata automaticamente. Con la selezione automatica delle VM, viene eseguito il provisioning dei worker da una selezione di tipi di macchine che soddisfano i requisiti di RAM e CPU.

Se utilizzi le prenotazioni di Compute Engine con la selezione automatica delle VM, tieni presente quanto segue:

Per saperne di più, consulta Flessibilità delle istanze e prenotazioni.

Nesting degli hint di risorse

Gli hint di risorse vengono applicati alla gerarchia di trasformazione della pipeline come segue:

  • min_ram: il valore di una trasformazione viene valutato come il valore dell'hint min_ram più grande tra i valori impostati sulla trasformazione stessa e su tutti i relativi genitori nella gerarchia della trasformazione.
    • Esempio: se un hint di trasformazione interno imposta min_ram su 16 GB e l'hint di trasformazione esterno nella gerarchia imposta min_ram su 32 GB, viene utilizzato un hint di 32 GB per tutti i passaggi dell'intera trasformazione.
    • Esempio: se un hint di trasformazione interno imposta min_ram su 16 GB e l'hint di trasformazione esterno nella gerarchia imposta min_ram su 8 GB, viene utilizzato un hint di 8 GB per tutti i passaggi della trasformazione esterna che non si trovano nella trasformazione interna e un hint di 16 GB viene utilizzato per tutti i passaggi della trasformazione interna.
  • accelerator: il valore più interno nella gerarchia della trasformazione ha la precedenza.
    • Esempio: se un hint accelerator di trasformazione interno è diverso da un hint accelerator di trasformazione esterno in una gerarchia, l'hint accelerator di trasformazione interno viene utilizzato per la trasformazione interna.

Gli hint impostati per l'intera pipeline vengono trattati come se fossero impostati su una trasformazione esterna separata.

Utilizzare gli hint di risorse

Puoi impostare gli hint di risorse sull'intera pipeline o sui passaggi della pipeline.

Hint di risorse della pipeline

Puoi impostare gli hint di risorse sull'intera pipeline quando esegui la pipeline dalla riga di comando.

Per configurare l'ambiente Python, consulta il tutorial di Python.

Esempio:

    python my_pipeline.py \
        --runner=DataflowRunner \
        --resource_hints=min_ram=numberGB \
        --resource_hints=cpu_count=number \
        --resource_hints=accelerator="type:type;count:number;install-nvidia-driver" \
        ...

Hint di risorse dei passaggi della pipeline

Puoi impostare gli hint di risorse sui passaggi della pipeline (trasformazioni) a livello di programmazione.

Java

Per installare l'SDK Apache Beam per Java, consulta Installare l'SDK Apache Beam.

Puoi impostare gli hint di risorse a livello di programmazione sulle trasformazioni della pipeline utilizzando la ResourceHints classe.

L'esempio seguente mostra come impostare gli hint di risorse a livello di programmazione sulle trasformazioni della 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)))

Per impostare gli hint di risorse a livello di programmazione sull'intera pipeline, utilizza l' ResourceHintsOptions interfaccia.

Python

Per installare l'SDK Apache Beam per Python, consulta Installare l'SDK Apache Beam.

Puoi impostare gli hint di risorse a livello di programmazione sulle trasformazioni della pipeline utilizzando la PTransforms.with_resource_hints classe. Per saperne di più, consulta la ResourceHint classe.

L'esempio seguente mostra come impostare gli hint di risorse a livello di programmazione sulle trasformazioni della 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)

Per impostare gli hint di risorse sull'intera pipeline, utilizza l'opzione della pipeline --resource_hints quando esegui la pipeline. Per un esempio, consulta Hint di risorse della pipeline.

Vai

Gli hint di risorse non sono supportati in Go.

Supporto di più acceleratori

All'interno di una pipeline, trasformazioni diverse possono avere configurazioni di acceleratori diverse. Queste includono configurazioni che richiedono tipi di macchine diversi. Queste configurazioni di acceleratori a livello di trasformazione hanno la precedenza sulla configurazione a livello di pipeline, se ne è stata fornita una.

Adattabilità e fusione

In alcuni casi, le trasformazioni impostate con hint di risorse diversi possono essere eseguite sui worker nello stesso pool di worker, nell'ambito del processo di ottimizzazione della fusione. Quando le trasformazioni vengono unite, Dataflow le esegue in un ambiente che soddisfa l'unione degli hint di risorse impostati sulle trasformazioni. In alcuni casi, questo include l'intera pipeline.

Quando gli hint di risorse non possono essere uniti, la fusione non si verifica. Ad esempio, gli hint di risorse per GPU diverse non sono unibili, quindi queste trasformazioni non vengono unite.

Puoi anche impedire la fusione aggiungendo un'operazione alla pipeline che costringe Dataflow a materializzare un PCollection intermedio. Questo è particolarmente utile quando si tenta di isolare risorse costose come le GPU o le macchine con memoria elevata da passaggi lenti o costosi dal punto di vista computazionale che non necessitano di queste risorse speciali. In questi casi, potrebbe essere utile forzare un'interruzione della fusione tra i passaggi lenti vincolati alla CPU e i passaggi che richiedono le GPU costose o le macchine con memoria elevata e pagare il costo della materializzazione associata all'interruzione della fusione. Per saperne di più, consulta Impedire la fusione.

Adattabilità in modalità flusso

Per i job in modalità flusso, puoi abilitare l'adattabilità impostando l'opzione della pipeline --experiments=enable_streaming_rightfitting.

L'adattabilità può migliorare il rendimento della pipeline se include fasi con requisiti di risorse diversi.

Esempio: pipeline con fase a uso intensivo di CPU e fase che richiede GPU

Una pipeline di esempio che potrebbe trarre vantaggio dall'adattabilità è quella che esegue una fase a uso intensivo di CPU, seguita da una fase che richiede GPU. Senza l'adattabilità, è necessario configurare un singolo pool di worker GPU per eseguire tutte le fasi della pipeline, inclusa la fase a uso intensivo di CPU. Ciò potrebbe comportare un sottoutilizzo delle risorse GPU quando il pool di worker esegue la fase a uso intensivo di CPU.

Se l'adattabilità è abilitata e un hint di risorse viene applicato al passaggio che richiede GPU, la pipeline creerà due pool separati, in modo che la fase a uso intensivo di CPU venga eseguita dal pool di worker CPU e la fase che richiede GPU venga eseguita dal pool di worker GPU.

Per questa pipeline di esempio, la tabella di scalabilità automatica mostra che il pool di worker che esegue la fase a uso intensivo di CPU, Pool 0, viene inizialmente aumentato a 99 worker e successivamente ridotto a 87 worker. Il pool di worker che esegue la fase che richiede GPU, Pool 1, viene aumentato a 13 worker:

Tabella che mostra la scalabilità automatica di due pool.

Il grafico Utilizzo CPU mostra che i worker in entrambi i pool di worker mostrano un utilizzo complessivo elevato della CPU:

Grafico che mostra l'utilizzo della CPU dei worker di due pool diversi.

Risolvere i problemi relativi all'adattabilità

Questa sezione fornisce istruzioni per la risoluzione dei problemi comuni relativi all'adattabilità.

Configurazione non valida

Quando provi a utilizzare l'adattabilità, si verifica il seguente errore:

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

Questo errore si verifica quando il tipo di GPU selezionato non è compatibile con il tipo di macchina selezionato. Per risolvere questo errore, seleziona un tipo di GPU e un tipo di macchina compatibili. Per informazioni dettagliate sulla compatibilità, consulta Piattaforme GPU.

Verificare l'adattabilità

Puoi verificare che l'adattabilità sia abilitata visualizzando le metriche di scalabilità automatica e verificando che la colonna Worker pool sia visibile ed elenchi pool diversi:

Tabella che mostra la cronologia dei worker di una pipeline con più pool quando è abilitata la selezione della taglia giusta.

Rendimento dell'adattabilità in modalità flusso

Le pipeline in modalità flusso con l'adattabilità abilitata potrebbero non sempre avere un rendimento migliore rispetto alle pipeline senza l'adattabilità abilitata. Ad esempio:

  1. La pipeline utilizza più worker
  2. La latenza del sistema è maggiore o la velocità effettiva è inferiore
  3. Le dimensioni del pool di worker cambiano più spesso o non si stabilizzano

Se riscontri questo problema per la tua pipeline, puoi disabilitare l'adattabilità rimuovendo l'opzione della pipeline --experiments=enable_streaming_rightfitting. Inoltre, le pipeline in modalità flusso con l'adattabilità abilitata che utilizzano gli hint di risorse dell'acceleratore potrebbero utilizzare più acceleratori di quanto desiderato. Se riscontri questo problema per la tua pipeline, puoi configurare un numero massimo di acceleratori utilizzati dalla pipeline impostando l'opzione della pipeline --experiments=max_num_accelerators=NUM.