Diffuser un modèle avec un seul GPU dans GKE


Ce tutoriel explique comment diffuser un modèle simple avec des GPU dans Google Kubernetes Engine (GKE). Ce tutoriel crée un cluster GKE qui utilise un seul GPU L4 Tensor Core et prépare l'infrastructure GKE pour l'inférence en ligne. Ce tutoriel utilise deux des frameworks les plus utilisés pour la diffusion en ligne :

Objectifs

Ce tutoriel est destiné aux ingénieurs en infrastructure, aux ingénieurs MLOps, aux ingénieurs DevOps ou aux administrateurs de cluster qui souhaitent héberger un modèle de machine learning (ML) pré-entraîné dans un cluster GKE.

Ce tutoriel couvre les étapes suivantes :

  1. Créez un cluster GKE Autopilot ou Standard.
  2. Configurez un bucket Cloud Storage où réside le modèle pré-entraîné.
  3. Déployez le framework d'inférence en ligne que vous sélectionnez.
  4. Envoyez une requête de test au service déployé.

Coûts

Ce tutoriel utilise les composants facturables Google Cloud suivants :

  • GKE
  • Cloud Storage
  • Accélérateurs de GPU L4
  • Trafic de sortie

Utilisez le simulateur de coût pour générer une estimation des coûts en fonction de votre utilisation prévue.

Une fois que vous avez terminé ce tutoriel, évitez de continuer à payer des frais en supprimant les ressources que vous avez créées. Pour en savoir plus, consultez la section Effectuer un nettoyage.

Avant de commencer

Configurer votre projet

  1. 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 gratuits pour exécuter, tester et déployer des charges de travail.
  2. Dans Google Cloud Console, sur la page de sélection du projet, cliquez sur Créer un projet pour commencer à créer un projet Google Cloud.

    Accéder au sélecteur de projet

  3. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  4. Activez l'API GKE

    Activer l'API

  5. Dans Google Cloud Console, sur la page de sélection du projet, cliquez sur Créer un projet pour commencer à créer un projet Google Cloud.

    Accéder au sélecteur de projet

  6. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  7. Activez l'API GKE

    Activer l'API

Définir des valeurs par défaut pour Google Cloud CLI

  1. Dans la console Google Cloud, démarrez une instance Cloud Shell :
    Ouvrir Cloud Shell

  2. Téléchargez le code source pour cet exemple d'application :

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
    cd kubernetes-engine-samples/ai-ml/gke-online-serving-single-gpu
    
  3. Définissez les variables d'environnement par défaut :

    gcloud config set project PROJECT_ID
    gcloud config set compute/region COMPUTE_REGION
    

    Remplacez les valeurs suivantes :

  4. Dans Cloud Shell, créez les variables d'environnement suivantes :

    export PROJECT_ID=$(gcloud config get project)
    export REGION=$(gcloud config get compute/region)
    export K8S_SA_NAME=gpu-k8s-sa
    export GSBUCKET=$PROJECT_ID-gke-bucket
    export MODEL_NAME=mnist
    export CLUSTER_NAME=online-serving-cluster
    

Créer un cluster GKE

Vous pouvez diffuser des modèles sur un seul GPU dans un cluster GKE Autopilot ou Standard. Nous vous recommandons d'utiliser un cluster Autopilot pour une expérience Kubernetes entièrement gérée. Avec GKE Autopilot, les ressources évoluent automatiquement en fonction des requêtes du modèle.

Pour choisir le mode de fonctionnement GKE le mieux adapté à vos charges de travail, consultez la section Choisir un mode de fonctionnement GKE.

Autopilot

Exécutez la commande suivante pour créer un cluster GKE Autopilot :

  gcloud container clusters create-auto ${CLUSTER_NAME} \
      --region=${REGION} \
      --project=${PROJECT_ID} \
      --release-channel=rapid

GKE crée un cluster Autopilot avec des nœuds de processeur et de GPU, à la demande des charges de travail déployées.

