Best practice per l'ottimizzazione delle prestazioni

Questa pagina fornisce indicazioni su come migliorare Cloud Storage FUSE utilizzando funzionalità e configurazioni chiave di Cloud Storage FUSE per ottenere il massimo throughput e prestazioni ottimali, in particolare per i carichi di lavoro di intelligenza artificiale e machine learning (AI/ML) come l'addestramento, la pubblicazione e il checkpointing.

Considerazioni

Prima di applicare le configurazioni consigliate in questa pagina, tieni presente quanto segue:

  • Puoi applicare le configurazioni consigliate in questa pagina utilizzando tre metodi:

  • Assicurati di utilizzare l'ultima versione di Cloud Storage FUSE. Le configurazioni consigliate devono essere applicate solo a Cloud Storage FUSE versione 3.0 o successive e al driver CSI di Cloud Storage FUSE per Google Kubernetes Engine in esecuzione su cluster GKE versione 1.32.2-gke.1297001 o successive.

  • Le configurazioni consigliate memorizzano nella cache i metadati di Cloud Storage per la durata del job e non vengono controllati dopo il montaggio iniziale del file system. Pertanto, per prestazioni ottimali, consigliamo che il file system sia di sola lettura o che la semantica del file system sia write-to-new, ovvero che le applicazioni scrivano sempre in nuovi file. I seguenti workload AI/ML sono di tipo write-to-new:

    • Checkpoint

    • Formazione

    • Pubblicazione

    • Memorizzazione nella cache jax.jit()

  • Le configurazioni consigliate in questa pagina sono state convalidate per i tipi di macchine di grandi dimensioni Cloud GPU e Cloud TPU su larga scala, dove sono presenti una grande quantità di memoria e un'interfaccia di rete a larghezza di banda elevata. I tipi di macchine Cloud GPU e Cloud TPU possono differire in termini di numero di risorse disponibili, come CPU, memoria e spazio di archiviazione locale all'interno della configurazione del nodo host. Ciò può influire direttamente sulle prestazioni per configurazioni come le seguenti:

Utilizza bucket con lo spazio dei nomi gerarchico abilitato

Utilizza sempre bucket con lo spazio dei nomi gerarchico abilitato. Lo spazio dei nomi gerarchico organizza i dati in una struttura gerarchica del file system, il che rende più efficienti le operazioni all'interno del bucket, con conseguenti tempi di risposta più rapidi e un numero inferiore di chiamate di elenco complessive per ogni operazione.

I vantaggi dello spazio dei nomi gerarchico includono:

  • I bucket con spazio dei nomi gerarchico forniscono fino a otto volte più query al secondo (QPS) iniziali rispetto ai bucket flat. Lo spazio dei nomi gerarchico supporta 40.000 richieste di lettura di oggetti iniziali al secondo e 8000 richieste di scrittura di oggetti iniziali, un numero significativamente superiore rispetto ai bucket flat FUSE di Cloud Storage tipici, che offrono solo 5000 richieste di lettura di oggetti al secondo inizialmente e 1000 richieste di scrittura di oggetti iniziali.

  • Lo spazio dei nomi gerarchico fornisce ridenominazioni atomiche delle directory, necessarie per il checkpointing con Cloud Storage FUSE per garantire l'atomicità. L'utilizzo di bucket con lo spazio dei nomi gerarchico abilitato è particolarmente vantaggioso per il checkpointing su larga scala, perché i framework ML utilizzano i cambi di nome delle directory per finalizzare i checkpoint, che è un comando rapido e atomico ed è supportato solo nei bucket con lo spazio dei nomi gerarchico abilitato. Se scegli di non utilizzare un bucket con lo spazio dei nomi gerarchico abilitato, consulta Aumentare il limite di ridenominazione per i bucket non HNS.

Per scoprire come creare un bucket con lo spazio dei nomi gerarchico abilitato, consulta Creare bucket con lo spazio dei nomi gerarchico abilitato. Per scoprire come montare un bucket abilitato per lo spazio dei nomi gerarchico, consulta Montare bucket con lo spazio dei nomi gerarchico abilitato. Gli spazi dei nomi gerarchici sono supportati su Google Kubernetes Engine versione 1.31.1-gke.2008000 o successive.

