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를 사용하여 모델을 학습하거나 제공하는 일반적인 절차
- Google Cloud 프로젝트 준비
- 용량 확보
- Cloud TPU 환경 프로비저닝
- 모델 학습 또는 추론 워크로드 실행
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
- Nightly JAX
- 안정화 소프트웨어 버전:
- JAX + v0.4.37의 JAX 라이브러리
- Python
프로젝트에 다음에 대한 할당량이 충분한지 확인합니다.
- 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 -> 서비스 계정에서 찾을 수 있는 서비스 계정의 이메일 주소입니다.
예: |
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 | 사용할 네트워크 및 서브네트워크입니다.
예: |
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 | 사용할 네트워크 및 서브네트워크입니다.
예: |
NODE_POOL_ARGUMENTS | 사용할 추가 노드 네트워크입니다.
예: |
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 관련 위치 및 가격 정보를 추가합니다.
~/.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
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
Cloud TPU v6e로 클러스터를 실행합니다.
sky launch tpu_v6.yaml -c tpu_v6
SSH를 사용하여 Cloud TPU v6e에 연결합니다.
ssh tpu_v6
추론 튜토리얼
다음 튜토리얼에서는 Cloud TPU v6e에서 추론을 실행하는 방법을 보여줍니다.
학습 예시
다음 섹션에서는 Cloud TPU v6e에서 MaxText, MaxDiffusion, PyTorch 모델을 학습시키는 예시를 제공합니다.
v6e Cloud TPU VM에서 MaxText 및 MaxDiffusion 학습
다음 섹션에서는 MaxText 및 MaxDiffusion 모델의 학습 수명 주기를 다룹니다.
일반적인 대략적인 단계는 다음과 같습니다.
- 워크로드 기본 이미지를 빌드합니다.
- XPK를 사용하여 워크로드를 실행합니다.
- 워크로드의 학습 명령어를 빌드합니다.
- 워크로드를 배포합니다.
- 워크로드를 따라가고 측정항목을 확인합니다.
- XPK 워크로드가 필요하지 않으면 삭제합니다.
- 더 이상 필요하지 않으면 XPK 클러스터를 삭제합니다.
기본 이미지 빌드
MaxText 또는 MaxDiffusion을 설치하고 Docker 이미지를 빌드합니다.
사용할 저장소를 클론하고 저장소의 디렉터리로 변경합니다.
MaxText:
git clone https://github.com/google/maxtext.git && cd maxtext
MaxDiffusion:
git clone https://github.com/google/maxdiffusion.git && cd maxdiffusion
Google Cloud CLI를 사용하도록 Docker를 구성합니다.
gcloud auth configure-docker
다음 명령어를 사용하거나 JAX 안정화 스택을 사용하여 Docker 이미지를 빌드합니다. JAX Stable Stack에 관한 자세한 내용은 JAX Stable Stack으로 Docker 이미지 빌드를 참고하세요.
bash docker_build_dependency_image.sh MODE=stable JAX_VERSION=0.4.35
로컬에서 빌드된 이미지가 없는 머신에서 워크로드를 실행하는 경우 이미지를 업로드합니다.
bash docker_upload_runner.sh CLOUD_IMAGE_NAME=${USER}_runner
XPK를 사용하여 워크로드 실행
MaxText에서 설정한 기본값 또는 MaxDiffusion을 사용하지 않는 경우 다음 환경 변수를 설정합니다.
export BASE_OUTPUT_DIR=gs://YOUR_BUCKET export PER_DEVICE_BATCH_SIZE=2 export NUM_STEPS=30 export MAX_TARGET_LENGTH=8192
모델 스크립트를 빌드합니다. 이 스크립트는 이후 단계에서 학습 명령어로 복사됩니다.
아직 모델 스크립트를 실행하지 마세요.
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
다음 변수를 내보냅니다.
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
학습 명령어로 실행할 모델 스크립트입니다. 이전 단계에서 만든 스크립트를 사용하여 모델을 실행합니다. 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를 통해 스칼라 및 프로필 데이터를 확인합니다.
- 사용 중인 영역의 리소스 관리 (CRUD) 요청을 600에서 5,000으로 늘립니다. VM 16대 미만을 사용하는 소규모 워크로드의 경우 이 문제가 발생하지 않을 수 있습니다.
Vertex AI용
cloud-accelerator-diagnostics
와 같은 종속 항목을 설치합니다.# xpk dependencies will install cloud-accelerator-diagnostics for Vertex AI cd ~/xpk pip install .
Vertex AI TensorBoard 만들기에 설명된 대로
--create-vertex-tensorboard
플래그를 사용하여 XPK 클러스터를 만듭니다. 기존 클러스터에서 이 명령어를 실행할 수도 있습니다.--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를 만들어 튜토리얼을 실행합니다.
환경 변수를 설정합니다.
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
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.33jaxlib
: 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 사용자 가이드를 참고하세요.
모델 매개변수 구성 파일을 만듭니다. 다음은 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
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를 참고하세요.
다음 명령어를 사용하여 구성 파일을 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분 정도 걸립니다.
다음 명령어를 사용하여 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'
모델 학습을 실행합니다.
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 |