Standard

  1. Exécutez la commande suivante pour créer un cluster GKE Standard :

      gcloud container clusters create ${CLUSTER_NAME} \
        --project=${PROJECT_ID}  \
        --region=${REGION}  \
        --workload-pool=${PROJECT_ID}.svc.id.goog \
        --addons GcsFuseCsiDriver \
        --release-channel=rapid \
        --num-nodes=1
    

    La création du cluster peut prendre plusieurs minutes.

  2. Exécutez la commande suivante pour créer le pool de nœuds :

      gcloud container node-pools create gpupool \
        --accelerator type=nvidia-l4,count=1,gpu-driver-version=latest \
        --project=${PROJECT_ID} \
        --location=${REGION} \
        --node-locations=${REGION}-a \
        --cluster=${CLUSTER_NAME} \
        --machine-type=g2-standard-8 \
        --num-nodes=1
    

    GKE crée un pool de nœuds unique contenant un GPU L4 pour chaque nœud.

Créer un bucket Cloud Storage

Créer un bucket Cloud Storage pour stocker le modèle pré-entraîné qui sera diffusé

Dans Cloud Shell, exécutez la commande ci-dessous.

gcloud storage buckets create gs://$GSBUCKET

Configurer votre cluster pour accéder au bucket à l'aide de la fédération d'identité de charge de travail pour GKE

Pour permettre à votre cluster d'accéder au bucket Cloud Storage, procédez comme suit :

  1. Créez un compte de service Google Cloud.
  2. Créer un ServiceAccount Kubernetes dans votre cluster
  3. Associer le ServiceAccount Kubernetes au compte de service Google Cloud

Créer un compte de service Google Cloud

  1. Dans la console Google Cloud, accédez à la page Créer un compte de service :

    Accéder à la page "Créer un compte de service"

  2. Dans le champ ID du compte de service, saisissez gke-ai-sa.

  3. Cliquez sur Créer et continuer.

  4. Dans la liste Rôle, sélectionnez le rôle Cloud Storage > Service de collecte des insights sur le stockage.

  5. Cliquez sur Ajouter un autre rôle.

  6. Dans la liste Sélectionner un rôle, sélectionnez le rôle Cloud Storage > Administrateur des objets de l'espace de stockage.

  7. Cliquez sur Continue (Continuer), puis sur Done (OK).

Créer un ServiceAccount Kubernetes dans votre cluster

Dans Cloud Shell, procédez comme suit :

  1. Créez un espace de noms Kubernetes :

    kubectl create namespace gke-ai-namespace
    
  2. Créez un ServiceAccount Kubernetes dans l'espace de noms :

    kubectl create serviceaccount gpu-k8s-sa --namespace=gke-ai-namespace
    

Associer le ServiceAccount Kubernetes au compte de service Google Cloud

Dans Cloud Shell, exécutez les commandes suivantes :

  1. Ajoutez une liaison IAM au compte de service Google Cloud :

    gcloud iam service-accounts add-iam-policy-binding gke-ai-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/iam.workloadIdentityUser \
        --member "serviceAccount:PROJECT_ID.svc.id.goog[gke-ai-namespace/gpu-k8s-sa]"
    

    L'option --member fournit l'identité complète du ServiceAccount Kubernetes dans Google Cloud.

  2. Annotez le compte de service Kubernetes :

    kubectl annotate serviceaccount gpu-k8s-sa \
        --namespace gke-ai-namespace \
        iam.gke.io/gcp-service-account=gke-ai-sa@PROJECT_ID.iam.gserviceaccount.com
    

Déployer le serveur d'inférence en ligne

Chaque framework d'inférence en ligne s'attend à trouver le modèle de ML pré-entraîné dans un format spécifique. La section suivante montre comment déployer le serveur d'inférence en fonction du framework que vous souhaitez utiliser :

