Trillium (v6e) 소개

v6e는 이 문서, TPU API, 로그에서 Trillium을 참조하는 데 사용됩니다. v6e는 Google의 6세대 TPU를 나타냅니다.

포드당 칩이 256개인 v6e 아키텍처는 v5e와 많은 유사점을 공유합니다. 이 시스템은 변환기, 텍스트-이미지, 컨볼루셔널 신경망 (CNN) 학습, 미세 조정, 서빙에 최적화되어 있습니다.

v6e 시스템 아키텍처 및 구성에 관한 자세한 내용은 TPU v6e를 참고하세요.

이 소개 문서에서는 JAX, PyTorch 또는 TensorFlow 프레임워크를 사용하여 모델을 학습하고 제공하는 프로세스에 중점을 둡니다. 각 프레임워크에서 큐에 추가된 리소스 또는 GKE를 사용하여 TPU를 프로비저닝할 수 있습니다. GKE 설정은 XPK 또는 GKE 명령어를 사용하여 수행할 수 있습니다.

v6e를 사용하여 모델을 학습하거나 제공하는 일반적인 절차

  1. Google Cloud 프로젝트 준비
  2. 용량 확보
  3. Cloud TPU 환경 프로비저닝
  4. 모델 학습 또는 추론 워크로드 실행

Google Cloud 프로젝트 준비

Cloud TPU를 사용하려면 먼저 다음을 실행해야 합니다.

  • 결제가 사용 설정된 Google Cloud 계정 및 프로젝트 만들기
  • Google Cloud CLI 알파 구성요소 설치
  • Cloud TPU API 사용 설정
  • Cloud TPU 서비스 에이전트 만들기
  • Cloud TPU 서비스 계정 만들기 및 권한 부여

자세한 내용은 Cloud TPU 환경 설정을 참고하세요.

용량 확보

Google Cloud 지원팀에 문의하여 Cloud TPU v6e 할당량을 요청하고 용량에 관한 질문에 답변받으세요.

Cloud TPU 환경 프로비저닝

v6e Cloud TPU는 GKE, GKE 및 XPK(GKE용 래퍼 CLI 도구)를 사용하여 프로비저닝 및 관리하거나 대기열에 추가된 리소스로 프로비저닝 및 관리할 수 있습니다.

기본 요건

  • 프로젝트에 Google Cloud프로젝트 내에서 액세스할 수 있는 최대 칩 수를 지정하는 TPUS_PER_TPU_FAMILY 할당량이 충분한지 확인합니다.
  • v6e는 다음 구성으로 테스트되었습니다.
    • Python 3.10 이상
    • Nightly 소프트웨어 버전:
      • Nightly JAX 0.4.32.dev20240912
      • Nightly LibTPU 0.1.dev20240912+nightly
    • 안정화 소프트웨어 버전:
      • JAX + v0.4.37의 JAX 라이브러리
  • 프로젝트에 다음에 대한 할당량이 충분한지 확인합니다.

    • Cloud TPU VM 할당량
    • IP 주소 할당량
    • Hyperdisk Balanced 할당량

  • XPK와 함께 GKE를 사용하는 경우 XPK를 실행하는 데 필요한 권한은 사용자 또는 서비스 계정의 Cloud 콘솔 권한을 참고하세요.

환경 변수 만들기

Cloud Shell에서 다음 환경 변수를 만듭니다.

export NODE_ID=your-tpu-name
export PROJECT_ID=your-project-id
export ACCELERATOR_TYPE=v6e-16
export ZONE=us-east1-d
export RUNTIME_VERSION=v2-alpha-tpuv6e
export SERVICE_ACCOUNT=your-service-account
export QUEUED_RESOURCE_ID=your-queued-resource-id
export VALID_DURATION=your-duration 

# Additional environment variable needed for Multislice:
export NUM_SLICES=number-of-slices

# Use a custom network for better performance as well as to avoid having the default network becoming overloaded.

export NETWORK_NAME=${PROJECT_ID}-mtu9k
export NETWORK_FW_NAME=${NETWORK_NAME}-fw

명령어 플래그 설명

변수 설명
NODE_ID 큐에 추가된 리소스 요청이 할당될 때 생성되는 Cloud TPU의 사용자 할당 ID입니다.
PROJECT_ID Google Cloud 프로젝트 이름 기존 프로젝트를 사용하거나 새 프로젝트를 만듭니다. 자세한 내용은 Google Cloud 프로젝트 설정을 참고하세요.
ZONE 지원되는 영역에 대해서는 Cloud TPU 리전 및 영역 문서를 참고하세요.
ACCELERATOR_TYPE 가속기 유형을 참고하세요.
RUNTIME_VERSION v2-alpha-tpuv6e
SERVICE_ACCOUNT Google Cloud 콘솔 -> IAM -> 서비스 계정에서 찾을 수 있는 서비스 계정의 이메일 주소입니다.

예: tpu-service-account@your-project-ID.iam.gserviceaccount.com.com

NUM_SLICES 생성할 슬라이스 수입니다 (멀티슬라이스에만 필요).
QUEUED_RESOURCE_ID 큐에 추가된 리소스 요청의 사용자 할당 텍스트 ID입니다.
VALID_DURATION 대기열에 추가된 리소스 요청이 유효한 기간입니다.
NETWORK_NAME 사용할 보조 네트워크의 이름입니다.
NETWORK_FW_NAME 사용할 보조 네트워크 방화벽의 이름입니다.

네트워크 성능 최적화

최상의 성능을 위해 MTU (최대 전송 단위)가 8,896인 네트워크를 사용하세요.

기본적으로 Virtual Private Cloud (VPC)는 1,460바이트의 MTU만 제공하므로 최적의 네트워크 성능을 제공하지 않습니다. VPC 네트워크의 MTU를 1,300바이트에서 8,896바이트 (양 끝값 포함) 사이의 값으로 설정할 수 있습니다. 일반적인 커스텀 MTU 크기는 1,500바이트 (표준 이더넷) 또는 8,896바이트 (최대)입니다. 자세한 내용은 유효한 VPC 네트워크 MTU 크기를 참고하세요.

기존 또는 기본 네트워크의 MTU 설정을 변경하는 방법에 관한 자세한 내용은 VPC 네트워크의 MTU 설정 변경을 참고하세요.

다음 예에서는 8,896 MTU로 네트워크를 만듭니다.

export RESOURCE_NAME=your-resource-name
export NETWORK_NAME=${RESOURCE_NAME}-privatenetwork
export NETWORK_FW_NAME=${RESOURCE_NAME}-privatefirewall
gcloud compute networks create ${NETWORK_NAME} --mtu=8896 --project=${PROJECT_ID} \
 --subnet-mode=auto --bgp-routing-mode=regional
gcloud compute firewall-rules create ${NETWORK_FW_NAME} --network=${NETWORK_NAME} \
 --allow tcp,icmp,udp --project=${PROJECT_ID}

멀티 NIC 사용 (멀티슬라이스 옵션)

멀티슬라이스 환경을 사용할 때 보조 서브넷에 다음 환경 변수가 필요합니다.

export NETWORK_NAME_2=${RESOURCE_NAME}
export SUBNET_NAME_2=${RESOURCE_NAME}
export FIREWALL_RULE_NAME=${RESOURCE_NAME}
export ROUTER_NAME=${RESOURCE_NAME}-network-2
export NAT_CONFIG=${RESOURCE_NAME}-natconfig-2
export REGION=your-region

다음 명령어를 사용하여 네트워크 및 서브넷의 맞춤 IP 라우팅을 만듭니다.

gcloud compute networks create ${NETWORK_NAME_2} --mtu=8896 \
   --bgp-routing-mode=regional --subnet-mode=custom --project=${PROJECT_ID}
gcloud compute networks subnets create ${SUBNET_NAME_2} \
   --network=${NETWORK_NAME_2} \
   --range=10.10.0.0/18 --region=${REGION} \
   --project=${PROJECT_ID}

gcloud compute firewall-rules create ${FIREWALL_RULE_NAME} \
   --network=${NETWORK_NAME_2} --allow tcp,icmp,udp \
   --source-ranges 10.10.0.0/18 --project=${PROJECT_ID}

gcloud compute routers create ${ROUTER_NAME} \
  --project=${PROJECT_ID} \
  --network=${NETWORK_NAME_2} \
  --region=${REGION}

gcloud compute routers nats create ${NAT_CONFIG} \
  --router=${ROUTER_NAME} \
  --region=${REGION} \
  --auto-allocate-nat-external-ips \
  --nat-all-subnet-ip-ranges \
  --project=${PROJECT_ID} \
  --enable-logging

