Diffuser un modèle avec un seul GPU dans GKE

Ce tutoriel explique comment déployer et diffuser un grand modèle de langage (LLM) à l'aide de GPU sur Google Kubernetes Engine (GKE) avec NVIDIA Triton Inference Server et TensorFlow Serving. Il vous permettra de comprendre et d'explorer le déploiement pratique de LLM pour l'inférence dans un environnement Kubernetes géré. Vous déployez un conteneur prédéfini sur un cluster GKE avec un seul GPU L4 Tensor Core et vous préparez l'infrastructure GKE pour l'inférence en ligne.

Ce tutoriel est destiné aux ingénieurs en machine learning (ML), aux administrateurs et opérateurs de plate-forme, ainsi qu'aux spécialistes des données et de l'IA qui souhaitent héberger un modèle de machine learning (ML) pré-entraîné sur un cluster GKE. Pour en savoir plus sur les rôles courants et les exemples de tâches que nous citons dans le contenu Google Cloud, consultez Rôles utilisateur et tâches courantes de GKE.

Avant de lire cette page, assurez-vous de connaître les éléments suivants :

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. Associez 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 :

    gcloud storage cp src/triton-model-repository gs://$GSBUCKET --recursive
    
  2. Déployez le framework à l'aide d'un déploiement. Un déploiement est un objet de l'API Kubernetes qui vous permet d'exécuter plusieurs instances dupliquées de pods répartis entre les nœuds d'un cluster :

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

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

    Une fois le framework 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éployez 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 :

    gcloud storage cp src/tfserve-model-repository gs://$GSBUCKET --recursive
    
  2. Déployez le framework à l'aide d'un déploiement. Un déploiement est un objet de l'API Kubernetes qui vous permet d'exécuter plusieurs instances dupliquées de pods répartis entre les nœuds d'un cluster :

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

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

    Une fois le framework 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éployez 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 utilisée, 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.

En fonction de l'image utilisée, vous obtenez un résultat semblable à celui-ci :

  Calling TensorFlow Serve HTTP Service    ->      Prediction result: 5

Observer les performances du modèle

Triton

Pour observer les performances du modèle, vous pouvez utiliser l'intégration du tableau de bord Triton dans Cloud Monitoring. Ce tableau de bord vous permet d'afficher des métriques de performances critiques telles que le débit de jetons, la latence des requêtes et les taux d'erreur.

Pour utiliser le tableau de bord Triton, vous devez activer Google Cloud Managed Service pour Prometheus, qui collecte les métriques de Triton, dans votre cluster GKE. Triton expose les métriques au format Prometheus par défaut. Vous n'avez pas besoin d'installer d'exportateur supplémentaire.

Vous pouvez ensuite afficher les métriques à l'aide du tableau de bord Triton. Pour savoir comment utiliser Google Cloud Managed Service pour Prometheus afin de collecter des métriques à partir de votre modèle, consultez les conseils d'observabilité Triton dans la documentation Cloud Monitoring.

TF Serving

Pour observer les performances du modèle, vous pouvez utiliser l'intégration du tableau de bord TF Serving dans Cloud Monitoring. Ce tableau de bord vous permet d'afficher des métriques de performances critiques telles que le débit de jetons, la latence des requêtes et les taux d'erreur.

Pour utiliser le tableau de bord TF Serving, vous devez activer Google Cloud Managed Service pour Prometheus, qui collecte les métriques de TF Serving, dans votre cluster GKE.

Vous pouvez ensuite afficher les métriques à l'aide du tableau de bord TF Serving. Pour savoir comment utiliser Google Cloud Managed Service pour Prometheus afin de collecter des métriques à partir de votre modèle, consultez les conseils d'observabilité TF Serving dans la documentation Cloud Monitoring.