Este tutorial mostra como configurar o KubeRay com a TPU Trillium no Google Kubernetes Engine (GKE). Saiba como configurar configurações de TPU de anfitrião único e vários anfitriões, incluindo as variáveis de ambiente necessárias e as especificações de pods para o TPU Trillium.
Este tutorial destina-se a administradores e operadores da plataforma, bem como a especialistas em dados e IA que queiram saber como configurar a inicialização do TPU Trillium com o KubeRay para pools de nós de anfitrião único e vários anfitriões. Este tutorial demonstra como executar um script com o Jax que verifica a inicialização bem-sucedida da TPU. Este tutorial não implementa um modelo.
Antes de configurar o KubeRay no GKE, certifique-se de que conhece as definições e a terminologia do Ray no GKE.
Vista geral
Este tutorial mostra como executar um script Python com o Jax que verifica se a inicialização do TPU Trillium com o KubeRay foi bem-sucedida. O JAX é uma biblioteca de computação numérica de elevado desempenho que suporta cargas de trabalho de aprendizagem automática. O KubeRay é um operador do Kubernetes que oferece uma forma unificada de implementar, gerir e monitorizar aplicações Ray no Kubernetes.
As TPUs Trillium (v6e) requerem variáveis de ambiente e especificações de Pod específicas que diferem das gerações de TPUs anteriores. Este tutorial fornece as configurações necessárias para implementar com êxito uma carga de trabalho com o KubeRay em TPUs Trillium.
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 o comando
gcloud components updatepara obter a versão mais recente. As versões anteriores da CLI gcloud podem não suportar a execução dos comandos neste documento.
- Certifique-se de que tem a CLI Ray (versão 2.37.0) instalada.
Ativar Cloud Shell
A Cloud Shell é pré-instalada com as ferramentas de linha de comandos gcloud, helm e kubectl usadas neste tutorial.
- Aceda à Google Cloud consola.
Na parte superior da Google Cloud janela da consola, clique no botão Ativar Cloud Shell
.É aberta uma sessão do Cloud Shell num novo frame na Google Cloud consola e é apresentado um comando.
Crie um cluster e um node pool do GKE
Pode configurar o KubeRay em TPUs num cluster do GKE Autopilot ou Standard. Recomendamos que 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 Acerca dos modos de funcionamento do GKE.
Piloto automático
No Cloud Shell, execute o seguinte comando:
gcloud container clusters create-auto CLUSTER_NAME \ --enable-ray-operator \ --release-channel=rapid \ --location=LOCATIONSubstitua o seguinte:
CLUSTER_NAME: o nome do novo cluster.LOCATION: a região onde a sua capacidade da TPU Trillium está disponível. Para mais informações, consulte o artigo Disponibilidade de TPUs no GKE.
O GKE cria um cluster do Autopilot com o suplemento do operador do Ray ativado. O suplemento instala automaticamente o webhook da TPU do Ray no plano de controlo do cluster.
Para comunicar com o cluster, configure o seguinte:
kubectlgcloud container clusters get-credentials CLUSTER_NAME --location=LOCATION
Standard
No Cloud Shell, crie um cluster Standard que ative o suplemento do operador Ray executando o seguinte comando :
gcloud container clusters create CLUSTER_NAME \ --location LOCATION \ --addons=RayOperator \ --cluster-version=1.33 \ --machine-type=n1-standard-16Substitua o seguinte:
CLUSTER_NAME: o nome do novo cluster.LOCATION: a região onde a sua capacidade da TPU Trillium está disponível. Para mais informações, consulte o artigo Disponibilidade de TPUs no GKE.
A criação do cluster pode demorar vários minutos.
Para comunicar com o cluster, configure o seguinte:
kubectlgcloud container clusters get-credentials CLUSTER_NAME --location=LOCATIONPode criar um conjunto de nós de segmentação do TPU de host único ou de vários hosts:
Anfitrião único
No Cloud Shell, execute o seguinte comando:
gcloud container node-pools create v6e-4 \
--location=us-central2-b \
--cluster=CLUSTER_NAME \
--machine-type=ct6e-standard-4t \
--num-nodes=1 \
--threads-per-core=1 \
--tpu-topology=2x2
Vários anfitriões
No Cloud Shell, execute o seguinte comando:
gcloud container node-pools create v6e-16 \
--location=us-central2-b \
--cluster=CLUSTER_NAME \
--machine-type=ct6e-standard-4t \
--num-nodes=4 \
--threads-per-core=1 \
--tpu-topology=4x4
Execute um recurso personalizado RayJob
Ao definir um manifesto RayJob, indica ao KubeRay que faça o seguinte:
- Criar um RayCluster: a especificação RayJob inclui um
rayClusterSpecque define a configuração do cluster Ray (grupos principais e de trabalho) que quer. - Executar uma tarefa específica: o campo
entrypointno RayJob especifica o comando ou o script a executar no cluster Ray criado. Neste tutorial, oentrypointé um script Python (tpu_list_devices.py) concebido para validar a inicialização da TPU Trillium.
Para criar um recurso personalizado RayJob, conclua os seguintes passos:
Anfitrião único
Crie o seguinte manifesto
ray-job.tpu-v6e-singlehost.yaml:Aplique o manifesto:
kubectl apply -f ray-job.tpu-v6e-singlehost.yamlVerifique se o RayJob foi criado e está em execução:
kubectl get rayjobs v6e-4-jobO resultado é semelhante ao seguinte:
NAME JOB STATUS DEPLOYMENT STATUS RAY CLUSTER NAME START TIME END TIME AGE v6e-4-job PENDING Running v6e-4-job-raycluster 2024-10-15T23:15:22Z 20sImprima a saída do RayJob.
kubectl logs -l=job-name=v6e-4-jobO resultado é semelhante ao seguinte:
2024-10-15 16:15:40,222 INFO cli.py:300 -- ray job stop v6e-4-job-hzq5q 2024-10-15 16:15:40,246 INFO cli.py:307 -- Tailing logs until the job exits (disable with --no-wait): 2024-10-15 16:15:40,112 INFO job_manager.py:528 -- Runtime env is setting up. 2024-10-15 16:15:50,181 INFO worker.py:1461 -- Using address 10.84.1.25:6379 set in the environment variable RAY_ADDRESS 2024-10-15 16:15:50,181 INFO worker.py:1601 -- Connecting to existing Ray cluster at address: 10.84.1.25:6379... 2024-10-15 16:15:50,186 INFO worker.py:1777 -- Connected to Ray cluster. View the dashboard at 10.84.1.25:8265 ['TPU cores:4'] 2024-10-15 16:16:12,349 SUCC cli.py:63 -- ------------------------------------- 2024-10-15 16:16:12,349 SUCC cli.py:64 -- Job 'v6e-4-job-hzq5q' succeeded 2024-10-15 16:16:12,349 SUCC cli.py:65 -- -------------------------------------
Vários anfitriões
Crie o seguinte manifesto
ray-job.tpu-v6e-multihost.yaml:Aplique o manifesto:
kubectl apply -f ray-job.tpu-v6e-multihost.yamlVerifique se o RayJob v6e-16 foi criado e está em execução:
kubectl get rayjobs v6e-16-jobO resultado é semelhante ao seguinte:
NAME JOB STATUS DEPLOYMENT STATUS RAY CLUSTER NAME START TIME END TIME AGE v6e-16-job Running v6e-16-job-raycluster-qr6vk 2024-10-16T19:28:19Z 66sImprima o resultado do RayJob v6e-16:
kubectl logs -l=job-name=v6e-16-jobO resultado é semelhante ao seguinte:
2024-10-16 12:21:33,986 INFO cli.py:300 -- ray job stop v6e-16-job-z44s7 2024-10-16 12:21:34,011 INFO cli.py:307 -- Tailing logs until the job exits (disable with --no-wait): 2024-10-16 12:21:33,826 INFO job_manager.py:528 -- Runtime env is setting up. 2024-10-16 12:21:46,327 INFO worker.py:1461 -- Using address 10.84.1.61:6379 set in the environment variable RAY_ADDRESS 2024-10-16 12:21:46,327 INFO worker.py:1601 -- Connecting to existing Ray cluster at address: 10.84.1.61:6379... 2024-10-16 12:21:46,333 INFO worker.py:1777 -- Connected to Ray cluster. View the dashboard at 10.84.1.61:8265 ['TPU cores:16', 'TPU cores:16', 'TPU cores:16', 'TPU cores:16'] 2024-10-16 12:22:12,156 SUCC cli.py:63 -- --------------------------------- 2024-10-16 12:22:12,156 SUCC cli.py:64 -- Job 'v6e-16-job-z44s7' succeeded 2024-10-16 12:22:12,156 SUCC cli.py:65 -- ---------------------------------
Veja o RayJob no painel de controlo do Ray
Verifique se o GKE criou o serviço RayCluster e ligue-se também à instância do RayCluster.
Anfitrião único
Recupere o nome do RayCluster gerado para o RayJob:
export RAYCLUSTER_NAME=$(kubectl get rayjob v6e-4-job -o jsonpath='{.status.rayClusterName}')Recupere o nome do serviço principal do RayCluster:
export HEAD_SVC=$(kubectl get svc -l ray.io/cluster=$RAYCLUSTER_NAME,ray.io/node-type=head -o jsonpath='{.items[0].metadata.name}')Estabeleça ligação ao painel de controlo do Ray encaminhando a porta do serviço principal:
kubectl port-forward svc/$HEAD_SVC 8265:8265 2>&1 >/dev/null &Abra um navegador de Internet e introduza o seguinte URL:
http://localhost:8265/#/jobsVeja o estado do RayJob e os registos relevantes.
Vários anfitriões
Recupere o nome do RayCluster gerado para o RayJob:
export RAYCLUSTER_NAME=$(kubectl get rayjob v6e-16-job -o jsonpath='{.status.rayClusterName}')Recupere o nome do serviço principal do RayCluster:
export HEAD_SVC=$(kubectl get svc -l ray.io/cluster=$RAYCLUSTER_NAME,ray.io/node-type=head -o jsonpath='{.items[0].metadata.name}')Estabeleça ligação ao painel de controlo do Ray encaminhando a porta do serviço principal:
kubectl port-forward svc/$HEAD_SVC 8265:8265 2>&1 >/dev/null &Abra um navegador de Internet e introduza o seguinte URL:
http://localhost:8265/#/jobsVeja o estado do RayJob e os registos relevantes.
O Ray define um recurso TPU-{accelerator}-Head para identificar o nó de trabalho do Ray que corresponde ao valor TPU_WORKER_ID=0. No grupo de TPUs com vários anfitriões, o nó do Ray com TPU_WORKER_ID=0 tem TPU-v6e-16-head: 1.0 definido nos respetivos recursos. Esta variável de ambiente TPU_WORKER_ID é definida por um webhook de mutação do GKE para o KubeRay.
Limpar
Depois de concluir o tutorial, para evitar a ocorrência de cobranças indesejadas na sua conta, elimine o RayJob:
Anfitrião único
kubectl delete rayjobs v6e-4-job
Vários anfitriões
kubectl delete rayjobs v6e-16-job
O que se segue?
- Saiba mais sobre o Ray no Kubernetes.
- Saiba como servir vLLM no GKE com TPUs.
- Saiba como publicar o SDXL no GKE com TPUs.
- Saiba mais acerca das TPUs no GKE.