Pathways를 사용하여 Cluster Director 클러스터 만들기

이 페이지에서는 플랫폼 관리자와 머신러닝(ML) 엔지니어가 Slurm 조정 Cluster Director 클러스터를 만들고 Pathways 워크로드에 맞게 구성하는 방법을 보여줍니다. 이 단계를 완료하면 TPU v6e 슬라이스, CPU 컨트롤러 노드, 공유 Google Cloud Managed Lustre 파일 시스템, /home/pathways 런타임 환경으로 클러스터를 프로비저닝합니다. Pathways는 Cluster Director 클러스터에 사전 설치되어 있지 않습니다. 클러스터를 만든 후 Pathways 스크립트를 로그인 노드에 다운로드하고 설정 스크립트를 한 번 실행합니다.

시작하기 전에

시작하기 전에

시작하기 전에 다음의 사건 요건을 완료하세요.

  • Google Cloud CLI를 설치합니다.
  • Hypercompute Cluster API를 사용 설정합니다.
  • 사용자 계정과 Compute Engine 기본 서비스 계정에 Cluster Director 클러스터를 만들고 연결하는 데 필요한 Identity and Access Management(IAM) 역할이 있는지 확인합니다. 역할 목록은 Cluster Director 빠른 시작의 시작하기 전에를 참조하세요.
  • 클러스터를 만들려는 영역에 TPU v6e 예약을 만듭니다(예: 2x4 슬라이스 2개에 대해 ct6e-standard-4t VM 최소 4개).
  • 자동 슬라이스 복구를 위해 클러스터 노드에서 비밀번호 없는 sudo를 구성합니다. 관리자에게 프로젝트에 대한 Compute OS 관리자 로그인(roles/compute.osAdminLogin) 역할을 부여해 달라고 요청하세요.
  • Pathways 스크래치 데이터 및 워크로드 출력을 위한 Cloud Storage 버킷을 만들고 프로젝트의 스토리지 객체 사용자(roles/storage.objectUser) 역할을 사용자 계정과 Compute Engine 기본 서비스 계정에 부여합니다.

로컬 환경 설정

Google Cloud 사용자 인증 정보로 로그인합니다.

gcloud auth login

워크로드에 적합한 값으로 다음 환경 변수를 정의합니다.

export PROJECT=PROJECT_ID
export REGION=REGION
export ZONE=ZONE
export CLUSTER_ID=CLUSTER_ID
export RESERVATION_NAME=RESERVATION_NAME

다음을 바꿉니다.

  • PROJECT_ID:Google Cloud 프로젝트 ID입니다.
  • REGION: 리소스를 만드는 리전입니다.
  • ZONE: 리소스를 만드는 영역입니다.
  • CLUSTER_ID: 클러스터 이름입니다. 이름은 최대 10자(영문 기준)까지 가능하며 숫자와 소문자만 사용할 수 있습니다.
  • RESERVATION_NAME: ZONE의 TPU v6e 예약 이름입니다.

Cluster Director 클러스터 만들기