Eseguire un montaggio specifico per la directory

Se vuoi accedere a una directory specifica all'interno di un bucket, puoi montare solo la directory specifica utilizzando l'opzione di montaggio only-dir anziché montare l'intero bucket. L'esecuzione di un montaggio specifico per la directory accelera le chiamate di elenco e riduce il numero complessivo di chiamate di elenco e stat limitando il numero di directory da attraversare durante la risoluzione di un nome file, perché le chiamate LookUpInode e le richieste di accesso a bucket o directory generano automaticamente chiamate di elenco e stat per ogni file o directory nel percorso.

Per montare una directory specifica, utilizza la seguente configurazione di montaggio:

volumeHandle: BUCKET_NAME
 - only-dir:DIRECTORY_NAME

Dove:

  • BUCKET_NAME è il nome del bucket in cui vuoi montare la directory.

  • DIRECTORY_NAME è il nome della directory che vuoi montare.

Per ulteriori informazioni su come eseguire il montaggio di una directory, consulta Montare una directory all'interno di un bucket.

Aumentare i valori della cache dei metadati

Per migliorare le prestazioni per le letture ripetute, puoi configurare Cloud Storage FUSE in modo da memorizzare nella cache una grande quantità di metadati ed evitare la scadenza dei metadati, in modo da evitare richieste ripetute di metadati a Cloud Storage e migliorare significativamente le prestazioni.

L'aumento dei valori della cache dei metadati è utile per i workload con letture ripetute per evitare chiamate ripetitive a Cloud Storage e per i volumi di sola lettura in cui è possibile impostare un TTL infinito.

Prima di aumentare i valori della cache dei metadati, considera quanto segue:

  • Una durata (TTL) infinita deve essere impostata solo per i volumi di sola lettura o di scrittura solo per i nuovi volumi.

  • La cache dei metadati deve essere abilitata per aumentare significativamente le dimensioni solo sui nodi con configurazioni di memoria di grandi dimensioni, perché memorizza nella cache tutti i metadati per il punto di montaggio specificato in ogni nodo ed elimina la necessità di un accesso aggiuntivo a Cloud Storage.

  • Le configurazioni in questa sezione memorizzano nella cache tutti i metadati a cui è stato eseguito l'accesso con un TTL infinito, il che può influire sulle garanzie di coerenza quando vengono apportate modifiche allo stesso bucket Cloud Storage da qualsiasi altro client, ad esempio sovrascritture o eliminazioni di un file.

  • Per verificare che il consumo di memoria non sia interessato, verifica che la quantità di memoria consumata dalla cache dei metadati sia accettabile per te, che può crescere fino a raggiungere i gigabyte e dipende dal numero di file nei bucket montati e dal numero di punti di montaggio utilizzati. Ad esempio, i metadati di ogni file occupano circa 1,5 KiB di memoria e, in proporzione, i metadati di un milione di file occupano circa 1,5 GiB di memoria. Per ulteriori informazioni, consulta la panoramica della memorizzazione nella cache.

Utilizza le seguenti istruzioni per configurare Cloud Storage FUSE in modo da memorizzare nella cache una grande quantità di metadati e ignorare la scadenza dei metadati:

Opzioni CLI

gcsfuse --metadata-cache-ttl-secs=-1 \
      --stat-cache-max-size-mb=-1 \
      --type-cache-max-size-mb=-1 \
      BUCKET_NAME MOUNT_POINT

Dove:

  • BUCKET_NAME è il nome del tuo bucket.

  • MOUNT_POINT è la directory locale in cui verrà montato il bucket. Ad esempio, /path/to/mount/point.

File di configurazione

metadata-cache:
stat-cache-max-size-mb: -1
ttl-secs: -1
type-cache-max-size-mb: -1

GKE

  mountOptions:
      - metadata-cache:ttl-secs:-1
      - metadata-cache:stat-cache-max-size-mb:-1
      - metadata-cache:type-cache-max-size-mb:-1

Precompilare la cache dei metadati