다중 네트워크 슬라이스를 만든 후 XPK 클러스터를 설정하고 XPK 워크로드 생성 명령어--command ifconfig 플래그를 추가하여 두 네트워크 인터페이스 카드 (NIC)가 모두 사용되고 있는지 확인할 수 있습니다.

다음 xpk workload 명령어를 사용하여 Google Cloud 콘솔 로그에 ifconfig 명령어의 출력을 표시하고 eth0과 eth1 모두 mtu=8896인지 확인합니다.

python3 xpk.py workload create \
   --cluster CLUSTER_NAME \
   {--base-docker-image maxtext_base_image | --docker-image your-cloud-image-name} \
   --workload=${USER}-xpk-${ACCELERATOR_TYPE}-${NUM_SLICES} \
   --tpu-type=${ACCELERATOR_TYPE} \
   --num-slices=${NUM_SLICES}  \
   --on-demand \
   --zone=${ZONE} \
   --project=${PROJECT_ID} \
   --command "ifconfig"

디버그 로그를 사용 설정하거나 Vertex AI TensorBoard를 사용하려면 다음 선택적 인수를 명령어에 추가합니다.

    --enable-debug-logs \
    --use-vertex-tensorboard

eth0 및 eth1 모두에 mtu=8,896이 있는지 확인합니다. XPK 워크로드 생성 명령어에 --command ifconfig 플래그를 추가하여 멀티 NIC가 실행 중인지 확인할 수 있습니다. Google Cloud 콘솔 로그에서 해당 xpk 워크로드의 출력을 확인하고 eth0과 eth1 모두 mtu=8896인지 확인합니다.

TCP 설정 개선

대기열 리소스 인터페이스를 사용하여 Cloud TPU를 만든 경우 다음 명령어를 실행하여 TCP 수신 버퍼 제한을 늘려 네트워크 성능을 개선할 수 있습니다.

gcloud alpha compute tpus queued-resources ssh "${QUEUED_RESOURCE_ID}" \
  --project "${PROJECT}" \
  --zone "${ZONE}" \
  --node=all \
  --command='sudo sh -c "echo \"4096 41943040 314572800\" > /proc/sys/net/ipv4/tcp_rmem"' \
  --worker=all

큐에 추가된 리소스로 프로비저닝

큐에 추가된 리소스를 사용하여 Cloud TPU v6e를 만들 수 있습니다. 용량을 사용할 수 있게 되면 큐에 추가된 리소스에서 용량을 받을 수 있습니다. 요청을 작성할 때 선택적으로 시작 시간과 종료 시간을 지정할 수 있습니다. 자세한 내용은 큐에 추가된 리소스 관리를 참고하세요.

GKE 또는 XPK로 v6e Cloud TPU 프로비저닝

v6e에서 GKE 명령어를 사용하는 경우 Kubernetes 명령어 또는 XPK를 사용하여 Cloud TPU를 프로비저닝하고 모델을 학습 또는 제공할 수 있습니다. GKE 클러스터에서 Cloud TPU 구성을 계획하는 방법은 GKE에서 Cloud TPU 계획을 참고하세요. 다음 섹션에서는 단일 NIC 지원 및 다중 NIC 지원이 있는 XPK 클러스터를 만드는 명령어를 제공합니다.

단일 NIC 지원을 통해 XPK 클러스터 만들기

export CLUSTER_NAME=xpk-cluster-name
export ZONE=us-east1-d
export PROJECT_ID=your-project-id
export TPU_TYPE=v6e-256
export NUM_SLICES=2

export NETWORK_NAME=${CLUSTER_NAME}-mtu9k
export NETWORK_FW_NAME=${NETWORK_NAME}-fw
gcloud compute networks create ${NETWORK_NAME} \
   --mtu=8896 \
   --project=${PROJECT_ID} \
   --subnet-mode=auto \
   --bgp-routing-mode=regional
gcloud compute firewall-rules create ${NETWORK_FW_NAME} \
   --network=${NETWORK_NAME} \
   --allow tcp,icmp,udp \
   --project=${PROJECT_ID}
export CLUSTER_ARGUMENTS="--network=${NETWORK_NAME} --subnetwork=${NETWORK_NAME}"
python3 xpk.py cluster create --cluster=${CLUSTER_NAME} \
   --cluster-cpu-machine-type=n1-standard-8 \
   --num-slices=${NUM_SLICES} \
   --tpu-type=${TPU_TYPE} \
   --zone=${ZONE}  \
   --project=${PROJECT_ID} \
   --on-demand \
   --custom-cluster-arguments="${CLUSTER_ARGUMENTS}"  \
   --create-vertex-tensorboard

명령어 플래그 설명

변수 설명
CLUSTER_NAME XPK 클러스터에 사용자가 할당한 이름입니다.
PROJECT_ID Google Cloud 프로젝트 이름 기존 프로젝트를 사용하거나 새 프로젝트를 만듭니다. 자세한 내용은 Google Cloud 프로젝트 설정을 참고하세요.
ZONE 지원되는 영역에 대해서는 Cloud TPU 리전 및 영역 문서를 참고하세요.
TPU_TYPE 가속기 유형을 참고하세요.
NUM_SLICES 만들려는 슬라이스 수
CLUSTER_ARGUMENTS 사용할 네트워크 및 서브네트워크입니다.

예: --network=${NETWORK_NAME} --subnetwork=${NETWORK_NAME}

NUM_SLICES 생성할 슬라이스 수입니다.
NETWORK_NAME 사용할 보조 네트워크의 이름입니다.
NETWORK_FW_NAME 사용할 보조 네트워크 방화벽의 이름입니다.

다중 NIC를 지원하는 XPK 클러스터 만들기

export CLUSTER_NAME=xpk-cluster-name
export ZONE=us-east1-d
export PROJECT_ID=your-project-id
export TPU_TYPE=v6e-256
export NUM_SLICES=2

export NETWORK_NAME_1=${CLUSTER_NAME}-mtu9k-1-${ZONE}
export SUBNET_NAME_1=${CLUSTER_NAME}-privatesubnet-1-${ZONE}
export NETWORK_FW_NAME_1=${NETWORK_NAME_1}-fw-1-${ZONE}
export FIREWALL_RULE_NAME=${CLUSTER_NAME}-privatefirewall-1-${ZONE}
export ROUTER_NAME=${CLUSTER_NAME}-network-1-${ZONE}
export NAT_CONFIG=${CLUSTER_NAME}-natconfig-1-${ZONE}
gcloud compute networks create ${NETWORK_NAME_1} \
   --mtu=8896 \
   --bgp-routing-mode=regional \
   --subnet-mode=custom \
   --project=${PROJECT_ID}
gcloud compute networks subnets create ${SUBNET_NAME_1} \
   --network=${NETWORK_NAME_1} \
   --range=10.11.0.0/18 \
   --region=${REGION} \
   --project=${PROJECT_ID}
gcloud compute firewall-rules create ${FIREWALL_RULE_NAME} \
   --network=${NETWORK_NAME_1} \
   --allow tcp,icmp,udp \
   --project=${PROJECT_ID}
gcloud compute routers create ${ROUTER_NAME} \
    --project=${PROJECT_ID} \
    --network=${NETWORK_NAME_1} \
    --region=${REGION}
gcloud compute routers nats create ${NAT_CONFIG} \
    --router=${ROUTER_NAME} \
    --region=${REGION} \
    --auto-allocate-nat-external-ips \
    --nat-all-subnet-ip-ranges \
    --project=${PROJECT_ID} \
    --enable-logging
# Secondary subnet for multi-nic experience.
# Need custom IP routing to be different from the first network's subnet.

export NETWORK_NAME_2=${CLUSTER_NAME}-privatenetwork-2-${ZONE}
export SUBNET_NAME_2=${CLUSTER_NAME}-privatesubnet-2-${ZONE}
export FIREWALL_RULE_NAME=${CLUSTER_NAME}-privatefirewall-2-${ZONE}
export ROUTER_NAME=${CLUSTER_NAME}-network-2-${ZONE}
export NAT_CONFIG=${CLUSTER_NAME}-natconfig-2-${ZONE}
gcloud compute networks create ${NETWORK_NAME_2} \
   --mtu=8896 \
   --bgp-routing-mode=regional \
   --subnet-mode=custom \
   --project=${PROJECT_ID}
gcloud compute networks subnets create ${SUBNET_NAME_2} \
   --network=${NETWORK_NAME_2} \
   --range=10.10.0.0/18 \
   --region=${REGION} \
   --project=${PROJECT_ID}
gcloud compute firewall-rules create ${FIREWALL_RULE_NAME} \
   --network=${NETWORK_NAME_2} \
   --allow tcp,icmp,udp \
   --project=${PROJECT_ID}
