I cluster di addestramento Vertex AI utilizzano Simple Linux Utility for Resource Management (Slurm) come orchestratore per gestire e pianificare i job sul cluster.
Slurm è un sistema di gestione dei cluster e pianificazione dei job open source ampiamente utilizzato, noto per la sua scalabilità e tolleranza agli errori.
Funzionalità principali di Slurm
- Slurm alloca un insieme di nodi di calcolo per l'utilizzo esclusivo di un job specifico per un periodo definito. In questo modo, un job ha accesso dedicato alle risorse necessarie per essere eseguito senza interferenze.
- Slurm fornisce un framework per la gestione dell'intero ciclo di vita di un job, dall'invio e dall'esecuzione al monitoraggio e al completamento. Questo sistema è progettato specificamente per gestire job paralleli eseguiti su un insieme di nodi allocati.
- Slurm gestisce una coda di job in attesa utilizzando un sofisticato motore di definizione delle priorità per arbitrare l'accesso alle risorse di calcolo. Tenendo conto di fattori come le dimensioni del job, la priorità dell'utente e il tempo di attesa, questo sistema garantisce un utilizzo equo ed efficiente delle risorse nel cluster.
Configurazione di base del cluster
Prima di poter eseguire i job, devi definire la struttura fondamentale del tuo cluster Slurm. Questa sezione descrive in dettaglio le impostazioni di configurazione essenziali, incluso come organizzare i nodi di calcolo in partizioni, specificare un pool di nodi di accesso dedicato e configurare una home directory condivisa per gli utenti.
Partizioni
Le partizioni raggruppano i nodi in insiemi logici, il che può essere utile per gestire
diversi tipi di macchine o livelli di accesso. Sono definiti come un elenco all'interno del campo
partizioni di slurm_spec.
Ogni oggetto partizione ha i seguenti campi obbligatori:
id: un identificatore univoco per la partizione.node_pool_ids: un elenco contenente gli ID di uno o più node pool che appartengono a questa partizione.
Ad esempio:
"partitions": [
{
"id": "a4",
"node_pool_ids": [ "a4" ]
}
]
Nodi di accesso
Il pool di nodi di accesso fornisce nodi dedicati che fungono da punto di accesso principale per gli utenti per interagire con il cluster. Il campo login_node_pool_id
specifica l'identificatore univoco per questo pool.
Ad esempio:
"login_node_pool_id": "login"
Spazio di archiviazione della home directory
Il campo home_directory_storage specifica l'istanza Filestore da montare come directory /home su tutti i nodi del cluster. In questo modo
viene fornita una home directory condivisa e persistente per tutti gli utenti.
Devi fornire il nome completo della risorsa dell'istanza Filestore per questo valore.
Ad esempio:
"home_directory_storage": "projects/PROJECT_ID/locations/REGION-ZONE/instances/FILESTORE_INSTANCE_NAME"
Configurazione avanzata di Slurm
I cluster di addestramento Vertex AI ti consentono di personalizzare un insieme selezionato di parametri slurm.conf,
ma tieni presente che queste impostazioni possono essere configurate solo durante la creazione iniziale del cluster e non possono essere modificate in un secondo momento.
Contabilità
I cluster di addestramento Vertex AI ti consentono di utilizzare le funzionalità di contabilità integrate per monitorare l'utilizzo delle risorse all'interno del cluster. Per una guida completa su come monitorare metriche come il tempo della CPU e l'utilizzo della memoria specifici per il job, consulta la documentazione ufficiale di Slurm Accounting.
| Parametro | Valore | Esempio |
|---|---|---|
| AccountingStorageEnforce | Stringhe separate da virgole | associations,limits,qos |
Preemption e priorità
Per gestire la pianificazione e la definizione delle priorità dei job, i cluster di addestramento Vertex AI consentono di configurare la preemption dei job di Slurm. La preemption funziona con il plug-in per la priorità multifattoriale per determinare se i job in esecuzione devono essere messi in pausa per fare spazio a lavori con priorità più alta.
Per una panoramica concettuale completa, consulta la documentazione ufficiale di Slurm sul plug-in di priorità multifattoriale e sul prerilascio.
Parametri di prerilascio
| Parametro | Valore | Esempio |
|---|---|---|
| PREEMPT_TYPE | Stringa | preempt/partition_prio |
| PREEMPT_MODE | Stringhe separate da virgole | SUSPEND,GANG |
| PREEMPT_EXEMPT_TIME | Stringa | 00:00:00 |
Parametri di priorità
| Parametro | Valore | Esempio |
|---|---|---|
| PRIORITY_TYPE | Stringa | priority/multifactor |
| PRIORITY_WEIGHT_AGE | Numero intero | 0 |
| PRIORITY_WEIGHT_ASSOC | Numero intero | 0 |
| PRIORITY_WEIGHT_FAIRSHARE | Numero intero | 0 |
| PRIORITY_WEIGHT_JOB_SIZE | Numero intero | 0 |
| PRIORITY_WEIGHT_PARTITION | Numero intero | 0 |
| PRIORITY_WEIGHT_QOS | Numero intero | 0 |
| PRIORITY_WEIGHT_TRES | Stringhe separate da virgole | cpu=100,mem=150 |
Script di prologo ed epilogo
Puoi configurare script Bash personalizzati da eseguire automaticamente all'inizio (prologo) e alla fine (epilogo) di ogni job utilizzando i seguenti campi:
prolog_bash_scripts: un elenco di stringhe, in cui ogni stringa contiene l'intero contenuto di uno script Bash da eseguire prima dell'inizio del job.epilog_bash_scripts: un elenco di stringhe, dove ogni stringa contiene l'intero contenuto di uno script Bash da eseguire al termine del job.
Questa operazione è utile per configurare un ambiente di lavoro univoco o eseguire attività di pulizia automatizzate.
Esempio di specifica del cluster
L'esempio seguente mostra una configurazione JSON completa per la creazione di un cluster di training. Puoi adattare questa specifica alle tue esigenze.
{ // ... other cluster configurations ... "orchestratorSpec": { "slurmSpec": { "partitions": [ { "id": "a4", "node_pool_ids": ["a4"] } ], "login_node_pool_id": "login", "home_directory_storage": "projects/PROJECT_ID/locations/REGION-ZONE/instances/FILESTORE_INSTANCE_ID", "accounting": { "accounting_storage_enforce": "ACCOUNTING_STORAGE_ENFORCE" }, "scheduling": { "priority_type": "PRIORITY_TYPE", "priority_weight_age": PRIORITY_WEIGHT_AGE, "priority_weight_assoc": PRIORITY_WEIGHT_ASSOC, "priority_weight_fairshare": PRIORITY_WEIGHT_FAIRSHARE, "priority_weight_job_size": PRIORITY_WEIGHT_JOB_SIZE, "priority_weight_partition": PRIORITY_WEIGHT_PARTITION, "priority_weight_qos": PRIORITY_WEIGHT_QOS, "priority_weight_tres": "PRIORITY_WEIGHT_TRES", "preempt_type": "PREEMPT_TYPE", "preempt_mode": "PREEMPT_MODE", "preempt_exempt_time": "PREEMPT_EXEMPT_TIME" }, "prolog_bash_scripts": [ "#!/bin/bash\necho 'First prolog script running'", "#!/bin/bash\necho 'Second prolog script running'" ], "epilog_bash_scripts": [ "#!/bin/bash\necho 'Epilog script running'" ] // ... other Slurm settings ... } } }
Gestione e operazioni del cluster
Gestione di un cluster in esecuzione
Una volta creato il cluster con le impostazioni di contabilità e preemptive scelte, puoi utilizzare gli strumenti a riga di comando di Slurm per gestire gli account utente e monitorare la pianificazione dei job.
Gestione dell'account con sacctmgr
Il comando sacctmgr è lo strumento principale per la gestione delle informazioni
di utenti e account nel database Slurm. Ad esempio, per aggiungere un nuovo utente a un account
e concedergli l'accesso a una partizione, esegui questo comando:
sudo sacctmgr add User Accounts=<account> Partition=<partition> <user>
Per un elenco completo di tutte le opzioni sacctmgr, consulta la
documentazione ufficiale di Slurm Accounting.
Controllare la priorità del job
Per controllare i componenti prioritari di ogni job nella coda, utilizza l'utilità sprio. Ciò è utile per capire perché l'esecuzione di determinati job è pianificata prima di altri.
Per informazioni dettagliate sull'utilizzo, consulta la documentazione dell'utilità sprio.
Esempi di preemption
La documentazione ufficiale di Slurm fornisce diversi esempi pratici di strategie di preemption. Puoi trovarli nella pagina Preemption di Slurm.
Passaggi successivi
Di seguito ci concentreremo sui passaggi finali del ciclo di vita del machine learning: gestione, deployment e monitoraggio dei modelli addestrati.
- Esegui il deployment del modello per l'inferenza: esegui il deployment del modello addestrato in un endpoint Vertex AI per gestire le richieste di inferenza online su larga scala.
- Gestisci il ciclo di vita del modello: utilizza Vertex AI Model Registry per versionare, confrontare e gestire i tuoi modelli. Una pipeline può essere configurata per registrare automaticamente un nuovo modello dopo l'addestramento riuscito.
- Monitora le esecuzioni della pipeline e il rendimento del modello:
- Monitoraggio delle pipeline: monitora il grafico di esecuzione, gli artefatti e le prestazioni delle esecuzioni della pipeline per eseguire il debug dei problemi e ottimizzare l'orchestrazione.
- Monitoraggio del modello: dopo il deployment, configura il monitoraggio per rilevare la deriva e le anomalie nel rendimento delle previsioni del modello, in modo da mantenere l'accuratezza del modello nel tempo.
- Ottimizza i costi e gestisci il ciclo di vita del cluster: quando utilizzi pipeline automatizzate, gestisci il ciclo di vita del cluster tenendo conto della frequenza di esecuzione.
- Per le esecuzioni poco frequenti, aggiungi un passaggio finale della pipeline per eliminare il cluster per risparmiare sui costi. In genere, ciò comporta la creazione di un componente della pipeline personalizzato che chiama la funzione di eliminazione.
- Per le esecuzioni frequenti, lascia attivo il cluster per ridurre il tempo di avvio del job.