Prima di eseguire un workload, ti consigliamo di precompilare la cache dei metadati, il che migliora significativamente le prestazioni e riduce notevolmente il numero di chiamate ai metadati a Cloud Storage, in particolare se viene utilizzata l'opzione di configurazione implicit-dirs. Il driver CSI di Cloud Storage FUSE per GKE fornisce un'API che gestisce il pre-popolamento della cache dei metadati. Per maggiori informazioni, consulta Utilizzare il prefetch dei metadati per pre-popolare la cache dei metadati.

Per precompilare la cache dei metadati, utilizza uno dei seguenti metodi:

GKE

Imposta il flag dell'attributo del volume CSI gcsfuseMetadataPrefetchOnMount su true:

Nelle versioni di Google Kubernetes Engine 1.32.1-gke.1357001 o successive, puoi abilitare il recupero preliminare dei metadati per un determinato volume utilizzando l'opzione di configurazione gcsfuseMetadataPrefetchOnMount nel campo volumeAttributes della definizione di PersistentVolume. Il metodo initContainer non è necessario quando utilizzi l'opzione di configurazione gcsfuseMetadataPrefetchOnMount.

  apiVersion: v1
  kind: PersistentVolume
  metadata:
    name: training-bucket-pv
  spec:
    ...
    csi:
      volumeHandle: BUCKET_NAME
      volumeAttributes:
        ...
        gcsfuseMetadataPrefetchOnMount: "true"
  

Dove:

  • BUCKET_NAME è il nome del tuo bucket.

Linux

Esegui manualmente il comando ls -R sul punto di montaggio FUSE di Cloud Storage per elencare in modo ricorsivo tutti i file e precompilare la cache dei metadati:

ls -R MOUNT_POINT > /dev/null

Dove:

MOUNT_POINT: il percorso del punto di montaggio di Cloud Storage FUSE.

Attivare la memorizzazione nella cache dei file e i download paralleli

La memorizzazione nella cache dei file consente di archiviare localmente i dati dei file a cui si accede di frequente sul tuo computer, velocizzando le letture ripetute e riducendo i costi di Cloud Storage. Quando attivi la memorizzazione nella cache dei file, vengono attivati automaticamente anche i download paralleli. I download paralleli utilizzano più worker per scaricare un file in parallelo utilizzando la directory della cache dei file come buffer di precaricamento, con un conseguente tempo di caricamento del modello nove volte più rapido.

Per scoprire come attivare e configurare la memorizzazione nella cache dei file e i download paralleli, consulta Attivare e configurare il comportamento di memorizzazione nella cache dei file. Per utilizzare una configurazione di esempio, consulta Configurazione di esempio per l'attivazione della memorizzazione nella cache dei file e dei download paralleli.

Considerazioni su GPU Cloud e Cloud TPU per l'utilizzo della memorizzazione nella cache dei file e dei download paralleli

La cache dei file può essere ospitata su SSD locali, RAM, Persistent Disk o Google Cloud Hyperdisk seguendo le indicazioni riportate di seguito. In tutti i casi, i dati o il singolo file di grandi dimensioni devono rientrare nella capacità disponibile della directory della cache dei file, che viene controllata utilizzando la configurazione max-size-mb.

Considerazioni sulle GPU Cloud

Gli SSD locali sono ideali per i download di dati di addestramento e checkpoint. I tipi di macchine Cloud GPU includono capacità SSD che possono essere utilizzate, ad esempio i tipi di macchine A4 che includono 12 TiB di SSD.

  • Un disco RAM offre le migliori prestazioni per il caricamento dei pesi del modello grazie alle sue dimensioni ridotte rispetto alla quantità di RAM inutilizzata sul sistema.

  • Persistent Disk o Google Cloud Hyperdisk possono essere utilizzati entrambi come cache.

Considerazioni su Cloud TPU

Cloud TPU non supporta gli SSD locali. Se utilizzi la memorizzazione nella cache dei file su Cloud TPU senza modifiche, la posizione predefinita utilizzata è il volume di avvio, che non è consigliata e comporta prestazioni scarse.

