맞춤 Slurm Docker 이미지 빌드

이 문서에서는 Google Kubernetes Engine (GKE)에서 Slurm 클러스터용 맞춤 Docker 이미지를 빌드하는 방법을 설명합니다. GKE에서 제공하는 기본 Slurm 이미지를 확장하여 고성능 컴퓨팅 (HPC) 워크로드에 필요한 추가 도구, 라이브러리 또는 구성을 포함할 수 있습니다.

이 문서를 읽기 전에 GKE용 Slurm Operator 부가기능을 숙지해야 합니다.

시작하기 전에

시작하기 전에 다음 태스크를 수행했는지 확인합니다.

  • Google Kubernetes Engine API를 사용 설정합니다.
  • Google Kubernetes Engine API 사용 설정
  • 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치했으면 gcloud components update 명령어를 실행하여 최신 버전을 가져옵니다. 이전 gcloud CLI 버전에서는 이 문서의 명령어를 실행하지 못할 수 있습니다.

기본 요건

이 문서에서는 GKE에 Slurm 클러스터가 이미 실행 중이고 GKE용 Slurm 연산자 부가기능이 설치되어 있다고 가정합니다. 다음 페이지의 절차를 완료합니다.

  1. 빠른 시작: GKE에 Slurm 클러스터 배포를 완료합니다.
  2. 프로젝트에서 Artifact Registry 저장소를 구성하여 커스텀 이미지를 저장합니다.

Slurm 기본 이미지

GKE는 gcr.io/gke-release/ Artifact Registry 저장소에 기본 Slurm 이미지를 제공합니다. GKE는 보안 및 성능을 위해 이러한 이미지를 자주 업데이트합니다. 이러한 이미지는 최신 Slurm 버전과 두 가지 Linux 배포(Ubuntu 및 Rocky Linux)가 포함된 변형으로 제공됩니다.

다음 기본 이미지를 맞춤설정할 수 있습니다.

  • gcr.io/gke-release/slinky/slurmd: Slurm 컴퓨팅 노드에 사용됩니다.
  • gcr.io/gke-release/slinky/login: 로그인 노드에 사용됩니다.

맞춤 이미지 빌드

다음 예에서는 JAX가 설치된 Python 가상 환경이 포함된 맞춤 Slurm 컴퓨팅 이미지를 빌드하는 방법을 보여줍니다. 또한 JAX 라이브러리를 실제로 설치하지 않고도 컴퓨팅 이미지 PATH 환경 변수를 미러링하는 해당 로그인 이미지를 빌드합니다.

이미지 버전 선택

기본 이미지를 선택할 때는 다음 조건을 충족해야 합니다.

  • 버전이 Slurm 클러스터의 다른 구성요소에서 사용하는 Slurm 버전과 일치합니다.
  • 특정 Slurm 버전의 경우 최신 보안 업데이트와 버그 수정이 포함된 사용 가능한 최신 이미지의 태그를 선택합니다.

예를 들어 클러스터의 기본 Slurm 버전이 25.11인 경우 25.11-로 시작하는 태그(예: 25.11-ubuntu24.04-gke.6)를 선택해야 합니다.

Dockerfile 만들기

  1. Ubuntu 기반 slurmd 이미지 태그를 선택합니다.

    1. Google Cloud 콘솔에서 slinky/slurmd 패키지가 포함된 Artifact Registry 저장소 페이지로 이동합니다.

      Artifact Registry 저장소로 이동

    2. ubuntu를 포함하고 Slurm 버전(예: 25.11-ubuntu24.04-gke.6)과 일치하는 태그가 있는 이미지를 찾습니다.

    3. 태그를 복사합니다. 이 태그를 사용하여 다음 구성 파일에서 VERSION_TAG 자리표시자를 바꿉니다.

  2. 다음 콘텐츠로 Dockerfile이라는 파일을 만듭니다.

    # --- 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
    

    VERSION_TAG을 클러스터의 기본 Slurm 버전과 일치하는 Slurm 버전 태그로 바꿉니다.

  3. 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 .
    

    다음을 바꿉니다.

    • AR_PATH: Artifact Registry 저장소의 경로입니다(예: gcr.io/my-project).
    • CUSTOM_SLURMD_TAG: 선택한 slurmd-custom 태그 이름입니다.
    • CUSTOM_LOGIN_TAG: 선택한 login-custom 태그 이름입니다.
  4. 커스텀 이미지를 저장소로 푸시합니다.

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

GKE에서 커스텀 이미지 사용

커스텀 이미지를 사용하려면 다음 단계를 완료하세요.

  1. 다음 예와 같이 values.yaml 파일을 수정하여 slurmd 노드셋과 login 로그인셋의 이미지 저장소와 태그를 업데이트합니다.

    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. 기존 배포를 업그레이드합니다.

    helm upgrade slurm oci://ghcr.io/slinkyproject/charts/slurm \
        --namespace slurm \
        --version=1.0.2 \
        -f values.yaml
    
  3. 로그인 노드에 로그인하고 다음 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}')
    "
    

    출력은 다음과 비슷합니다.

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

    이 출력은 Slurm이 커스텀 이미지를 실행하는 작업자 포드에서 스크립트를 실행하고 이미지가 필요한 Python 및 JAX 기능을 포함하고 있음을 확인해 줍니다.

삭제

이 튜토리얼에서 사용한 리소스를 정리하려면 다음 단계를 따르세요.

  1. Helm 배포를 제거합니다. sh helm uninstall slurm --namespace slurm

    이 명령어는 Helm 차트로 배포된 모든 Kubernetes 리소스를 삭제합니다.

  2. Slurm 네임스페이스를 삭제합니다.

    kubectl delete namespace slurm
    
  3. GKE 클러스터를 삭제합니다.

    gcloud container clusters delete CLUSTER_NAME
    

    CLUSTER_NAME을 클러스터 이름으로 바꿉니다.

  4. 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. 로컬 Docker 환경에서 맞춤 이미지를 삭제합니다.

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

다음 단계