En este instructivo, se muestra cómo implementar y entregar
DeepSeek-R1
(deepseek-ai/DeepSeek-R1), un modelo de mezcla de expertos de 671,000 millones de parámetros
con 37,000 millones de parámetros activos, en Google Kubernetes Engine (GKE) en
Google Cloud. La implementación usa Cluster Toolkit, dos instancias de máquina virtual (VM)
A4 (a4-highgpu-8g)
multihost con un total de 16 GPUs NVIDIA B200 y el
framework de entrega de vLLM.
En la configuración de implementación que se describe en este instructivo, usarás
Cluster Toolkit para aprovisionar un clúster de GKE en
modo estándar. El clúster tiene dos nodos a4-highgpu-8g conectados a través de
la red de acceso remoto directo a memoria (RDMA) de GPUDirect. Luego, almacena en etapa intermedia los
pesos del modelo en Cloud Storage y usa la API de JobSet de Kubernetes y Ray para
entregar el modelo en las 16 GPU NVIDIA B200 con paralelismo de tensores, paralelismo
de expertos y una caché de KV de FP8.
Objetivos
- Instala Cluster Toolkit y aprovisiona un clúster de GKE de A4 con varios hosts en el modo estándar.
- Almacena en etapa intermedia las ponderaciones del modelo DeepSeek-R1 en un bucket de Cloud Storage.
- Implementa un servidor de inferencia de vLLM de varios hosts con JobSet y Ray en dos nodos A4, con un total de 16 GPUs NVIDIA B200.
- Envía una solicitud de finalización de chat al servidor de vLLM.
- Ejecuta una carga de trabajo de comparativas de entrega.
- Limpia los recursos implementados.
Costos
En este documento, usarás los siguientes componentes facturables de Google Cloud:
Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios.
Antes de comenzar
Configura tu entorno para el instructivo:
- Instala y, luego, inicializa Google Cloud CLI, y, luego, instala
kubectl. Si usas Cloud Shell, ambas herramientas están preinstaladas. - Si ejecutas este instructivo desde una estación de trabajo de Linux o macOS en lugar de Cloud Shell, instala las dependencias de Cluster Toolkit necesarias (como Terraform y Git).
Habilita la API de Kubernetes Engine, la API de Compute Engine, la API de Cloud Storage, la API de Artifact Registry y la API de Service Usage en tu proyecto de Google Cloud :
Obtén un token de acceso de Hugging Face
Necesitas un token de acceso de Hugging Face para usar este instructivo. Puedes registrarte para obtener una cuenta gratuita en Hugging Face. Después de tener una cuenta, genera un token de acceso:
- En la página Welcome to Hugging Face, haz clic en el avatar de tu cuenta y selecciona Tokens de acceso.
- En la página Tokens de acceso, haz clic en Crear token nuevo.
- Selecciona el tipo de token Lectura y, luego, ingresa un nombre para el token.
- Se mostrará tu token de acceso. Guarda el token en un lugar seguro.
Roles obligatorios
Si quieres obtener los permisos que necesitas para completar este instructivo, pídele a tu administrador que te otorgue los siguientes roles de IAM en tu proyecto:
- Administrador de Kubernetes Engine (
roles/container.admin) - Administrador de Compute (
roles/compute.admin) - Administrador de almacenamiento (
roles/storage.admin) - Administrador de IAM de proyecto (
roles/resourcemanager.projectIamAdmin) - Administrador de cuenta de servicio (
roles/iam.serviceAccountAdmin) - Usuario de la cuenta de servicio (
roles/iam.serviceAccountUser) - Consumidor de Service Usage (
roles/serviceusage.serviceUsageConsumer)
Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.
También puedes obtener los permisos necesarios a través de roles personalizados o cualquier otro rol predefinido.
Configura tus variables de entorno
Configura la autenticación y las variables de entorno para el instructivo:
Configura la autenticación:
Exporta las variables de entorno que usarás en este instructivo:
Reemplaza lo siguiente:
YOUR_PROJECT_ID: Es el ID de tu proyecto de Google Cloud .YOUR_REGION: Es la región de procesamiento en la que se encuentra tu capacidad de A4 y en la que deseas implementar tu clúster, comous-central1.YOUR_ZONE: Es la zona de procesamiento en la que se encuentra tu capacidad de A4, comous-central1-b.YOUR_CLUSTER_NAME: Es el nombre de tu clúster de GKE y de la implementación de Cluster Toolkit. Usa un nombre de 20 caracteres o menos para que el ID de cuenta de servicio del grupo de nodos generado (YOUR_CLUSTER_NAME-gke-np-sa) se mantenga dentro del límite de 30 caracteres de Identity and Access Management (IAM).YOUR_RESERVATION_NAME: Es el nombre de tu reserva de A4 o la ruta de acceso del bloque de reserva extendido en el formatoRESERVATION_NAME/reservationBlocks/RESERVATION_BLOCK_NAME.YOUR_HF_TOKEN: Es tu token de acceso de Hugging Face.YOUR_GCS_BUCKET: un nombre único a nivel global para el bucket de Cloud Storage en el que almacenas en etapa intermedia los pesos del modelo. La secuencia de comandos también estableceTERRAFORM_BUCKETenYOUR_GCS_BUCKET-tf-statepara almacenar el estado de Terraform para Cluster Toolkit.
La secuencia de comandos también establece
CLUSTER_TOOLKIT_VERSIONenv1.104.0, lo que especifica la versión de Cluster Toolkit que se instalará. La versiónv1.104.0y las posteriores de Cluster Toolkit incluyen opciones integradas de consumo de capacidad paraexamples/gke-a4/gke-a4-deployment.yaml. En las versiones anteriores a lav1.104.0, debes agregar estas opciones de capacidad de forma manual.
Crea el clúster de GKE
Descarga Cluster Toolkit y aprovisiona un clúster de GKE en
modo estándar con dos nodos a4-highgpu-8g, redes de RDMA de GPUDirect
y el controlador de JobSet:
Descarga y extrae el paquete de Cluster Toolkit compilado previamente para la versión especificada en
CLUSTER_TOOLKIT_VERSION(v1.104.0), cambia tu directorio de trabajo al directoriocluster-toolkity verifica la versión del objeto binario:De manera opcional, consulta los comandos y las marcas disponibles en Cluster Toolkit:
Crea el bucket de Cloud Storage que almacena el estado de Terraform para tu implementación de Cluster Toolkit:
Crea el archivo de configuración de implementación de
examples/gke-a4/gke-a4-deployment.yamlpara dos nodos dea4-highgpu-8g:De forma predeterminada, el plano
examples/gke-a4/gke-a4.yamlestá configurado para usar una reserva específica. Si no tienes una reserva específica, puedes editarexamples/gke-a4/gke-a4.yamlantes de implementar el clúster para usar una de las siguientes opciones de consumo:- Capacidad de Spot: Asegúrate de que tu proyecto tenga suficiente
cuota interrumpible para tus GPU,
discos y CPU. En la parte inferior de
examples/gke-a4/gke-a4.yaml, marca como comentario la sección--- Option 1: Specific Reservation ---y quita el comentario de la sección--- Option 4: Spot ---. - VMs de inicio flexible: Asegúrate de que tu proyecto tenga suficiente
cuota interrumpible
para tus GPUs, discos y CPUs. En la parte inferior de
examples/gke-a4/gke-a4.yaml, marca como comentario la sección--- Option 1: Specific Reservation ---y quita el comentario de la sección--- Option 2: DWS Flex Start ---.
- Capacidad de Spot: Asegúrate de que tu proyecto tenga suficiente
cuota interrumpible para tus GPU,
discos y CPU. En la parte inferior de
Implementa el clúster de GKE con el comando
gcluster deploy:La creación de clústeres tarda entre 30 y 45 minutos aproximadamente. Si ejecutas
./gcluster deploysin la marca--auto-approve, para aplicar los cambios propuestos, ingresaacuando se te solicite. Cuando finaliza la implementación, el resultado termina con un mensaje similar al siguiente:Apply complete! Resources: 80 added, 0 changed, 0 destroyed.Configura las credenciales de
kubectlpara comunicarte con tu clúster:
Almacena las ponderaciones del modelo en Cloud Storage
Descarga los pesos de DeepSeek-R1 en la SSD local de uno de tus nodos A4 y transfiérelos a un bucket de Cloud Storage para transmitirlos con rapidez entre nodos:
Descarga los archivos de manifiesto de Kubernetes para el trabajo de descarga del modelo, el servidor de inferencia de vLLM y los Pods de comparativas:
Crea el bucket de Cloud Storage con acceso uniforme a nivel de bucket para almacenar las ponderaciones del modelo:
Otorga permisos de IAM en el bucket a la cuenta de servicio predeterminada de Kubernetes, la cuenta de servicio predeterminada de Compute Engine y la cuenta de servicio del grupo de nodos del clúster (
${CLUSTER_NAME}-gke-np-sa):Los permisos de IAM que otorga la secuencia de comandos anterior incluyen el rol de lector de buckets heredados de Storage (
roles/storage.legacyBucketReader), que es necesario para--load-format runai_streamer.Crea un Secret de Kubernetes llamado
hf-secretpara almacenar tu token de acceso de Hugging Face:Revisa el manifiesto
download_model.yamlo crea el archivo de forma local si no lo descargaste antes:Sustituye el nombre de tu bucket de Cloud Storage en el manifiesto
download_model.yamly, luego, inicia el trabajo de descarga del modelo:Espera a que se inicie el Pod de descarga y, luego, transmite los registros del trabajo:
La descarga del modelo en la SSD de NVMe local del nodo y la carga de las ponderaciones en tu bucket de Cloud Storage tardan entre 30 y 40 minutos aproximadamente.
Una vez que se haya completado el trabajo, verifica que los 163 fragmentos de
.safetensorsestén presentes en tu bucket de Cloud Storage:Borra el trabajo de etapa de pruebas completado:
Implementa el servidor de vLLM de varios hosts
El manifiesto de la carga de trabajo (deepseek_r1_server.yaml) define un Service ClusterIP
(vllm-r1-leader) y un JobSet de Kubernetes (vllm-r1) que coordinan
la entrega de varios hosts en los dos nodos a4-highgpu-8g:
- Líder (
leader): Ejecuta una réplica en un nodo A4 con ocho GPU NVIDIA B200, obtiene el entorno de NCCL/gIB (/usr/local/gib/scripts/set_nccl_env.sh), inicia el nodo principal de Ray en el puerto6379para un clúster de dos nodos y lanzavllm serveen el puerto HTTP8080. El servidor transmite los pesos directamente desdegs://$MODEL_BUCKET/DeepSeek-R1con--load-format runai_streamery carga el asignador de token desde el volumen de Cloud Storage FUSE activado en/models/DeepSeek-R1. Se ejecuta con--tensor-parallel-size 16,--pipeline-parallel-size 1,--distributed-executor-backend ray,--enable-expert-parallel,--kv-cache-dtype fp8_e4m3,--async-schedulingy gráficos de CUDA (FULL_AND_PIECEWISE). - Trabajador (
worker): Ejecuta una réplica sin interfaz gráfica en el segundo nodo A4 con ocho GPUs NVIDIA B200, configura NCCL/gIB y se une al clúster de Ray del líder envllm-r1-leader:6379.
Implementa y supervisa el servidor de vLLM de varios hosts:
Revisa el manifiesto
deepseek_r1_server.yamlo crea el archivo de forma local si no lo descargaste antes:Para escalar esta implementación a más hosts, actualiza los parámetros en
deepseek_r1_server.yaml. Por ejemplo, para escalar a cuatro nodos A4, con un total de 32 GPU NVIDIA B200, establecereplicas: 3en el trabajo replicadoworkery actualiza los argumentos del líder de la siguiente manera:--ray_cluster_size=4--tensor-parallel-size=16--pipeline-parallel-size=2
Sustituye el nombre de tu bucket de Cloud Storage en
deepseek_r1_server.yamly aplica el manifiesto a tu clúster:Supervisa los registros de los Pods líder y trabajador hasta que se complete el inicio del servidor:
Debido a que
kubectl logs -ftransmite registros en primer plano, ejecuta el comando de registros del trabajador en una sesión de terminal independiente si deseas supervisar ambos Pods de forma simultánea. Para detener la transmisión de registros en cualquier momento, presiona Control + C.La transmisión de pesos inicial, la carga del modelo y la captura de grafos de CUDA tardan aproximadamente entre 15 y 20 minutos. Antes de enviar solicitudes, espera hasta que los registros del Pod líder muestren los siguientes mensajes:
(APIServer pid=1) INFO: Started server process [1] (APIServer pid=1) INFO: Waiting for application startup. (APIServer pid=1) INFO: Application startup complete.
Envía solicitudes de inferencia
Envía una solicitud de finalización de chat al servidor de vLLM implementado:
Redirecciona el puerto local
8080al Servicevllm-r1-leaderen segundo plano:Envía una solicitud de finalización de chat al extremo
/v1/chat/completions:
Ejecuta cargas de trabajo de comparativas
Compara el servidor de DeepSeek-R1 implementado con vllm bench serve con una
configuración de 8,192 tokens de entrada y 1,024 tokens de salida (8k/1k):
Revisa el manifiesto
deepseek_r1_8k_1k.yamlo crea el archivo de forma local si no lo descargaste antes:El manifiesto especifica 8,192 tokens de entrada, 1,024 tokens de salida, 1,280 instrucciones y una simultaneidad máxima de 112.
Aplica el manifiesto
deepseek_r1_8k_1k.yaml:Espera a que se inicie el Pod
vllm-bench-8k-1ky, luego, transmite los registros de la comparativa:La comparativa tarda aproximadamente 15 minutos en completarse. Una vez que se complete la comparativa, busca un resultado que contenga métricas como las siguientes:
Output token throughputTotal token throughputTTFTTPOT
Realiza una limpieza
Para evitar que se apliquen cargos adicionales a tu cuenta de Google Cloud por los recursos que se usaron en este instructivo, borra las cargas de trabajo de Kubernetes, el clúster de GKE y tus buckets de Cloud Storage:
Borra los Pods de comparativas, el JobSet y el Service del servidor de vLLM, el Job de descarga del modelo y el Secret de Hugging Face:
Borra el bucket de Cloud Storage que almacena los pesos del modelo en etapa de pruebas:
En el directorio
cluster-toolkit, destruye el clúster de GKE y su infraestructura asociada con el comandogcluster destroy:Borra el bucket de Cloud Storage que almacena el estado de Terraform:
¿Qué sigue?
- Obtén más información sobre vLLM.
- Obtén más información sobre las VMs A4 con GPUs NVIDIA B200.
- Obtén más información sobre Cluster Toolkit.
- Obtén más información para administrar clústeres de GKE optimizados para IA.