Neste tutorial, mostramos como implantar e disponibilizar o
DeepSeek-R1
(deepseek-ai/DeepSeek-R1), um modelo de Mix de Especialistas de 671 bilhões de parâmetros
com 37 bilhões de parâmetros ativos, no Google Kubernetes Engine (GKE) em
Google Cloud. A implantação usa o Cluster Toolkit, duas instâncias de máquina virtual (VM)
A4 (a4-highgpu-8g)
com vários hosts e um total de 16 GPUs NVIDIA B200, além do
framework de exibição vLLM.
Na configuração de implantação descrita neste tutorial, use o
Cluster Toolkit para provisionar um cluster do GKE no
modo Standard. O cluster tem dois nós a4-highgpu-8g conectados pela rede de acesso direto à memória remota (RDMA) do GPUDirect. Em seguida, você prepara os
pesos do modelo no Cloud Storage e usa a API JobSet do Kubernetes e o Ray para
disponibilizar o modelo em todas as 16 GPUs NVIDIA B200 com paralelismo de tensor, paralelismo
de especialista e um cache KV FP8.
Objetivos
- Instale o Cluster Toolkit e provisione um cluster do GKE A4 de vários hosts no modo padrão.
- Armazene os pesos do modelo DeepSeek-R1 em um bucket do Cloud Storage.
- Implantar um servidor de inferência vLLM de vários hosts com JobSet e Ray em dois nós A4, com um total de 16 GPUs NVIDIA B200.
- Envie uma solicitação de conclusão de chat para o servidor vLLM.
- Executar uma carga de trabalho de comparativo de mercado de exibição.
- Limpe os recursos implantados.
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.
Antes de começar
Configure o ambiente para o tutorial:
- Instale e inicialize a
Google Cloud CLI e instale
kubectl. Se você usa o Cloud Shell, as duas ferramentas já estão pré-instaladas. - Se você estiver executando este tutorial em uma estação de trabalho Linux ou macOS em vez do Cloud Shell, instale as dependências do Cluster Toolkit necessárias (como Terraform e Git).
Ative as API Kubernetes Engine, Compute Engine, Cloud Storage, API Artifact Registry e API Service Usage no projeto do Google Cloud :
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) - Administrador de projetos do IAM (
roles/resourcemanager.projectIamAdmin) - Administrador da conta de serviço (
roles/iam.serviceAccountAdmin) - Usuário da conta de serviço (
roles/iam.serviceAccountUser) - Consumidor do Service Usage (
roles/serviceusage.serviceUsageConsumer)
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
Configure as variáveis de ambiente e de autenticação para o tutorial:
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 de computação em que sua capacidade A4 está localizada e em que você quer implantar o cluster, comous-central1.YOUR_ZONE: a zona do Compute em que sua capacidade A4 está localizada, comous-central1-b.YOUR_CLUSTER_NAME: o nome do cluster do GKE e da implantação do Cluster Toolkit. Use um nome com até 20 caracteres para que o ID da conta de serviço do pool de nós gerado (YOUR_CLUSTER_NAME-gke-np-sa) permaneça dentro do limite de 30 caracteres do Identity and Access Management (IAM).YOUR_RESERVATION_NAME: o nome da sua reserva de A4 ou o caminho do bloco de reserva estendido no formatoRESERVATION_NAME/reservationBlocks/RESERVATION_BLOCK_NAME.YOUR_HF_TOKEN: seu token de acesso do Hugging Face.YOUR_GCS_BUCKET: um nome globalmente exclusivo para o bucket do Cloud Storage em que você prepara os pesos do modelo. O script também defineTERRAFORM_BUCKETcomoYOUR_GCS_BUCKET-tf-statepara armazenar o estado do Terraform para o Cluster Toolkit.
O script também define
CLUSTER_TOOLKIT_VERSIONcomov1.104.0, que especifica a versão do Cluster Toolkit a ser instalada. A versãov1.104.0e mais recentes do Cluster Toolkit incluem opções integradas de consumo de capacidade paraexamples/gke-a4/gke-a4-deployment.yaml. Em versões anteriores àv1.104.0, é necessário adicionar essas opções de capacidade manualmente.
Criar o cluster do GKE
Faça o download do Cluster Toolkit e provisione um cluster do GKE no
modo Standard com dois nós a4-highgpu-8g, rede GPUDirect RDMA
e o controlador JobSet:
Faça o download e extraia o pacote pré-criado do Cluster Toolkit para a versão especificada em
CLUSTER_TOOLKIT_VERSION(v1.104.0), mude o diretório de trabalho para o diretóriocluster-toolkite verifique a versão binária:Se quiser, confira os comandos e as flags disponíveis no Cluster Toolkit:
Crie o bucket do Cloud Storage que armazena o estado do Terraform para sua implantação do Cluster Toolkit:
Crie o arquivo de configuração de implantação
examples/gke-a4/gke-a4-deployment.yamlpara dois nósa4-highgpu-8g:Por padrão, o blueprint
examples/gke-a4/gke-a4.yamlé configurado para usar uma reserva específica. Se você não tiver uma reserva específica, poderá editarexamples/gke-a4/gke-a4.yamlantes de implantar o cluster para usar uma das seguintes opções de consumo:- Capacidade spot: verifique se o projeto tem cota preemptiva suficiente para as GPUs, os discos e as CPUs. Na parte de baixo de
examples/gke-a4/gke-a4.yaml, comente a seção--- Option 1: Specific Reservation ---e remova a marca de comentário da seção--- Option 4: Spot ---. - VMs flex-start: verifique se o projeto tem cota preemptiva suficiente para as GPUs, os discos e as CPUs. Na parte de baixo de
examples/gke-a4/gke-a4.yaml, comente a seção--- Option 1: Specific Reservation ---e remova a marca de comentário da seção--- Option 2: DWS Flex Start ---.
- Capacidade spot: verifique se o projeto tem cota preemptiva suficiente para as GPUs, os discos e as CPUs. Na parte de baixo de
Implante o cluster do GKE usando o comando
gcluster deploy:A criação do cluster leva aproximadamente de 30 a 45 minutos. Se você executar
./gcluster deploysem a flag--auto-approve, para aplicar as mudanças propostas, insiraaquando solicitado. Quando a implantação terminar, a saída vai terminar com uma mensagem semelhante a esta:Apply complete! Resources: 80 added, 0 changed, 0 destroyed.Configure as credenciais de
kubectlpara se comunicar com o cluster:
Organizar os pesos do modelo no Cloud Storage
Faça o download dos pesos do DeepSeek-R1 no SSD local de um dos nós A4 e transfira-os para um bucket do Cloud Storage para streaming rápido entre nós:
Faça o download dos arquivos de manifesto do Kubernetes para o job de download do modelo, o servidor de inferência vLLM e os pods de comparativo de mercado:
Crie o bucket do Cloud Storage com acesso uniforme no nível do bucket para armazenar os pesos do modelo:
Conceda permissões do IAM no bucket à conta de serviço padrão do Kubernetes, à conta de serviço padrão do Compute Engine e à conta de serviço do pool de nós do cluster (
${CLUSTER_NAME}-gke-np-sa):As permissões do IAM concedidas pelo script anterior incluem o papel de Leitor de bucket legado do Storage (
roles/storage.legacyBucketReader), que é necessário para--load-format runai_streamer.Crie um Secret do Kubernetes chamado
hf-secretpara armazenar o token de acesso do Hugging Face:Revise o manifesto
download_model.yamlou crie o arquivo localmente se você não o tiver baixado anteriormente:Substitua o nome do bucket do Cloud Storage no manifesto
download_model.yamle inicie o job de download do modelo:Aguarde o início do pod de download e transmita os registros do job:
Leva de 30 a 40 minutos para fazer o download do modelo para o SSD NVMe local do nó e fazer upload dos pesos para o bucket do Cloud Storage.
Depois que o job for concluído, verifique se todos os 163 fragmentos
.safetensorsestão presentes no bucket do Cloud Storage:Exclua o job de preparo concluído:
Implantar o servidor vLLM de vários hosts
O manifesto da carga de trabalho (deepseek_r1_server.yaml) define um serviço ClusterIP
(vllm-r1-leader) e um JobSet do Kubernetes (vllm-r1) que coordenam
a exibição de vários hosts nos dois nós a4-highgpu-8g:
- Líder (
leader): executa uma réplica em um nó A4 com oito GPUs NVIDIA B200, origina o ambiente NCCL/gIB (/usr/local/gib/scripts/set_nccl_env.sh), inicia o nó principal do Ray na porta6379para um cluster de dois nós e iniciavllm servena porta HTTP8080. O servidor transmite pesos diretamente dogs://$MODEL_BUCKET/DeepSeek-R1usando--load-format runai_streamere carrega o tokenizador do volume montado do Cloud Storage FUSE em/models/DeepSeek-R1. Ele é executado com--tensor-parallel-size 16,--pipeline-parallel-size 1,--distributed-executor-backend ray,--enable-expert-parallel,--kv-cache-dtype fp8_e4m3,--async-schedulinge gráficos CUDA (FULL_AND_PIECEWISE). - Worker (
worker): executa uma réplica headless no segundo nó A4 com oito GPUs NVIDIA B200, configura o NCCL/gIB e se junta ao cluster do Ray do líder emvllm-r1-leader:6379.
Implante e monitore o servidor vLLM de vários hosts:
Revise o manifesto
deepseek_r1_server.yamlou crie o arquivo localmente se você não tiver feito o download dele antes:Para escalonar essa implantação para mais hosts, atualize os parâmetros em
deepseek_r1_server.yaml. Por exemplo, para escalonar para quatro nós A4, com um total de 32 GPUs NVIDIA B200, definareplicas: 3no job replicadoworkere atualize os argumentos do líder da seguinte maneira:--ray_cluster_size=4--tensor-parallel-size=16--pipeline-parallel-size=2
Substitua o nome do bucket do Cloud Storage em
deepseek_r1_server.yamle aplique o manifesto ao cluster:Monitore os registros dos pods líder e worker até que a inicialização do servidor seja concluída:
Como o
kubectl logs -ftransmite registros em primeiro plano, execute o comando de registros do worker em uma sessão de terminal separada se quiser monitorar os dois pods simultaneamente. Para interromper o streaming de registros a qualquer momento, pressione Control+C.O streaming de peso inicial, o carregamento do modelo e a captura de gráficos CUDA levam aproximadamente de 15 a 20 minutos. Antes de enviar solicitações, aguarde até que os registros do pod líder mostrem as seguintes mensagens:
(APIServer pid=1) INFO: Started server process [1] (APIServer pid=1) INFO: Waiting for application startup. (APIServer pid=1) INFO: Application startup complete.
Enviar solicitações de inferência
Envie uma solicitação de conclusão de chat para o servidor vLLM implantado:
Encaminhe a porta local
8080para o Serviçovllm-r1-leaderem segundo plano:Envie uma solicitação de conclusão de chat para o endpoint
/v1/chat/completions:
Executar cargas de trabalho de comparativo de mercado
Faça um comparativo do servidor DeepSeek-R1 implantado usando vllm bench serve com uma
configuração de 8.192 tokens de entrada e 1.024 tokens de saída (8k/1k):
Revise o manifesto
deepseek_r1_8k_1k.yamlou crie o arquivo localmente se você não tiver feito o download dele antes:O manifesto especifica 8.192 tokens de entrada, 1.024 tokens de saída, 1.280 comandos e uma simultaneidade máxima de 112.
Aplique o manifesto
deepseek_r1_8k_1k.yaml:Aguarde o pod
vllm-bench-8k-1kser iniciado e, em seguida, transmita os registros de comparação:O comparativo de mercado leva cerca de 15 minutos para ser concluído. 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 contínuas adicionais na sua conta do Google Cloud pelos recursos usados neste tutorial, exclua as cargas de trabalho do Kubernetes, o cluster do GKE e os buckets do Cloud Storage:
Exclua os pods de comparativo de mercado, o JobSet e o serviço do servidor vLLM, o job de download do modelo e o secret do Hugging Face:
Exclua o bucket do Cloud Storage que armazena os pesos do modelo em etapas:
No diretório
cluster-toolkit, destrua o cluster do GKE e a infraestrutura associada usando o comandogcluster destroy:Exclua o bucket do Cloud Storage que armazena o estado do Terraform:
A seguir
- Saiba mais sobre o vLLM.
- Saiba mais sobre as VMs A4 com GPUs NVIDIA B200.
- Saiba mais sobre o Cluster Toolkit.
- Saiba mais sobre como gerenciar clusters do GKE otimizados para IA.