Publicar um modelo com uma única GPU no GKE

Este tutorial mostra como implementar e publicar um grande modelo de linguagem (GML) usando GPUs no Google Kubernetes Engine (GKE) com o NVIDIA Triton Inference Server e o TensorFlow Serving. Isto fornece uma base para compreender e explorar a implementação prática de GMLs para inferência num ambiente Kubernetes gerido. Implementa um contentor pré-criado num cluster do GKE com uma única GPU L4 Tensor Core e prepara a infraestrutura do GKE para fazer inferência online.

Este tutorial destina-se a engenheiros de aprendizagem automática (ML), administradores e operadores de plataformas, e a especialistas de dados e IA que queiram alojar um modelo de aprendizagem automática (ML) pré-preparado num cluster do GKE. Para saber mais sobre as funções comuns e as tarefas de exemplo referidas no Google Cloud conteúdo, consulte o artigo Funções e tarefas comuns do utilizador do GKE.

Antes de ler esta página, certifique-se de que conhece o seguinte:

Objetivos

  1. Crie um cluster do GKE Autopilot ou Standard.
  2. Configure um contentor do Cloud Storage onde o modelo pré-preparado está localizado.
  3. Implemente a estrutura de inferência online que selecionar.
  4. Faça um pedido de teste ao serviço implementado.

Custos

Este tutorial usa os seguintes componentes faturáveis do Google Cloud:

  • GKE
  • Cloud Storage
  • Aceleradores de GPU L4
  • Tráfego de saída

Use a calculadora de preços para gerar uma estimativa de custo com base na sua utilização projetada.

Quando terminar este tutorial, pode evitar a faturação contínua eliminando os recursos que criou. Para mais informações, consulte o artigo Limpe.

Antes de começar

