Publique MDIs no GKE com uma estratégia de aprovisionamento de GPUs de alta disponibilidade e otimizada em termos de custos


Este guia mostra como otimizar os custos para cargas de trabalho de fornecimento de LLMs no GKE. Este tutorial usa uma combinação de início flexível, VMs do Spot e perfis de classe de computação personalizados para uma inferência económica.

Este guia usa o Mixtral 8x7b como um exemplo de um MDG que pode implementar.

Este guia destina-se a engenheiros de aprendizagem automática (ML), administradores e operadores de plataformas, bem como a especialistas em dados e IA interessados em usar as capacidades de orquestração de contentores do Kubernetes para publicar GMLs. Para mais informações sobre as funções comuns e exemplos de tarefas que referimos no conteúdo, consulte o artigo Funções e tarefas comuns do utilizador do GKE. Google Cloud

Preços de início flexível

Recomendamos o início flexível se a sua carga de trabalho exigir recursos aprovisionados dinamicamente conforme necessário, durante um máximo de sete dias com reservas de curto prazo, sem gestão complexa de quotas e acesso rentável. O início flexível é alimentado pelo programador de carga de trabalho dinâmico e é faturado através dos preços do programador de carga de trabalho dinâmico:

  • Com desconto (até 53%) para vCPUs, GPUs e TPUs.
  • Paga à medida que usa.

Contexto

Esta secção descreve as técnicas disponíveis que pode usar para obter recursos de computação, incluindo aceleradores de GPU, com base nos requisitos das suas cargas de trabalho de IA/ML. Estas técnicas são denominadas estratégias de obtenção de aceleradores no GKE.

GPUs

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

Para mais informações, consulte o artigo Acerca das GPUs no GKE.

Modo de aprovisionamento de início flexível

O modo de aprovisionamento de início flexível, com tecnologia do Dynamic Workload Scheduler, é um tipo de consumo de GPU em que o GKE persiste no seu pedido de GPU e aprovisiona automaticamente recursos quando a capacidade fica disponível. Pondere usar o início flexível para cargas de trabalho que precisam de capacidade de GPU durante um período limitado, até sete dias, e não têm uma data de início fixa. Para mais informações, consulte o artigo flex-start.

VMs do Spot

Pode usar GPUs com VMs do Spot se as suas cargas de trabalho tolerarem interrupções frequentes de nós. A utilização de VMs do Spot ou de início flexível reduz o preço de execução de GPUs. A utilização de VMs do Spot combinada com o início flexível oferece uma opção alternativa quando a capacidade das VMs do Spot está indisponível.

Para mais informações, consulte o artigo Usar VMs Spot com pools de nós de GPU.

Classes de computação personalizadas

Pode pedir GPUs através de classes de computação personalizadas. As classes de computação personalizadas permitem-lhe definir uma hierarquia de configurações de nós para que o GKE priorize durante as decisões de dimensionamento de nós, para que as cargas de trabalho sejam executadas no hardware selecionado. Para mais informações, consulte o artigo Acerca das 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.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  • Verify 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.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  • Verify 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.

      Aceder ao IAM
    2. Selecione o projeto.
    3. Clique em Conceder acesso.
    4. No campo Novos responsáveis, introduza o identificador do utilizador. Normalmente, este é o endereço de email de uma Conta Google.

    5. Na lista Selecionar uma função, selecione uma função.
    6. Para conceder funções adicionais, clique em Adicionar outra função e adicione cada função adicional.
    7. Clique em Guardar.

Aceda ao modelo

Se ainda não tiver um, gere um novo token do Hugging Face:

  1. Clique em O seu perfil > Definições > Tokens de acesso.
  2. Selecione Novo token.
  3. Especifique um nome à sua escolha e uma função de, pelo menos, Read.
  4. Selecione Gerar um token.

Crie um perfil de classe de computação personalizado

Nesta secção, cria 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 sua carga de trabalho.

  1. Na Google Cloud consola, inicie uma sessão do Cloud Shell clicando em Ativar Cloud Shell na Google Cloud consola.Ícone de ativação do Cloud Shell É aberta uma sessão no painel inferior da consola Google Cloud .
  2. Crie um dws-flex-start.yamlficheiro de manifesto:

    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 implementa máquinas g2-standard-24 com aceleradores L4. O GKE usa classes de computação para priorizar primeiro as VMs do Spot e, em segundo lugar, o início flexível.

Implemente a carga de trabalho do MDI/CE

  1. Crie um segredo do Kubernetes que contenha o token do Hugging Face através do 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 ficheiro com o nome mixtral-deployment.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: inference-mixtral-ccc
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: llm
      template:
        metadata:
          labels:
            app: llm
        spec:
          nodeSelector:
            cloud.google.com/compute-class: dws-model-inference-class
          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 está definido como /tmp, porque é o caminho onde a variável de ambiente HF_HOME no contentor de aprendizagem profunda (DLC) para a inferência de geração de texto (TGI) está definida, em vez do caminho /data predefinido que está definido na imagem predefinida do TGI. O modelo transferido é armazenado neste diretório.

  3. Implemente o modelo:

    kubectl apply -f  mixtral-deployment.yaml
    

    O GKE agenda um novo pod para implementação, o que aciona o escalador automático do conjunto de nós para adicionar um segundo nó antes de implementar a segunda réplica do modelo.

  4. Valide o estado do modelo:

    watch kubectl get deploy inference-mixtral-ccc
    

    Se o modelo foi implementado com êxito, o resultado é semelhante ao seguinte:

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

    Para sair do relógio, prima CTRL + C.

  5. Aguarde que o contentor seja transferido e comece a publicar o modelo:

    watch "kubectl logs $(kubectl get pods -l app=llm -o custom-columns=:metadata.name --no-headers) | tail"
    

    Para sair do relógio, prima CTRL + C.

  6. Veja os node pools que o GKE aprovisionou:

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

    O resultado é semelhante ao seguinte:

      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 conjunto de nós criado indica o tipo de máquina. Neste caso, o GKE aprovisionou VMs do Spot.

  7. Exponha o modelo:

    kubectl expose deployment/inference-mixtral-ccc --port 8080 --name=llm-service
    

Interaja com o modelo através de curl

Esta secção mostra como pode realizar um teste de inferência básico para validar o modelo implementado.

  1. Configure o encaminhamento de porta para o modelo:

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

    O resultado é semelhante ao seguinte:

    Forwarding from 127.0.0.1:8080 -> 8080
    
  2. Numa nova sessão de terminal, converse com o 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}'
    

    O resultado tem um aspeto semelhante ao seguinte:

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

Limpar

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

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.

Elimine o recurso individual

  1. Elimine os recursos do Kubernetes que criou a partir deste 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. Elimine o cluster:

    gcloud container clusters delete CLUSTER_NAME
    

O que se segue?