gcloud compute routers create ${ROUTER_NAME} \
     --project=${PROJECT_ID} \
     --network=${NETWORK_NAME_2} \
     --region=${REGION}
gcloud compute routers nats create ${NAT_CONFIG} \
     --router=${ROUTER_NAME} \
     --region=${REGION} \
     --auto-allocate-nat-external-ips \
     --nat-all-subnet-ip-ranges \
     --project=${PROJECT_ID} \
     --enable-logging
export CLUSTER_ARGUMENTS="--enable-dataplane-v2 --enable-ip-alias --enable-multi-networking
--network=${NETWORK_NAME_1} --subnetwork=${SUBNET_NAME_1}"

export NODE_POOL_ARGUMENTS="--additional-node-network
network=${NETWORK_NAME_2},subnetwork=${SUBNET_NAME_2}"
python3 ~/xpk/xpk.py cluster create \
    --cluster=${CLUSTER_NAME} \
    --num-slices=${NUM_SLICES} \
    --tpu-type=${TPU_TYPE} \
    --zone=${ZONE}  \
    --project=${PROJECT_ID} \
    --on-demand \
    --custom-cluster-arguments="${CLUSTER_ARGUMENTS}" \
    --custom-nodepool-arguments="${NODE_POOL_ARGUMENTS}" \
    --create-vertex-tensorboard

명령어 플래그 설명

변수 설명
CLUSTER_NAME XPK 클러스터에 사용자가 할당한 이름입니다.
PROJECT_ID Google Cloud 프로젝트 이름 기존 프로젝트를 사용하거나 새 프로젝트를 만듭니다. 자세한 내용은 Google Cloud 프로젝트 설정을 참고하세요.
ZONE 지원되는 영역에 대해서는 Cloud TPU 리전 및 영역 문서를 참고하세요.
TPU_TYPE 가속기 유형을 참고하세요.
NUM_SLICES 만들려는 슬라이스 수
CLUSTER_ARGUMENTS 사용할 네트워크 및 서브네트워크입니다.

예: --enable-dataplane-v2 --enable-ip-alias --enable-multi-networking --network=${NETWORK_NAME_1} --subnetwork=${SUBNET_NAME_1}

NODE_POOL_ARGUMENTS 사용할 추가 노드 네트워크입니다.

예: --additional-node-network network=${NETWORK_NAME_2},subnetwork=${SUBNET_NAME_2}

NUM_SLICES 생성할 슬라이스 수입니다 (멀티슬라이스에만 필요).
NETWORK_NAME 사용할 보조 네트워크의 이름입니다.
NETWORK_FW_NAME 사용할 보조 네트워크 방화벽의 이름입니다.

프레임워크 설정

이 섹션에서는 JAX, PyTorch 또는 TensorFlow 프레임워크를 사용하는 ML 모델 학습을 위한 일반적인 설정 프로세스를 설명합니다. GKE를 사용하는 경우 프레임워크 설정에 XPK 또는 Kubernetes 명령어를 사용할 수 있습니다.

JAX 설정

이 섹션에서는 XPK 유무와 관계없이 GKE에서 JAX 워크로드를 실행하고 대기열에 추가된 리소스를 사용하는 방법을 설명합니다.

GKE를 사용하여 JAX 설정

단일 호스트의 단일 슬라이스

다음 예에서는 Kubernetes YAML 파일을 사용하여 2x2 단일 호스트 노드 풀을 설정합니다.

apiVersion: v1
kind: Pod
metadata:
  name: tpu-pod-jax-v6e-a
spec:
  restartPolicy: Never
  nodeSelector:
    cloud.google.com/gke-tpu-accelerator: tpu-v6e-slice
    cloud.google.com/gke-tpu-topology: 2x2
  containers:
  - name: tpu-job
    image: python:3.10
    securityContext:
      privileged: true
    command:
    - bash
    - -c
    - |
      pip install -U --pre jax jaxlib libtpu-nightly requests -f https://storage.googleapis.com/jax-releases/jax_nightly_releases.html -f https://storage.googleapis.com/jax-releases/libtpu_releases.html
      JAX_PLATFORMS=tpu,cpu ENABLE_PJRT_COMPATIBILITY=true python3 -c 'import jax; print("Total TPU chips:", jax.device_count())'
    resources:
      requests:
        google.com/tpu: 4
      limits:
        google.com/tpu: 4

완료되면 GKE 로그에 다음 메시지가 표시됩니다.

Total TPU chips: 4

멀티 호스트의 단일 슬라이스

다음 예에서는 Kubernetes YAML 파일을 사용하여 4x4 멀티 호스트 노드 풀을 설정합니다.

apiVersion: v1
kind: Service
metadata:
  name: headless-svc
spec:
  clusterIP: None
  selector:
    job-name: tpu-available-chips
---
apiVersion: batch/v1
kind: Job
metadata:
  name: tpu-available-chips
spec:
  backoffLimit: 0
  completions: 4
  parallelism: 4
  completionMode: Indexed
  template:
    spec:
      subdomain: headless-svc
      restartPolicy: Never
      nodeSelector:
        cloud.google.com/gke-tpu-accelerator: tpu-v6e-slice
        cloud.google.com/gke-tpu-topology: 4x4
      containers:
      - name: tpu-job
        image: python:3.10
        ports:
        - containerPort: 8471 # Default port using which TPU VMs communicate
        - containerPort: 8431 # Port to export TPU runtime metrics, if supported.
        securityContext:
          privileged: true
        command:
        - bash
        - -c
        - |
          pip install -U --pre jax jaxlib libtpu-nightly requests -f https://storage.googleapis.com/jax-releases/jax_nightly_releases.html -f https://storage.googleapis.com/jax-releases/libtpu_releases.html
          JAX_PLATFORMS=tpu,cpu ENABLE_PJRT_COMPATIBILITY=true python -c 'import jax; print("Total TPU chips:", jax.device_count())'
        resources:
          requests:
            google.com/tpu: 4
          limits:
            google.com/tpu: 4

완료되면 GKE 로그에 다음 메시지가 표시됩니다.

Total TPU chips: 16

멀티 호스트의 멀티슬라이스

다음 예에서는 Kubernetes YAML 파일을 사용하여 4x4 멀티 호스트 노드 풀 2개를 설정합니다.

기본 요건으로 v0.2.3 이상의 JobSet을 설치해야 합니다.

apiVersion: jobset.x-k8s.io/v1alpha2
kind: JobSet
metadata:
  name: multislice-job
  annotations:
    alpha.jobset.sigs.k8s.io/exclusive-topology: cloud.google.com/gke-nodepool
spec:
  failurePolicy:
    maxRestarts: 4
  replicatedJobs:
    - name: slice
      replicas: 2
      template:
        spec:
          parallelism: 4
          completions: 4
          backoffLimit: 0
          template:
            spec:
              hostNetwork: true
              dnsPolicy: ClusterFirstWithHostNet
              nodeSelector:
                cloud.google.com/gke-tpu-accelerator: tpu-v6e-slice
                cloud.google.com/gke-tpu-topology: 4x4
              hostNetwork: true
              containers:
              - name: jax-tpu
                image: python:3.10
                ports:
                - containerPort: 8471
                - containerPort: 8080
                - containerPort: 8431
                securityContext:
                  privileged: true
                command:
                - bash
                - -c
                - |
                  pip install -U --pre jax jaxlib libtpu-nightly requests -f https://storage.googleapis.com/jax-releases/jax_nightly_releases.html -f https://storage.googleapis.com/jax-releases/libtpu_releases.html
                  JAX_PLATFORMS=tpu,cpu ENABLE_PJRT_COMPATIBILITY=true python -c 'import jax; print("Total TPU chips:", jax.device_count())'
                resources:
                  limits:
                   google.com/tpu: 4
                  requests:
                   google.com/tpu: 4

완료되면 GKE 로그에 다음 메시지가 표시됩니다.

Total TPU chips: 32

자세한 내용은 GKE 문서의 멀티슬라이스 워크로드 실행을 참고하세요.

성능을 개선하려면 hostNetwork를 사용 설정합니다.

멀티 NIC

GKE에서 멀티 NIC를 활용하려면 Kubernetes Pod 매니페스트에 추가 주석이 있어야 합니다. 다음은 TPU가 아닌 멀티 NIC 워크로드 매니페스트의 예입니다.

apiVersion: v1
kind: Pod
metadata:
  name: sample-netdevice-pod-1
  annotations:
    networking.gke.io/default-interface: 'eth0'
    networking.gke.io/interfaces: |
      [
        {"interfaceName":"eth0","network":"default"},
        {"interfaceName":"eth1","network":"netdevice-network"}
      ]
