Disponibilizar LLMs no GKE com uma estratégia de provisionamento de GPU com custo otimizado e alta disponibilidade


Neste guia, mostramos como otimizar os custos de carga de trabalho ao implantar um modelo de linguagem grande (LLM). A infraestrutura do GKE utiliza uma combinação do modo de provisionamento flexível, VMs do Spot e perfis de classe de computação personalizados para otimizar os custos da carga de trabalho.

Este guia usa o Mixtral 8x7b como um exemplo de LLM que pode ser implantado.

Este guia é destinado a engenheiros de machine learning (ML), administradores e operadores de plataforma e especialistas em dados e IA que têm interesse em usar os recursos de orquestração de contêineres do Kubernetes para veiculação de LLMs. Para mais informações sobre papéis comuns e exemplos de tarefas mencionados no conteúdo Google Cloud , consulte Funções e tarefas de usuário comuns do GKE Enterprise.

Contexto

Esta seção descreve as técnicas disponíveis para conseguir recursos de computação, incluindo aceleradores de GPU, com base nos requisitos das cargas de trabalho de IA/ML. Essas técnicas são chamadas de estratégias de disponibilidade de aceleradores no GKE.

GPUs

As unidades de processamento gráfico (GPUs) permitem acelerar cargas de trabalho específicas, como machine learning e processamento de dados. O GKE oferece nós equipados com essas GPUs potentes para otimizar o desempenho de tarefas de machine learning e processamento de dados. O GKE oferece uma variedade de opções de tipo de máquina para configuração de nós, incluindo tipos de máquina com GPUs NVIDIA H100, A100 e L4.

Para mais informações, consulte Sobre GPUs no GKE.

Modo de provisionamento de início flexível

O modo de provisionamento flexível é um tipo de reserva de GPU em que o GKE persiste sua solicitação de GPU e provisiona recursos automaticamente quando a capacidade fica disponível. Considere usar o modo de provisionamento flexível para cargas de trabalho que precisam de capacidade de GPU por um tempo limitado, até sete dias, e não têm uma data de início fixa. Para mais informações, consulte Modo de provisionamento flex-start.

VMs spot

É possível usar GPUs com VMs spot se as cargas de trabalho conseguirem tolerar interrupções frequentes de nós. O uso de VMs spot ou do modo de provisionamento flexível reduz o preço de GPUs em execução. O uso de VMs spot combinadas com o modo de provisionamento de início flexível oferece uma opção alternativa quando a capacidade de VMs spot não está disponível.

Para mais informações, consulte Como usar VMs spot com pools de nós de GPU.

Classes de computação personalizadas

É possível solicitar GPUs usando classes de computação personalizadas. As classes de computação personalizadas permitem definir uma hierarquia de configurações de nós para que o GKE priorize durante as decisões de escalonamento de nós, para que as cargas de trabalho sejam executadas no hardware selecionado. Para mais informações, consulte Sobre as classes de computação personalizadas.

Antes de começar

  • 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.
  • In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  • Make sure that billing is enabled for your Google Cloud project.

  • In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  • Make sure that billing is enabled for your Google Cloud project.

  • Make sure that you have the following role or roles on the project:

    Check for the roles

    1. In the Google Cloud console, go to the IAM page.

      Go to IAM
    2. Select the project.
    3. In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.

    4. For all rows that specify or include you, check the Role column to see whether the list of roles includes the required roles.

    Grant the roles

    1. In the Google Cloud console, go to the IAM page.

      Acessar o IAM
    2. Selecionar um projeto.
    3. Clique em CONCEDER ACESSO.
    4. No campo Novos principais, insira seu identificador de usuário. Normalmente, é o endereço de e-mail de uma Conta do Google.

    5. Na lista Selecionar um papel, escolha um.
    6. Para conceder outros papéis, clique em Adicionar outro papel e adicione cada papel adicional.

Receber acesso ao modelo

Gere um token do Hugging Face, se você ainda não tiver um:

  1. Clique em Seu perfil > Configurações > Tokens de acesso.
  2. Selecione Novo token.
  3. Especifique um nome de sua escolha e um papel de pelo menos Read.
  4. Selecione Gerar um token.

Criar um perfil de classe de computação personalizado

Nesta seção, você vai criar um perfil de classe de computação personalizado. Os perfis de classe de computação personalizados definem os tipos e as relações entre vários recursos de computação usados pela carga de trabalho.

  1. No console do Google Cloud, inicie uma sessão do Cloud Shell clicando em Ícone de ativação do Cloud Shell Ativar o Cloud Shell no console do Google Cloud. Uma sessão é aberta no painel inferior do console do Google Cloud.
  2. Crie um arquivo de manifesto dws-flex-start.yaml:

    apiVersion: cloud.google.com/v1
    kind: ComputeClass
    metadata:
      name: dws-model-inference-class
    spec:
      priorities:
        - machineType: g2-standard-24
          spot: true
        - machineType: g2-standard-24
          flexStart:
            enabled: true
            nodeRecycling:
              leadTimeSeconds: 3600
      nodePoolAutoCreation:
        enabled: true
    
  3. Aplique o manifesto dws-flex-start.yaml:

    kubectl apply -f dws-flex-start.yaml
    

O GKE implanta máquinas g2-standard-24 com aceleradores L4. O GKE usa classes de computação para priorizar as VMs do Spot em primeiro lugar e o modo de provisionamento flexível em segundo.

