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 theresourcemanager.projects.create
permission. Learn how to grant roles.
-
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 theresourcemanager.projects.create
permission. Learn how to grant roles.
-
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
-
In the Google Cloud console, go to the IAM page.
Go to IAM - Select the project.
-
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.
- 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
-
In the Google Cloud console, go to the IAM page.
Aceder ao IAM - Selecione o projeto.
- Clique em Conceder acesso.
-
No campo Novos responsáveis, introduza o identificador do utilizador. Normalmente, este é o endereço de email de uma Conta Google.
- Na lista Selecionar uma função, selecione uma função.
- Para conceder funções adicionais, clique em Adicionar outra função e adicione cada função adicional.
- Clique em Guardar.
-
- Certifique-se de que tem um cluster do GKE Autopilot ou Standard que executa a versão 1.32.2-gke.1652000 ou posterior. O cluster tem de ativar o aprovisionamento automático de nós e configurar os limites da GPU.
- Crie uma conta Hugging Face, se ainda não tiver uma.
- Certifique-se de que o seu projeto tem quota preemptível suficiente para GPUs NVIDIA L4. Para mais informações, consulte o artigo Quotas preemptíveis.
Aceda ao modelo
Se ainda não tiver um, gere um novo token do Hugging Face:
- Clique em O seu perfil > Definições > Tokens de acesso.
- Selecione Novo token.
- Especifique um nome à sua escolha e uma função de, pelo menos,
Read
. - 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.
- Na Google Cloud consola, inicie uma sessão do Cloud Shell clicando em Ativar Cloud Shell na Google Cloud consola.
É aberta uma sessão no painel inferior da consola Google Cloud .
Crie um
dws-flex-start.yaml
ficheiro 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
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
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.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 ambienteHF_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.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.
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
.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
.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.
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.
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
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
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Elimine o recurso individual
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
Elimine o cluster:
gcloud container clusters delete CLUSTER_NAME
O que se segue?
- Saiba como formar uma pequena carga de trabalho com o início flexível.
- Saiba mais sobre as GPUs no GKE.