spec:
  containers:
  - name: sample-netdevice-pod
    image: busybox
    command: ["sleep", "infinity"]
    ports:
    - containerPort: 80
  restartPolicy: Always
  tolerations:
  - key: "google.com/tpu"
    operator: "Exists"
    effect: "NoSchedule"

exec 명령어를 사용하여 Kubernetes 포드에 연결하면 다음 코드를 사용하여 추가 NIC가 표시됩니다.

$ k exec --stdin --tty sample-netdevice-pod-1 -- /bin/sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1460 qdisc noqueue
    link/ether da:be:12:67:d2:25 brd ff:ff:ff:ff:ff:ff
    inet 10.124.2.6/24 brd 10.124.2.255 scope global eth0
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc mq qlen 1000
    link/ether 42:01:ac:18:00:04 brd ff:ff:ff:ff:ff:ff
    inet 172.24.0.4/32 scope global eth1
       valid_lft forever preferred_lft forever

XPK를 사용하여 GKE로 JAX 설정

GKE 및 XPK를 사용하여 JAX를 설정하려면 xpk 리드미를 참고하세요.

MaxText로 XPK를 설정하고 실행하려면 MaxText 실행 방법을 참고하세요.

큐에 추가된 리소스를 사용하여 JAX 설정

gcloud alpha compute tpus tpu-vm ssh 명령어를 사용하여 슬라이스 또는 슬라이스의 모든 Cloud TPU VM에 JAX를 동시에 설치합니다. 멀티슬라이스의 경우 --node=all 플래그를 추가합니다.

gcloud alpha compute tpus tpu-vm ssh ${TPU_NAME} --project ${PROJECT_ID} \
 --zone ${ZONE} --worker=all \
 --command='pip install -U --pre jax jaxlib libtpu-nightly requests -f https://storage.googleapis.com/jax-releases/jax_nightly_releases.html -f https://storage.googleapis.com/jax-releases/libtpu_releases.html'

다음 명령어를 실행하여 슬라이스에서 사용할 수 있는 Cloud TPU 코어 수를 확인하고 모든 것이 올바르게 설치되었는지 테스트할 수 있습니다.

gcloud alpha compute tpus tpu-vm ssh ${TPU_NAME} --project ${PROJECT_ID} \
   --zone ${ZONE} --worker=all  \
   --command='python3 -c "import jax; print(jax.device_count(), jax.local_device_count())"'

v6e-16 슬라이스에서 실행하면 출력은 다음과 비슷합니다.

SSH: Attempting to connect to worker 0...
SSH: Attempting to connect to worker 1...
SSH: Attempting to connect to worker 2...
SSH: Attempting to connect to worker 3...
16 4
16 4
16 4
16 4

jax.device_count()에서는 지정된 슬라이스의 칩 총개수를 보여줍니다. jax.local_device_count()는 이 슬라이스에서 단일 VM이 액세스할 수 있는 칩 수를 나타냅니다.

gcloud alpha compute tpus queued-resources ssh ${QUEUED_RESOURCE_ID} \
   --project=${PROJECT_ID} --zone=${ZONE} --worker=all  \
   --command='git clone -b mlperf4.1 https://github.com/google/maxdiffusion.git &&
   cd maxdiffusion && git checkout 975fdb7dbddaa9a53ad72a421cdb487dcdc491a3 &&
   && pip install -r requirements.txt  && pip install . '

JAX 설정 문제 해결하기

일반적인 팁은 GKE 워크로드 매니페스트에서 상세 로깅을 사용 설정하는 것입니다. 그런 다음 GKE 지원팀에 로그를 제공합니다.

TPU_MIN_LOG_LEVEL=0 TF_CPP_MIN_LOG_LEVEL=0 TPU_STDERR_LOG_LEVEL=0

오류 메시지

no endpoints available for service 'jobset-webhook-service'

이 오류는 작업 세트가 올바르게 설치되지 않았음을 의미합니다. jobset-controller-manager 배포 Kubernetes Pod가 실행 중인지 확인합니다. 자세한 내용은 JobSet 문제 해결 문서를 참고하세요.

TPU initialization failed: Failed to connect

GKE 노드 버전이 1.30.4-gke.1348000 이상인지 확인합니다 (GKE 1.31은 지원되지 않음).

PyTorch 설정

이 섹션에서는 PyTorch/XLA를 사용하여 v6e에서 PJRT 사용을 시작하는 방법을 설명합니다. Python 3.10이 권장되는 Python 버전입니다.

XPK를 사용하여 GKE를 통해 PyTorch 설정

PyTorch 종속 항목이 이미 설치된 XPK와 함께 다음 Docker 컨테이너를 사용할 수 있습니다.

us-central1-docker.pkg.dev/tpu-pytorch-releases/docker/xla:nightly_3.10_tpuvm_20241028

XPK 워크로드를 만들려면 다음 명령어를 사용합니다.

python3 xpk.py workload create \
    --cluster ${CLUSTER_NAME} \
    {--docker-image | --base-docker-image} us-central1-docker.pkg.dev/tpu-pytorch-releases/docker/xla:nightly_3.10_tpuvm_20241028 \
    --workload ${USER} -xpk-${ACCELERATOR_TYPE} -${NUM_SLICES} \
    --tpu-type=${ACCELERATOR_TYPE} \
    --num-slices=${NUM_SLICES}  \
    --on-demand \
    --zone ${ZONE} \
    --project ${PROJECT_ID} \
    --enable-debug-logs \
    --command 'python3 -c "import torch; import torch_xla; import torch_xla.runtime as xr; print(xr.global_runtime_device_count())"'

--base-docker-image를 사용하면 현재 작업 디렉터리가 새 Docker에 빌드된 새 Docker 이미지가 생성됩니다.

큐에 추가된 리소스를 사용하여 PyTorch 설정

다음 단계에 따라 대기열에 추가된 리소스를 사용하여 PyTorch를 설치하고 v6e에서 작은 스크립트를 실행합니다.

SSH를 사용하여 종속 항목을 설치하여 VM에 액세스

다음 명령어를 사용하여 모든 Cloud TPU VM에 종속 항목을 설치합니다. 멀티슬라이스의 경우 --worker=all 플래그를 추가합니다.

gcloud compute tpus tpu-vm ssh ${TPU_NAME} \
    --project=${PROJECT_ID} \
    --zone=${ZONE} \
    --worker=all \
    --command='sudo apt install -y libopenblas-base pip3 && \
               pip install torch~=2.6.0 "torch_xla[tpu]~=2.6.0" -f https://storage.googleapis.com/libtpu-releases/index.html -f https://storage.googleapis.com/libtpu-wheels/index.html'

상당한 크기의 자주 할당되는 모델의 성능 개선

상당한 크기의 할당이 빈번한 모델의 경우 tcmalloc 함수를 사용하면 기본 malloc 함수 구현에 비해 성능이 크게 향상되므로 Cloud TPU VM에서 사용되는 기본 malloc 함수는 tcmalloc입니다. 그러나 워크로드에 따라 (예: 임베딩 테이블에 대한 대규모 할당이 있는 DLRM) tcmalloc 함수가 느려질 수 있으며, 이 경우 대신 기본 malloc 함수를 사용하여 다음 변수를 설정 해제할 수 있습니다.

unset LD_PRELOAD

Python 스크립트를 사용하여 v6e VM에서 계산 실행

다음 명령어를 사용하여 두 개의 텐서를 만들고, 함께 더하고, 결과를 출력하는 스크립트를 실행합니다.

gcloud alpha compute tpus tpu-vm ssh ${TPU_NAME} \
   --project ${PROJECT_ID} \
   --zone ${ZONE} --worker all --command='
   unset LD_PRELOAD
   python3 -c "import torch; import torch_xla; import torch_xla.core.xla_model as xm; print(xm.xla_device()); dev = xm.xla_device(); t1 = torch.randn(3,3,device=dev); t2 = torch.randn(3,3,device=dev); print(t1 + t2)"
'

그러면 다음과 비슷한 출력이 생성됩니다.

SSH: Attempting to connect to worker 0...
WARNING:root:libtpu.so and TPU device found. Setting PJRT_DEVICE=TPU.
xla:0
tensor([[ 0.3355, -1.4628, -3.2610],
        [-1.4656,  0.3196, -2.8766],
        [ 0.8668, -1.5060,  0.7125]], device='xla:0')

TensorFlow 설정

다음 명령어를 실행하여 v6e 호환 TensorFlow 버전으로 Cloud TPU 런타임을 재설정할 수 있습니다.

gcloud alpha compute tpus tpu-vm ssh ${TPU_NAME} --project ${PROJECT_ID} \
    --zone  ${ZONE} --worker=all --command="sudo sed -i 's/TF_DOCKER_URL=.*/TF_DOCKER_URL=gcr.io\/cloud-tpu-v2-images\/grpc_tpu_worker:v6e\"/' /etc/systemd/system/tpu-runtime.service"