Implantar a carga de trabalho do LLM

  1. Crie um secret do Kubernetes que contenha o token do Hugging Face usando o seguinte comando:

    kubectl create secret generic model-inference-secret \
        --from-literal=HUGGING_FACE_TOKEN=HUGGING_FACE_TOKEN \
        --dry-run=client -o yaml | kubectl apply -f -
    

    Substitua HUGGING_FACE_TOKEN pelo seu token de acesso do Hugging Face.

  2. Crie um arquivo chamado mixtral-deployment.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: inference-mixtral-ccc
    spec:
      nodeSelector:
        cloud.google.com/compute-class: dws-model-inference-class
      replicas: 1
      selector:
        matchLabels:
          app: llm
      template:
        metadata:
          labels:
            app: llm
        spec:
          containers:
          - name: llm
            image: us-docker.pkg.dev/deeplearning-platform-release/gcr.io/huggingface-text-generation-inference-cu124.2-3.ubuntu2204.py311
            resources:
              requests:
                cpu: "5"
                memory: "40Gi"
                nvidia.com/gpu: "2"
              limits:
                cpu: "5"
                memory: "40Gi"
                nvidia.com/gpu: "2"
            env:
            - name: MODEL_ID
              value: mistralai/Mixtral-8x7B-Instruct-v0.1
            - name: NUM_SHARD
              value: "2"
            - name: PORT
              value: "8080"
            - name: QUANTIZE
              value: bitsandbytes-nf4
            - name: HUGGING_FACE_HUB_TOKEN
              valueFrom:
                secretKeyRef:
                  name: model-inference-secret
                  key: HUGGING_FACE_TOKEN
            volumeMounts:
              - mountPath: /dev/shm
                name: dshm
              - mountPath: /tmp
                name: ephemeral-volume
          volumes:
            - name: dshm
              emptyDir:
                  medium: Memory
            - name: ephemeral-volume
              ephemeral:
                volumeClaimTemplate:
                  metadata:
                    labels:
                      type: ephemeral
                  spec:
                    accessModes: ["ReadWriteOnce"]
                    storageClassName: "premium-rwo"
                    resources:
                      requests:
                        storage: 100Gi
    

    Neste manifesto, o campo mountPath é definido como /tmp, porque é o caminho para o qual a variável de ambiente HF_HOME no contêiner de Deep Learning (DLC) para inferência de geração de texto (TGI) é definida, em vez do caminho /data padrão definido na imagem padrão da TGI. O modelo transferido por download será armazenado neste diretório.

  3. Implante o modelo:

    kubectl apply -f  mixtral-deployment.yaml
    

    O GKE programa a implantação de um novo pod, que aciona o escalonador automático do pool de nós para adicionar um segundo nó antes de implantar a segunda réplica do modelo.

  4. Verifique o status do modelo:

    watch kubectl get deploy inference-mixtral-ccc
    

    Se o modelo tiver sido implantado, a saída será semelhante a esta:

    NAME                   READY   UP-TO-DATE   AVAILABLE   AGE
    inference-mixtral-ccc  1/1     1            1           10m
    

    Para sair da exibição, pressione CTRL + C.

  5. Confira os pools de nós provisionados pelo GKE:

    kubectl get nodes -L cloud.google.com/gke-nodepool
    

    O resultado será assim:

      NAME                                                  STATUS   ROLES    AGE   VERSION               GKE-NODEPOOL
      gke-flex-na-nap-g2-standard--0723b782-fg7v   Ready    <none>   10m   v1.32.3-gke.1152000   nap-g2-standard-24-spot-gpu2-1gbdlbxz
      gke-flex-nap-zo-default-pool-09f6fe53-fzm8   Ready    <none>   32m   v1.32.3-gke.1152000   default-pool
      gke-flex-nap-zo-default-pool-09f6fe53-lv2v   Ready    <none>   32m   v1.32.3-gke.1152000   default-pool
      gke-flex-nap-zo-default-pool-09f6fe53-pq6m   Ready    <none>   32m   v1.32.3-gke.1152000   default-pool
    

    O nome do pool de nós criado indica o tipo de máquina. Nesse caso, o GKE provisionou VMs do Spot.

Interagir com o modelo usando curl

Nesta seção, mostramos como realizar um teste de inferência básico para verificar o modelo implantado.

  1. Configure o encaminhamento de portas para o modelo:

    kubectl port-forward service/llm-service 8080:8080
    

    O resultado será assim:

    Forwarding from 127.0.0.1:8080 -> 8080
    
  2. Em uma nova sessão do terminal, converse com seu modelo usando curl:

    curl http://localhost:8080/v1/completions \
    -X POST \
    -H "Content-Type: application/json" \
    -d '{
        "model": "mixtral-8x7b-instruct-gptq",
        "prompt": "<s>[INST]Who was the first president of the United States?[/INST]",
        "max_tokens": 40}'
    

    A saída será assim:

    George Washington was a Founding Father and the first president of the United States, serving from 1789 to 1797.
    

Limpar

Para evitar cobranças na sua conta do Google Cloud pelos recursos usados nesta página, exclua o projeto que contém os recursos ou mantenha o projeto e exclua os recursos individuais.

Excluir 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.

Excluir o recurso individual

  1. Exclua os recursos do Kubernetes que você criou neste guia:

    kubectl delete deployment inference-mixtral-ccc
    kubectl delete service llm-service
    kubectl delete computeclass dws-model-inference-class
    kubectl delete secret model-inference-secret
    
  2. Exclua o cluster:

    gcloud container clusters delete CLUSTER_NAME
    

A seguir