Anziché il volume di avvio, ti consigliamo di utilizzare un disco RAM, preferibile per le sue prestazioni e l'assenza di costi incrementali. Tuttavia, un disco RAM è spesso limitato in termini di dimensioni e non adatto per la pubblicazione dei pesi del modello. In alternativa, ti consigliamo di utilizzare Persistent Disk e Google Cloud Hyperdisk per la memorizzazione nella cache.

Configurazione di esempio per l'attivazione della memorizzazione nella cache dei file e dei download paralleli

Per impostazione predefinita, la cache dei file utilizza un SSD locale se la modalità ephemeral-storage-local-ssd è abilitata per il nodo Google Kubernetes Engine. Se non è disponibile alcun SSD locale, ad esempio sulle macchine Cloud TPU, la cache dei file utilizza il disco di avvio del nodo Google Kubernetes Engine, il che non è consigliabile. In questo caso, puoi utilizzare un disco RAM come directory della cache, ma considera la quantità di RAM disponibile per la memorizzazione nella cache dei file rispetto a quella necessaria al pod.

Opzioni CLI

gcsfuse --file-cache-max-size-mb: -1 \
      --file-cache-cache-file-for-range-read: true \
      --file-cache-enable-parallel-downloads: true \
      BUCKET_NAME

Dove:

  • BUCKET_NAME è il nome del tuo bucket.

File di configurazione

file-cache:
  max-size-mb: -1
  cache-file-for-range-read: true
  enable-parallel-downloads: true

GPU

mountOptions:
    - file-cache:max-size-mb:-1
    - file-cache:cache-file-for-range-read:true
    - file-cache:enable-parallel-downloads:true

# RAM disk file cache if LSSD not available. Uncomment to use
# volumes:
#   - name: gke-gcsfuse-cache
#     emptyDir:
#       medium: Memory

TPU

mountOptions:
    - file-cache:max-size-mb:-1
    - file-cache:cache-file-for-range-read:true 
    - file-cache:enable-parallel-downloads:true 

volumes:
    - name: gke-gcsfuse-cache
      emptyDir:
        medium: Memory

Disattiva le voci della cache delle statistiche negative

Per impostazione predefinita, Cloud Storage FUSE memorizza nella cache le voci stat negative, ovvero le voci per i file che non esistono, con un TTL di cinque secondi. Nei carichi di lavoro in cui i file vengono creati o eliminati di frequente, ad esempio il checkpoint distribuito, queste voci memorizzate nella cache possono diventare rapidamente obsolete, il che porta a problemi di prestazioni. Per evitare questo problema, ti consigliamo di disattivare la cache delle statistiche negative per i carichi di lavoro di addestramento, pubblicazione e checkpoint utilizzando l'opzione di configurazione negative-ttl-secs.

Segui queste istruzioni per disattivare la cache delle statistiche negative:

Opzioni CLI

gcsfuse --metadata-cache-negative-ttl-secs: 0 \
  BUCKET_NAME

Dove:

  • BUCKET_NAME è il nome del tuo bucket.

File di configurazione

metadata-cache:
 negative-ttl-secs: 0

GKE

mountOptions:
    - metadata-cache:negative-ttl-secs:0

Abilita operazioni di scrittura in streaming

Le scritture in streaming caricano i dati direttamente in Cloud Storage man mano che vengono scritti, il che riduce la latenza e l'utilizzo dello spazio su disco. Ciò è particolarmente vantaggioso per le scritture sequenziali di grandi dimensioni, come i checkpoint. Le scritture in streaming sono abilitate per impostazione predefinita in Cloud Storage FUSE versione 3.0 e successive.

Se le scritture di streaming non sono abilitate per impostazione predefinita, segui queste istruzioni per abilitarle. L'attivazione delle scritture in streaming richiede Cloud Storage FUSE versione 3.0, disponibile su Google Kubernetes Engine versioni 1.32.1-gke.1729000 o successive.

Opzioni CLI

gcsfuse --enable-streaming-writes: true \
  BUCKET_NAME

Dove:

  • BUCKET_NAME è il nome del tuo bucket.

File di configurazione

write:
 enable-streaming-writes: true

GKE

mountOptions:
    - write:enable-streaming-writes:true

Aumenta le dimensioni di lettura anticipata del kernel

