Publicar um modelo com uma única GPU no GKE

Este tutorial mostra como implementar e publicar um modelo de linguagem (conteúdo extenso) (MDI/CE) 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 MDIs/CEs 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 referenciadas no Google Cloud conteúdo, consulte Funções e tarefas comuns de utilizadores do GKE.

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

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 conta de serviço 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 conta de serviço 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é-preparado para o contentor do Cloud Storage:

    gcloud storage cp src/triton-model-repository gs://$GSBUCKET --recursive
    
  2. Implemente a framework usando 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
    ...
    

Publicação de TF

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

    gcloud storage cp src/tfserve-model-repository gs://$GSBUCKET --recursive
    
  2. Implemente a framework usando 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
    

Publicação de TF

  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.

Publicação de TF

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 Google Cloud Managed Service for 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 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 TF Serving na documentação do Cloud Monitoring.