gcloud alpha compute tpus tpu-vm ssh ${TPU_NAME}  --project ${PROJECT_ID} \
    --zone ${ZONE} --worker=all --command='sudo systemctl daemon-reload && sudo systemctl restart tpu-runtime'

SSH를 사용하여 worker-0에 액세스합니다.

$ gcloud alpha compute tpus tpu-vm ssh ${TPU_NAME} --project ${PROJECT_ID} \
     --zone ${ZONE}

worker-0에 TensorFlow를 설치합니다.

sudo apt install -y libopenblas-base
pip install cloud-tpu-client
pip install https://storage.googleapis.com/tensorflow-public-build-artifacts/prod/tensorflow/official/release/nightly/linux_x86_tpu/wheel_py310/749/20240915-062017/github/tensorflow/build_output/tf_nightly_tpu-2.18.0.dev20240915-cp310
pip install cloud-tpu-client

pip install https://storage.googleapis.com/tensorflow-public-build-artifacts/prod/tensorflow/official/release/nightly/linux_x86_tpu/wheel_py310/749/20240915-062017/github/tensorflow/build_output/tf_nightly_tpu-2.18.0.dev20240915-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl \
-f https://storage.googleapis.com/libtpu-tf-releases/index.html --force

TPU_NAME 환경 변수를 내보냅니다.

export TPU_NAME=v6e-16

다음 Python 스크립트를 실행하여 슬라이스에서 사용할 수 있는 Cloud TPU 코어 수를 확인하고 모든 것이 올바르게 설치되었는지 테스트할 수 있습니다.

import TensorFlow as tf
print("TensorFlow version " + tf.__version__)

@tf.function
  def add_fn(x,y):
  z = x + y
  return z

  cluster_resolver = tf.distribute.cluster_resolver.TPUClusterResolver()
  tf.config.experimental_connect_to_cluster(cluster_resolver)
  tf.tpu.experimental.initialize_tpu_system(cluster_resolver)
  strategy = tf.distribute.TPUStrategy(cluster_resolver)

  x = tf.constant(1.)
  y = tf.constant(1.)
  z = strategy.run(add_fn, args=(x,y))
  print(z)

v6e-16 슬라이스에서 실행하면 출력은 다음과 비슷합니다.

PerReplica:{
  0: tf.Tensor(2.0, shape=(), dtype=float32),
  1: tf.Tensor(2.0, shape=(), dtype=float32),
  2: tf.Tensor(2.0, shape=(), dtype=float32),
  3: tf.Tensor(2.0, shape=(), dtype=float32),
  4: tf.Tensor(2.0, shape=(), dtype=float32),
  5: tf.Tensor(2.0, shape=(), dtype=float32),
  6: tf.Tensor(2.0, shape=(), dtype=float32),
  7: tf.Tensor(2.0, shape=(), dtype=float32)
}

SkyPilot이 포함된 v6e

SkyPilot에서 Cloud TPU v6e를 사용할 수 있습니다. 다음 단계에 따라 SkyPilot에 v6e 관련 위치 및 가격 정보를 추가합니다.

  1. ~/.sky/catalogs/v5/gcp/vms.csv 파일 끝에 다음을 추가합니다.

    ,,,tpu-v6e-1,1,tpu-v6e-1,us-south1,us-south1-a,0,0
    ,,,tpu-v6e-1,1,tpu-v6e-1,europe-west4,europe-west4-a,0,0
    ,,,tpu-v6e-1,1,tpu-v6e-1,us-east5,us-east5-b,0,0
    ,,,tpu-v6e-4,1,tpu-v6e-4,us-south1,us-south1-a,0,0
    ,,,tpu-v6e-4,1,tpu-v6e-4,europe-west4,europe-west4-a,0,0
    ,,,tpu-v6e-4,1,tpu-v6e-4,us-east5,us-east5-b,0,0
    ,,,tpu-v6e-8,1,tpu-v6e-8,us-south1,us-south1-a,0,0
    ,,,tpu-v6e-8,1,tpu-v6e-8,europe-west4,europe-west4-a,0,0
    ,,,tpu-v6e-8,1,tpu-v6e-8,us-east5,us-east5-b,0,0
    ,,,tpu-v6e-16,1,tpu-v6e-16,us-south1,us-south1-a,0,0
    ,,,tpu-v6e-16,1,tpu-v6e-16,europe-west4,europe-west4-a,0,0
    ,,,tpu-v6e-16,1,tpu-v6e-16,us-east5,us-east5-b,0,0
    ,,,tpu-v6e-32,1,tpu-v6e-32,us-south1,us-south1-a,0,0
    ,,,tpu-v6e-32,1,tpu-v6e-32,europe-west4,europe-west4-a,0,0
    ,,,tpu-v6e-32,1,tpu-v6e-32,us-east5,us-east5-b,0,0
    ,,,tpu-v6e-64,1,tpu-v6e-64,us-south1,us-south1-a,0,0
    ,,,tpu-v6e-64,1,tpu-v6e-64,europe-west4,europe-west4-a,0,0
    ,,,tpu-v6e-64,1,tpu-v6e-64,us-east5,us-east5-b,0,0
    ,,,tpu-v6e-128,1,tpu-v6e-128,us-south1,us-south1-a,0,0
    ,,,tpu-v6e-128,1,tpu-v6e-128,europe-west4,europe-west4-a,0,0
    ,,,tpu-v6e-128,1,tpu-v6e-128,us-east5,us-east5-b,0,0
    ,,,tpu-v6e-256,1,tpu-v6e-256,us-south1,us-south1-a,0,0
    ,,,tpu-v6e-256,1,tpu-v6e-256,europe-west4,europe-west4-a,0,0
    ,,,tpu-v6e-256,1,tpu-v6e-256,us-east5,us-east5-b,0,0
    
  2. YAML 파일에서 다음 리소스를 지정합니다.

    # tpu_v6.yaml
    resources:
      accelerators: tpu-v6e-16 # Fill in the accelerator type you want to use
      accelerator_args:
        runtime_version: v2-alpha-tpuv6e # Official suggested runtime
    
  3. Cloud TPU v6e로 클러스터를 실행합니다.

       sky launch tpu_v6.yaml -c tpu_v6
    
  4. SSH를 사용하여 Cloud TPU v6e에 연결합니다. ssh tpu_v6

추론 튜토리얼

다음 튜토리얼에서는 Cloud TPU v6e에서 추론을 실행하는 방법을 보여줍니다.

학습 예시

다음 섹션에서는 Cloud TPU v6e에서 MaxText, MaxDiffusion, PyTorch 모델을 학습시키는 예시를 제공합니다.

v6e Cloud TPU VM에서 MaxText 및 MaxDiffusion 학습

다음 섹션에서는 MaxTextMaxDiffusion 모델의 학습 수명 주기를 다룹니다.

일반적인 대략적인 단계는 다음과 같습니다.

  1. 워크로드 기본 이미지를 빌드합니다.
  2. XPK를 사용하여 워크로드를 실행합니다.
    1. 워크로드의 학습 명령어를 빌드합니다.
    2. 워크로드를 배포합니다.
  3. 워크로드를 따라가고 측정항목을 확인합니다.
  4. XPK 워크로드가 필요하지 않으면 삭제합니다.
  5. 더 이상 필요하지 않으면 XPK 클러스터를 삭제합니다.

기본 이미지 빌드

MaxText 또는 MaxDiffusion을 설치하고 Docker 이미지를 빌드합니다.

  1. 사용할 저장소를 클론하고 저장소의 디렉터리로 변경합니다.

    MaxText:

    git clone https://github.com/google/maxtext.git && cd maxtext
    

    MaxDiffusion:

    git clone https://github.com/google/maxdiffusion.git && cd maxdiffusion
    
  2. Google Cloud CLI를 사용하도록 Docker를 구성합니다.

    gcloud auth configure-docker
    
  3. 다음 명령어를 사용하거나 JAX 안정화 스택을 사용하여 Docker 이미지를 빌드합니다. JAX Stable Stack에 관한 자세한 내용은 JAX Stable Stack으로 Docker 이미지 빌드를 참고하세요.

    bash docker_build_dependency_image.sh MODE=stable JAX_VERSION=0.4.35
    
  4. 로컬에서 빌드된 이미지가 없는 머신에서 워크로드를 실행하는 경우 이미지를 업로드합니다.

    bash docker_upload_runner.sh CLOUD_IMAGE_NAME=${USER}_runner
    

