En esta guía, se muestra cómo entrenar un modelo en Google Kubernetes Engine (GKE) con Ray, PyTorch y el complemento Ray Operator.
Información acerca de Ray
Ray es un framework de procesamiento escalable de código abierto para aplicaciones de IA/AA. Ray Train es un componente de Ray diseñado para el entrenamiento y el ajuste de modelos distribuidos. Puedes usar la API de Ray Train para escalar el entrenamiento en varias máquinas y, luego, integrarlo a las bibliotecas de aprendizaje automático, como PyTorch.
Puedes implementar trabajos de entrenamiento de Ray con el recurso de RayCluster o RayJob. Debes usar un recurso de RayJob cuando implementes trabajos de Ray en producción por los siguientes motivos
- El recurso de RayJob crea un clúster de Ray efímero que se puede borrar automáticamente cuando se completa un trabajo.
- El recurso de RayJob admite políticas de reintento para la ejecución de trabajos resilientes.
- Puedes administrar trabajos de Ray con patrones de API de Kubernetes conocidos.
Objetivos
Esta guía está dirigida a clientes de IA generativa, usuarios nuevos o existentes de GKE, ingenieros de AA, ingenieros de MLOps (DevOps) o administradores de plataformas que estén interesados en el uso de las capacidades de organización de contenedores de Kubernetes para entregar modelos con Ray.
- Crea un clúster de GKE.
- Crea un clúster de Ray con el recurso personalizado RayCluster.
- Entrena un modelo con un trabajo de Ray.
- Implementa un trabajo de Ray con el recurso personalizado RayJob.
Costos
En este documento, usarás los siguientes componentes facturables de Google Cloud:
Para obtener una estimación de costos en función del uso previsto,
usa la calculadora de precios.
Cuando completes las tareas que se describen en este documento, podrás borrar los recursos que creaste para evitar que se te siga facturando. Para obtener más información, consulta Realiza una limpieza.
Antes de comenzar
Cloud Shell tiene preinstalado el software que necesitas para este
instructivo, incluidos kubectl
y gcloud CLI. Si no usas Cloud Shell,
debes instalar gcloud CLI.
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
Install the Google Cloud CLI.
-
Si usas un proveedor de identidad externo (IdP), primero debes Acceder a la gcloud CLI con tu identidad federada.
-
Para inicializar gcloud CLI, ejecuta el siguiente comando:
gcloud init -
Create or select a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_IDwith a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_IDwith your Google Cloud project name.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the GKE API:
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.gcloud services enable container.googleapis.com
-
Install the Google Cloud CLI.
-
Si usas un proveedor de identidad externo (IdP), primero debes Acceder a la gcloud CLI con tu identidad federada.
-
Para inicializar gcloud CLI, ejecuta el siguiente comando:
gcloud init -
Create or select a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_IDwith a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_IDwith your Google Cloud project name.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the GKE API:
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.gcloud services enable container.googleapis.com
-
Grant roles to your user account. Run the following command once for each of the following IAM roles:
roles/container.clusterAdmin, roles/container.admingcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
Replace the following:
PROJECT_ID: Your project ID.USER_IDENTIFIER: The identifier for your user account. For example,myemail@example.com.ROLE: The IAM role that you grant to your user account.
Para iniciar una sesión de Cloud Shell desde la Google Cloud consola, haz clic en
Activar Cloud Shell en la Google Cloud consola. Esto inicia una sesión en el panel inferior de la Google Cloud consola.
Establece las variables de entorno:
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`Reemplaza lo siguiente:
PROJECT_ID: Es el ID de tu proyecto. Google CloudCLUSTER_VERSION: la versión de GKE que se usará. Debe ser1.30.1o una versión posterior.
Clona el repositorio de GitHub:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samplesCambia al directorio de trabajo:
cd kubernetes-engine-samples/ai-ml/gke-ray/raytrain/pytorch-mnistCrea un entorno virtual de Python:
python -m venv myenv && \ source myenv/bin/activateRevisa el siguiente manifiesto:
En este manifiesto, se describe un recurso personalizado de RayCluster.
Aplica el manifiesto a tu clúster de GKE:
kubectl apply -f ray-cluster.yamlVerifica que el recurso de RayCluster esté listo:
kubectl get rayclusterEl resultado es similar a este:
NAME DESIRED WORKERS AVAILABLE WORKERS CPUS MEMORY GPUS STATUS AGE pytorch-mnist-cluster 2 2 6 20Gi 0 ready 63sEn este resultado,
readyen la columnaSTATUSindica que el recurso de RayCluster está listo.Verifica que GKE haya creado el Service de RayCluster:
kubectl get svc pytorch-mnist-cluster-head-svcEl resultado es similar a este:
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 109sEstablece una sesión de redirección de puertos al encabezado de Ray:
kubectl port-forward svc/pytorch-mnist-cluster-head-svc 8265:8265 2>&1 >/dev/null &Verifica que el cliente de Ray pueda conectarse al clúster de Ray con localhost:
ray list nodes --address http://localhost:8265El resultado es similar a este:
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 omittedEnvía un trabajo de Ray y espera a que se complete:
ray job submit --submission-id pytorch-mnist-job --working-dir . --runtime-env-json='{"pip": ["torch", "torchvision"], "excludes": ["myenv"]}' --address http://localhost:8265 -- python train.pyEl resultado es similar a este:
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 el estado del trabajo:
ray job status pytorch-mnistEl resultado es similar a este:
Job submission server address: http://localhost:8265 Status for job 'pytorch-mnist-job': RUNNING Status message: Job is currently running.Espera a que
Status for jobseaCOMPLETE. Este proceso puede tardar 15 minutos o más.Visualiza los registros de trabajos de Ray:
ray job logs pytorch-mnistEl resultado es similar a este:
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 -------------------------------Revisa el siguiente manifiesto:
En este manifiesto, se describe un recurso personalizado de RayJob.
Aplica el manifiesto a tu clúster de GKE:
kubectl apply -f ray-job.yamlVerifica que el recurso de RayJob esté en ejecución:
kubectl get rayjobEl resultado es similar a este:
NAME JOB STATUS DEPLOYMENT STATUS START TIME END TIME AGE pytorch-mnist-job RUNNING Running 2024-06-19T15:43:32Z 2m29sEn este resultado, la columna
DEPLOYMENT STATUSindica que el recurso de RayJob esRunning.Visualiza el estado de los recursos de RayJob:
kubectl logs -f -l job-name=pytorch-mnist-jobEl resultado es similar a este:
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 que el trabajo de Ray esté completo:
kubectl get rayjobEl resultado es similar a este:
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 9m6sEn este resultado, la columna
DEPLOYMENT STATUSindica que el recurso de RayJob esComplete.- Explora arquitecturas de referencia, diagramas y prácticas recomendadas sobre Google Cloud. Consulta nuestro Cloud Architecture Center.
Prepara el entorno
Para preparar tu entorno, sigue estos pasos:
Crea un clúster de GKE
Crea un cluster de GKE Autopilot o Standard:
Autopilot
Crea un clúster de Autopilot:
gcloud container clusters create-auto ${CLUSTER_NAME} \
--enable-ray-operator \
--cluster-version=${CLUSTER_VERSION} \
--location=${COMPUTE_REGION}
Estándar
Crea un clúster estándar:
gcloud container clusters create ${CLUSTER_NAME} \
--addons=RayOperator \
--cluster-version=${CLUSTER_VERSION} \
--machine-type=e2-standard-8 \
--location=${COMPUTE_ZONE} \
--num-nodes=4
Implementa un recurso de RayCluster
Implementa un recurso de RayCluster en tu clúster:
Conéctate al recurso de RayCluster
Conéctate al recurso de RayCluster para enviar un trabajo de Ray.
Entrenar un modelo
Entrena un modelo de PyTorch con el conjunto de datos de Fashion MNIST:
Implementa un RayJob
El recurso personalizado RayJob administra el ciclo de vida de un recurso de RayCluster durante la ejecución de un solo trabajo de Ray.
Limpia
Borra el proyecto
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
Borra los recursos individuales
Si usaste un proyecto existente y no quieres borrarlo, puedes borrar los recursos individuales. Para borrar el clúster, escribe lo siguiente:
gcloud container clusters delete ${CLUSTER_NAME}