Configure o seu projeto

  1. 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.
  2. In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.

    Roles required to create a project

    To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. 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 the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  5. In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.

    Roles required to create a project

    To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  6. Verify that billing is enabled for your Google Cloud project.

  7. 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 the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  8. Defina predefinições para a CLI Google Cloud

    1. Na Google Cloud consola, inicie uma instância do Cloud Shell:
      Abrir Cloud Shell

    2. Transfira o código-fonte desta app de exemplo:

      git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
      cd kubernetes-engine-samples/ai-ml/gke-online-serving-single-gpu
      
    3. Defina as variáveis de ambiente predefinidas:

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

      Substitua os seguintes valores:

    4. No Cloud Shell, crie as seguintes variáveis de ambiente:

      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
      

    Crie um cluster do GKE

    Pode publicar modelos numa única GPU num cluster do GKE Autopilot ou Standard. Recomendamos que use um cluster do Autopilot para uma experiência do Kubernetes totalmente gerida. Com o GKE Autopilot, os recursos são dimensionados automaticamente com base nos pedidos de modelos.

    Para escolher o modo de funcionamento do GKE mais adequado às suas cargas de trabalho, consulte o artigo Escolha um modo de funcionamento do GKE.

    Piloto automático

    Execute o seguinte comando para criar um cluster do GKE Autopilot:

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

    O GKE cria um cluster do Autopilot com nós de CPU e GPU, conforme solicitado pelas cargas de trabalho implementadas.

    Standard

    1. Execute o seguinte comando para criar um cluster padrão do GKE:

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

      A criação do cluster pode demorar vários minutos.

    2. Execute o seguinte comando para criar o node pool:

        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
      

      O GKE cria um único node pool que contém uma GPU L4 para cada nó.

    Crie um contentor do Cloud Storage

    Crie um contentor do Cloud Storage para armazenar o modelo pré-preparado que vai ser publicado.

    No Cloud Shell, execute o seguinte:

    gcloud storage buckets create gs://$GSBUCKET
    

    Configure o cluster para aceder ao contentor através da Workload Identity Federation para o GKE

    Para permitir que o cluster aceda ao contentor do Cloud Storage, faça o seguinte:

    1. Crie uma Google Cloud conta de serviço.
    2. Crie uma conta de serviço do Kubernetes no seu cluster.
    3. Associe a conta de serviço do Kubernetes à Google Cloud conta de serviço.

    Crie uma Google Cloud conta de serviço

    1. Na Google Cloud consola, aceda à página Criar conta de serviço:

      Aceda a Criar conta de serviço

    2. No campo ID da conta de serviço, introduza gke-ai-sa.

    3. Clique em Criar e continuar.

    4. Na lista Função, selecione a função Cloud Storage > Serviço de recolha de estatísticas de armazenamento.

    5. Clique em Adicionar outra função.

    6. Na lista Selecionar uma função, selecione a função Cloud Storage > Administrador de objetos de armazenamento.

    7. Clique em Continuar e, de seguida, em Concluído.

    Crie uma ServiceAccount do Kubernetes no seu cluster

    No Cloud Shell, faça o seguinte:

    1. Crie um namespace do Kubernetes:

      kubectl create namespace gke-ai-namespace
      
    2. Crie uma ServiceAccount do Kubernetes no espaço de nomes:

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

    Associe a conta de serviço do Kubernetes à Google Cloud conta de serviço

    No Cloud Shell, execute os seguintes comandos:

    1. Adicione uma associação do IAM à Google Cloud conta de serviço:

      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]"
      

      A flag --member fornece a identidade completa da ServiceAccount do Kubernetes em Google Cloud.

    2. Anotar a ServiceAccount do 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
      

    Implemente o servidor de inferência online

    Cada framework de inferência online espera encontrar o modelo de ML pré-preparado num formato específico. A secção seguinte mostra como implementar o servidor de inferência consoante a framework que quer usar:

    Triton

    1. No Cloud Shell, copie o modelo de ML pré-formado para o contentor do Cloud Storage:

      gcloud storage cp src/triton-model-repository gs://$GSBUCKET --recursive
      
    2. Implemente a estrutura com uma implementação. Uma implementação é um objeto da API Kubernetes que lhe permite executar várias réplicas de pods distribuídos entre os nós num cluster:

      envsubst < src/gke-config/deployment-triton.yaml | kubectl --namespace=gke-ai-namespace apply -f -
      
    3. Valide se o GKE implementou a framework:

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

      Quando a estrutura estiver pronta, o resultado é semelhante ao seguinte:

      NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
      triton-deployment    1/1     1            1           5m29s
      
    4. Implemente os serviços para aceder à implementação:

      kubectl apply --namespace=gke-ai-namespace -f src/gke-config/service-triton.yaml
      
    5. Verifique se o IP externo está atribuído:

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

      O resultado é semelhante ao seguinte:

      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
      

      Tome nota do endereço IP do triton-server na coluna EXTERNAL-IP.

    6. Verifique se o serviço e a implementação estão a funcionar corretamente:

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

      O resultado é semelhante ao seguinte:

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

    TF Serving

    1. No Cloud Shell, copie o modelo de ML pré-formado para o contentor do Cloud Storage:

      gcloud storage cp src/tfserve-model-repository gs://$GSBUCKET --recursive
      
    2. Implemente a estrutura com uma implementação. Uma implementação é um objeto da API Kubernetes que lhe permite executar várias réplicas de pods distribuídos entre os nós num cluster:

      envsubst < src/gke-config/deployment-tfserve.yaml | kubectl --namespace=gke-ai-namespace apply -f -
      
    3. Valide se o GKE implementou a framework:

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

      Quando a estrutura estiver pronta, o resultado é semelhante ao seguinte:

      NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
      tfserve-deployment   1/1     1            1           5m29s
      
    4. Implemente os serviços para aceder à implementação:

      kubectl apply --namespace=gke-ai-namespace -f src/gke-config/service-tfserve.yaml
      
    5. Verifique se o IP externo está atribuído:

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

      O resultado é semelhante ao seguinte:

      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
      

      Tome nota do endereço IP do tfserve-server na coluna EXTERNAL-IP.

    6. Verifique se o serviço e a implementação estão a funcionar corretamente:

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

      Substitua EXTERNAL_IP pelo seu endereço IP externo.

      O resultado é semelhante ao seguinte:

      ...
      < 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": ""
              }
            }
          ]
      }
      

    Publique o modelo

    Triton

    1. Crie um ambiente virtual Python no Cloud Shell.

      python -m venv ./mnist_client
      source ./mnist_client/bin/activate
      
    2. Instale os pacotes Python necessários.

      pip install -r src/client/triton-requirements.txt
      
    3. Teste o servidor de inferência do Triton carregando uma imagem:

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

      Substitua o seguinte:

      • EXTERNAL_IP: o seu endereço IP externo.
      • TEST_IMAGE: o nome do ficheiro que corresponde à imagem que quer testar. Pode usar as imagens armazenadas no src/client/images.

      Consoante a imagem que usar, o resultado é semelhante ao seguinte:

      Calling Triton HTTP Service      ->      Prediction result: 7
      

    TF Serving

    1. Crie um ambiente virtual Python no Cloud Shell.

      python -m venv ./mnist_client
      source ./mnist_client/bin/activate
      
    2. Instale os pacotes Python necessários.

      pip install -r src/client/tfserve-requirements.txt
      
    3. Teste o TensorFlow Serving com algumas imagens.

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

    Substitua o seguinte:

    • EXTERNAL_IP: o seu endereço IP externo.
    • TEST_IMAGE: um valor de 0 a 9. Pode usar as imagens armazenadas no src/client/images.

    Consoante a imagem que usar, recebe um resultado semelhante a este:

      Calling TensorFlow Serve HTTP Service    ->      Prediction result: 5
    

    Observe o desempenho do modelo

    Triton

    Para observar o desempenho do modelo, pode usar a integração do painel de controlo do Triton no Cloud Monitoring. Com este painel de controlo, pode ver métricas de desempenho críticas, como o débito de tokens, a latência de pedidos e as taxas de erro.

    Para usar o painel de controlo do Triton, tem de ativar o Google Cloud Managed Service for Prometheus, que recolhe as métricas do Triton, no seu cluster do GKE. Por predefinição, o Triton expõe métricas no formato Prometheus; não precisa de instalar um exportador adicional.

    Em seguida, pode ver as métricas através do painel de controlo do Triton. Para obter informações sobre a utilização do serviço gerido do Google Cloud para Prometheus para recolher métricas do seu modelo, consulte as orientações de observabilidade do Triton na documentação do Cloud Monitoring.

    TF Serving

    Para observar o desempenho do modelo, pode usar a integração do painel de controlo do TF Serving no Cloud Monitoring. Com este painel de controlo, pode ver métricas de desempenho críticas, como o débito de tokens, a latência de pedidos e as taxas de erro.

    Para usar o painel de controlo do TF Serving, tem de ativar o serviço gerido do Google Cloud para Prometheus, que recolhe as métricas do TF Serving, no seu cluster do GKE.

    Em seguida, pode ver as métricas através do painel de controlo do TF Serving. Para obter informações sobre como usar o Google Cloud Managed Service for Prometheus para recolher métricas do seu modelo, consulte as orientações de observabilidade do TF Serving na documentação do Cloud Monitoring.

    Limpar

    Para evitar incorrer em custos na sua Google Cloud conta pelos recursos que criou neste guia, faça uma das seguintes ações:

    • Manter o cluster do GKE: elimine os recursos do Kubernetes no cluster e os Google Cloud recursos
    • Manter o Google Cloud projeto: elimine o cluster do GKE e os Google Cloud recursos
    • Elimine o projeto

    Elimine os recursos do Kubernetes no cluster e os Google Cloud recursos

    1. Elimine o espaço de nomes do Kubernetes e as cargas de trabalho que implementou:

    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. Elimine o contentor do Cloud Storage:

      1. Aceda à página Recipientes:

        Aceda a Recipientes

      2. Selecione a caixa de verificação de PROJECT_ID-gke-bucket.

      3. Clique em Eliminar.

      4. Para confirmar a eliminação, escreva DELETE e clique em Eliminar.

    2. Elimine a Google Cloud conta de serviço:

      1. Aceda à página Contas de serviço:

        Aceda a Contas de serviço

      2. Selecione o seu projeto.

      3. Selecione a caixa de verificação de gke-gpu-sa@PROJECT_ID.iam.gserviceaccount.com.

      4. Clique em Eliminar.

      5. Para confirmar a eliminação, clique em Eliminar.

    Elimine o cluster do GKE e os recursos Google Cloud

    1. Elimine o cluster do GKE:

      1. Aceda à página Clusters:

        Aceda a Clusters

      2. Selecione a caixa de verificação online-serving-cluster.

      3. Clique em Eliminar.

      4. Para confirmar a eliminação, escreva online-serving-cluster e clique em Eliminar.

    2. Elimine o contentor do Cloud Storage:

      1. Aceda à página Recipientes:

        Aceda a Recipientes

      2. Selecione a caixa de verificação de PROJECT_ID-gke-bucket.

      3. Clique em Eliminar.

      4. Para confirmar a eliminação, escreva DELETE e clique em Eliminar.

    3. Elimine a Google Cloud conta de serviço:

      1. Aceda à página Contas de serviço:

        Aceda a Contas de serviço

      2. Selecione o seu projeto.

      3. Selecione a caixa de verificação de gke-gpu-sa@PROJECT_ID.iam.gserviceaccount.com.

      4. Clique em Eliminar.

      5. Para confirmar a eliminação, clique em Eliminar.

    Elimine o projeto

    1. In the Google Cloud console, go to the Manage resources page.

      Go to Manage resources

    2. In the project list, select the project that you want to delete, and then click Delete.
    3. In the dialog, type the project ID, and then click Shut down to delete the project.

    O que se segue?