Neste tutorial, mostramos como implantar e disponibilizar o
Qwen3-30B-A3B (Qwen/Qwen3-30B-A3B-FP8),
um modelo de mix de especialistas, no Google Kubernetes Engine (GKE). A implantação usa aceleradores TPU v6e (Trillium) de vários hosts e o framework de veiculação de TPU vLLM com TorchTPU (torchtpu) e desagregação de pré-preenchimento e decodificação (DP).
Na configuração de implantação descrita neste tutorial, você provisiona
dois pools de nós ct6e-standard-4t de vários hosts, cada um organizado em uma topologia 2x4
(oito chips de TPU v6e em dois nós por pool de nós, totalizando 16
chips de TPU v6e). Use a API JobSet do Kubernetes e o Ray para fazer o seguinte:
- Execute servidores de pré-preenchimento e decodificação desagregados de vários hosts em frações separadas da TPU v6e com o paralelismo de dados e o paralelismo de especialistas ativados.
- Encaminhar solicitações por um proxy de desagregação.
Para executar um fluxo de trabalho de disponibilização de TorchTPU vLLM de vários hosts semelhante em aceleradores TPU7x (Ironwood) com o modelo Qwen3.5-397B maior, consulte Disponibilizar o Qwen3.5-397B no GKE com TorchTPU vLLM de vários hosts em aceleradores TPU7x.
Objetivos
- Configure o cluster do GKE e os pools de nós de TPU v6e de vários hosts.
- Armazene os pesos do modelo em um bucket do Cloud Storage.
- Implante os servidores de preenchimento, decodificação e proxy do vLLM TorchTPU de vários hosts com o JobSet.
- Executar uma carga de trabalho de comparativo de mercado de exibição e analisar os resultados.
- Fazer a limpeza.
Custos
Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:
Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços.
Ao concluir as tarefas descritas neste documento, é possível evitar o faturamento contínuo excluindo os recursos criados. Para mais informações, consulte Limpeza.
Antes de começar
Configure o ambiente para o tutorial:
Ative a API Kubernetes Engine no projeto do Google Cloud :
Instale e inicialize a Google Cloud CLI e instale
kubectl. Se você usa o Cloud Shell, as duas ferramentas já estão pré-instaladas.Verifique se o projeto tem cota de SSD e cota de endereço IP externo suficientes na região em que a capacidade da TPU está localizada:
No console do Google Cloud , acesse a página Cotas e limites do sistema.
Filtre por SSD de disco permanente (GB) e verifique se você tem cota de SSD suficiente disponível na região de destino.
Filtre por Endereços IPv4 externos regionais em uso e verifique se você tem cota de endereço IP suficiente na região de destino.
Receber um token de acesso do Hugging Face
Você precisa de um token de acesso do Hugging Face para usar este tutorial. Você pode se inscrever para uma conta sem custo financeiro no Hugging Face. Depois de criar uma conta, gere um token de acesso:
- Na página Welcome to Hugging Face, clique no avatar da sua conta e selecione Tokens de acesso.
- Na página Tokens de acesso, clique em Criar novo token.
- Selecione o tipo de token Read e insira um nome para ele.
- Seu token de acesso será exibido. Salve o token em um local seguro.
Funções exigidas
Para conseguir as permissões necessárias para concluir o tutorial, peça ao administrador para conceder a você os seguintes papéis do IAM no seu projeto:
- Administrador do Kubernetes Engine (
roles/container.admin) - Administrador do Compute (
roles/compute.admin) - Administrador de armazenamento (
roles/storage.admin) - Usuário da conta de serviço (
roles/iam.serviceAccountUser)
Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.
Também é possível conseguir as permissões necessárias usando papéis personalizados ou outros papéis predefinidos.
Configurar as variáveis de ambiente
Para configurar as variáveis de ambiente, siga estas etapas:
Configure sua autenticação:
Exporte as variáveis de ambiente que você vai usar neste tutorial:
Substitua:
YOUR_PROJECT_ID: o ID do seu projeto do Google Cloud .YOUR_REGION: a região em que você quer implantar o cluster, comous-central1.YOUR_ZONE: a zona em que você quer implantar os pools de nós da TPU v6e, comous-central1-c.YOUR_CLUSTER_NAME: o nome do cluster do GKE.YOUR_RESERVATION_NAME: se você estiver usando uma reserva, o nome da sua reserva de TPU v6e.YOUR_GCS_BUCKET: o nome do bucket do Cloud Storage que você usa para preparar os pesos do modelo.YOUR_HF_TOKEN: seu token de acesso do Hugging Face.
Se você estiver usando uma imagem de contêiner personalizada do vLLM TorchTPU, substitua o URI de imagem padrão
vllm/vllm-torchtpuna variávelVLLM_IMAGEpelo URI da sua imagem. Para imagens públicas, consulte o repositório vLLM TorchTPU.
Criar o cluster do GKE
Para criar um cluster do GKE no modo Standard e anexar dois pools de nós de TPU v6e de vários hosts para desagregação de pré-preenchimento e decodificação, siga estas etapas:
Crie um cluster regional do GKE com a federação de identidade da carga de trabalho para GKE ativada:
O resultado será o seguinte:
NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS STACK_TYPE asq-v6e us-central1 1.35.7-gke.1027000 35.226.172.84 e2-standard-4 1.35.7-gke.1027000 3 RUNNING IPV4Crie dois pools de nós de TPU v6e de vários hosts, cada um contendo dois nós
ct6e-standard-4t(oito chips de TPU v6e em uma topologia2x4por pool de nós, totalizando 16 chips de TPU v6e):Neste tutorial, usamos a capacidade spot (
--spot). As instâncias que usam essa capacidade podem levar algum tempo para serem criadas após a criação do pool de nós e podem ser interrompidas durante as execuções da carga de trabalho. Também é possível criar os pools de nós usando uma reserva ou VMs flex-start transmitindo as seguintes flags:Reserva específica: crie o pool de nós usando uma reserva específica:
Para saber mais sobre reservas de TPU, consulte Sobre as reservas do Cloud TPU.
VMs flex-start: provisione o pool de nós usando a opção de consumo de início flexível:
Para mais informações, consulte Executar uma carga de trabalho em lote pequena com TPUs e VMs de início flexível.
A saída de cada pool de nós é semelhante a esta:
NAME MACHINE_TYPE DISK_SIZE_GB NODE_VERSION np-0 ct6e-standard-4t 100 1.35.7-gke.1027000Configure as credenciais de
kubectlpara se comunicar com o cluster:
Organizar os pesos do modelo no Cloud Storage
Prepare os pesos do modelo em um bucket do Cloud Storage para as execuções da carga de trabalho:
Crie um bucket do Cloud Storage com acesso uniforme no nível do bucket:
Conceda permissões do Identity and Access Management (IAM) no bucket à conta de serviço padrão do Compute Engine e à conta de serviço padrão do Kubernetes:
Crie um secret do Kubernetes chamado
hf-secretpara armazenar o token de acesso do Hugging Face:Busque o manifesto
download_qwen3_30b.yaml:Como alternativa, crie um arquivo chamado
download_qwen3_30b.yamlcom o seguinte conteúdo:Faça o download dos pesos do modelo
Qwen/Qwen3-30B-A3B-FP8para o volume de preparo e transfira-os para o bucket do Cloud Storage:Essa etapa leva de 5 a 10 minutos para ser concluída.
Aguarde o pod iniciar e monitore os registros do job de download:
Depois que o job for concluído, verifique se todos os 16 fragmentos
.safetensorsestão no bucket do Cloud Storage:Exclua o job de preparo concluído:
Implantar o servidor TorchTPU do vLLM de vários hosts
O manifesto da carga de trabalho (v6e_qwen3_server_multihost_slice.yaml) define um
recurso JobSet do Kubernetes (vllm-qwen3-30b-pd-disagg-v6e) com três
jobs replicados que coordenam a disponibilização de pré-preenchimento e decodificação desagregados nos
dois pools de nós de TPU v6e 2x4:
Servidor de preenchimento prévio (
prefill): executa duas réplicas em um pool de nós de TPU v6e2x4(dois nósct6e-standard-4tcom quatro chips por host, totalizando oito núcleos de TPU). Os pods formam um cluster do Ray de dois nós e iniciam o vLLM TorchTPU na porta8000paraQwen/Qwen3-30B-A3B-FP8. O servidor usaTPURaidenConnectorconfigurado comokv_producercom as seguintes flags:--data-parallel-size=8--tensor-parallel-size=1--enable-expert-parallel--load-format=runai_streamer
Servidor de decodificação (
decode): executa duas réplicas no segundo pool de nós de TPU v6e2x4(oito núcleos de TPU no total). O JobSet usa regras de afinidade e antiafinidade de pods no rótulocloud.google.com/gke-nodepoolpara isolar o preenchimento prévio e a decodificação em pools de nós separados. Os pods formam um cluster do Ray de dois nós e iniciam o vLLM TorchTPU na porta7200comTPURaidenConnectorconfigurado comokv_consumer.Proxy de desagregação (
proxy): executa o scripttoy_proxy_server.pyna porta10000para coordenar o roteamento de solicitações e a transferência de cache de KV entre o servidor de preenchimento prévio (porta8000) e o servidor de decodificação (porta7200).
Para implantar e monitorar os servidores vLLM desagregados, siga estas etapas:
Instale o CustomResourceDefinition e o controlador do JobSet do Kubernetes no cluster:
Busque o manifesto do servidor:
Como alternativa, crie um arquivo chamado
v6e_qwen3_server_multihost_slice.yamlcom o seguinte conteúdo:Substitua o nome do bucket do Cloud Storage e a imagem do contêiner no arquivo
v6e_qwen3_server_multihost_slice.yamle aplique o manifesto:Essa configuração usa uma fração de TPU v6e
2x4(dois nós) para pré-preenchimento e uma fração de TPU v6e2x4(dois nós) para decodificação. Para escalonar o número de nós em qualquer pool, atualize o camporeplicas(replicas: NUM_NODES). SubstituaNUM_NODESpelo número de nós que você quer usar.Monitore os registros de pod de preenchimento prévio e decodificação até que a inicialização do aplicativo seja concluída:
O carregamento e a compilação iniciais do modelo levam de 15 a 25 minutos na primeira execução.
Se você estiver usando capacidade preemptiva, como capacidade spot ou VMs flex-start, pode levar mais tempo após a criação do pool de nós para que os nós de fração de TPU sejam criados, e eles podem ser interrompidos durante as execuções de carga de trabalho. Para mais detalhes, consulte Instâncias de VM preemptivas. Para verificar se os nós de fração de TPU foram criados, consulte Verificar o status e as condições do nó.
Aguarde até que os registros do servidor de preenchimento prévio e decodificação informem
Application startup completeantes de executar a carga de trabalho de comparativo de mercado:(APIServer pid=1) INFO: Started server process [1] (APIServer pid=1) INFO: Waiting for application startup. (APIServer pid=1) INFO: Application startup complete.
Executar uma carga de trabalho de comparativo de mercado
Para comparar o modelo Qwen3-30B-A3B implantado usando uma carga de trabalho de entrada de 8.192 tokens e
saída de 1.024 tokens (8k/1k) com o proxy de desagregação, siga
estas etapas:
Busque o manifesto de comparativo de mercado:
Como alternativa, crie um arquivo chamado
v6e_qwen3_benchmark_multihost_slice.yamlcom o seguinte conteúdo:Aplique o manifesto do job de comparativo de mercado:
Aguarde até que o pod de comparativo de mercado esteja pronto e monitore os registros do job de comparativo de mercado:
Depois que o comparativo de mercado for concluído, procure uma saída que contenha métricas como as seguintes:
Output token throughputTotal token throughputTTFTTPOT
Limpar
Para evitar cobranças na sua conta do Google Cloud pelos recursos usados neste tutorial, exclua as cargas de trabalho do Kubernetes, os pools de nós da TPU v6e, o cluster do GKE e o bucket do Cloud Storage:
Exclua as cargas de trabalho do Kubernetes:
Exclua os pools de nós da TPU v6e e o cluster do GKE:
Exclua o bucket do Cloud Storage que armazena os pesos do modelo em etapas. Se você quiser manter os pesos do modelo, pule esta etapa ou copie-os para o local de sua preferência:
A seguir
- Saiba mais sobre o vLLM no Cloud TPU.
- Saiba mais sobre a TPU v6e (Trillium).
- Saiba mais sobre o Cloud TPU.