Triton

  1. Dans Cloud Shell, copiez le modèle de ML pré-entraîné dans le bucket Cloud Storage:

    gsutil cp -r src/triton-model-repository gs://$GSBUCKET
    
  2. Déployez le framework sur Kubernetes:

    envsubst < src/gke-config/deployment-triton.yaml | kubectl --namespace=gke-ai-namespace apply -f -
    
  3. Confirmez que GKE a déployé le framework:

    kubectl get deployments --namespace=gke-ai-namespace
    

    Lorsque le framework est prêt, le résultat ressemble à ce qui suit:

    NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
    triton-deployment    1/1     1            1           5m29s
    
  4. Déployer les services pour accéder au déploiement

    kubectl apply --namespace=gke-ai-namespace -f src/gke-config/service-triton.yaml
    
  5. Vérifiez que l'adresse IP externe est attribuée:

    kubectl get services --namespace=gke-ai-namespace
    

    Le résultat ressemble à ce qui suit :

    NAME            TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)                                        AGE
    kubernetes      ClusterIP      34.118.224.1     <none>          443/TCP                                        60m
    triton-server   LoadBalancer   34.118.227.176   35.239.54.228   8000:30866/TCP,8001:31035/TCP,8002:30516/TCP   5m14s
    

    Notez l'adresse IP de triton-server dans la colonne EXTERNAL-IP.

  6. Vérifiez que le service et le déploiement fonctionnent correctement:

    curl -v EXTERNAL_IP:8000/v2/health/ready
    

    Le résultat ressemble à ce qui suit :

    ...
    < HTTP/1.1 200 OK
    < Content-Length: 0
    < Content-Type: text/plain
    ...
    

TF Serving

  1. Dans Cloud Shell, copiez le modèle de ML pré-entraîné dans le bucket Cloud Storage:

    gsutil cp -r src/tfserve-model-repository gs://$GSBUCKET
    
  2. Déployez le framework sur Kubernetes:

    envsubst < src/gke-config/deployment-tfserve.yaml | kubectl --namespace=gke-ai-namespace apply -f -
    
  3. Confirmez que GKE a déployé le framework:

    kubectl get deployments --namespace=gke-ai-namespace
    

    Lorsque le framework est prêt, le résultat ressemble à ce qui suit:

    NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
    tfserve-deployment   1/1     1            1           5m29s
    
  4. Déployer les services pour accéder au déploiement

    kubectl apply --namespace=gke-ai-namespace -f src/gke-config/service-tfserve.yaml
    
  5. Vérifiez que l'adresse IP externe est attribuée:

    kubectl get services --namespace=gke-ai-namespace
    

    Le résultat ressemble à ce qui suit :

    NAME            TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)                                        AGE
    kubernetes      ClusterIP      34.118.224.1     <none>          443/TCP                                        60m
    tfserve-server  LoadBalancer   34.118.227.176   35.239.54.228   8500:30003/TCP,8000:32194/TCP                  5m14s
    

    Notez l'adresse IP de tfserve-server dans la colonne EXTERNAL-IP.

  6. Vérifiez que le service et le déploiement fonctionnent correctement:

    curl -v EXTERNAL_IP:8000/v1/models/mnist
    

    Remplacez EXTERNAL_IP par votre adresse IP externe.

    Le résultat ressemble à ce qui suit :

    ...
    < HTTP/1.1 200 OK
    < Content-Type: application/json
    < Date: Thu, 12 Oct 2023 19:01:19 GMT
    < Content-Length: 154
    <
    {
      "model_version_status": [
            {
            "version": "1",
            "state": "AVAILABLE",
            "status": {
              "error_code": "OK",
              "error_message": ""
            }
          }
        ]
    }
    

Diffuser le modèle

Triton

  1. Créez un environnement virtuel Python dans Cloud Shell.

    python -m venv ./mnist_client
    source ./mnist_client/bin/activate
    
  2. Installez les packages Python requis.

    pip install -r src/client/triton-requirements.txt
    
  3. Testez le serveur d'inférence Triton en chargeant une image:

    cd src/client
    python triton_mnist_client.py -i EXTERNAL_IP -m mnist -p ./images/TEST_IMAGE.png
    

    Remplacez les éléments suivants :

    • EXTERNAL_IP: votre adresse IP externe.
    • TEST_IMAGE: nom du fichier correspondant à l'image que vous souhaitez tester. Vous pouvez utiliser les images stockées dans src/client/images.

    Selon l'image que vous utilisez, le résultat ressemble à ce qui suit:

    Calling Triton HTTP Service      ->      Prediction result: 7
    

