Benutzerdefinierte Slurm-Docker-Images erstellen

In diesem Dokument wird erläutert, wie Sie benutzerdefinierte Docker-Images für Ihre Slurm-Cluster in Google Kubernetes Engine (GKE) erstellen. Sie können die von GKE bereitgestellten Slurm-Basis-Images um zusätzliche Tools, Bibliotheken oder Konfigurationen erweitern, die für Ihre Hochleistungs-Computing-Arbeitslasten (HPC) erforderlich sind.

Machen Sie sich vor dem Lesen dieses Dokuments mit dem Slurm Operator-Add-on für GKE vertraut.

Hinweis

Führen Sie die folgenden Aufgaben aus, bevor Sie beginnen:

  • Aktivieren Sie die Google Kubernetes Engine API.
  • Google Kubernetes Engine API aktivieren
  • Wenn Sie die Google Cloud CLI für diesen Task verwenden möchten, installieren und dann initialisieren Sie die gcloud CLI. Wenn Sie die gcloud CLI bereits installiert haben, rufen Sie die neueste Version mit dem gcloud components update Befehl ab. Ältere gcloud CLI-Versionen unterstützen möglicherweise nicht die Ausführung der Befehle in diesem Dokument.

Vorbereitung

In diesem Dokument wird davon ausgegangen, dass Sie bereits einen Slurm-Cluster in GKE mit installiertem Slurm Operator-Add-on für GKE haben. Führen Sie die Schritte auf den folgenden Seiten aus:

  1. Führen Sie die Kurzanleitung: Slurm-Cluster in GKE bereitstellen aus.
  2. Konfigurieren Sie ein Artifact Registry-Repository in Ihrem Projekt, um Ihre benutzerdefinierten Images zu speichern.

Slurm-Basis-Images

GKE bietet Slurm-Basis-Images im gcr.io/gke-release/ Artifact Registry-Repository an. GKE aktualisiert diese Images häufig aus Sicherheits- und Leistungsgründen. Diese Images sind in Varianten mit den neuesten Slurm-Versionen und zwei Linux-Distributionen verfügbar: Ubuntu und Rocky Linux.

Sie können die folgenden Basis-Images anpassen:

  • gcr.io/gke-release/slinky/slurmd: wird für Slurm-Rechenknoten verwendet.
  • gcr.io/gke-release/slinky/login: wird für Anmeldeknoten verwendet.

Benutzerdefiniertes Image erstellen

Im folgenden Beispiel wird gezeigt, wie Sie ein benutzerdefiniertes Slurm-Rechen-Image erstellen, das eine virtuelle Python-Umgebung mit installierter JAX-Bibliothek enthält. Außerdem erstellen Sie ein entsprechendes Anmelde-Image, das die Umgebungsvariable PATH des Rechen-Images widerspiegelt, ohne die JAX-Bibliotheken tatsächlich zu installieren.

Image-Version auswählen

Wenn Sie ein Basis-Image auswählen, muss es die folgenden Bedingungen erfüllen:

  • Die Version entspricht der Slurm-Version, die von anderen Komponenten in Ihrem Slurm-Cluster verwendet wird.
  • Wählen Sie für eine bestimmte Slurm-Version das Tag des neuesten verfügbaren Images aus, das die neuesten Sicherheitsupdates und Fehlerkorrekturen enthält.

Wenn die Standard-Slurm-Version in Ihrem Cluster beispielsweise 25.11 ist, sollten Sie ein Tag auswählen, das mit 25.11- beginnt, z. B. 25.11-ubuntu24.04-gke.6.

Dockerfile erstellen

  1. Wählen Sie ein Ubuntu-basiertes slurmd-Image-Tag aus:

    1. Rufen Sie in der Google Cloud Console die Seite Artifact Registry-Repository auf, die das Paket slinky/slurmd enthält.

      Artifact Registry-Repository aufrufen

    2. Suchen Sie nach einem Image mit einem Tag, das ubuntu enthält und Ihrer Slurm Version entspricht, z. B. 25.11-ubuntu24.04-gke.6.

    3. Kopieren Sie das Tag. Mit diesem Tag ersetzen Sie den Platzhalter VERSION_TAG in der folgenden Konfigurationsdatei.

  2. Erstellen Sie eine Datei mit dem Namen Dockerfile und dem folgenden Inhalt:

    # --- 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}/bin
    

    Ersetzen Sie VERSION_TAG durch das Slurm-Versionstag, das der Standard-Slurm-Version Ihres Clusters entspricht.

  3. Erstellen Sie die Images mit dem Befehl 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 .
    

    Ersetzen Sie Folgendes:

    • AR_PATH: der Pfad zu Ihrem Artifact Registry-Repository, z. B. gcr.io/my-project.
    • CUSTOM_SLURMD_TAG: ein slurmd-custom-Tag-Name Ihrer Wahl.
    • CUSTOM_LOGIN_TAG: ein login-custom-Tag-Name Ihrer Wahl.
  4. Übertragen Sie die benutzerdefinierten Images in Ihr Repository:

    docker push AR_PATH/slinky/slurmd:CUSTOM_SLURMD_TAG
    docker push AR_PATH/slinky/login:CUSTOM_LOGIN_TAG
    

Benutzerdefinierte Images in GKE verwenden

So verwenden Sie Ihre benutzerdefinierten Images:

  1. Aktualisieren Sie wie im folgenden Beispiel gezeigt das Image-Repository und das Tag für das slurmd-Knotenset und das login-Anmeldeset, indem Sie die Datei values.yaml ändern:

    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_TAG
    
  2. Aktualisieren Sie die vorhandene Bereitstellung:

    helm upgrade slurm oci://ghcr.io/slinkyproject/charts/slurm \
        --namespace slurm \
        --version=1.0.2 \
        -f values.yaml
    
  3. Testen Sie die neuen Funktionen Ihres Rechenknotens, indem Sie sich im Anmeldeknoten anmelden und den folgenden srun-Befehl ausführen:

    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}')
    "
    

    Die Ausgabe sieht etwa so aus:

    Python Executable: /opt/custom_venv/bin/python3
    Using JAX backend: cpu
    Matrix multiplication successful. Shape: (5000, 5000)
    

    Diese Ausgabe bestätigt, dass Slurm das Skript auf Worker-Pods ausführt, auf denen Ihr benutzerdefiniertes Image ausgeführt wird, und dass das Image die erforderlichen Python- und JAX-Funktionen enthält.

Bereinigen

So bereinigen Sie die in dieser Anleitung verwendeten Ressourcen:

  1. Deinstallieren Sie die Helm-Bereitstellung: sh helm uninstall slurm --namespace slurm

    Mit diesem Befehl werden alle Kubernetes-Ressourcen entfernt, die vom Helm-Diagramm bereitgestellt wurden.

  2. Löschen Sie den Slurm-Namespace:

    kubectl delete namespace slurm
    
  3. Löschen Sie den GKE-Cluster:

    gcloud container clusters delete CLUSTER_NAME
    

    Ersetzen Sie CLUSTER_NAME durch den Clusternamen.

  4. Löschen Sie die benutzerdefinierten Images aus 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-tags
    
  5. Entfernen Sie die benutzerdefinierten Images aus Ihrer lokalen Docker-Umgebung:

    docker rmi AR_PATH/slinky/slurmd:CUSTOM_SLURMD_TAG
    docker rmi AR_PATH/slinky/login:CUSTOM_LOGIN_TAG
    

Nächste Schritte