Questa guida mostra come addestrare un modello su Google Kubernetes Engine (GKE) utilizzando Ray, PyTorch e il componente aggiuntivo Operatore Ray.
Informazioni su Ray
Ray è un framework di calcolo scalabile open source per applicazioni AI/ML. Ray Train è un componente di Ray progettato per l'addestramento e l'ottimizzazione dei modelli distribuiti. Puoi utilizzare l'API Ray Train per scalare l'addestramento su più macchine e per integrarla con librerie di machine learning come PyTorch.
Puoi eseguire il deployment dei job di addestramento Ray utilizzando la risorsa RayCluster o RayJob. Devi utilizzare una risorsa RayJob quando esegui il deployment dei job Ray in produzione per i seguenti motivi
- La risorsa RayJob crea un cluster Ray temporaneo che può essere eliminato automaticamente al termine di un job.
- La risorsa RayJob supporta i criteri di ripetizione per l'esecuzione resiliente dei job.
- Puoi gestire i job Ray utilizzando pattern API Kubernetes familiari.
Obiettivi
Questa guida è destinata ai clienti di AI generativa, agli utenti nuovi o esistenti di GKE, agli ingegneri ML, agli ingegneri MLOps (DevOps) o agli amministratori di piattaforma interessati a utilizzare le funzionalità di orchestrazione dei container Kubernetes per erogare modelli utilizzando Ray.
- Creare un cluster GKE.
- Crea un cluster Ray utilizzando la risorsa personalizzata RayCluster.
- Addestra un modello utilizzando un job Ray.
- Esegui il deployment di un job Ray utilizzando la risorsa personalizzata RayJob.
Costi
In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:
Per generare una stima dei costi in base all'utilizzo previsto,
utilizza il calcolatore prezzi.
Al termine delle attività descritte in questo documento, puoi evitare l'addebito di ulteriori costi eliminando le risorse che hai creato. Per saperne di più, consulta Esegui la pulizia.
Prima di iniziare
Cloud Shell è preinstallato con il software necessario per questo tutorial, tra cui kubectl e gcloud CLI. Se non utilizzi Cloud Shell,
devi installare gcloud CLI.
- Accedi al tuo account Google Cloud . Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti senza costi per l'esecuzione, il test e il deployment dei workload.
-
Installa Google Cloud CLI.
-
Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.
-
Per inizializzare gcloud CLI, esegui questo comando:
gcloud init -
Crea o seleziona un Google Cloud progetto.
Ruoli richiesti per selezionare o creare un progetto
- Seleziona un progetto: la selezione di un progetto non richiede un ruolo IAM specifico. Puoi selezionare qualsiasi progetto per il quale ti è stato concesso un ruolo.
-
Crea un progetto: per creare un progetto, devi disporre del ruolo Autore progetto
(
roles/resourcemanager.projectCreator), che contiene l'autorizzazioneresourcemanager.projects.create. Scopri come concedere i ruoli.
-
Creare un progetto Google Cloud :
gcloud projects create PROJECT_ID
Sostituisci
PROJECT_IDcon un nome per il progetto Google Cloud che stai creando. -
Seleziona il progetto Google Cloud che hai creato:
gcloud config set project PROJECT_ID
Sostituisci
PROJECT_IDcon il nome del progetto Google Cloud .
-
Verifica che la fatturazione sia attivata per il tuo progetto Google Cloud .
Abilita l'API GKE:
Ruoli richiesti per abilitare le API
Per abilitare le API, devi disporre del ruolo IAM Amministratore utilizzo dei servizi (
roles/serviceusage.serviceUsageAdmin), che include l'autorizzazioneserviceusage.services.enable. Scopri come concedere i ruoli.gcloud services enable container.googleapis.com
-
Installa Google Cloud CLI.
-
Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.
-
Per inizializzare gcloud CLI, esegui questo comando:
gcloud init -
Crea o seleziona un Google Cloud progetto.
Ruoli richiesti per selezionare o creare un progetto
- Seleziona un progetto: la selezione di un progetto non richiede un ruolo IAM specifico. Puoi selezionare qualsiasi progetto per il quale ti è stato concesso un ruolo.
-
Crea un progetto: per creare un progetto, devi disporre del ruolo Autore progetto
(
roles/resourcemanager.projectCreator), che contiene l'autorizzazioneresourcemanager.projects.create. Scopri come concedere i ruoli.
-
Creare un progetto Google Cloud :
gcloud projects create PROJECT_ID
Sostituisci
PROJECT_IDcon un nome per il progetto Google Cloud che stai creando. -
Seleziona il progetto Google Cloud che hai creato:
gcloud config set project PROJECT_ID
Sostituisci
PROJECT_IDcon il nome del progetto Google Cloud .
-
Verifica che la fatturazione sia attivata per il tuo progetto Google Cloud .
Abilita l'API GKE:
Ruoli richiesti per abilitare le API
Per abilitare le API, devi disporre del ruolo IAM Amministratore utilizzo dei servizi (
roles/serviceusage.serviceUsageAdmin), che include l'autorizzazioneserviceusage.services.enable. Scopri come concedere i ruoli.gcloud services enable container.googleapis.com
-
Concedi ruoli al tuo account utente. Esegui il seguente comando una volta per ciascuno dei seguenti ruoli IAM:
roles/container.clusterAdmin, roles/container.admingcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
Sostituisci quanto segue:
PROJECT_ID: il tuo ID progetto.USER_IDENTIFIER: l'identificatore del tuo account utente . Ad esempio:myemail@example.com.ROLE: il ruolo IAM che concedi al tuo account utente.
prepara l'ambiente
Per preparare l'ambiente:
Avvia una sessione di Cloud Shell dalla console Google Cloud facendo clic su
Attiva Cloud Shell nella consoleGoogle Cloud . Viene avviata una sessione nel riquadro inferiore della console Google Cloud .
Imposta le variabili di ambiente:
export PROJECT_ID=PROJECT_ID export CLUSTER_NAME=ray-cluster export COMPUTE_REGION=us-central1 export COMPUTE_ZONE=us-central1-c export CLUSTER_VERSION=CLUSTER_VERSION export TUTORIAL_HOME=`pwd`Sostituisci quanto segue:
PROJECT_ID: il tuo Google Cloud ID progetto.CLUSTER_VERSION: la versione di GKE da utilizzare. Deve essere1.30.1o successiva.
Clona il repository GitHub:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samplesPassa alla directory di lavoro:
cd kubernetes-engine-samples/ai-ml/gke-ray/raytrain/pytorch-mnistCrea un ambiente virtuale Python:
python -m venv myenv && \ source myenv/bin/activate
Crea un cluster GKE
Crea un cluster GKE Autopilot o Standard:
Autopilot
Crea un cluster Autopilot:
gcloud container clusters create-auto ${CLUSTER_NAME} \
--enable-ray-operator \
--cluster-version=${CLUSTER_VERSION} \
--location=${COMPUTE_REGION}
Standard
Crea un cluster Standard:
gcloud container clusters create ${CLUSTER_NAME} \
--addons=RayOperator \
--cluster-version=${CLUSTER_VERSION} \
--machine-type=e2-standard-8 \
--location=${COMPUTE_ZONE} \
--num-nodes=4
Esegui il deployment di una risorsa RayCluster
Esegui il deployment di una risorsa RayCluster nel cluster:
Esamina il seguente manifest:
Questo manifest descrive una risorsa personalizzata RayCluster.
Applica il manifest al cluster GKE:
kubectl apply -f ray-cluster.yamlVerifica che la risorsa RayCluster sia pronta:
kubectl get rayclusterL'output è simile al seguente:
NAME DESIRED WORKERS AVAILABLE WORKERS CPUS MEMORY GPUS STATUS AGE pytorch-mnist-cluster 2 2 6 20Gi 0 ready 63sIn questo output,
readynella colonnaSTATUSindica che la risorsa RayCluster è pronta.
Connettiti alla risorsa RayCluster
Connettiti alla risorsa RayCluster per inviare un job Ray.
Verifica che GKE abbia creato il servizio RayCluster:
kubectl get svc pytorch-mnist-cluster-head-svcL'output è simile al seguente:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE pytorch-mnist-cluster-head-svc ClusterIP 34.118.238.247 <none> 10001/TCP,8265/TCP,6379/TCP,8080/TCP 109sStabilisci una sessione di port forwarding con la testa di Ray:
kubectl port-forward svc/pytorch-mnist-cluster-head-svc 8265:8265 2>&1 >/dev/null &Verifica che il client Ray possa connettersi al cluster Ray utilizzando localhost:
ray list nodes --address http://localhost:8265L'output è simile al seguente:
Stats: ------------------------------ Total: 3 Table: ------------------------------ NODE_ID NODE_IP IS_HEAD_NODE STATE NODE_NAME RESOURCES_TOTAL LABELS 0 1d07447d7d124db641052a3443ed882f913510dbe866719ac36667d2 10.28.1.21 False ALIVE 10.28.1.21 CPU: 2.0 ray.io/node_id: 1d07447d7d124db641052a3443ed882f913510dbe866719ac36667d2 # Several lines of output omitted
Addestra un modello
Addestra un modello PyTorch utilizzando il set di dati Fashion MNIST:
Invia un job Ray e attendi il completamento:
ray job submit --submission-id pytorch-mnist-job --working-dir . --runtime-env-json='{"pip": ["torch", "torchvision"], "excludes": ["myenv"]}' --address http://localhost:8265 -- python train.pyL'output è simile al seguente:
Job submission server address: http://localhost:8265 -------------------------------------------- Job 'pytorch-mnist-job' submitted successfully -------------------------------------------- Next steps Query the logs of the job: ray job logs pytorch-mnist-job Query the status of the job: ray job status pytorch-mnist-job Request the job to be stopped: ray job stop pytorch-mnist-job Handling connection for 8265 Tailing logs until the job exits (disable with --no-wait): ... ...Verifica lo stato del job:
ray job status pytorch-mnistL'output è simile al seguente:
Job submission server address: http://localhost:8265 Status for job 'pytorch-mnist-job': RUNNING Status message: Job is currently running.Attendi che
Status for jobsiaCOMPLETE. Questa operazione può richiedere 15 minuti o più.Visualizza i log dei job Ray:
ray job logs pytorch-mnistL'output è simile al seguente:
Training started with configuration: ╭─────────────────────────────────────────────────╮ │ Training config │ ├──────────────────────────────────────────────────┤ │ train_loop_config/batch_size_per_worker 8 │ │ train_loop_config/epochs 10 │ │ train_loop_config/lr 0.001 │ ╰─────────────────────────────────────────────────╯ # Several lines omitted Training finished iteration 10 at 2024-06-19 08:29:36. Total running time: 9min 18s ╭───────────────────────────────╮ │ Training result │ ├────────────────────────────────┤ │ checkpoint_dir_name │ │ time_this_iter_s 25.7394 │ │ time_total_s 351.233 │ │ training_iteration 10 │ │ accuracy 0.8656 │ │ loss 0.37827 │ ╰───────────────────────────────╯ # Several lines omitted ------------------------------- Job 'pytorch-mnist' succeeded -------------------------------
Esegui il deployment di un RayJob
La risorsa personalizzata RayJob gestisce il ciclo di vita di una risorsa RayCluster durante l'esecuzione di un singolo job Ray.
Esamina il seguente manifest:
Questo manifest descrive una risorsa personalizzata RayJob.
Applica il manifest al cluster GKE:
kubectl apply -f ray-job.yamlVerifica che la risorsa RayJob sia in esecuzione:
kubectl get rayjobL'output è simile al seguente:
NAME JOB STATUS DEPLOYMENT STATUS START TIME END TIME AGE pytorch-mnist-job RUNNING Running 2024-06-19T15:43:32Z 2m29sIn questo output, la colonna
DEPLOYMENT STATUSindica che la risorsa RayJob èRunning.Visualizza lo stato della risorsa RayJob:
kubectl logs -f -l job-name=pytorch-mnist-jobL'output è simile al seguente:
Training started with configuration: ╭─────────────────────────────────────────────────╮ │ Training config │ ├──────────────────────────────────────────────────┤ │ train_loop_config/batch_size_per_worker 8 │ │ train_loop_config/epochs 10 │ │ train_loop_config/lr 0.001 │ ╰─────────────────────────────────────────────────╯ # Several lines omitted Training finished iteration 10 at 2024-06-19 08:29:36. Total running time: 9min 18s ╭───────────────────────────────╮ │ Training result │ ├────────────────────────────────┤ │ checkpoint_dir_name │ │ time_this_iter_s 25.7394 │ │ time_total_s 351.233 │ │ training_iteration 10 │ │ accuracy 0.8656 │ │ loss 0.37827 │ ╰───────────────────────────────╯ # Several lines omitted ------------------------------- Job 'pytorch-mnist' succeeded -------------------------------Verifica che il job Ray sia completato:
kubectl get rayjobL'output è simile al seguente:
NAME JOB STATUS DEPLOYMENT STATUS START TIME END TIME AGE pytorch-mnist-job SUCCEEDED Complete 2024-06-19T15:43:32Z 2024-06-19T15:51:12Z 9m6sIn questo output, la colonna
DEPLOYMENT STATUSindica che la risorsa RayJob èComplete.
Osserva i tuoi carichi di lavoro Ray
Per visualizzare i dettagli dei tuoi RayJob, puoi andare alla sezione Kubernetes Engine > AI/ML > Job della console Google Cloud .
Esegui la pulizia
Elimina il progetto
Elimina un progetto Google Cloud :
gcloud projects delete PROJECT_ID
Elimina singole risorse
Se hai utilizzato un progetto esistente e non vuoi eliminarlo, puoi eliminare le singole risorse. Per eliminare il cluster, digita:
gcloud container clusters delete ${CLUSTER_NAME}
Passaggi successivi
- Esplora architetture di riferimento, diagrammi e best practice su Google Cloud. Consulta il nostro Cloud Architecture Center.