I cluster di addestramento Vertex AI utilizzano Simple Linux Utility for Resource Management (Slurm) come orchestratore per la gestione e la pianificazione dei job sul cluster.
Slurm è un sistema di gestione dei cluster e di pianificazione dei job open source ampiamente utilizzato, noto per la sua scalabilità e tolleranza agli errori.
Funzionalità chiave di Slurm
- Slurm alloca un insieme di nodi di calcolo per l'utilizzo esclusivo di un job specifico per un periodo di tempo definito. In questo modo, un job ha accesso dedicato alle risorse di cui ha bisogno 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 i job paralleli eseguiti su un insieme di nodi allocati.
- Slurm gestisce una coda di job in attesa, utilizzando un motore di definizione delle priorità sofisticato 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 cluster Slurm. Questa sezione descrive in dettaglio le impostazioni di configurazione essenziali, tra cui 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, che possono essere utili per gestire diversi tipi di macchine o livelli di accesso. Sono definite come un elenco all'interno del campo `partitions` 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ù pool di nodi appartenenti 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 di 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.
Per questo valore devi fornire il nome completo della risorsa dell'istanza Filestore.
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 di CPU specifico del job e la memoria utilizzata, consulta la documentazione ufficiale sulla contabilità di Slurm.
| 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 ti consentono di configurare la preemption dei job di Slurm. La preemption funziona con il plug-in di priorità multifattoriale per determinare se i job in esecuzione devono essere messi in pausa per lasciare spazio a lavori con priorità più alta.
Per una panoramica concettuale completa, consulta la documentazione ufficiale di Slurm su the plug-in di priorità multifattoriale e preemption.
Parametri di preemption
| 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, dove 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 job univoco o per 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 addestramento. 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 preemption scelte, puoi utilizzare gli strumenti da riga di comando di Slurm per gestire gli account utente e monitorare la pianificazione dei job.
Gestione degli account con sacctmgr
Il comando sacctmgr è lo strumento principale per la gestione delle informazioni su utenti e account nel database Slurm. Ad esempio, per aggiungere un nuovo utente a un account e concedergli l'accesso a una partizione, esegui il comando seguente:
sudo sacctmgr add User Accounts=<account> Partition=<partition> <user>
Per un elenco completo di tutte le opzioni sacctmgr, consulta la documentazione ufficiale
sulla contabilità di Slurm.
Controllo della priorità del job
Per controllare i componenti di priorità di ogni job nella coda, utilizza l'utilità sprio. Questa operazione è utile per capire perché alcuni job sono pianificati per essere eseguiti 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 sono riportati i 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 controllare le versioni, confrontare e gestire i modelli. Una pipeline può essere configurata per registrare automaticamente un nuovo modello dopo l'addestramento.
- Monitora le esecuzioni delle pipeline e il rendimento del modello:
- Monitoraggio delle pipeline: monitora il grafico di esecuzione, gli artefatti e il rendimento delle esecuzioni delle pipeline per eseguire il debug dei problemi e ottimizzare l'orchestrazione.
- Monitoraggio dei modelli: dopo il deployment, configura il monitoraggio per rilevare la deriva e le anomalie nel rendimento di previsione 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 le 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 e ridurre i costi. In genere, questa operazione 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.