XPK를 사용하여 워크로드 실행

  1. MaxText에서 설정한 기본값 또는 MaxDiffusion을 사용하지 않는 경우 다음 환경 변수를 설정합니다.

    export BASE_OUTPUT_DIR=gs://YOUR_BUCKET
    export PER_DEVICE_BATCH_SIZE=2
    export NUM_STEPS=30
    export MAX_TARGET_LENGTH=8192
  2. 모델 스크립트를 빌드합니다. 이 스크립트는 이후 단계에서 학습 명령어로 복사됩니다.

    아직 모델 스크립트를 실행하지 마세요.

    MaxText

    MaxText는 순수 Python 및 JAX로 작성되었으며 학습 및 추론을 위해 Google Cloud TPU 및 GPU를 타겟팅하는 고성능의 확장성이 뛰어난 오픈소스 LLM입니다.

    JAX_PLATFORMS=tpu,cpu \
    ENABLE_PJRT_COMPATIBILITY=true \
    TPU_SLICE_BUILDER_DUMP_CHIP_FORCE=true \
    TPU_SLICE_BUILDER_DUMP_ICI=true && \
    python /deps/MaxText/train.py /deps/MaxText/configs/base.yml \
            base_output_directory=${BASE_OUTPUT_DIR} \
            dataset_type=synthetic \
            per_device_batch_size=${PER_DEVICE_BATCH_SIZE} \
            enable_checkpointing=false \
            gcs_metrics=true \
            profiler=xplane \
            skip_first_n_steps_for_profiler=5 \
            steps=${NUM_STEPS}  # attention='dot_product'"
    

    Gemma2

    Gemma는 Gemini 연구 및 기술을 기반으로 Google DeepMind에서 개발한 개방형 가중치 LLM 제품군입니다.

    python3 MaxText/train.py MaxText/configs/base.yml \
        model_name=gemma2-27b \
        run_name=gemma2-27b-run \
        base_output_directory=${BASE_OUTPUT_DIR} \
        max_target_length=${MAX_TARGET_LENGTH} \
        per_device_batch_size=${PER_DEVICE_BATCH_SIZE} \
        steps=${NUM_STEPS} \
        enable_checkpointing=false \
        use_iota_embed=true \
        gcs_metrics=true \
        dataset_type=synthetic \
        profiler=xplane \
        attention=flash
    

    Mixtral 8x7b

    Mixtral은 Mistral AI에서 개발한 최신 AI 모델로, 희소 전문가 망 (MoE) 아키텍처를 활용합니다.

    python3 MaxText/train.py MaxText/configs/base.yml \
        base_output_directory=${BASE_OUTPUT_DIR} \
        per_device_batch_size=${PER_DEVICE_BATCH_SIZE} \
        model_name=mixtral-8x7b \
        steps=${NUM_STEPS} \
        max_target_length=${MAX_TARGET_LENGTH} \
        tokenizer_path=assets/tokenizer.mistral-v1 \
        attention=flash \
        dtype=bfloat16 \
        dataset_type=synthetic \
        profiler=xplane
    

    Llama3-8b

    Llama는 Meta에서 개발한 개방형 가중치 LLM 제품군입니다.

    python3 MaxText/train.py MaxText/configs/base.yml \
        model_name=llama3-8b \
        base_output_directory=${BASE_OUTPUT_DIR} \
        dataset_type=synthetic \
        tokenizer_path=assets/tokenizer_llama3.tiktoken \
        per_device_batch_size=${PER_DEVICE_BATCH_SIZE} # set to 4 \
        gcs_metrics=true \
        profiler=xplane \
        skip_first_n_steps_for_profiler=5 \
        steps=${NUM_STEPS} \
        max_target_length=${MAX_TARGET_LENGTH} \
        attention=flash
    

    MaxDiffusion

    MaxDiffusion은 Cloud TPU 및 GPU를 비롯한 XLA 기기에서 실행되는 순수 Python 및 JAX로 작성된 다양한 잠재 확산 모델의 참조 구현 모음입니다. 안정적인 확산은 모든 텍스트 입력에서 실사 이미지를 생성하는 잠재 텍스트 이미지 변환 모델입니다.

    MaxDiffusion을 실행하려면 다음 git checkout 명령어와 같이 특정 Git 브랜치를 설치해야 합니다.

    git clone https://github.com/google/maxdiffusion.git
    && cd maxdiffusion
    && git checkout e712c9fc4cca764b0930067b6e33daae2433abf0
    && pip install -r requirements.txt
    && pip install .
    

    학습 스크립트:

        cd maxdiffusion && OUT_DIR=${BASE_OUTPUT_DIR} \
        python src/maxdiffusion/train_sdxl.py \
        src/maxdiffusion/configs/base_xl.yml \
        revision=refs/pr/95 \
        activations_dtype=bfloat16 \
        weights_dtype=bfloat16 \
        resolution=1024 \
        per_device_batch_size=1 \
        output_dir=${OUT_DIR}  \
        jax_cache_dir=${OUT_DIR}/cache_dir/ \
        max_train_steps=200 \
        attention=flash run_name=sdxl-ddp-v6e
        
  3. 다음 변수를 내보냅니다.

    export CLUSTER_NAME=CLUSTER_NAME
    export ACCELERATOR_TYPE=ACCELERATOR_TYPE
    export NUM_SLICES=NUM_SLICES
    export YOUR_MODEL_SCRIPT=YOUR_MODEL_SCRIPT

    환경 변수 설명

    변수 설명
    CLUSTER_NAME XPK 클러스터의 이름입니다.
    ACCELERATOR_TYPE 가속기 유형을 참고하세요.
    NUM_SLICES TPU 슬라이스 수입니다.
    YOUR_MODEL_SCRIPT 학습 명령어로 실행할 모델 스크립트입니다.
  4. 이전 단계에서 만든 스크립트를 사용하여 모델을 실행합니다. MaxText 기본 이미지를 사용하려면 --base-docker-image 플래그를 지정하거나 --docker-image 플래그와 사용하려는 이미지를 지정해야 합니다.

    선택사항: --enable-debug-logs 플래그를 포함하여 디버그 로깅을 사용 설정할 수 있습니다. 자세한 내용은 MaxText에서 JAX 디버그를 참고하세요.

    선택사항: --use-vertex-tensorboard 플래그를 포함하여 Vertex AI 실험을 만들어 Vertex AI 텐서보드에 데이터를 업로드할 수 있습니다. 자세한 내용은 Vertex AI를 사용하여 MaxText에서 JAX 모니터링을 참고하세요.

    python3 xpk.py workload create \
        --cluster ${CLUSTER_NAME} \
        {--base-docker-image maxtext_base_image|--docker-image ${CLOUD_IMAGE_NAME}} \
        --workload=${USER}-xpk-${ACCELERATOR_TYPE}-${NUM_SLICES} \
        --tpu-type=${ACCELERATOR_TYPE} \
        --num-slices=${NUM_SLICES}  \
        --on-demand \
        --zone=${ZONE} \
        --project=${PROJECT_ID} \
        [--enable-debug-logs] \
        [--use-vertex-tensorboard] \
        --command=${YOUR_MODEL_SCRIPT}

    출력에는 워크로드를 추적할 수 있는 링크가 포함됩니다. 링크를 열고 로그 탭을 클릭하여 워크로드를 실시간으로 추적합니다.

MaxText에서 JAX 디버그

보조 XPK 명령어를 사용하여 클러스터 또는 워크로드가 실행되지 않는 이유를 진단합니다.

  • XPK 워크로드 목록
  • XPK 검사기
  • XPK 워크로드를 만들 때 --enable-debug-logs 플래그를 사용하여 워크로드 로그에서 상세 로깅을 사용 설정합니다.

Vertex AI를 사용하여 MaxText에서 JAX 모니터링

Vertex AI의 관리형 TensorBoard를 통해 스칼라 및 프로필 데이터를 확인합니다.

  1. 사용 중인 영역의 리소스 관리 (CRUD) 요청을 600에서 5,000으로 늘립니다. VM 16대 미만을 사용하는 소규모 워크로드의 경우 이 문제가 발생하지 않을 수 있습니다.
  2. Vertex AI용 cloud-accelerator-diagnostics와 같은 종속 항목을 설치합니다.

    # xpk dependencies will install cloud-accelerator-diagnostics for Vertex AI
    cd ~/xpk
    pip install .
  3. Vertex AI TensorBoard 만들기에 설명된 대로 --create-vertex-tensorboard 플래그를 사용하여 XPK 클러스터를 만듭니다. 기존 클러스터에서 이 명령어를 실행할 수도 있습니다.

  4. --use-vertex-tensorboard 플래그와 선택사항인 --experiment-name 플래그를 사용하여 XPK 워크로드를 실행할 때 Vertex AI 실험을 만듭니다. 단계의 전체 목록은 Vertex AI 실험을 만들어 Vertex AI 텐서보드에 데이터 업로드하기를 참고하세요.

