XPK를 사용하여 GKE에 Managed Lustre 프로비저닝

이 문서에서는 관리형 Lustre를 GKE와 통합하여 인공지능 (AI), 머신러닝 (ML), 고성능 컴퓨팅 (HPC)과 같은 까다롭고 데이터 집약적인 워크로드에 최적화된 환경을 만드는 방법을 설명합니다.

이 문서에서는 XPK로 GKE 클러스터를 프로비저닝하고, 관리형 Lustre 인스턴스를 만들어 클러스터에 연결합니다. 이 구성을 테스트하려면 플렉스 시작 프로비저닝을 사용하는 노드에서 워크로드를 실행합니다.

이 문서는 관리형 Lustre 인스턴스로 지원되는 Kubernetes 컨테이너 조정 기능을 살펴보고자 하는 머신러닝 (ML) 엔지니어와 데이터 및 AI 전문가를 대상으로 합니다. Google Cloud 콘텐츠에서 참조하는 일반적인 역할 및 예시 태스크에 대해 자세히 알아보려면 일반 GKE 사용자 역할 및 태스크를 참고하세요.

배경

이 섹션에서는 이 문서에서 사용되는 주요 기술을 설명합니다.

XPK

XPK는 특히 AI/ML 작업의 GKE 클러스터 및 워크로드 프로비저닝과 관리를 간소화하는 도구입니다. XPK는 사전 구성되고 학습에 최적화된 인프라를 생성하는 데 도움이 되므로 개념 증명 및 테스트 환경에 적합합니다.

Google Cloud CLI 또는 가속 처리 키트 (XPK)를 사용하여 TPU를 사용하는 클러스터를 만들 수 있습니다.

  • gcloud CLI를 사용하여 GKE 클러스터 인스턴스를 수동으로 만들어 기존 프로덕션 GKE 환경을 정확하게 맞춤설정하거나 확장합니다.
  • XPK를 사용하여 GKE 클러스터를 빠르게 만들고 개념 증명 및 테스트를 위한 워크로드를 실행합니다. 자세한 내용은 XPK README를 참고하세요.

이 문서에서는 리소스 프로비저닝 및 관리에만 XPK를 사용합니다.

자세한 내용은 가속 처리 키트 (XPK) 문서를 참고하세요.

유연한 시작

Flex-start를 사용하면 필요한 리소스에 대한 비용만 지불하여 TPU 프로비저닝을 최적화할 수 있습니다. 워크로드에 필요에 따라 동적으로 프로비저닝된 리소스가 최대 7일 동안 필요하고 비용 효율적인 액세스가 필요한 경우 flex-start(유연한 시작)를 사용하는 것이 좋습니다.

이 문서에서는 소비 옵션의 예로 flex-start를 사용하지만 예약이나 스팟과 같은 다른 옵션을 사용할 수도 있습니다. 자세한 내용은 GKE의 AI/ML 워크로드용 가속기 소비 옵션 정보를 참고하세요.

Managed Lustre

Managed Lustre는 까다로운 워크로드를 위해 설계된 고성능 병렬 파일 시스템 서비스입니다. Managed Lustre CSI 드라이버를 사용하면 표준 Kubernetes 영구 볼륨 클레임 (PVC) 및 영구 볼륨(PV)을 사용하여 Managed Lustre 인스턴스를 GKE와 통합할 수 있습니다. 이 드라이버는 지속 가능하고 확장 가능하며 처리량이 높은 스토리지가 필요한 AI, ML, HPC 워크로드에 특히 유용합니다.

자세한 내용은 Managed Lustre CSI 드라이버 정보를 참고하세요.

시작하기 전에

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

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

개발 환경 준비