다음 예시에서는 예약에서 TPU v6e 2x4 슬라이스 2개(ct6e-standard-4t VM 4개)와 Pathways 컨트롤러의 CPU 노드 1개로 클러스터를 만듭니다. 모든 노드는 /home에서 공유 Managed Lustre 파일 시스템을 마운트합니다. 클러스터 정의의 필드에 대한 자세한 내용은 커스텀 클러스터 만들기를 참조하세요.

  1. REST API를 사용하여 클러스터를 만듭니다.

    요청 본문을 만듭니다.

    cat <<EOF > "${CLUSTER_ID}_create.json"
    {
      "networkResources": {
        "net": {
          "config": {
            "newNetwork": {
              "network": "projects/${PROJECT}/global/networks/${CLUSTER_ID}-net"
            }
          }
        }
      },
      "storageResources": {
        "home": {
          "config": {
            "newLustre": {
              "lustre": "projects/${PROJECT}/locations/${ZONE}/instances/${CLUSTER_ID}-lustre",
              "filesystem": "lustre",
              "capacityGb": "18000",
              "perUnitStorageThroughput": "500"
            }
          }
        }
      },
      "computeResources": {
        "crtpu": {
          "config": {
            "newReservedInstances": {
              "reservation": "projects/${PROJECT}/zones/${ZONE}/reservations/${RESERVATION_NAME}"
            }
          }
        },
        "crcpu": {
          "config": {
            "newOnDemandInstances": {
              "zone": "${ZONE}",
              "machineType": "n2-highmem-32"
            }
          }
        }
      },
      "orchestrator": {
        "slurm": {
          "loginNodes": {
            "count": "1",
            "zone": "${ZONE}",
            "machineType": "n2-standard-16",
            "enableOsLogin": true,
            "enablePublicIps": true,
            "bootDisk": {
              "type": "pd-balanced",
              "sizeGb": "100"
            },
            "storageConfigs": [
              {
                "id": "home",
                "localMount": "/home"
              }
            ]
          },
          "nodeSets": [
            {
              "id": "nstpu",
              "computeId": "crtpu",
              "staticNodeCount": "4",
              "maxDynamicNodeCount": "0",
              "enablePublicIps": true,
              "resourcePolicyConfig": {
                "acceleratorTopology": "2x4"
              },
              "computeInstance": {
                "bootDisk": {
                  "type": "hyperdisk-balanced",
                  "sizeGb": "100"
                }
              },
              "storageConfigs": [
                {
                  "id": "home",
                  "localMount": "/home"
                }
              ]
            },
            {
              "id": "nscpu",
              "computeId": "crcpu",
              "staticNodeCount": "1",
              "maxDynamicNodeCount": "0",
              "enablePublicIps": true,
              "computeInstance": {
                "bootDisk": {
                  "type": "pd-balanced",
                  "sizeGb": "100",
                  "image": "projects/clusterdirector-public-images/global/images/family/tpu-v6e-v5p-ubuntu2204-slurm2605-v20260902"
                }
              },
              "storageConfigs": [
                {
                  "id": "home",
                  "localMount": "/home"
                }
              ]
            }
          ],
          "partitions": [
            {
              "id": "tpu",
              "nodeSetIds": ["nstpu"]
            },
            {
              "id": "cpu",
              "nodeSetIds": ["nscpu"]
            }
          ],
          "defaultPartition": "tpu",
          "config": {
            "requeueExitCodes": [1, 2, 134, 137, 139, 143]
          }
        }
      }
    }
    EOF
    

    그런 다음 요청을 전송합니다.

    curl -s -X POST \
        -H "Content-Type: application/json" \
        -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        -d @"${CLUSTER_ID}_create.json" \
        "https://hypercomputecluster.googleapis.com/v1alpha/projects/${PROJECT}/locations/${REGION}/clusters?clusterId=${CLUSTER_ID}"
    

    클러스터에는 다음이 포함됩니다.

    • tpu 파티션: 예약된 TPU v6e VM의 정적 노드 세트입니다. staticNodeCount은 VM 수이고 acceleratorTopology은 각 슬라이스의 토폴로지입니다. 각 ct6e-standard-4t VM에는 칩이 4개 있으므로 2x4 슬라이스에는 VM이 2개 있습니다. 슬라이스가 더 많은 경우 곱합니다. 2x4 슬라이스 2개에는 4의 staticNodeCount가 필요합니다.
    • cpu 파티션: Pathways 리소스 관리자, IFRT 프록시 서버, MaxText 클라이언트를 실행하는 주문형 VM 1개 Pathways 스크립트는 cpu이라는 파티션에 작업을 제출합니다. Pathways 서비스와 MaxText가 체크포인트를 저장하는 동안 최대 240GB의 메모리가 필요하므로 VM은 n2-highmem-32 머신 유형을 사용합니다. 또한 Pathways 서비스가 이 VM에서 TPU 워커 작업을 제출하므로 TPU 슬라이스를 지원하는 Slurm 26.05가 포함된 이미지를 사용합니다.
    • requeueExitCodes: Slurm은 이러한 코드 중 하나로 종료되는 작업을 다시 큐에 추가합니다. 이 설정을 사용하면 슬라이스의 VM이 선점될 때 Slurm이 첫 번째 VM뿐만 아니라 TPU 워커 작업을 다시 시작할 수 있습니다.
  2. 클러스터가 준비될 때까지 기다립니다. Google Cloud 콘솔의 Cluster Director 페이지에서 진행 상황을 확인하거나 다음 명령어의 출력에서 reconciling가 false인지 확인할 수 있습니다.

    curl -s \
        -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        "https://hypercomputecluster.googleapis.com/v1alpha/projects/${PROJECT}/locations/${REGION}/clusters/${CLUSTER_ID}"
    