로그에는 다음과 유사한 Vertex AI 텐서보드 링크가 포함됩니다.

View your TensorBoard at https://us-central1.tensorboard.googleusercontent.com/experiment/project_id+locations+us-central1+tensorboards+hash+experiments+name

Google Cloud 콘솔에서도 Vertex AI TensorBoard 링크를 찾을 수 있습니다. Google Cloud 콘솔에서 Vertex AI Experiments로 이동합니다. 드롭다운에서 적절한 지역을 선택합니다.

TensorBoard 디렉터리도 ${BASE_OUTPUT_DIR}로 지정한 Cloud Storage 버킷에 씁니다.

XPK 워크로드 삭제

xpk workload delete 명령어를 사용하여 작업 접두사 또는 작업 상태를 기반으로 하나 이상의 워크로드를 삭제합니다. 이 명령어는 더 이상 실행할 필요가 없는 XPK 워크로드를 전송했거나 대기열에 멈춘 작업이 있는 경우에 유용할 수 있습니다.

XPK 클러스터 삭제

xpk cluster delete 명령어를 사용하여 클러스터를 삭제합니다.

python3 xpk.py cluster delete --cluster ${CLUSTER_NAME} \
--zone=${ZONE} --project=${PROJECT_ID}

v6e Cloud TPU VM에서 Llama 및 PyTorch/XLA 학습

이 튜토리얼에서는 WikiText 데이터 세트를 사용하여 Cloud TPU v6e에서 PyTorch/XLA를 사용하여 Llama 모델을 학습시키는 방법을 설명합니다.

Hugging Face 및 Llama 3 모델에 대한 액세스 권한 얻기

이 튜토리얼을 실행하려면 Hugging Face 사용자 액세스 토큰이 필요합니다. 사용자 액세스 토큰 생성 및 사용에 관한 자세한 내용은 사용자 액세스 토큰에 관한 Hugging Face 문서를 참고하세요.

Hugging Face의 Llama 3 8B 모델에 액세스하려면 권한도 필요합니다. 액세스 권한을 얻으려면 HuggingFace의 Meta-Llama-3-8B 모델로 이동하여 액세스를 요청하세요.

Cloud TPU VM 만들기

칩 8개가 있는 Cloud TPU v6e를 만들어 튜토리얼을 실행합니다.

  1. 환경 변수를 설정합니다.

    export ACCELERATOR_TYPE=v6e-8
    export VERSION=v2-alpha-tpuv6e
    export TPU_NAME=$USER-$ACCELERATOR_TYPE
    export PROJECT_ID=your-project-id
    export ZONE=us-east1-d
  2. Cloud TPU VM을 만듭니다.

    gcloud alpha compute tpus tpu-vm create ${TPU_NAME} --version=${VERSION} \
        --accelerator-type=${ACCELERATOR_TYPE} \
        --zone=${ZONE} \
        --project=${PROJECT_ID}

설치

Hugging Face 트랜스포저 및 종속 항목의 pytorch-tpu/transformers 포크를 설치합니다. 이 튜토리얼은 이 예에서 사용된 다음 종속 항목 버전으로 테스트되었습니다.

  • torch: 2.5.0과 호환됨
  • torch_xla[tpu]: 2.5.0과 호환됨
  • jax: 0.4.33
  • jaxlib: 0.4.33
gcloud alpha compute tpus tpu-vm ssh ${TPU_NAME} --project=${PROJECT_ID} --zone ${ZONE} \
    --worker=all --command='git clone -b flash_attention https://github.com/pytorch-tpu/transformers.git
    cd transformers
    sudo pip3 install -e .
    pip3 install datasets
    pip3 install evaluate
    pip3 install scikit-learn
    pip3 install accelerate
    pip install torch~=2.6.0 torch_xla[tpu]~=2.6.0 -f https://storage.googleapis.com/libtpu-releases/index.html -f https://storage.googleapis.com/libtpu-wheels/index.html
    pip install jax==0.4.38 jaxlib==0.4.38 -f https://storage.googleapis.com/jax-releases/jax_nightly_releases.html -f https://storage.googleapis.com/jax-releases/jaxlib_nightly_releases.html'

모델 구성 설정

다음 섹션의 학습 명령어인 모델 실행은 두 개의 JSON 구성 파일을 사용하여 모델 매개변수와 FSDP (전체 샤딩 데이터 병렬) 구성을 정의합니다. FSDP 샤딩은 학습 중에 모델 가중치가 더 큰 배치 크기에 맞게 조정되는 데 사용됩니다. 소형 모델로 학습하는 경우 데이터 병렬 처리를 사용하고 각 기기에 가중치를 복제하는 것으로 충분할 수 있습니다. PyTorch/XLA에서 기기 간에 텐서를 샤딩하는 방법에 관한 자세한 내용은 PyTorch/XLA SPMD 사용자 가이드를 참고하세요.

  1. 모델 매개변수 구성 파일을 만듭니다. 다음은 Llama3-8B의 모델 매개변수 구성입니다. 다른 모델의 경우 Hugging Face에서 구성을 찾습니다. 예를 보려면 Llama2-7B 구성을 참고하세요.

    cat > llama-config.json << EOF
    {
        "architectures": [
            "LlamaForCausalLM"
        ],
        "attention_bias": false,
        "attention_dropout": 0.0,
        "bos_token_id": 128000,
        "eos_token_id": 128001,
        "hidden_act": "silu",
        "hidden_size": 4096,
        "initializer_range": 0.02,
        "intermediate_size": 14336,
        "max_position_embeddings": 8192,
        "model_type": "llama",
        "num_attention_heads": 32,
        "num_hidden_layers": 32,
        "num_key_value_heads": 8,
        "pretraining_tp": 1,
        "rms_norm_eps": 1e-05,
        "rope_scaling": null,
        "rope_theta": 500000.0,
        "tie_word_embeddings": false,
        "torch_dtype": "bfloat16",
        "transformers_version": "4.40.0.dev0",
        "use_cache": false,
        "vocab_size": 128256
    }
    EOF
    
  2. FSDP 구성 파일을 만듭니다.

    cat > fsdp-config.json << EOF
    {
        "fsdp_transformer_layer_cls_to_wrap": [
            "LlamaDecoderLayer"
        ],
        "xla": true,
        "xla_fsdp_v2": true,
        "xla_fsdp_grad_ckpt": true
    }
    EOF
    

    FSDP에 관한 자세한 내용은 FSDPv2를 참고하세요.

  3. 다음 명령어를 사용하여 구성 파일을 Cloud TPU VM에 업로드합니다.

    gcloud alpha compute tpus tpu-vm scp llama-config.json fsdp-config.json ${TPU_NAME}:. \
        --worker=all \
        --project=${PROJECT_ID} \
        --zone=${ZONE}

모델 실행

이전 섹션에서 만든 구성 파일을 사용하여 run_clm.py 스크립트를 실행하여 WikiText 데이터 세트에서 Llama 3 8B 모델을 학습합니다. 학습 스크립트는 Cloud TPU v6e-8에서 실행되는 데 약 10분 정도 걸립니다.

  1. 다음 명령어를 사용하여 Cloud TPU에서 Hugging Face에 로그인합니다.

    gcloud alpha compute tpus tpu-vm ssh ${TPU_NAME} --project=${PROJECT} \
        --zone ${ZONE} \
        --worker=all \
        --command='
        pip3 install "huggingface_hub[cli]"
        huggingface-cli login --token HUGGING_FACE_TOKEN'
  2. 모델 학습을 실행합니다.

    gcloud alpha compute tpus tpu-vm ssh ${TPU_NAME} --project=${PROJECT} \
        --zone ${ZONE} \
        --worker=all \
        --command='
        export PJRT_DEVICE=TPU
        export XLA_USE_SPMD=1
        export ENABLE_PJRT_COMPATIBILITY=true
            # Optional variables for debugging:
        export XLA_IR_DEBUG=1
        export XLA_HLO_DEBUG=1
        export PROFILE_EPOCH=0
        export PROFILE_STEP=3
        export PROFILE_DURATION_MS=100000
            # Set PROFILE_LOGDIR to a local VM path or gs://my-bucket/profile_path
        export PROFILE_LOGDIR=PROFILE_PATH
        python3 transformers/examples/pytorch/language-modeling/run_clm.py \
        --dataset_name wikitext \
        --dataset_config_name wikitext-2-raw-v1 \
        --per_device_train_batch_size 16 \
        --do_train \
        --output_dir /home/$USER/tmp/test-clm \
        --overwrite_output_dir \
        --config_name /home/$USER/llama-config.json \
        --cache_dir /home/$USER/cache \
        --tokenizer_name meta-llama/Meta-Llama-3-8B \
        --block_size 8192 \
        --optim adafactor \
        --save_strategy no \
        --logging_strategy no \
        --fsdp "full_shard" \
        --fsdp_config /home/$USER/fsdp-config.json \
        --torch_dtype bfloat16 \
        --dataloader_drop_last yes \
        --flash_attention \
        --max_steps 20'