이 섹션에서는 클러스터 환경을 준비하는 방법을 보여줍니다.

  1. 새 터미널 창에서 가상 환경을 만듭니다.

    VENV_DIR=~/venvp4;python3 -m venv $VENV_DIR;source $VENV_DIR/bin/activate
    
  2. XPK 설치 파일의 단계에 따라 XPK를 설치합니다. 소스에서 클론하는 대신 pip install를 사용합니다.

  3. 기본 환경 변수를 설정합니다.

    gcloud config set project PROJECT_ID
    gcloud config set billing/quota_project PROJECT_ID
    export PROJECT_ID=$(gcloud config get project)
    export LOCATION=LOCATION
    export CLUSTER_NAME=CLUSTER_NAME
    export GKE_VERSION=VERSION
    export NETWORK_NAME=NETWORK_NAME
    export IP_RANGE_NAME=IP_RANGE_NAME
    export FIREWALL_RULE_NAME=FIREWALL_RULE_NAME
    export ACCELERATOR_TYPE=v6e-16
    export NUM_SLICES=1
    

    다음 값을 바꿉니다.

    위 명령어는 v6e-16 가속기 유형을 구성합니다. 이 구성에는 다음 변수가 포함됩니다.

    • ACCELERATOR_TYPE=v6e-16: 4x4 토폴로지가 있는 TPU Trillium에 해당합니다. 이 TPU 버전은 GKE에 멀티 호스트 슬라이스 노드 풀을 프로비저닝하도록 지시합니다. v6e-16는 GKE의 ct6e-standard-4t 머신 유형에 매핑됩니다.
    • NUM_SLICES=1: 선택한 ACCELERATOR_TYPE에 대해 XPK가 만드는 TPU 슬라이스 노드 풀 수입니다.

    ACCELERATOR_TYPENUM_SLICES 변수를 맞춤설정하려면 다음 문서를 참고하여 사용 가능한 조합을 확인하세요.

    • 사용할 TPU 버전, GKE용 머신 유형, 토폴로지, 사용 가능한 영역을 확인하려면 GKE에서 TPU 계획을 참고하세요.
    • GKE 머신 유형을 Cloud TPU API의 가속기 유형에 매핑하려면 TPU Trillium (v6e) 문서를 참고하세요.

VPC 네트워크 준비

관리형 Lustre 인스턴스 및 GKE 클러스터의 Virtual Private Cloud 네트워크를 준비합니다.

  1. Service Networking API를 사용 설정합니다.

    gcloud services enable servicenetworking.googleapis.com \
            --project=${PROJECT_ID}
    
  2. VPC 네트워크를 만듭니다.

    gcloud compute networks create ${NETWORK_NAME} \
            --subnet-mode=auto --project=${PROJECT_ID} \
            --mtu=8896
    
  3. VPC 피어링의 IP 주소 범위를 만듭니다.

    gcloud compute addresses create ${IP_RANGE_NAME} \
            --global \
            --purpose=VPC_PEERING \
            --prefix-length=20 \
            --description="Managed Lustre VPC Peering" \
            --network=${NETWORK_NAME} \
            --project=${PROJECT_ID}
    
  4. IP 주소 범위의 CIDR 범위를 가져옵니다.

    CIDR_RANGE=$(
        gcloud compute addresses describe ${IP_RANGE_NAME} \
                --global  \
                --format="value[separator=/](address, prefixLength)" \
                --project=${PROJECT_ID}
    )
    
  5. IP 주소 범위의 TCP 트래픽을 허용하는 방화벽 규칙을 만듭니다.

    gcloud compute firewall-rules create ${FIREWALL_RULE_NAME} \
            --allow=tcp:988,tcp:6988 \
            --network=${NETWORK_NAME} \
            --source-ranges=${CIDR_RANGE} \
            --project=${PROJECT_ID}
    
  6. VPC 피어링을 연결합니다.

    gcloud services vpc-peerings connect \
            --network=${NETWORK_NAME} \
            --project=${PROJECT_ID} \
            --ranges=${IP_RANGE_NAME} \
            --service=servicenetworking.googleapis.com
    

Managed Lustre 스토리지 인스턴스 만들기

Managed Lustre 스토리지 인스턴스를 만듭니다.

  1. 스토리지 인스턴스 변수를 설정합니다.

    export STORAGE_NAME=STORAGE_NAME
    export STORAGE_THROUGHPUT=STORAGE_THROUGHPUT
    export STORAGE_CAPACITY=STORAGE_CAPACITY_GIB
    export STORAGE_FS=lfs
    

    다음 값을 바꿉니다.

    • STORAGE_NAME: 관리형 Lustre 인스턴스의 이름입니다.
    • STORAGE_THROUGHPUT: 관리 Lustre 인스턴스의 처리량입니다(TiB당 MiB/s). 유효한 처리량 값은 새 용량 계산을 참고하세요.
    • STORAGE_CAPACITY_GIB: Managed Lustre 인스턴스의 용량(GiB)입니다. 유효한 용량 값은 허용되는 용량 및 처리량 값을 참고하세요.
  2. Managed Lustre 인스턴스를 만듭니다.

    gcloud lustre instances create ${STORAGE_NAME} \
            --per-unit-storage-throughput=${STORAGE_THROUGHPUT} \
            --capacity-gib=${STORAGE_CAPACITY} \
            --filesystem=${STORAGE_FS} \
            --location=${LOCATION} \
            --network=projects/${PROJECT_ID}/global/networks/${NETWORK_NAME} \
            --project=${PROJECT_ID} \
            --async # Creates the instance asynchronously
    

    --async 플래그는 인스턴스를 비동기적으로 만들고 상태를 추적할 작업 ID를 제공합니다.

  3. 작업 상태를 확인합니다.

    gcloud lustre operations describe OPERATION_ID  \
            --location=${LOCATION} \
            --project=${PROJECT_ID}
    

    OPERATION_ID를 이전 비동기 명령어의 출력에서 가져온 ID로 바꿉니다. ID가 없는 경우 모든 작업을 나열할 수 있습니다.

    gcloud lustre operations list \
            --location=${LOCATION} \
            --project=${PROJECT_ID}
    

    명령어 출력에 done: true이 표시되면 인스턴스가 준비된 것입니다.