Per i carichi di lavoro che comportano principalmente letture sequenziali di file di grandi dimensioni, come il servizio e i ripristini dei checkpoint, l'aumento delle dimensioni di lettura anticipata può migliorare significativamente le prestazioni. Questa operazione può essere eseguita utilizzando il parametro del kernel Linux read_ahead_kb sulla macchina locale. Ti consigliamo di aumentare il parametro del kernel read_ahead_kb a 1 MB anziché utilizzare l'importo predefinito di 128 KB impostato sulla maggior parte delle distribuzioni Linux. Per le istanze Compute Engine, sono necessarie le autorizzazioni sudo o root per aumentare correttamente il parametro del kernel.

Per aumentare il parametro del kernel read_ahead_kb a 1 MB per una directory di montaggio Cloud Storage FUSE specifica, utilizza il seguente comando in cui /path/to/mount/point è il punto di montaggio di Cloud Storage FUSE. Prima di eseguire il comando, il bucket deve essere montato su Cloud Storage FUSE, altrimenti il parametro del kernel non aumenta.

  mountOptions:
    - read_ahead_kb=1024
  

Disattiva il servizio token di sicurezza per evitare controlli ridondanti

Il driver CSI di Cloud Storage FUSE per Google Kubernetes Engine esegue controlli di accesso per garantire il recupero dei pod a causa di una configurazione errata da parte dell'utente dei binding dell'identità del workload tra il bucket e il account di servizio GKE, che può raggiungere le quote predefinite dell'API Security Token Service su larga scala. Questa opzione può essere disattivata impostando l'attributo skipCSIBucketAccessCheck del volume del driver CSI del volume permanente. Ti consigliamo di assicurarti che il account di servizio GKE disponga dell'accesso corretto al bucket Cloud Storage di destinazione per evitare errori di montaggio per il pod.

Inoltre, la quota del servizio token di sicurezza deve essere aumentata oltre il valore predefinito di 6000 se un cluster Google Kubernetes Engine è composto da più di 6000 nodi, il che può comportare errori 429 se non viene aumentata nei deployment su larga scala. La quota del servizio token di sicurezza deve essere aumentata tramite la pagina Quote e limiti. Ti consigliamo di mantenere la quota pari al numero di montaggi. Ad esempio, se nel cluster sono presenti 10.000 montaggi, la quota deve essere aumentata a 10000.

Per impostare l'attributo del volume skipCSIBucketAccessCheck, consulta la seguente configurazione di esempio:

  volumeAttributes:
      - skipCSIBucketAccessCheck: "true"
   

Altre considerazioni sulle prestazioni

Oltre alle ottimizzazioni principali discusse, diversi altri fattori possono influire in modo significativo sulle prestazioni complessive di Cloud Storage FUSE. Le sezioni seguenti descrivono ulteriori considerazioni sulle prestazioni che ti consigliamo di prendere in considerazione quando utilizzi Cloud Storage FUSE.

Aumentare il limite di ridenominazione per i bucket non HNS

I workload di checkpoint devono sempre essere eseguiti con un bucket con lo spazio dei nomi gerarchico abilitato a causa di ridenominazioni atomiche e più rapide e di QPS più elevato per letture e scritture. Tuttavia, se accetti il rischio che le ridenominazioni delle directory non siano atomiche e richiedano più tempo, puoi utilizzare l'opzione di configurazione rename-dir-limit se esegui il checkpoint utilizzando bucket senza spazio dei nomi gerarchico per specificare un limite al numero di file o operazioni coinvolti in un'operazione di ridenominazione di directory in un determinato momento.

Ti consigliamo di impostare l'opzione di configurazione rename-dir-limit su un valore elevato per evitare errori di checkpointing. Poiché Cloud Storage FUSE utilizza uno spazio dei nomi semplice e gli oggetti sono immutabili, un'operazione di ridenominazione di una directory comporta la ridenominazione e l'eliminazione di tutti i singoli file all'interno della directory. Puoi controllare il numero di file interessati da un'operazione di ridenominazione impostando l'opzione di configurazione rename-dir-limit.

Per impostare l'opzione di configurazione rename-dir-limit:

Opzioni CLI

gcsfuse --rename-dir-limit: 200000 \
  BUCKET_NAME