Pathways 환경 설정

Pathways 환경은 공유 파일 시스템의 /home/pathways에 있으므로 클러스터당 한 번 설정합니다. 여기에는 Pathways 컨테이너 이미지, JAX 및 pathwaysutils가 포함된 Python 환경, Pathways 스크립트가 포함됩니다.

  1. 로그인 노드에 연결합니다. 연결하는 다른 방법은 클러스터에 연결을 참조하세요.

    gcloud compute ssh ${CLUSTER_ID}-login-001 \
        --project=${PROJECT} \
        --zone=${ZONE} \
        --tunnel-through-iap
    
  2. cpu 및 tpu 파티션이 존재하고 idle 상태인지 확인합니다.

    sinfo -o "%P %a %D %T %N %f"
    

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

    PARTITION AVAIL NODES STATE NODELIST FEATURES
    tpu* up 4 idle ${CLUSTER_ID}-nstpu-[0-3]
    cpu up 1 idle ${CLUSTER_ID}-nscpu-0
    
  3. Pathways 스크립트를 로그인 노드에 다운로드합니다.

    mkdir -p ~/pathways-scripts && cd ~/pathways-scripts
    for f in setup_env.sh start_pathways.sh run_worker_slice.sh run_maxtext.sh; do
      curl -fsSLO "https://raw.githubusercontent.com/GoogleCloudPlatform/slurm-gcp/tpu-2605/pathways/scripts/${f}"
    done
    

    이 명령어는 다음 스크립트를 다운로드합니다.

    • setup_env.sh: Pathways 환경의 일회성 설정을 수행합니다.
    • start_pathways.sh: Pathways 서비스를 시작합니다.
    • run_worker_slice.sh: 하나의 TPU 슬라이스에 대해 Pathways 워커를 시작합니다(start_pathways.sh에서 제출).
    • run_maxtext.sh: MaxText 학습 워크로드 예시를 실행합니다.
  4. 설정 스크립트를 실행합니다. 5분 정도 소요됩니다.

    chmod +x *.sh
    ./setup_env.sh
    

    스크립트는 Pathways 서버 및 프록시 이미지를 가져오고, JAX, pathwaysutils, MaxText를 사용하여 Python 환경을 빌드하고, 스크립트를 /home/pathways에 복사하고, ~/pathways를 /home/pathways에 연결합니다. 다음과 비슷한 출력으로 끝납니다.

    Environment ready: JAX 0.11.1
    
  5. 선택사항: 다른 클러스터 사용자에게 Pathways 환경에 대한 액세스 권한을 부여하려면 /home/pathways을 홈 디렉터리에 연결하도록 합니다.

    ln -sfn /home/pathways ~/pathways
    

이제 클러스터가 Pathways를 사용할 준비가 되었습니다. 일괄 워크로드와 대화형 워크로드는 서로 다른 설정으로 Pathways 서비스를 시작하므로 워크로드 실행의 일부로 Pathways 서비스를 시작합니다. 자세한 내용은 Pathways로 일괄 워크로드 실행 및 Pathways로 대화형 워크로드 실행을 참조하세요.

문제가 발생하면 Cloud에서 Pathways 문제 해결을 참조하세요.

삭제

이 페이지에서 사용한 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 완료 후 Cluster Director 클러스터를 삭제합니다.

curl -s -X DELETE \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://hypercomputecluster.googleapis.com/v1alpha/projects/${PROJECT}/locations/${REGION}/clusters/${CLUSTER_ID}"

다음 단계