XPK를 사용하여 GKE 클러스터 만들기

XPK를 사용하여 노드 풀이 있는 GKE 클러스터를 만듭니다.

GKE 클러스터를 만듭니다.

xpk cluster create --cluster ${CLUSTER_NAME} \
        --num-slices=${NUM_SLICES} \
        --tpu-type=${ACCELERATOR_TYPE} \
        --zone=${LOCATION} \
        --project=${PROJECT_ID} \
        --gke-version=${GKE_VERSION} \
        --custom-cluster-arguments="--network=${NETWORK_NAME}" \
        --enable-lustre-csi-driver \
        --flex

이 명령어는 XPK를 사용하여 GKE 클러스터를 만듭니다. 클러스터가 노드 프로비저닝에 flex-start를 사용하도록 구성되어 있고 Managed Lustre CSI 드라이버가 사용 설정되어 있습니다.

스토리지 인스턴스를 클러스터에 연결

영구 볼륨 (PV) 및 영구 볼륨 신청 (PVC)을 구성하기 위해 이 섹션에서는 매니페스트 파일과 함께 XPK 스토리지 연결 명령어 (xpk storage attach)를 사용합니다. 이 섹션에서는 XPK 소스 코드의 매니페스트 예시를 사용합니다.

다음 단계를 완료하여 관리형 Lustre 스토리지 인스턴스를 GKE 클러스터에 연결합니다.

  1. 예시 매니페스트 파일을 현재 작업 디렉터리에 다운로드하고 lustre-manifest-attach.yaml로 저장합니다.

  2. Managed Lustre 인스턴스의 정보로 매니페스트 파일을 업데이트합니다.

    1. PersistentVolume 섹션에서 다음 값을 바꿉니다.

      • STORAGE_SIZE: Managed Lustre 인스턴스의 크기(GiB)입니다.
      • PROJECT_ID/ZONE/INSTANCE_NAME: 관리형 Lustre 인스턴스의 전체 리소스 경로입니다.
      • IP_ADDRESS: 관리형 Lustre 인스턴스의 IP 주소입니다.
      • FILE_SYSTEM: 파일 시스템 유형(lfs)
    2. PersistentVolumeClaim 섹션에서 다음 값을 바꿉니다.

      • STORAGE_SIZE: PersistentVolumeClaim의 크기(GiB)입니다.
  3. 스토리지 인스턴스를 클러스터에 연결합니다.

    xpk storage attach ${STORAGE_NAME} \
            --cluster=${CLUSTER_NAME} --project=${PROJECT_ID} --zone=${LOCATION} \
            --type=lustre \
            --mount-point='/lustre-data' \
            --readonly=false \
            --auto-mount=true \
            --manifest='./lustre-manifest-attach.yaml'
    
  4. 클러스터의 스토리지를 연결했는지 확인합니다.

    xpk storage list \
            --cluster=${CLUSTER_NAME} --project=${PROJECT_ID} --zone=${LOCATION}
    

워크로드 실행

연결된 Managed Lustre 인스턴스로 워크로드를 실행합니다 . 다음 예시 명령어는 사용 가능한 디스크를 나열하고 Managed Lustre 인스턴스의 디렉터리에 'hello' 파일을 만듭니다.

워크로드를 만들고 실행합니다.

xpk workload create --workload test-lustre \
--cluster=${CLUSTER_NAME} --project=${PROJECT_ID} --zone=${LOCATION} \
--command="df -h && echo 'hello' > /lustre-data/hello.txt && cat /lustre-data/hello.txt" \
--tpu-type=${ACCELERATOR_TYPE} \
--num-slices=1 \
--flex

삭제

이 문서의 단계를 완료한 후 계정에 원치 않는 요금이 발생하지 않도록 클러스터를 삭제합니다.

  xpk cluster delete --cluster ${CLUSTER_NAME} \
        --zone ${LOCATION} \
        --project ${PROJECT_ID}

다음 단계