Dove:

  • BUCKET_NAME è il nome del tuo bucket.

File di configurazione

file-system:
 rename-dir-limit: 200000

GKE

mountOptions:
    - rename-dir-limit=200000

Memorizzazione nella cache dell'elenco dei kernel

La cache dell'elenco è una cache per le risposte di elenchi di directory e file o ls che migliora la velocità delle operazioni di elenco. A differenza delle cache di statistiche e tipi, che sono gestite da Cloud Storage FUSE, la cache di elenco viene conservata nella cache di pagine del kernel ed è controllata dal kernel in base alla disponibilità di memoria.

L'attivazione della memorizzazione nella cache dell'elenco dei kernel è più vantaggiosa per i seguenti casi d'uso:

  • Workload con elenchi di directory ripetuti: questa configurazione è particolarmente utile per i workload che eseguono elenchi di directory completi frequenti, come le esecuzioni di addestramento AI/ML. Ciò può avvantaggiare sia i carichi di lavoro di distribuzione che di addestramento.

  • Montaggi di sola lettura: la memorizzazione nella cache degli elenchi è consigliata con i montaggi di sola lettura per evitare problemi di coerenza.

L'attivazione della memorizzazione nella cache dell'elenco dei kernel deve essere eseguita con cautela e deve essere utilizzata solo se il file system è effettivamente di sola lettura e non sono previste modifiche ai contenuti della directory durante l'esecuzione di un job. Questo perché con questo flag l'applicazione locale non vede mai gli aggiornamenti, soprattutto se il TTL è impostato su -1.

Ad esempio, Client 1 elenca directoryA, che fa sì che directoryA diventi un residente nella cache dell'elenco del kernel. Client 2 crea fileB in directoryA nel bucket Cloud Storage. Client 1 controlla continuamente la presenza di fileB in directoryA, il che significa controllare la voce della cache dell'elenco dei kernel e non passa mai attraverso la rete. Client 1 non vede che un nuovo file si trova nella directory perché l'elenco dei file viene continuamente pubblicato dalla cache dell'elenco del kernel locale. Client 1 scade e il programma non funziona più.

Utilizza le seguenti istruzioni per attivare la memorizzazione nella cache degli elenchi:

Opzioni CLI

gcsfuse --kernel-list-cache-ttl-secs: -1 \
  BUCKET_NAME

Dove:

  • BUCKET_NAME è il nome del tuo bucket.

File di configurazione

file-system:
 kernel-list-cache-ttl-secs: -1

GKE

mountOptions:
    - file-system:kernel-list-cache-ttl-secs:-1

Quando utilizzi l'opzione di montaggio file-system:kernel-list-cache-ttl-secs, i valori hanno il seguente significato:

  • Un valore positivo rappresenta il TTL in secondi per mantenere la risposta dell'elenco di directory nella cache delle pagine del kernel.

  • Un valore di -1 ignora la scadenza della voce e restituisce la risposta dell'elenco dalla cache quando è disponibile.

Utilizza la cache di compilazione persistente (JIT) di JAX con Cloud Storage FUSE

JAX supporta la cache Just-In-Time (JIT), una cache di compilazione persistente facoltativa che archivia gli artefatti delle funzioni compilate. Quando utilizzi questa cache, puoi velocizzare notevolmente le esecuzioni successive degli script evitando passaggi di compilazione ridondanti.

Per abilitare la memorizzazione nella cache JIT, devi soddisfare i seguenti requisiti:

  • Utilizza l'ultima versione di JAX: utilizza JAX versione 0.5.1 o successive per le funzionalità e le ottimizzazioni della cache più recenti.

  • Massimizza la capacità della cache: per evitare il peggioramento delle prestazioni dovuto all'eliminazione della cache, valuta la possibilità di impostare una dimensione della cache illimitata, soprattutto se vuoi ignorare le impostazioni predefinite. Puoi farlo impostando la variabile di ambiente:

    export JAX_COMPILATION_CACHE_MAX_SIZE=-1
    
  • Assicurati che il pod checkpoint YAML: utilizza la configurazione del checkpoint per il punto di montaggio della cache JIT di JAX.

Passaggi successivi