Exibir um modelo com uma única GPU no GKE

Neste tutorial, mostramos como implantar e disponibilizar um modelo de linguagem grande (LLM) usando GPUs no Google Kubernetes Engine (GKE) com o NVIDIA Triton Inference Server e o TensorFlow Serving Isso fornece uma base para entender e explorar a implantação prática de LLMs para inferência em um ambiente gerenciado do Kubernetes. Você implanta um contêiner pré-criado em um cluster do GKE com uma única GPU do Tensor Core L4 e prepara a infraestrutura do GKE para fazer inferências on-line.

Este tutorial é destinado a engenheiros de machine learning (ML), administradores e operadores de plataforma e especialistas em dados e IA que querem hospedar um modelo de machine learning (ML) pré-treinado em um cluster do GKE. Para saber mais sobre papéis comuns e exemplos de tarefas referenciados no conteúdo do Google Cloud, consulte Funções e tarefas comuns do usuário do GKE.

Antes de ler esta página, confira se você conhece os seguintes conceitos:

Criar um bucket do Cloud Storage

Crie um bucket do Cloud Storage para armazenar o modelo pré-treinado que será exibido.

No Cloud Shell, execute o seguinte:

gcloud storage buckets create gs://$GSBUCKET

Configurar o cluster para acessar o bucket usando a federação de identidade da carga de trabalho do GKE

Para permitir que o cluster acesse o bucket do Cloud Storage, faça o seguinte:

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

Criar uma conta de serviço Google Cloud

  1. No console Google Cloud , acesse a página Criar conta de serviço:

    Acesse "Criar conta de serviço"

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

  3. Clique em Criar e continuar.

  4. Na lista Papel, selecione o papel Cloud Storage > Serviço de coletor do Insights.

  5. Clique em Adicionar outro papel.

  6. Na lista Selecionar um papel, selecione o papel Cloud Storage > Administrador de objetos do Storage.

  7. Clique em Continuar e depois em Concluído.

Criar uma conta de serviço do Kubernetes no cluster

No Cloud Shell, faça o seguinte:

  1. Crie um namespace do Kubernetes:

    kubectl create namespace gke-ai-namespace
    
  2. Crie uma conta de serviço do Kubernetes no namespace:

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

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

No Cloud Shell, execute estes comandos:

  1. Adicione uma vinculação do IAM à conta de serviço 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]"
    

    A flag --member fornece a identidade completa da conta de serviço do Kubernetes em Google Cloud.

  2. Anote a conta de serviço 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
    

Implantar o servidor de inferência on-line

Cada framework de inferência on-line espera encontrar o modelo de ML pré-treinado em um formato específico. A seção a seguir mostra como implantar o servidor de inferência dependendo do framework que você quer usar:

Triton

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

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

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

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

    Quando o framework estiver pronto, a saída será semelhante a esta:

    NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
    triton-deployment    1/1     1            1           5m29s
    
  4. Implante os serviços para acessar a implantaçã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 será assim:

    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
    

    Anote o endereço IP de triton-server na coluna EXTERNAL-IP.

  6. Verifique se o serviço e a implantação estão funcionando corretamente:

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

    O resultado será assim:

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

Exibição de TF

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

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

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

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

    Quando o framework estiver pronto, a saída será semelhante a esta:

    NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
    tfserve-deployment   1/1     1            1           5m29s
    
  4. Implante os serviços para acessar a implantaçã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 será assim:

    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
    

    Anote o endereço IP de tfserve-server na coluna EXTERNAL-IP.

  6. Verifique se o serviço e a implantação estão funcionando corretamente:

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

    Substitua EXTERNAL_IP pelo endereço IP externo.

    O resultado será assim:

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

Disponibilizar o modelo

Triton

  1. Criar um ambiente virtual do 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:

    • EXTERNAL_IP: o endereço IP externo.
    • TEST_IMAGE: o nome do arquivo que corresponde à imagem que você quer testar. É possível usar as imagens armazenadas em src/client/images.

    Dependendo da imagem usada, a saída será semelhante a esta:

    Calling Triton HTTP Service      ->      Prediction result: 7
    

Exibição de TF

  1. Criar um ambiente virtual do 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. Testar 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:

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

Dependendo da imagem usada, você terá uma saída semelhante a esta:

  Calling TensorFlow Serve HTTP Service    ->      Prediction result: 5

Observar o desempenho do modelo

Triton

Para observar a performance do modelo, use a integração do painel do Triton no Cloud Monitoring. Com esse painel, é possível conferir métricas de desempenho importantes, como taxa de transferência de tokens, latência de solicitação e taxas de erro.

Para usar o painel do Triton, ative o Google Cloud Managed Service para Prometheus, que coleta as métricas do Triton no cluster do GKE. O Triton expõe métricas no formato do Prometheus por padrão. Não é necessário instalar um exportador adicional.

Em seguida, é possível conferir as métricas usando o painel do Triton. Para informações sobre como usar o Google Cloud Managed Service para Prometheus e coletar métricas do seu modelo, consulte as orientações de capacidade de observação do Triton na documentação do Cloud Monitoring.

Exibição de TF

Para observar a performance do modelo, use a integração do painel do TF Serving no Cloud Monitoring. Com esse painel, é possível conferir métricas de desempenho importantes, como taxa de transferência de tokens, latência de solicitação e taxas de erro.

Para usar o painel do TF Serving, ative o Google Cloud Managed Service para Prometheus, que coleta as métricas do TF Serving no cluster do GKE.

Em seguida, é possível conferir as métricas usando o painel do TF Serving. Para informações sobre como usar o Google Cloud Managed Service para Prometheus para coletar métricas do seu modelo, consulte as orientações de capacidade de observação do TF Serving na documentação do Cloud Monitoring.