PyTorch/XLA 문제 해결

이전 섹션에서 디버깅을 위한 선택적 변수를 설정하면 모델의 프로필이 PROFILE_LOGDIR 변수로 지정된 위치에 저장됩니다. 이 위치에 저장된 xplane.pb 파일을 추출하고 tensorboard를 사용하여 TensorBoard 안내에 따라 브라우저에서 프로필을 볼 수 있습니다. PyTorch/XLA가 예상대로 작동하지 않으면 모델 디버깅, 프로파일링, 최적화에 관한 제안사항이 포함된 문제 해결 가이드를 참고하세요.

v6e에서 DLRM DCN v2 학습

이 튜토리얼에서는 Cloud TPU v6e에서 DLRM DCN v2 모델을 학습시키는 방법을 보여줍니다. 64, 128 또는 256개의 칩이 있는 TPU v6e를 프로비저닝해야 합니다.

멀티 호스트 TPU에서 실행하는 경우 다음 명령어를 실행하여 적절한 TensorFlow 버전으로 tpu-runtime를 재설정합니다. 단일 호스트 TPU에서 실행하는 경우 다음 두 명령어를 실행할 필요가 없습니다.

gcloud alpha compute tpus tpu-vm ssh ${TPU_NAME}  \
    --project ${PROJECT_ID} \
    --zone ${ZONE} \
    --worker=all \
    --command="sudo sed -i 's/TF_DOCKER_URL=.*/TF_DOCKER_URL=gcr.io\/cloud-tpu-v2-images\/grpc_tpu_worker:v6e\"/' /etc/systemd/system/tpu-runtime.service"

gcloud alpha compute tpus tpu-vm ssh ${TPU_NAME}  \
    --project ${PROJECT_ID} \
    --zone  ${ZONE} \
    --worker=all \
    --command='sudo systemctl daemon-reload && sudo systemctl restart tpu-runtime'

SSH를 사용하여 worker-0에 연결

gcloud alpha compute tpus tpu-vm ssh ${TPU_NAME} --zone ${ZONE} --project ${PROJECT_ID}

Cloud TPU 이름 설정

export TPU_NAME=your-tpu-name

DLRM v2 실행

다음 코드 스니펫을 script.sh 파일에 복사합니다.

pip install --user setuptools==65.5.0

pip install cloud-tpu-client

pip install gin-config && pip install tensorflow-datasets && pip install tf-keras-nightly --no-deps

pip install https://storage.googleapis.com/tensorflow-public-build-artifacts/prod/tensorflow/official/release/nightly/linux_x86_tpu/wheel_py310/749/20240915-062017/github/tensorflow/build_output/tf_nightly_tpu-2.18.0.dev20240915-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -f https://storage.googleapis.com/libtpu-tf-releases/index.html --force

git clone https://github.com/tensorflow/recommenders.git
git clone https://github.com/tensorflow/models.git

export PYTHONPATH=~/recommenders/:~/models/
export TF_XLA_FLAGS='--tf_mlir_enable_mlir_bridge=true --tf_xla_sparse_core_disable_table_stacking=true --tf_mlir_enable_convert_control_to_data_outputs_pass=true --tf_mlir_enable_merge_control_flow_pass=true'

TF_USE_LEGACY_KERAS=1 TPU_LOAD_LIBRARY=0 python3 ./models/official/recommendation/ranking/train.py  --mode=train     --model_dir=gs://ptxla-debug/tf/sc/dlrm/runs/2/ --params_override="
runtime:
  distribution_strategy: tpu
  mixed_precision_dtype: 'mixed_bfloat16'
task:
  use_synthetic_data: false
  use_tf_record_reader: true
  train_data:
    input_path: 'gs://trillium-datasets/criteo/train/day_*/*'
    global_batch_size: 16384
    use_cached_data: true
  validation_data:
    input_path: 'gs://trillium-datasets/criteo/eval/day_*/*'
    global_batch_size: 16384
    use_cached_data: true
  model:
    num_dense_features: 13
    bottom_mlp: [512, 256, 128]
    embedding_dim: 128
    interaction: 'multi_layer_dcn'
    dcn_num_layers: 3
    dcn_low_rank_dim: 512
    size_threshold: 8000
    top_mlp: [1024, 1024, 512, 256, 1]
    use_multi_hot: true
    concat_dense: false
    dcn_use_bias: true
    vocab_sizes: [40000000,39060,17295,7424,20265,3,7122,1543,63,40000000,3067956,405282,10,2209,11938,155,4,976,14,40000000,40000000,40000000,590152,12973,108,36]
    multi_hot_sizes: [3,2,1,2,6,1,1,1,1,7,3,8,1,6,9,5,1,1,1,12,100,27,10,3,1,1]
    max_ids_per_chip_per_sample: 128
    max_ids_per_table: [280, 128, 64, 272, 432, 624, 64, 104, 368, 352, 288, 328, 304, 576, 336, 368, 312, 392, 408, 552, 2880, 1248, 720, 112, 320, 256]
    max_unique_ids_per_table: [104, 56, 40, 32, 72, 32, 40, 32, 32, 144, 64, 192, 32, 40, 136, 32, 32, 32, 32, 240, 1352, 432, 120, 80, 32, 32]
    use_partial_tpu_embedding: false
    size_threshold: 0
    initialize_tables_on_host: true
trainer:
  train_steps: 10000
  validation_interval: 1000
  validation_steps: 660
  summary_interval: 1000
  steps_per_loop: 1000
  checkpoint_interval: 0
  optimizer_config:
    embedding_optimizer: 'Adagrad'
    dense_optimizer: 'Adagrad'
    lr_config:
      decay_exp: 2
      decay_start_steps: 70000
      decay_steps: 30000
      learning_rate: 0.025
      warmup_steps: 0
    dense_sgd_config:
      decay_exp: 2
      decay_start_steps: 70000
      decay_steps: 30000
      learning_rate: 0.00025
      warmup_steps: 8000
  train_tf_function: true
  train_tf_while_loop: true
  eval_tf_while_loop: true
  use_orbit: true
  pipeline_sparse_and_dense_execution: true"

GKE에서 TensorFlow를 실행하는 경우 다음 명령어를 사용하여 TensorFlow Cloud TPU 휠과 libtpu를 설치합니다.

pip install https://storage.googleapis.com/tensorflow-public-build-artifacts/prod/tensorflow/official/release/nightly/linux_x86_tpu/wheel_py310/749/20240915-062017/github/tensorflow/build_output/tf_nightly_tpu-2.18.0.dev20240915-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl \
-f https://storage.googleapis.com/libtpu-tf-releases/index.html --force

추천 워크로드(예: DLRM DCN)를 실행하는 데 필요한 다음 플래그를 설정합니다.

ENV TF_XLA_FLAGS='--tf_mlir_enable_mlir_bridge=true \
--tf_mlir_enable_tpu_variable_runtime_reformatting_pass=false \
--tf_mlir_enable_convert_control_to_data_outputs_pass=true \
--tf_mlir_enable_merge_control_flow_pass=true --tf_xla_disable_full_embedding_pipelining=true' \
ENV LIBTPU_INIT_ARGS="--xla_sc_splitting_along_feature_dimension=auto \
--copy_with_dynamic_shape_op_output_pjrt_buffer=true"

script.sh을 실행합니다.

chmod +x script.sh
./script.sh

벤치마킹 결과

다음 섹션에는 v6e의 DLRM DCN v2 및 MaxDiffusion에 관한 벤치마킹 결과가 포함되어 있습니다.

DLRM DCN v2

DLRM DCN v2 학습 스크립트는 다양한 규모로 실행되었습니다. 다음 표에서 처리량을 확인하세요.

v6e-64 v6e-128 v6e-256
학습 단계 7000 7000 7000
전역 배치 크기 131072 262144 524288
처리량(예시/초) 2975334 5111808 10066329

MaxDiffusion

v6e-4, v6e-16, v6e-16 2대에서 MaxDiffusion 학습 스크립트를 실행했습니다. 다음 표에서 처리량을 확인하세요.

v6e-4 v6e-16 v6e-16 2개
학습 단계 0.069 0.073 0.13
전역 배치 크기 8 32 64
처리량(예시/초) 115.9 438.4 492.3