En este documento, se explica cómo compilar imágenes de Docker personalizadas para tus clústeres de Slurm en Google Kubernetes Engine (GKE). Puedes extender las imágenes base de Slurm que proporciona GKE para incluir herramientas, bibliotecas o configuraciones adicionales que se requieran para tus cargas de trabajo de computación de alto rendimiento (HPC).
Antes de leer este documento, asegúrate de conocer el complemento de Slurm Operator para GKE.
Antes de comenzar
Antes de comenzar, asegúrate de haber realizado las siguientes tareas:
- Habilita la API de Google Kubernetes Engine. Habilitar la API de Google Kubernetes Engine
- Si deseas usar Google Cloud CLI para esta tarea, instala y, luego, inicializa gcloud CLI. Si ya instalaste la gcloud CLI, ejecuta el comando
gcloud components updatepara obtener la versión más reciente. Es posible que las versiones anteriores de la gcloud CLI no admitan la ejecución de los comandos que se describen en este documento.
Requisitos previos
En este documento, se supone que ya tienes un clúster de Slurm en ejecución en GKE con el complemento de Slurm Operator para GKE instalado. Completa los procedimientos de las siguientes páginas:
- Completa la guía de inicio rápido para implementar un clúster de Slurm en GKE.
- Configura un repositorio de Artifact Registry en tu proyecto para almacenar tus imágenes personalizadas.
Imágenes base de Slurm
GKE proporciona imágenes base de Slurm en el repositorio de Artifact Registry gcr.io/gke-release/. GKE actualiza estas imágenes con frecuencia para mejorar la seguridad y el rendimiento. Estas imágenes vienen en variantes que incluyen las versiones más recientes de Slurm y dos distribuciones de Linux, Ubuntu y Rocky Linux.
Puedes personalizar las siguientes imágenes base:
gcr.io/gke-release/slinky/slurmd: Se usa para los nodos de procesamiento de Slurm.gcr.io/gke-release/slinky/login: Se usa para los nodos de acceso.
Compila una imagen personalizada
En el siguiente ejemplo, se muestra cómo compilar una imagen de procesamiento de Slurm personalizada que incluye un entorno virtual de Python con JAX instalado. También compilas una imagen de acceso correspondiente que refleja la variable de entorno PATH de la imagen de procesamiento sin instalar realmente las bibliotecas de JAX.
Selecciona la versión de la imagen
Cuando selecciones una imagen base, asegúrate de que cumpla con las siguientes condiciones:
- La versión coincide con la versión de Slurm que usan otros componentes de tu clúster de Slurm.
- Para una versión específica de Slurm, elige la etiqueta de la imagen disponible más reciente, que incluye las actualizaciones de seguridad y las correcciones de errores más recientes.
Por ejemplo, si la versión predeterminada de Slurm en tu clúster es 25.11, debes elegir una etiqueta que comience con 25.11-, por ejemplo, 25.11-ubuntu24.04-gke.6.
Crea un Dockerfile
Selecciona una etiqueta de imagen
slurmdbasada en Ubuntu:En la consola de Google Cloud , ve a la página del repositorio de Artifact Registry que incluye el paquete
slinky/slurmd.Busca una imagen con una etiqueta que incluya
ubuntuy coincida con tu versión de Slurm, por ejemplo,25.11-ubuntu24.04-gke.6.Copia la etiqueta. Usas esta etiqueta para reemplazar el marcador de posición
VERSION_TAGen el siguiente archivo de configuración.
Crea un archivo llamado
Dockerfilecon el siguiente contenido:# --- Target 1: The Worker Node (slurmd) --- FROM gcr.io/gke-release/slinky/slurmd:VERSION_TAG AS slurmd-custom USER root # Install minimal requirements for venv RUN apt-get update && apt-get install -y --no-install-recommends \ python3-pip \ python3-venv \ && rm -rf /var/lib/apt/lists/* # Create and populate the virtual environment ENV VIRTUAL_ENV=/opt/custom_venv RUN python3 -m venv ${VIRTUAL_ENV} ENV PATH="${VIRTUAL_ENV}/bin:$PATH" # Install JAX (CPU version for general compatibility) and dependencies RUN pip install --no-cache-dir jax[cpu] numpy # --- Target 2: The Login Node --- FROM gcr.io/gke-release/slinky/login:VERSION_TAG AS login-custom USER root # Mirror the PATH exactly so that the srun command captures it. # Note: You don't need to install the JAX libs here, # but the binary path must exist for the shell to recognize it. ENV VIRTUAL_ENV=/opt/custom_venv ENV PATH="${VIRTUAL_ENV}/bin:$PATH" # Create the directory structure so the PATH is valid on the login node RUN mkdir -p ${VIRTUAL_ENV}/binReemplaza
VERSION_TAGpor la etiqueta de versión de Slurm que coincida con la versión predeterminada de Slurm de tu clúster.Compila las imágenes con el comando
docker build:docker build --target=slurmd-custom \ -t AR_PATH/slinky/slurmd:CUSTOM_SLURMD_TAG \ -f Dockerfile . docker build --target=login-custom \ -t AR_PATH/slinky/login:CUSTOM_LOGIN_TAG \ -f Dockerfile .Reemplaza lo siguiente:
AR_PATH: Es la ruta de acceso a tu repositorio de Artifact Registry, por ejemplo,gcr.io/my-project.CUSTOM_SLURMD_TAG: Es el nombre de la etiquetaslurmd-customque elijas.CUSTOM_LOGIN_TAG: Es el nombre de la etiquetalogin-customque elijas.
Envía las imágenes personalizadas a tu repositorio:
docker push AR_PATH/slinky/slurmd:CUSTOM_SLURMD_TAG docker push AR_PATH/slinky/login:CUSTOM_LOGIN_TAG
Usa las imágenes personalizadas en GKE
Para usar tus imágenes personalizadas, completa los siguientes pasos:
Como se muestra en el siguiente ejemplo, actualiza el repositorio y la etiqueta de la imagen para los conjuntos de nodos
slurmdy de accesologinmodificando el archivovalues.yaml:nodesets: slinky: replicas: 1 slurmd: image: repository: AR_PATH/slinky/slurmd tag: CUSTOM_SLURMD_TAG loginsets: slinky: enabled: true replicas: 1 login: image: repository: AR_PATH/slinky/login tag: CUSTOM_LOGIN_TAGActualiza la implementación existente:
helm upgrade slurm oci://ghcr.io/slinkyproject/charts/slurm \ --namespace slurm \ --version=1.0.2 \ -f values.yamlPara probar las nuevas capacidades de tu nodo de procesamiento, accede al nodo de acceso y ejecuta el siguiente comando
srun:srun python3 -c " import sys import jax import jax.numpy as jnp print(f'Python Executable: {sys.executable}') print(f'Using JAX backend: {jax.devices()[0].platform}') key = jax.random.PRNGKey(42) x = jax.random.normal(key, (5000, 5000)) result = jnp.dot(x, x) print(f'Matrix multiplication successful. Shape: {result.shape}') "El resultado es similar a lo siguiente:
Python Executable: /opt/custom_venv/bin/python3 Using JAX backend: cpu Matrix multiplication successful. Shape: (5000, 5000)Este resultado confirma que Slurm ejecuta el script en los Pods de trabajador que ejecutan tu imagen personalizada y que la imagen contiene las capacidades requeridas de Python y JAX.
Realiza una limpieza
Para limpiar los recursos que usaste en este instructivo, haz lo siguiente:
Desinstala la implementación de Helm:
sh helm uninstall slurm --namespace slurmEste comando quita todos los recursos de Kubernetes implementados por el gráfico de Helm.
Borra el espacio de nombres de Slurm:
kubectl delete namespace slurmBorra el clúster de GKE:
gcloud container clusters delete CLUSTER_NAMEReemplaza
CLUSTER_NAMEpor el nombre del clúster.Borra las imágenes personalizadas de Artifact Registry:
gcloud container images delete AR_PATH/slinky/slurmd:CUSTOM_SLURMD_TAG --force-delete-tags gcloud container images delete AR_PATH/slinky/login:CUSTOM_LOGIN_TAG --force-delete-tagsQuita las imágenes personalizadas de tu entorno local de Docker:
docker rmi AR_PATH/slinky/slurmd:CUSTOM_SLURMD_TAG docker rmi AR_PATH/slinky/login:CUSTOM_LOGIN_TAG
¿Qué sigue?
- Explora el proyecto de Slurm en GitHub.
- Obtén más información para habilitar el complemento de Slurm Operator para GKE.