TF Serving

  1. Créez un environnement virtuel Python dans Cloud Shell.

    python -m venv ./mnist_client
    source ./mnist_client/bin/activate
    
  2. Installez les packages Python requis.

    pip install -r src/client/tfserve-requirements.txt
    
  3. Testez TensorFlow Serving avec quelques images.

    cd src/client
    python tfserve_mnist_client.py -i EXTERNAL_IP -m mnist -p ./images/TEST_IMAGE.png
    

Remplacez les éléments suivants :

  • EXTERNAL_IP: votre adresse IP externe.
  • TEST_IMAGE: Une valeur comprise entre 0 et 9. Vous pouvez utiliser les images stockées dans src/client/images.

Selon l'image que vous utilisez, vous obtenez un résultat semblable à celui-ci:

  Calling TensorFlow Serve HTTP Service    ->      Prediction result: 5

Effectuer un nettoyage

Pour éviter que les ressources que vous avez créées dans ce guide soient facturées sur votre compte Google Cloud, effectuez l'une des opérations suivantes :

  • Conserver le cluster GKE : supprimez les ressources Kubernetes du cluster et les ressources Google Cloud.
  • Conserver le projet Google Cloud : supprimer le cluster GKE et les ressources Google Cloud.
  • Supprimer le projet

Supprimer les ressources Kubernetes du cluster et les ressources Google Cloud

  1. Supprimez l'espace de noms Kubernetes et les charges de travail que vous avez déployées :

Triton

kubectl -n gke-ai-namespace delete -f src/gke-config/service-triton.yaml
kubectl -n gke-ai-namespace delete -f src/gke-config/deployment-triton.yaml
kubectl delete namespace gke-ai-namespace

TF Serving

kubectl -n gke-ai-namespace delete -f src/gke-config/service-tfserve.yaml
kubectl -n gke-ai-namespace delete -f src/gke-config/deployment-tfserve.yaml
kubectl delete namespace gke-ai-namespace
  1. Supprimez le bucket Cloud Storage :

    1. Accédez à la page Buckets :

      Accéder à la page "Buckets"

    2. Sélectionnez la case à cocher correspondant à PROJECT_ID-gke-bucket.

    3. Cliquez sur Supprimer.

    4. Pour confirmer la suppression, saisissez DELETE et cliquez sur Supprimer.

  2. Supprimer le compte de service Google Cloud :

    1. Accédez à la page Comptes de service :

      Accéder à la page "Comptes de service"

    2. Sélectionnez votre projet.

    3. Sélectionnez la case à cocher correspondant à gke-gpu-sa@PROJECT_ID.iam.gserviceaccount.com.

    4. Cliquez sur Supprimer.

    5. Pour confirmer la suppression, cliquez sur Supprimer.

Supprimer le cluster GKE et les ressources Google Cloud

  1. Supprimez le cluster GKE :

    1. Accédez à la page Clusters :

      accéder aux clusters

    2. Sélectionnez la case à cocher correspondant à online-serving-cluster.

    3. Cliquez sur Supprimer.

    4. Pour confirmer la suppression, saisissez online-serving-cluster et cliquez sur Supprimer.

  2. Supprimez le bucket Cloud Storage :

    1. Accédez à la page Buckets :

      Accéder à la page "Buckets"

    2. Sélectionnez la case à cocher correspondant à PROJECT_ID-gke-bucket.

    3. Cliquez sur Supprimer.

    4. Pour confirmer la suppression, saisissez DELETE et cliquez sur Supprimer.

  3. Supprimer le compte de service Google Cloud :

    1. Accédez à la page Comptes de service :

      Accéder à la page "Comptes de service"

    2. Sélectionnez votre projet.

    3. Sélectionnez la case à cocher correspondant à gke-gpu-sa@PROJECT_ID.iam.gserviceaccount.com.

    4. Cliquez sur Supprimer.

    5. Pour confirmer la suppression, cliquez sur Supprimer.

Supprimer le projet

  1. Dans la console Google Cloud, accédez à la page Gérer les ressources.

    Accéder à la page Gérer les ressources

  2. Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer.
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.

Étapes suivantes