Este tema describe las mejores prácticas para desplegar el modelo de la versión completa de DeepSeek en varios nodos de Alibaba Cloud Container Service for Kubernetes (ACK). El objetivo es lograr un rendimiento, una escalabilidad y una confiabilidad óptimos.
Contexto
Descripción general de DeepSeek
DeepSeek es una serie de modelos de lenguaje grandes desarrollados por DeepSeek. Los modelos de la versión completa de DeepSeek admiten los modos de pensamiento híbrido y de pensamiento exclusivo. Estos proporcionan capacidades avanzadas de razonamiento para tareas complejas. Dichos modelos son especialmente adecuados para escenarios que requieren un análisis profundo y resolución de problemas.
Los modelos de DeepSeek compatibles incluyen:
Modelos de pensamiento híbrido (deshabilitados de forma predeterminada): deepseek-v3.2, deepseek-v3.2-exp, deepseek-v3.1
Modelos de pensamiento exclusivo: deepseek-r1, deepseek-r1-0528, modelos destilados de deepseek-r1
Nota: Actualmente, los modelos de DeepSeek solo están disponibles en la región Beijing.
Beneficios del despliegue distribuido en ACK
Desplegar los modelos de DeepSeek en varios nodos de ACK ofrece varias ventajas:
Escalabilidad: escale los recursos de cómputo de forma dinámica según la demanda de la carga de trabajo.
Alta disponibilidad: distribuya las cargas de trabajo en varios nodos para eliminar puntos únicos de falla.
Optimización de recursos: utilice de manera eficiente los recursos de GPU en todo el clúster.
Rendimiento: reduzca la latencia mediante un load balancer inteligente y la programación por proximidad.
Requisitos previos
-
Cree un clúster administrado de ACK (edición Pro) con nodos de GPU. La versión de Kubernetes del clúster debe ser 1.22 o posterior.
Asegúrese de que el clúster contenga nodos con GPU de NVIDIA compatibles (se recomiendan A10, V100 o A100). Utilice la versión 525 del controlador de NVIDIA para obtener un rendimiento óptimo.
Asegúrese de contar con permisos suficientes para crear y gestionar recursos de Kubernetes, incluidos deployments, services y volúmenes persistentes.
Configure Object Storage Service (OSS) para el almacenamiento y la caché del modelo. Cree un bucket para almacenar los pesos del modelo y los archivos de configuración.
Establezca las políticas de red y los security groups adecuados. Esto permite la comunicación entre nodos y el acceso externo al servicio de inference.
Principios de diseño de arquitectura
Estrategia de despliegue en varios nodos
Al desplegar los modelos de DeepSeek en varios nodos, considere los siguientes enfoques arquitectónicos:
Enfoque de Horizontal Pod Autoscaler (HPA)
Despliegue varias réplicas del servicio de inference de DeepSeek en distintos nodos. Esto permite que Kubernetes escale automáticamente con base en métricas de CPU, memoria o personalizadas.
Afinidad y antiafinidad de nodos
Utilice reglas de afinidad de nodos para garantizar una distribución óptima de los pods de DeepSeek en distintos nodos y zonas de disponibilidad:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: NotIn
values:
- node-1
- node-2
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchLabels:
app: deepseek-inference
topologyKey: kubernetes.io/hostname
Gestión de recursos
Configure las solicitudes y los límites de recursos adecuados para los pods de DeepSeek:
resources:
requests:
cpu: "4"
memory: "16Gi"
nvidia.com/gpu: "1"
limits:
cpu: "8"
memory: "32Gi"
nvidia.com/gpu: "1"
Pasos de despliegue
Paso 1: Preparar el modelo de DeepSeek
-
Descargue los archivos del modelo de DeepSeek en su bucket de OSS:
#!/bin/bash # Download DeepSeek model from ModelScope git lfs install git clone https://www.modelscope.cn/deepseek-ai/DeepSeek-V3.2.git /tmp/deepseek-v3.2 # Upload to OSS ossutil cp -r /tmp/deepseek-v3.2 oss://your-bucket/models/deepseek-v3.2/ -
Optimice el modelo para inference con TensorRT-LLM (opcional, pero recomendado para mejorar el rendimiento):
cd /workspace/tensorrt_llm/examples/deepseek python convert_checkpoint.py \ --model_dir /models/deepseek-v3.2 \ --output_dir /models/deepseek-v3.2-trtllm \ --dtype float16
Paso 2: Configurar el almacenamiento y la caché
-
Cree un Dataset de Fluid para cargar el modelo de manera eficiente:
apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: deepseek-models spec: mounts: - mountPoint: oss://your-bucket/models/ name: models path: / options: fs.oss.endpoint: oss-cn-beijing.aliyuncs.com encryptOptions: - name: fs.oss.accessKeyId valueFrom: secretKeyRef: name: oss-secret key: accessKeyId - name: fs.oss.accessKeySecret valueFrom: secretKeyRef: name: oss-secret key: accessKeySecret -
Configure JindoRuntime para la caché:
apiVersion: data.fluid.io/v1alpha1 kind: JindoRuntime metadata: name: deepseek-models spec: replicas: 3 tieredstore: levels: - mediumtype: MEM volumeType: emptyDir path: /dev/shm quota: 50Gi high: "0.95" low: "0.7"
Paso 3: Desplegar el servicio de inference
-
Cree un deployment de Kubernetes con varias réplicas:
apiVersion: apps/v1 kind: Deployment metadata: name: deepseek-inference spec: replicas: 3 selector: matchLabels: app: deepseek-inference template: metadata: labels: app: deepseek-inference spec: containers: - name: deepseek-server image: registry.cn-beijing.aliyuncs.com/your-registry/deepseek-inference:latest ports: - containerPort: 8000 env: - name: MODEL_PATH value: "/models/deepseek-v3.2" - name: ENABLE_THINKING value: "true" resources: requests: cpu: "4" memory: "16Gi" nvidia.com/gpu: "1" limits: cpu: "8" memory: "32Gi" nvidia.com/gpu: "1" volumeMounts: - name: model-storage mountPath: /models volumes: - name: model-storage persistentVolumeClaim: claimName: deepseek-models affinity: podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchLabels: app: deepseek-inference topologyKey: kubernetes.io/hostname -
Cree un service de tipo load balancer:
apiVersion: v1 kind: Service metadata: name: deepseek-inference-service spec: selector: app: deepseek-inference ports: - protocol: TCP port: 80 targetPort: 8000 type: LoadBalancer
Paso 4: Configurar el escalado automático
-
Configure Horizontal Pod Autoscaler:
apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: deepseek-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: deepseek-inference minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70 - type: Resource resource: name: memory target: type: Utilization averageUtilization: 80 -
Establezca métricas personalizadas para la utilización de la GPU (opcional):
# Custom metric for GPU utilization - type: Pods pods: metric: name: gpu_utilization target: type: AverageValue averageValue: "75"
Monitoreo y optimización
Configuración del monitoreo
Implemente un monitoreo integral para su despliegue de DeepSeek:
Métricas de Prometheus para la utilización de CPU, memoria y GPU.
Paneles de Grafana para la visualización en tiempo real.
Registro centralizado con Fluentd o Logstash.
Seguimiento distribuido con Jaeger para analizar el flujo de las solicitudes.
Técnicas de optimización del rendimiento
Aplique estas estrategias de optimización para mejorar el rendimiento:
Procesamiento por lotes de solicitudes
Configure el procesamiento por lotes para aumentar el rendimiento:
env:
- name: MAX_BATCH_SIZE
value: "8"
- name: BATCH_TIMEOUT_MS
value: "100"
Estrategias de caché del modelo
Utilice una caché multinivel para reducir el tiempo de carga del modelo:
Caché basada en RAM para las partes del modelo a las que se accede con frecuencia.
Caché en SSD NVMe para componentes más grandes del modelo.
Redis o Memcached para compartir datos entre nodos.
Pool de conexiones
Implemente un pool de conexiones para reducir la sobrecarga:
env:
- name: CONNECTION_POOL_SIZE
value: "50"
- name: KEEP_ALIVE_TIMEOUT
value: "300"
Mejores prácticas
Planificación de recursos
Asignación de GPU: asigne GPU dedicadas por cada instancia de DeepSeek para evitar la contención de recursos.
Dimensionamiento de memoria: reserve como mínimo el doble del tamaño del modelo en RAM para obtener un rendimiento óptimo.
Núcleos de CPU: asigne de 4 a 8 núcleos de CPU por cada instancia de GPU para las tareas de preprocesamiento.
Estrategias de escalado
Escalado gradual: escale de forma incremental con base en los patrones reales de carga, en lugar de estimaciones máximas.
Distribución por zonas: distribuya las réplicas en varias zonas de disponibilidad para garantizar tolerancia a fallas.
Periodos de calentamiento: implemente un aumento gradual del tráfico durante los eventos de escalado.
Optimización de costos
Instancias spot: utilice instancias preemptible para cargas de trabajo de inference no críticas.
Límites de escalado automático: establezca límites mínimos y máximos adecuados para equilibrar el rendimiento y el costo.
Apagado por inactividad: implemente el apagado automático durante los periodos de bajo uso.
Consideraciones de seguridad
Políticas de red: restrinja la comunicación entre pods mediante las Network Policies de Kubernetes.
Cifrado TLS: habilite TLS para todas las comunicaciones externas.
RBAC: implemente el control de acceso basado en roles para los recursos del clúster.
Gestión de secretos: utilice Kubernetes Secrets o almacenes externos para gestionar las credenciales.
Solución de problemas
Problemas comunes y soluciones
Errores de falta de memoria en la GPU
Síntomas: errores de CUDA por falta de memoria durante la inference.
Soluciones:
Reduzca el tamaño del lote.
Aumente la asignación de memoria de la GPU.
Habilite la cuantización del modelo.
Utilice paralelismo de modelos en varias GPU.
Rendimiento lento de inference
Síntomas: alta latencia y tiempos de respuesta lentos.
Soluciones:
Compruebe las métricas de utilización de la GPU.
Optimice el modelo con TensorRT-LLM.
Implemente el procesamiento por lotes de solicitudes.
Revise la conectividad de red entre los nodos.
Problemas con el escalado automático
Síntomas: los pods no se inician ni escalan correctamente.
Soluciones:
Compruebe las cuotas y los límites de recursos.
Verifique la disponibilidad de recursos en los nodos.
Revise las reglas de afinidad y antiafinidad.
Supervise los registros del escalador automático del clúster.
Comandos de diagnóstico
Comandos útiles para solucionar problemas:
# Check pod status and resource usage
kubectl top pods -l app=deepseek-inference
# View detailed pod information
kubectl describe pod -l app=deepseek-inference
# Check GPU utilization
kubectl exec -it <pod-name> -- nvidia-smi
# Monitor logs
kubectl logs -f -l app=deepseek-inference --tail=100
# Check HPA status
kubectl get hpa deepseek-hpa
# Verify service endpoints
kubectl get endpoints deepseek-inference-service