Ce guide explique comment entraîner un modèle sur Google Kubernetes Engine (GKE) à l'aide de Ray, PyTorch et du module complémentaire Ray Operator.
À propos de Ray
Ray est un framework de calcul évolutif Open Source pour les applications d'IA/ML. L'Ray Train est un composant de Ray conçu pour l'entraînement et le réglage de modèles distribués. Vous pouvez utiliser l'API Ray Train pour mettre à l'échelle l'entraînement sur plusieurs machines et pour l'intégrer à des bibliothèques de machine learning telles que PyTorch.
Vous pouvez déployer des jobs d'entraînement Ray à l'aide de la ressource RayCluster ou RayJob. Vous devez utiliser une ressource RayJob lorsque vous déployez des jobs Ray en production pour les raisons suivantes :
- La ressource RayJob crée un cluster Ray éphémère qui peut être supprimé automatiquement lorsqu'un job est terminé.
- La ressource RayJob est compatible avec les stratégies de nouvelle tentative pour une exécution de job résiliente.
- Vous pouvez gérer les jobs Ray à l'aide de modèles d'API Kubernetes connus.
Objectifs
Ce guide est destiné aux clients d'IA générative, aux utilisateurs nouveaux ou existants de GKE, aux ingénieurs en ML, aux ingénieurs MLOps (DevOps) ou aux administrateurs de plate-forme qui s'intéressent à l'utilisation des fonctionnalités d'orchestration de conteneurs Kubernetes pour diffuser des modèles utilisant Ray.
- créer un cluster GKE ;
- Créez un cluster Ray à l'aide de la ressource personnalisée RayCluster.
- Entraînez un modèle à l'aide d'un job Ray.
- Déployer un job Ray à l'aide de la ressource personnalisée RayJob.
Coûts
Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :
Pour obtenir une estimation des coûts en fonction de votre utilisation prévue, utilisez le simulateur de coût.
Une fois que vous avez terminé les tâches décrites dans ce document, supprimez les ressources que vous avez créées pour éviter que des frais vous soient facturés. Pour en savoir plus, consultez la section Effectuer un nettoyage.
Avant de commencer
Cloud Shell est préinstallé avec les logiciels dont vous avez besoin dans ce tutoriel, y compris kubectl et gcloud CLI. Si vous n'utilisez pas Cloud Shell, vous devez installer gcloud CLI.
- Connectez-vous à votre compte Google Cloud . Si vous débutez sur Google Cloud, créez un compte pour évaluer les performances de nos produits en conditions réelles. Les nouveaux clients bénéficient également de 300 $ de crédits sans frais pour exécuter, tester et déployer des charges de travail.
-
Installez la Google Cloud CLI.
-
Si vous utilisez un fournisseur d'identité (IdP) externe, vous devez d'abord vous connecter à la gcloud CLI avec votre identité fédérée.
-
Pour initialiser la gcloud CLI, exécutez la commande suivante :
gcloud init -
Créez ou sélectionnez un projet Google Cloud .
Rôles requis pour sélectionner ou créer un projet
- Sélectionnez un projet : la sélection d'un projet ne nécessite pas de rôle IAM spécifique. Vous pouvez sélectionner n'importe quel projet pour lequel un rôle vous a été attribué.
-
Créer un projet : pour créer un projet, vous devez disposer du rôle Créateur de projet (
roles/resourcemanager.projectCreator), qui contient l'autorisationresourcemanager.projects.create. Découvrez comment attribuer des rôles.
-
Créez un projet Google Cloud :
gcloud projects create PROJECT_ID
Remplacez
PROJECT_IDpar le nom du projet Google Cloud que vous créez. -
Sélectionnez le projet Google Cloud que vous avez créé :
gcloud config set project PROJECT_ID
Remplacez
PROJECT_IDpar le nom de votre projet Google Cloud .
-
Vérifiez que la facturation est activée pour votre projet Google Cloud .
Activez l'API GKE :
Rôles requis pour activer les API
Pour activer les API, vous avez besoin du rôle IAM Administrateur Service Usage (
roles/serviceusage.serviceUsageAdmin), qui contient l'autorisationserviceusage.services.enable. Découvrez comment attribuer des rôles.gcloud services enable container.googleapis.com
-
Installez la Google Cloud CLI.
-
Si vous utilisez un fournisseur d'identité (IdP) externe, vous devez d'abord vous connecter à la gcloud CLI avec votre identité fédérée.
-
Pour initialiser la gcloud CLI, exécutez la commande suivante :
gcloud init -
Créez ou sélectionnez un projet Google Cloud .
Rôles requis pour sélectionner ou créer un projet
- Sélectionnez un projet : la sélection d'un projet ne nécessite pas de rôle IAM spécifique. Vous pouvez sélectionner n'importe quel projet pour lequel un rôle vous a été attribué.
-
Créer un projet : pour créer un projet, vous devez disposer du rôle Créateur de projet (
roles/resourcemanager.projectCreator), qui contient l'autorisationresourcemanager.projects.create. Découvrez comment attribuer des rôles.
-
Créez un projet Google Cloud :
gcloud projects create PROJECT_ID
Remplacez
PROJECT_IDpar le nom du projet Google Cloud que vous créez. -
Sélectionnez le projet Google Cloud que vous avez créé :
gcloud config set project PROJECT_ID
Remplacez
PROJECT_IDpar le nom de votre projet Google Cloud .
-
Vérifiez que la facturation est activée pour votre projet Google Cloud .
Activez l'API GKE :
Rôles requis pour activer les API
Pour activer les API, vous avez besoin du rôle IAM Administrateur Service Usage (
roles/serviceusage.serviceUsageAdmin), qui contient l'autorisationserviceusage.services.enable. Découvrez comment attribuer des rôles.gcloud services enable container.googleapis.com
-
Attribuez des rôles à votre compte utilisateur. Exécutez la commande suivante une fois pour chacun des rôles IAM suivants :
roles/container.clusterAdmin, roles/container.admingcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
Remplacez les éléments suivants :
PROJECT_ID: ID de votre projetUSER_IDENTIFIER: identifiant de votre compte d'utilisateur. Par exemple,myemail@example.com.ROLE: rôle IAM que vous accordez à votre compte utilisateur.
Préparer votre environnement
Pour préparer votre environnement, procédez comme suit :
Lancez une session Cloud Shell depuis la console Google Cloud en cliquant sur
Activer Cloud Shell dans la consoleGoogle Cloud . Une session s'ouvre dans le volet inférieur de la console Google Cloud .
Définissez les variables d'environnement :
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`Remplacez les éléments suivants :
PROJECT_ID: ID de votre projet Google Cloud.CLUSTER_VERSION: version de GKE à utiliser. Doit être1.30.1ou une version ultérieure.
Clonez le dépôt GitHub.
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samplesAccédez au répertoire de travail :
cd kubernetes-engine-samples/ai-ml/gke-ray/raytrain/pytorch-mnistCréez un environnement virtuel Python :
python -m venv myenv && \ source myenv/bin/activate
Créer un cluster GKE
Créez un cluster GKE Autopilot ou Standard :
Autopilot
Créez un cluster Autopilot :
gcloud container clusters create-auto ${CLUSTER_NAME} \
--enable-ray-operator \
--cluster-version=${CLUSTER_VERSION} \
--location=${COMPUTE_REGION}
Standard
Créez 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
Déployer une ressource RayCluster
Déployez une ressource RayCluster sur votre cluster :
Examinez le fichier manifeste suivant :
Ce fichier manifeste décrit une ressource personnalisée RayCluster.
Appliquez le fichier manifeste à votre cluster GKE :
kubectl apply -f ray-cluster.yamlVérifiez que la ressource RayCluster est prête :
kubectl get rayclusterLe résultat ressemble à ce qui suit :
NAME DESIRED WORKERS AVAILABLE WORKERS CPUS MEMORY GPUS STATUS AGE pytorch-mnist-cluster 2 2 6 20Gi 0 ready 63sDans ce résultat,
readydans la colonneSTATUSindique que la ressource RayCluster est prête.
Se connecter à la ressource RayCluster
Connectez-vous à la ressource RayCluster pour envoyer un job Ray.
Vérifiez que GKE a créé le service RayCluster :
kubectl get svc pytorch-mnist-cluster-head-svcLe résultat ressemble à ce qui suit :
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 109sÉtablissez une session de transfert de port vers le nœud principal Ray :
kubectl port-forward svc/pytorch-mnist-cluster-head-svc 8265:8265 2>&1 >/dev/null &Vérifiez que le client Ray peut se connecter au cluster Ray à l'aide de localhost :
ray list nodes --address http://localhost:8265Le résultat ressemble à ce qui suit :
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
Entraîner un modèle
Entraînez un modèle PyTorch à l'aide de l'ensemble de données Fashion MNIST :
Envoyez un job Ray et attendez qu'il se termine :
ray job submit --submission-id pytorch-mnist-job --working-dir . --runtime-env-json='{"pip": ["torch", "torchvision"], "excludes": ["myenv"]}' --address http://localhost:8265 -- python train.pyLe résultat ressemble à ce qui suit :
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): ... ...Vérifiez l'état du job :
ray job status pytorch-mnistLe résultat ressemble à ce qui suit :
Job submission server address: http://localhost:8265 Status for job 'pytorch-mnist-job': RUNNING Status message: Job is currently running.Attendez que
Status for jobsoit défini surCOMPLETE. Cette opération peut prendre 15 minutes, voire plus.Affichez les journaux des jobs Ray :
ray job logs pytorch-mnistLe résultat ressemble à ce qui suit :
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 -------------------------------
Déployer une ressource RayJob
La ressource personnalisée RayJob gère le cycle de vie d'une ressource RayCluster lors de l'exécution d'un seul job Ray.
Examinez le fichier manifeste suivant :
Ce fichier manifeste décrit une ressource personnalisée RayJob.
Appliquez le fichier manifeste à votre cluster GKE :
kubectl apply -f ray-job.yamlVérifiez que la ressource RayJob est en cours d'exécution :
kubectl get rayjobLe résultat ressemble à ce qui suit :
NAME JOB STATUS DEPLOYMENT STATUS START TIME END TIME AGE pytorch-mnist-job RUNNING Running 2024-06-19T15:43:32Z 2m29sDans ce résultat, la colonne
DEPLOYMENT STATUSindique que la ressource RayJob estRunning.Affichez l'état de la ressource RayJob :
kubectl logs -f -l job-name=pytorch-mnist-jobLe résultat ressemble à ce qui suit :
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 -------------------------------Vérifiez que le job Ray est terminé :
kubectl get rayjobLe résultat ressemble à ce qui suit :
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 9m6sDans ce résultat, la colonne
DEPLOYMENT STATUSindique que la ressource RayJob estComplete.
Observer vos charges de travail Ray
Pour afficher les détails de vos RayJobs, vous pouvez accéder à la section Kubernetes Engine > AI/ML > Jobs (Kubernetes Engine > IA/ML > Jobs) dans la console Google Cloud .
Effectuer un nettoyage
Supprimer le projet
Supprimer un projet Google Cloud :
gcloud projects delete PROJECT_ID
Supprimer des ressources individuelles
Si vous avez utilisé un projet existant et que vous ne souhaitez pas le supprimer, vous pouvez supprimer les ressources individuelles. Pour supprimer le cluster, saisissez ce qui suit :
gcloud container clusters delete ${CLUSTER_NAME}
Étape suivante
- Découvrez des architectures de référence, des schémas et des bonnes pratiques concernant Google Cloud. Consultez notre Cloud Architecture Center.