Neste tutorial, pode publicar modelos de MDIs em TPUs v5e ou TPUs Trillium (v6e) da seguinte forma:
- Llama 3 8B instruct numa TPU v5e de host único.
- Mistral 7B instruct v0.3 numa TPU v5e de anfitrião único.
- Llama 3.1 70B numa TPU Trillium (v6e) de host único.
Este guia destina-se a clientes de IA generativa, utilizadores novos e existentes do GKE, engenheiros de ML, engenheiros de MLOps (DevOps) ou administradores de plataformas interessados em usar capacidades de orquestração de contentores do Kubernetes para publicar modelos usando o Ray, em TPUs com o vLLM.
Contexto
Esta secção descreve as principais tecnologias usadas neste guia.
Serviço Kubernetes gerido do GKE
AGoogle Cloud oferece uma vasta gama de serviços, incluindo o GKE, que é adequado para implementar e gerir cargas de trabalho de IA/AA. O GKE é um serviço Kubernetes gerido que simplifica a implementação, o dimensionamento e a gestão de aplicações contentorizadas. O GKE fornece a infraestrutura necessária, incluindo recursos escaláveis, computação distribuída e redes eficientes, para processar as exigências computacionais dos MDIs.
Para saber mais sobre os principais conceitos do Kubernetes, consulte o artigo Comece a saber mais sobre o Kubernetes. Para saber mais sobre o GKE e como este ajuda a dimensionar, automatizar e gerir o Kubernetes, consulte a vista geral do GKE.
Operador de raio
O suplemento Ray Operator no GKE oferece uma plataforma de IA/AA ponto a ponto para a apresentação, a preparação e o ajuste preciso de cargas de trabalho de aprendizagem automática. Neste tutorial, vai usar o Ray Serve, uma framework no Ray, para publicar LLMs populares do Hugging Face.
TPUs
As TPUs são circuitos integrados específicos da aplicação (ASICs) desenvolvidos pela Google e usados para acelerar a aprendizagem automática e os modelos de IA criados com frameworks como o TensorFlow, o PyTorch e o JAX.
Este tutorial aborda a publicação de modelos de MDIs em nós de TPU v5e ou TPU Trillium (v6e) com topologias de TPU configuradas com base nos requisitos de cada modelo para publicar comandos com baixa latência.
vLLM
O vLLM é uma framework de publicação de GML de código aberto altamente otimizada que pode aumentar a taxa de transferência de publicação em TPUs, com funcionalidades como:
- Implementação do transformador otimizada com PagedAttention
- Processamento em lote contínuo para melhorar o débito geral da publicação
- Paralelismo de tensores e publicação distribuída em várias GPUs
Para saber mais, consulte a documentação do vLLM.
Objetivos
Este tutorial abrange os seguintes passos:
- Crie um cluster do GKE com um node pool de TPUs.
- Implemente um recurso personalizado RayCluster com uma fatia de TPU de anfitrião único. O GKE implementa o recurso personalizado RayCluster como pods do Kubernetes.
- Publicar um MDI/CE.
- Interagir com os modelos.
Opcionalmente, pode configurar os seguintes recursos de publicação de modelos e técnicas suportadas pela framework Ray Serve:
- Implemente um recurso personalizado RayService.
- Componha vários modelos com a composição de modelos.
Antes de começar
Antes de começar, certifique-se de que realizou as seguintes tarefas:
- Ative a API Google Kubernetes Engine. Ative a API Google Kubernetes Engine
- Se quiser usar a CLI gcloud para esta tarefa,
instale-a e, em seguida,
inicialize-a. Se instalou anteriormente a CLI gcloud, execute
gcloud components update
para obter a versão mais recente.
- Crie uma conta Hugging Face, se ainda não tiver uma.
- Certifique-se de que tem um token do Hugging Face.
- Certifique-se de que tem acesso ao modelo do Hugging Face que quer usar. Normalmente, obtém este acesso ao assinar um contrato e solicitar acesso ao proprietário do modelo na página do modelo do Hugging Face.
- Certifique-se de que tem as seguintes funções de IAM:
roles/container.admin
roles/iam.serviceAccountAdmin
roles/container.clusterAdmin
roles/artifactregistry.writer
Prepare o seu ambiente
Verifique se tem quota suficiente no seu Google Cloud projeto para uma TPU v5e de host único ou uma TPU Trillium (v6e) de host único. Para gerir a sua quota, consulte o artigo Quotas de TPU.
Na Google Cloud consola, inicie uma instância do Cloud Shell:
Abrir Cloud ShellClone o repositório de exemplo:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git cd kubernetes-engine-samples
Navegue para o diretório de trabalho:
cd ai-ml/gke-ray/rayserve/llm
Defina as variáveis de ambiente predefinidas para a criação do cluster do GKE:
Llama-3-8B-Instruct
export PROJECT_ID=$(gcloud config get project) export PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format="value(projectNumber)") export CLUSTER_NAME=vllm-tpu export COMPUTE_REGION=REGION export COMPUTE_ZONE=ZONE export HF_TOKEN=HUGGING_FACE_TOKEN export GSBUCKET=vllm-tpu-bucket export KSA_NAME=vllm-sa export NAMESPACE=default export MODEL_ID="meta-llama/Meta-Llama-3-8B-Instruct" export VLLM_IMAGE=docker.io/vllm/vllm-tpu:866fa4550d572f4ff3521ccf503e0df2e76591a1 export SERVICE_NAME=vllm-tpu-head-svc
Substitua o seguinte:
HUGGING_FACE_TOKEN
: o seu token de acesso do Hugging Face.REGION
: a região onde tem quota de TPUs. Certifique-se de que a versão da TPU que quer usar está disponível nesta região. Para saber mais, consulte o artigo Disponibilidade de TPUs no GKE.ZONE
: a zona com quota de TPUs disponível.VLLM_IMAGE
: a imagem da TPU vLLM. Pode usar a imagemdocker.io/vllm/vllm-tpu:866fa4550d572f4ff3521ccf503e0df2e76591a1
pública ou criar a sua própria imagem de TPU.
Mistral-7B
export PROJECT_ID=$(gcloud config get project) export PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format="value(projectNumber)") export CLUSTER_NAME=vllm-tpu export COMPUTE_REGION=REGION export COMPUTE_ZONE=ZONE export HF_TOKEN=HUGGING_FACE_TOKEN export GSBUCKET=vllm-tpu-bucket export KSA_NAME=vllm-sa export NAMESPACE=default export MODEL_ID="mistralai/Mistral-7B-Instruct-v0.3" export TOKENIZER_MODE=mistral export VLLM_IMAGE=docker.io/vllm/vllm-tpu:866fa4550d572f4ff3521ccf503e0df2e76591a1 export SERVICE_NAME=vllm-tpu-head-svc
Substitua o seguinte:
HUGGING_FACE_TOKEN
: o seu token de acesso do Hugging Face.REGION
: a região onde tem quota de TPUs. Certifique-se de que a versão da TPU que quer usar está disponível nesta região. Para saber mais, consulte o artigo Disponibilidade de TPUs no GKE.ZONE
: a zona com quota de TPUs disponível.VLLM_IMAGE
: a imagem da TPU vLLM. Pode usar a imagemdocker.io/vllm/vllm-tpu:866fa4550d572f4ff3521ccf503e0df2e76591a1
pública ou criar a sua própria imagem de TPU.
Llama 3.1 70B
export PROJECT_ID=$(gcloud config get project) export PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format="value(projectNumber)") export CLUSTER_NAME=vllm-tpu export COMPUTE_REGION=REGION export COMPUTE_ZONE=ZONE export HF_TOKEN=HUGGING_FACE_TOKEN export GSBUCKET=vllm-tpu-bucket export KSA_NAME=vllm-sa export NAMESPACE=default export MODEL_ID="meta-llama/Llama-3.1-70B" export MAX_MODEL_LEN=8192 export VLLM_IMAGE=docker.io/vllm/vllm-tpu:866fa4550d572f4ff3521ccf503e0df2e76591a1 export SERVICE_NAME=vllm-tpu-head-svc
Substitua o seguinte:
HUGGING_FACE_TOKEN
: o seu token de acesso do Hugging Face.REGION
: a região onde tem quota de TPUs. Certifique-se de que a versão da TPU que quer usar está disponível nesta região. Para saber mais, consulte o artigo Disponibilidade de TPUs no GKE.ZONE
: a zona com quota de TPUs disponível.VLLM_IMAGE
: a imagem da TPU vLLM. Pode usar a imagemdocker.io/vllm/vllm-tpu:866fa4550d572f4ff3521ccf503e0df2e76591a1
pública ou criar a sua própria imagem de TPU.
Puxe a imagem do contentor vLLM:
sudo usermod -aG docker ${USER} newgrp docker docker pull ${VLLM_IMAGE}
Crie um cluster
Pode publicar um MDG em TPUs com o Ray num cluster do GKE Autopilot ou Standard usando o suplemento do operador do Ray.
Use um cluster do Autopilot para uma experiência do Kubernetes totalmente gerida. Para escolher o modo de funcionamento do GKE mais adequado às suas cargas de trabalho, consulte o artigo Escolha um modo de funcionamento do GKE.
Use o Cloud Shell para criar um cluster do Autopilot ou Standard:
Piloto automático
Crie um cluster do GKE Autopilot com o suplemento Ray Operator ativado:
gcloud container clusters create-auto ${CLUSTER_NAME} \ --enable-ray-operator \ --release-channel=rapid \ --location=${COMPUTE_REGION}
Standard
Crie um cluster padrão com o suplemento do operador Ray ativado:
gcloud container clusters create ${CLUSTER_NAME} \ --release-channel=rapid \ --location=${COMPUTE_ZONE} \ --workload-pool=${PROJECT_ID}.svc.id.goog \ --machine-type="n1-standard-4" \ --addons=RayOperator,GcsFuseCsiDriver
Crie um node pool de fatia de TPU de host único:
Llama-3-8B-Instruct
gcloud container node-pools create tpu-1 \ --location=${COMPUTE_ZONE} \ --cluster=${CLUSTER_NAME} \ --machine-type=ct5lp-hightpu-8t \ --num-nodes=1
O GKE cria um node pool de TPU v5e com um tipo de máquina
ct5lp-hightpu-8t
.Mistral-7B
gcloud container node-pools create tpu-1 \ --location=${COMPUTE_ZONE} \ --cluster=${CLUSTER_NAME} \ --machine-type=ct5lp-hightpu-8t \ --num-nodes=1
O GKE cria um node pool de TPU v5e com um tipo de máquina
ct5lp-hightpu-8t
.Llama 3.1 70B
gcloud container node-pools create tpu-1 \ --location=${COMPUTE_ZONE} \ --cluster=${CLUSTER_NAME} \ --machine-type=ct6e-standard-8t \ --num-nodes=1
O GKE cria um node pool de TPU v6e com um tipo de máquina
ct6e-standard-8t
.
Configure o kubectl para comunicar com o seu cluster
Para configurar o kubectl para comunicar com o cluster, execute o seguinte comando:
Piloto automático
gcloud container clusters get-credentials ${CLUSTER_NAME} \
--location=${COMPUTE_REGION}
Standard
gcloud container clusters get-credentials ${CLUSTER_NAME} \
--location=${COMPUTE_ZONE}
Crie um segredo do Kubernetes para as credenciais do Hugging Face
Para criar um segredo do Kubernetes que contenha o token do Hugging Face, execute o seguinte comando:
kubectl create secret generic hf-secret \
--from-literal=hf_api_token=${HF_TOKEN} \
--dry-run=client -o yaml | kubectl --namespace ${NAMESPACE} apply -f -
Crie um contentor do Cloud Storage
Para acelerar o tempo de arranque da implementação de vLLM e minimizar o espaço em disco necessário por nó, use o controlador CSI FUSE do Cloud Storage para montar o modelo transferido e a cache de compilação nos nós do Ray.
No Cloud Shell, execute o seguinte comando:
gcloud storage buckets create gs://${GSBUCKET} \
--uniform-bucket-level-access
Este comando cria um contentor do Cloud Storage para armazenar os ficheiros do modelo que transfere do Hugging Face.
Configure uma conta de serviço do Kubernetes para aceder ao contentor
Crie a ServiceAccount do Kubernetes:
kubectl create serviceaccount ${KSA_NAME} \ --namespace ${NAMESPACE}
Conceda à conta de serviço do Kubernetes acesso de leitura/escrita ao contentor do Cloud Storage:
gcloud storage buckets add-iam-policy-binding gs://${GSBUCKET} \ --member "principal://iam.googleapis.com/projects/${PROJECT_NUMBER}/locations/global/workloadIdentityPools/${PROJECT_ID}.svc.id.goog/subject/ns/${NAMESPACE}/sa/${KSA_NAME}" \ --role "roles/storage.objectUser"
O GKE cria os seguintes recursos para o GML:
- Um contentor do Cloud Storage para armazenar o modelo transferido e a cache de compilação. Um controlador CSI FUSE do Cloud Storage lê o conteúdo do contentor.
- Volumes com o armazenamento em cache de ficheiros ativado e a funcionalidade de transferência paralela do Cloud Storage FUSE.
Prática recomendada: Use uma cache de ficheiros suportada por
tmpfs
ouHyperdisk / Persistent Disk
consoante o tamanho esperado dos conteúdos do modelo, por exemplo, ficheiros de ponderação. Neste tutorial, usa a cache de ficheiros do FUSE do Cloud Storage suportada pela RAM.
Implemente um recurso personalizado RayCluster
Implemente um recurso personalizado RayCluster, que normalmente consiste num pod do sistema e em vários pods de trabalho.
Llama-3-8B-Instruct
Crie o recurso personalizado RayCluster para implementar o modelo Llama 3 8B otimizado para instruções concluindo os seguintes passos:
Inspecione o manifesto
ray-cluster.tpu-v5e-singlehost.yaml
:Aplique o manifesto:
envsubst < tpu/ray-cluster.tpu-v5e-singlehost.yaml | kubectl --namespace ${NAMESPACE} apply -f -
O comando
envsubst
substitui as variáveis de ambiente no manifesto.
O GKE cria um recurso personalizado RayCluster com um workergroup
que contém um host único de TPU v5e numa topologia 2x4
.
Mistral-7B
Crie o recurso personalizado RayCluster para implementar o modelo Mistral-7B concluindo os seguintes passos:
Inspecione o manifesto
ray-cluster.tpu-v5e-singlehost.yaml
:Aplique o manifesto:
envsubst < tpu/ray-cluster.tpu-v5e-singlehost.yaml | kubectl --namespace ${NAMESPACE} apply -f -
O comando
envsubst
substitui as variáveis de ambiente no manifesto.
O GKE cria um recurso personalizado RayCluster com um workergroup
que contém um host único de TPU v5e numa topologia 2x4
.
Llama 3.1 70B
Crie o recurso personalizado RayCluster para implementar o modelo Llama 3.1 70B concluindo os seguintes passos:
Inspecione o manifesto
ray-cluster.tpu-v6e-singlehost.yaml
:Aplique o manifesto:
envsubst < tpu/ray-cluster.tpu-v6e-singlehost.yaml | kubectl --namespace ${NAMESPACE} apply -f -
O comando
envsubst
substitui as variáveis de ambiente no manifesto.
O GKE cria um recurso personalizado RayCluster com um workergroup
que contém um
TPU v6e de anfitrião único numa topologia 2x4
.
Ligue-se ao recurso personalizado RayCluster
Depois de criar o recurso personalizado RayCluster, pode estabelecer ligação ao recurso RayCluster e começar a publicar o modelo.
Verifique se o GKE criou o serviço RayCluster:
kubectl --namespace ${NAMESPACE} get raycluster/vllm-tpu \ --output wide
O resultado é semelhante ao seguinte:
NAME DESIRED WORKERS AVAILABLE WORKERS CPUS MEMORY GPUS TPUS STATUS AGE HEAD POD IP HEAD SERVICE IP vllm-tpu 1 1 ### ###G 0 8 ready ### ###.###.###.### ###.###.###.###
Aguarde até que o estado do dispositivo seja
ready
e as colunasHEAD POD IP
eHEAD SERVICE IP
tenham um endereço IP.STATUS
Estabeleça
port-forwarding
sessões para o auricular Ray:pkill -f "kubectl .* port-forward .* 8265:8265" pkill -f "kubectl .* port-forward .* 10001:10001" kubectl --namespace ${NAMESPACE} port-forward service/${SERVICE_NAME} 8265:8265 2>&1 >/dev/null & kubectl --namespace ${NAMESPACE} port-forward service/${SERVICE_NAME} 10001:10001 2>&1 >/dev/null &
Confirme se o cliente do Ray consegue estabelecer ligação ao recurso personalizado do RayCluster remoto:
docker run --net=host -it ${VLLM_IMAGE} \ ray list nodes --address http://localhost:8265
O resultado é semelhante ao seguinte:
======== List: YYYY-MM-DD HH:MM:SS.NNNNNN ======== Stats: ------------------------------ Total: 2 Table: ------------------------------ NODE_ID NODE_IP IS_HEAD_NODE STATE STATE_MESSAGE NODE_NAME RESOURCES_TOTAL LABELS 0 XXXXXXXXXX ###.###.###.### True ALIVE ###.###.###.### CPU: 2.0 ray.io/node_id: XXXXXXXXXX memory: #.### GiB node:###.###.###.###: 1.0 node:__internal_head__: 1.0 object_store_memory: #.### GiB 1 XXXXXXXXXX ###.###.###.### False ALIVE ###.###.###.### CPU: 100.0 ray.io/node_id: XXXXXXXXXX TPU: 8.0 TPU-v#e-8-head: 1.0 accelerator_type:TPU-V#E: 1.0 memory: ###.### GiB node:###.###.###.###: 1.0 object_store_memory: ##.### GiB tpu-group-0: 1.0
Implemente o modelo com o vLLM
Para implementar um modelo específico com o vLLM, siga estas instruções.
Llama-3-8B-Instruct
docker run \
--env MODEL_ID=${MODEL_ID} \
--net=host \
--volume=./tpu:/workspace/vllm/tpu \
-it \
${VLLM_IMAGE} \
serve run serve_tpu:model \
--address=ray://localhost:10001 \
--app-dir=./tpu \
--runtime-env-json='{"env_vars": {"MODEL_ID": "meta-llama/Meta-Llama-3-8B-Instruct"}}'
Mistral-7B
docker run \
--env MODEL_ID=${MODEL_ID} \
--env TOKENIZER_MODE=${TOKENIZER_MODE} \
--net=host \
--volume=./tpu:/workspace/vllm/tpu \
-it \
${VLLM_IMAGE} \
serve run serve_tpu:model \
--address=ray://localhost:10001 \
--app-dir=./tpu \
--runtime-env-json='{"env_vars": {"MODEL_ID": "mistralai/Mistral-7B-Instruct-v0.3", "TOKENIZER_MODE": "mistral"}}'
Llama 3.1 70B
docker run \
--env MAX_MODEL_LEN=${MAX_MODEL_LEN} \
--env MODEL_ID=${MODEL_ID} \
--net=host \
--volume=./tpu:/workspace/vllm/tpu \
-it \
${VLLM_IMAGE} \
serve run serve_tpu:model \
--address=ray://localhost:10001 \
--app-dir=./tpu \
--runtime-env-json='{"env_vars": {"MAX_MODEL_LEN": "8192", "MODEL_ID": "meta-llama/Meta-Llama-3.1-70B"}}'
Veja o painel de controlo do Ray
Pode ver a implementação do Ray Serve e os registos relevantes no painel de controlo do Ray.
- Clique no botão
Pré-visualização Web, que se encontra na parte superior direita da barra de tarefas do Cloud Shell.
- Clique em Alterar porta e defina o número da porta para
8265
. - Clique em Alterar e pré-visualizar.
- No painel de controlo do Ray, clique no separador Serve.
Depois de a implementação da publicação ter o estado HEALTHY
, o modelo está pronto para começar a processar entradas.
Publique o modelo
Este guia realça os modelos que suportam a geração de texto, uma técnica que permite a criação de conteúdo de texto a partir de um comando.
Llama-3-8B-Instruct
Configure o encaminhamento de portas para o servidor:
pkill -f "kubectl .* port-forward .* 8000:8000" kubectl --namespace ${NAMESPACE} port-forward service/${SERVICE_NAME} 8000:8000 2>&1 >/dev/null &
Envie um comando para o ponto final Serve:
curl -X POST http://localhost:8000/v1/generate -H "Content-Type: application/json" -d '{"prompt": "What are the top 5 most popular programming languages? Be brief.", "max_tokens": 1024}'
Mistral-7B
Configure o encaminhamento de portas para o servidor:
pkill -f "kubectl .* port-forward .* 8000:8000" kubectl --namespace ${NAMESPACE} port-forward service/${SERVICE_NAME} 8000:8000 2>&1 >/dev/null &
Envie um comando para o ponto final Serve:
curl -X POST http://localhost:8000/v1/generate -H "Content-Type: application/json" -d '{"prompt": "What are the top 5 most popular programming languages? Be brief.", "max_tokens": 1024}'
Llama 3.1 70B
Configure o encaminhamento de portas para o servidor:
pkill -f "kubectl .* port-forward .* 8000:8000" kubectl --namespace ${NAMESPACE} port-forward service/${SERVICE_NAME} 8000:8000 2>&1 >/dev/null &
Envie um comando para o ponto final Serve:
curl -X POST http://localhost:8000/v1/generate -H "Content-Type: application/json" -d '{"prompt": "What are the top 5 most popular programming languages? Be brief.", "max_tokens": 1024}'
Configuração adicional
Opcionalmente, pode configurar os seguintes recursos de publicação de modelos e técnicas suportadas pela framework Ray Serve:
- Implemente um recurso personalizado do RayService. Nos passos anteriores deste tutorial, usa o RayCluster em vez do RayService. Recomendamos o RayService para ambientes de produção.
- Componha vários modelos com a composição de modelos. Configure a multiplexagem de modelos e a composição de modelos suportadas pela framework Ray Serve. A composição de modelos permite encadear entradas e saídas em vários MDIs e dimensionar os seus modelos como uma única aplicação.
- Crie e implemente a sua própria imagem de TPU. Recomendamos esta opção se precisar de um controlo mais detalhado sobre o conteúdo da sua imagem do Docker.
Implemente um RayService
Pode implementar os mesmos modelos deste tutorial usando um recurso personalizado RayService.
Elimine o recurso personalizado RayCluster que criou neste tutorial:
kubectl --namespace ${NAMESPACE} delete raycluster/vllm-tpu
Crie o recurso personalizado RayService para implementar um modelo:
Llama-3-8B-Instruct
Inspecione o manifesto
ray-service.tpu-v5e-singlehost.yaml
:Aplique o manifesto:
envsubst < tpu/ray-service.tpu-v5e-singlehost.yaml | kubectl --namespace ${NAMESPACE} apply -f -
O comando
envsubst
substitui as variáveis de ambiente no manifesto.O GKE cria um RayService com um
workergroup
que contém um TPU v5e de anfitrião único numa topologia2x4
.
Mistral-7B
Inspecione o manifesto
ray-service.tpu-v5e-singlehost.yaml
:Aplique o manifesto:
envsubst < tpu/ray-service.tpu-v5e-singlehost.yaml | kubectl --namespace ${NAMESPACE} apply -f -
O comando
envsubst
substitui as variáveis de ambiente no manifesto.O GKE cria um RayService com um
workergroup
que contém um TPU v5e de anfitrião único numa topologia2x4
.
Llama 3.1 70B
Inspecione o manifesto
ray-service.tpu-v6e-singlehost.yaml
:Aplique o manifesto:
envsubst < tpu/ray-service.tpu-v6e-singlehost.yaml | kubectl --namespace ${NAMESPACE} apply -f -
O comando
envsubst
substitui as variáveis de ambiente no manifesto.
O GKE cria um recurso personalizado RayCluster onde a aplicação Ray Serve é implementada e o recurso personalizado RayService subsequente é criado.
Verifique o estado do recurso RayService:
kubectl --namespace ${NAMESPACE} get rayservices/vllm-tpu
Aguarde que o estado do serviço mude para
Running
:NAME SERVICE STATUS NUM SERVE ENDPOINTS vllm-tpu Running 1
Recupere o nome do serviço principal do RayCluster:
SERVICE_NAME=$(kubectl --namespace=${NAMESPACE} get rayservices/vllm-tpu \ --template={{.status.activeServiceStatus.rayClusterStatus.head.serviceName}})
Estabeleça
port-forwarding
sessões com o auricular Ray para ver o painel de controlo do Ray:pkill -f "kubectl .* port-forward .* 8265:8265" kubectl --namespace ${NAMESPACE} port-forward service/${SERVICE_NAME} 8265:8265 2>&1 >/dev/null &
Limpe o recurso RayService:
kubectl --namespace ${NAMESPACE} delete rayservice/vllm-tpu
Componha vários modelos com a composição de modelos
A composição de modelos é uma técnica para compor vários modelos numa única aplicação.
Nesta secção, vai usar um cluster do GKE para compor dois modelos, o Llama 3 8B IT e o Gemma 7B IT, numa única aplicação:
- O primeiro modelo é o modelo de assistente que responde a perguntas feitas no comando.
- O segundo modelo é o modelo de resumo. A saída do modelo de assistente é encadeada na entrada do modelo de resumo. O resultado final é a versão resumida da resposta do modelo do assistente.
Aceda ao modelo Gemma concluindo os seguintes passos:
- Inicie sessão na plataforma Kaggle, assine o contrato de consentimento da licença e obtenha um token da API Kaggle. Neste tutorial, vai usar um segredo do Kubernetes para as credenciais do Kaggle.
- Aceda à página de consentimento do modelo em Kaggle.com.
- Inicie sessão no Kaggle, se ainda não o tiver feito.
- Clique em Pedir acesso.
- Na secção Escolher conta para consentimento, selecione Validar através da conta do Kaggle para usar a sua conta do Kaggle para conceder consentimento.
- Aceite os Termos de Utilização do modelo.
Configure o seu ambiente:
export ASSIST_MODEL_ID=meta-llama/Meta-Llama-3-8B-Instruct export SUMMARIZER_MODEL_ID=google/gemma-7b-it
Para clusters padrão, crie um conjunto de nós de fatia de TPU de host único adicional:
gcloud container node-pools create tpu-2 \ --location=${COMPUTE_ZONE} \ --cluster=${CLUSTER_NAME} \ --machine-type=MACHINE_TYPE \ --num-nodes=1
Substitua
MACHINE_TYPE
por qualquer um dos seguintes tipos de máquinas:ct5lp-hightpu-8t
para aprovisionar a TPU v5e.ct6e-standard-8t
para aprovisionar TPUs v6e.
Os clusters do Autopilot aprovisionam automaticamente os nós necessários.
Implemente o recurso RayService com base na versão da TPU que quer usar:
TPU v5e
Inspecione o manifesto
ray-service.tpu-v5e-singlehost.yaml
:Aplique o manifesto:
envsubst < model-composition/ray-service.tpu-v5e-singlehost.yaml | kubectl --namespace ${NAMESPACE} apply -f -
TPU v6e
Inspecione o manifesto
ray-service.tpu-v6e-singlehost.yaml
:Aplique o manifesto:
envsubst < model-composition/ray-service.tpu-v6e-singlehost.yaml | kubectl --namespace ${NAMESPACE} apply -f -
Aguarde que o estado do recurso RayService mude para
Running
:kubectl --namespace ${NAMESPACE} get rayservice/vllm-tpu
O resultado é semelhante ao seguinte:
NAME SERVICE STATUS NUM SERVE ENDPOINTS vllm-tpu Running 2
Neste resultado, o estado
RUNNING
indica que o recurso RayService está pronto.Confirme que o GKE criou o serviço para a aplicação Ray Serve:
kubectl --namespace ${NAMESPACE} get service/vllm-tpu-serve-svc
O resultado é semelhante ao seguinte:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE vllm-tpu-serve-svc ClusterIP ###.###.###.### <none> 8000/TCP ###
Estabeleça
port-forwarding
sessões para o auricular Ray:pkill -f "kubectl .* port-forward .* 8265:8265" pkill -f "kubectl .* port-forward .* 8000:8000" kubectl --namespace ${NAMESPACE} port-forward service/vllm-tpu-serve-svc 8265:8265 2>&1 >/dev/null & kubectl --namespace ${NAMESPACE} port-forward service/vllm-tpu-serve-svc 8000:8000 2>&1 >/dev/null &
Envie um pedido ao modelo:
curl -X POST http://localhost:8000/ -H "Content-Type: application/json" -d '{"prompt": "What is the most popular programming language for machine learning and why?", "max_tokens": 1000}'
O resultado é semelhante ao seguinte:
{"text": [" used in various data science projects, including building machine learning models, preprocessing data, and visualizing results.\n\nSure, here is a single sentence summarizing the text:\n\nPython is the most popular programming language for machine learning and is widely used in data science projects, encompassing model building, data preprocessing, and visualization."]}
Crie e implemente a imagem da TPU
Este tutorial usa imagens de TPU alojadas a partir do
vLLM. O vLLM fornece uma imagem
Dockerfile.tpu
que cria o vLLM com base na imagem PyTorch XLA necessária
que inclui dependências da TPU. No entanto, também pode criar e implementar a sua própria imagem de TPU para um controlo mais detalhado sobre o conteúdo da sua imagem do Docker.
Crie um repositório Docker para armazenar as imagens de contentores para este guia:
gcloud artifacts repositories create vllm-tpu --repository-format=docker --location=${COMPUTE_REGION} && \ gcloud auth configure-docker ${COMPUTE_REGION}-docker.pkg.dev
Clone o repositório vLLM:
git clone https://github.com/vllm-project/vllm.git cd vllm
Crie a imagem:
docker build -f ./docker/Dockerfile.tpu . -t vllm-tpu
Etiquete a imagem da TPU com o nome do Artifact Registry:
export VLLM_IMAGE=${COMPUTE_REGION}-docker.pkg.dev/${PROJECT_ID}/vllm-tpu/vllm-tpu:TAG docker tag vllm-tpu ${VLLM_IMAGE}
Substitua
TAG
pelo nome da etiqueta que quer definir. Se não especificar uma etiqueta, o Docker aplica a etiqueta mais recente predefinida.Envie a imagem para o Artifact Registry:
docker push ${VLLM_IMAGE}
Elimine os recursos individuais
Se usou um projeto existente e não o quer eliminar, pode eliminar os recursos individuais.
Elimine o recurso personalizado RayCluster:
kubectl --namespace ${NAMESPACE} delete rayclusters vllm-tpu
Elimine o contentor do Cloud Storage:
gcloud storage rm -r gs://${GSBUCKET}
Elimine o repositório do Artifact Registry:
gcloud artifacts repositories delete vllm-tpu \ --location=${COMPUTE_REGION}
Elimine o cluster:
gcloud container clusters delete ${CLUSTER_NAME} \ --location=LOCATION
Substitua
LOCATION
por qualquer uma das seguintes variáveis de ambiente:- Para clusters do Autopilot, use
COMPUTE_REGION
. - Para clusters padrão, use
COMPUTE_ZONE
.
- Para clusters do Autopilot, use
Elimine o projeto
Se implementou o tutorial num novo Google Cloud projeto e já não precisa do projeto, elimine-o concluindo os seguintes passos:
- 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.
O que se segue?
- Descubra como executar cargas de trabalho de IA/ML otimizadas com as capacidades de orquestração da plataforma do GKE.
- Saiba como usar o Ray Serve no GKE, consultando o código de exemplo no GitHub.
- Saiba como recolher e ver métricas para clusters do Ray executados no GKE, concluindo os passos em Recolha e veja registos e métricas para clusters do Ray no GKE.