1. 소개
단계별 튜토리얼 없이 패키지 스크립트를 직접 실행하려면 GoogleCloudPlatform/devrel-demos 저장소에서 찾을 수 있습니다.
이 Codelab에서는 Google Kubernetes Engine (GKE) 및 Managed Lustre를 사용하여 강화 학습 (RL)을 위한 고성능 학습 파이프라인을 배포하는 방법을 알아봅니다.
강화 학습 워크로드, 특히 그룹 상대 정책 최적화 (GRPO)와 같은 알고리즘을 사용하는 워크로드는 '경험 생성' 중에 엄청난 양의 데이터를 생성하며 빈번한 체크포인트가 필요합니다. 표준 객체 스토리지는 이러한 I/O 버스트 중에 병목 현상을 일으켜 비용이 많이 드는 액셀러레이터가 유휴 상태로 남을 수 있습니다.
병렬 파일 시스템인 Managed Lustre를 사용하여 이러한 병목 현상을 제거하고 더 높은 학습 처리량을 달성합니다.
실습할 내용
- GPU 기반 Ray 클러스터의 환경 변수를 구성합니다.
- Cluster Toolkit을 사용하여 GKE에 스팟 GPU 클러스터를 프로비저닝하고 Managed Lustre 인스턴스를 프로비저닝합니다.
- KubeRay 클러스터를 배포하고 Lustre 파일 시스템을 마운트합니다.
- NeMo-RL 학습 워크로드를 제출합니다.
- Cloud Monitoring을 사용하여 높은 처리량과 낮은 체크포인트 지연 시간 관찰

필요한 항목
- 웹브라우저(예: Chrome)
- 결제가 사용 설정된 Google Cloud 프로젝트.
이 Codelab은 GKE 및 스토리지 개념에 익숙한 고급 기술 사용자, 플랫폼 엔지니어, AI 연구자를 대상으로 합니다.
예상 총 소요 시간: 45~60분 + 2시간의 교육 시간
2. 시작하기 전에
Google Cloud 프로젝트 만들기
- Google Cloud 콘솔에서 Google Cloud 프로젝트를 선택하거나 만듭니다.
- Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.
Cloud Shell 시작
Cloud Shell은 Google Cloud에서 실행되는 명령줄 환경으로, 필요한 도구가 미리 로드되어 제공됩니다.
- Google Cloud 콘솔 상단에서 Cloud Shell 활성화를 클릭합니다.
- Cloud Shell에 연결되면 인증을 확인합니다.
gcloud auth list - 프로젝트가 구성되어 있는지 확인합니다.
gcloud config get project - 프로젝트가 예상대로 설정되지 않은 경우 설정합니다.
export PROJECT_ID=<YOUR_PROJECT_ID> gcloud config set project $PROJECT_ID
Cluster Toolkit 설치
이 Codelab에서는 Cluster Toolkit (gcluster)을 사용하여 GKE 클러스터를 배포합니다. Cluster Toolkit 설정 방법에 대한 자세한 내용은 Cluster Toolkit 설정 가이드를 참고하세요.
API 사용 설정
Cloud Shell에서 다음 명령어를 실행하여 필요한 모든 API를 사용 설정합니다.
gcloud services enable \
container.googleapis.com \
lustre.googleapis.com \
compute.googleapis.com \
servicenetworking.googleapis.com
3. 환경 변수 구성
이 Codelab에서 명령어를 일관되게 유지하려면 몇 가지 환경 변수를 설정하세요.
env.sh이라는 파일을 만들고 구성으로 파일을 채웁니다. 다음 템플릿을 사용할 수 있습니다.
# Environment Variables for the RL Demo execution
export PROJECT_ID="{{'<var>'}}PROJECT_ID{{'</var>'}}"
export ZONE="us-east1-b"
export REGION="us-east1"
export CLUSTER_NAME="ray-a4-gpu-spot"
export HF_TOKEN="{{'<var>'}}YOUR_HF_TOKEN{{'</var>'}}" # Required for downloading models
export WANDB_API_KEY="{{'<var>'}}YOUR_WANDB_API_KEY{{'</var>'}}" # Optional
# Topology defaults
export NUM_NODES="8"
export GPUS_PER_NODE="8" # Fixed for A4/B200 architecture
<YOUR_PROJECT_ID> 및 <YOUR_HF_TOKEN>을 실제 값으로 바꿉니다.
파일을 소싱하여 변수를 현재 세션에 로드합니다.
source env.sh
4. Cluster Toolkit을 사용하여 GKE 클러스터 및 Managed Lustre 배포
이 단계에서는 클러스터 툴킷 (gcluster)을 사용하여 스팟 GPU가 있는 GKE 클러스터를 배포하고 Lustre CSI 드라이버와 사전 구성된 PersistentVolumeClaim (lustre-pvc)으로 관리형 Lustre 스토리지를 자동으로 프로비저닝합니다.
청사진 준비
배포하기 전에 examples/gke-a4/gke-a4.yaml 청사진을 검토하세요 (자세한 내용은 A4 클러스터 만들기 참고).
- Managed Lustre 사용 설정:
gke-a4.yaml에서managed-lustre및lustre-pvc모듈 섹션의 주석을 해제합니다. - RayOperator 애드온 사용 설정:
gke-a4.yaml에서gke_cluster모듈 설정 아래에enable_ray_operator: true를 설정합니다.
인프라 배포
Cloud Shell 액세스에 대해 승인된 CIDR을 설정하고 gcluster deploy를 사용하여 배포합니다.
export AUTHORIZED_CIDR="$(curl -s ifconfig.me)/32"
gcluster deploy examples/gke-a4/gke-a4.yaml \
--vars project_id=${PROJECT_ID},deployment_name=${CLUSTER_NAME},region=${REGION},zone=${ZONE},static_node_count=${NUM_NODES},authorized_cidr=${AUTHORIZED_CIDR},spot=true
배포가 완료될 때까지 기다립니다. 클러스터 툴킷은 조정된 하나의 배포에서 VPC 네트워크, 비공개 서비스 액세스 (PSA) 피어링, Managed Lustre 파일 시스템, Lustre CSI 드라이버, RayOperator 부가기능, Kubernetes 스토리지 요청 (lustre-pvc)을 자동으로 프로비저닝합니다.
5. GKE에 Ray 클러스터 배포
이 단계에서는 GKE 노드에 KubeRay 클러스터를 배포하고 Cluster Toolkit에서 자동으로 프로비저닝한 PersistentVolumeClaim (lustre-pvc)을 사용하여 Lustre 파일 시스템을 마운트합니다.
RayCluster 구성 만들기
ray-cluster.yaml 파일을 만듭니다. 이는 nvidia-b200 가속기 유형을 사용하여 /lustre에 Lustre 볼륨을 마운트하여 KubeRay 헤드 및 작업자 노드를 지정합니다.
cat << EOF > ray-cluster.yaml
apiVersion: ray.io/v1
kind: RayCluster
metadata:
name: ${CLUSTER_NAME}
namespace: default
spec:
rayVersion: '2.54.0'
headGroupSpec:
rayStartParams:
dashboard-host: '0.0.0.0'
template:
spec:
nodeSelector:
cloud.google.com/gke-accelerator: nvidia-b200
tolerations:
- key: "nvidia.com/gpu"
operator: "Exists"
effect: "NoSchedule"
containers:
- name: ray-head
image: nvcr.io/nvidia/nemo-rl:v0.4.0
ports:
- containerPort: 6379
name: gcs-server
- containerPort: 8265
name: dashboard
- containerPort: 10001
name: client
resources:
limits:
cpu: "32"
memory: "1000Gi"
requests:
cpu: "8"
memory: "64Gi"
volumeMounts:
- mountPath: /lustre
name: lustre-storage
volumes:
- name: lustre-storage
persistentVolumeClaim:
claimName: lustre-pvc
workerGroupSpecs:
- groupName: gpu-worker-group
replicas: ${NUM_NODES}
minReplicas: ${NUM_NODES}
maxReplicas: ${NUM_NODES}
rayStartParams: {}
template:
spec:
nodeSelector:
cloud.google.com/gke-accelerator: nvidia-b200
tolerations:
- key: "nvidia.com/gpu"
operator: "Exists"
effect: "NoSchedule"
containers:
- name: ray-worker
image: nvcr.io/nvidia/nemo-rl:v0.4.0
resources:
limits:
nvidia.com/gpu: "8"
cpu: "100"
memory: "1000Gi"
requests:
nvidia.com/gpu: "8"
cpu: "100"
memory: "1000Gi"
volumeMounts:
- mountPath: /lustre
name: lustre-storage
- mountPath: /dev/shm
name: dshm
volumes:
- name: lustre-storage
persistentVolumeClaim:
claimName: lustre-pvc
- name: dshm
emptyDir:
medium: Memory
EOF
클러스터에 연결
Cloud Shell 세션이 GKE 클러스터에 인증되었는지 확인합니다.
gcloud container clusters get-credentials ${CLUSTER_NAME} \
--region ${REGION} \
--project ${PROJECT_ID}
RayCluster 구성 적용
Ray 클러스터 구성을 적용합니다.
kubectl apply -f ray-cluster.yaml
클러스터 상태 확인
포드 생성을 모니터링합니다.
kubectl get pods -w
헤드 및 작업자 포드가 Running가 될 때까지 기다립니다.
6. 강화 학습 워크로드 제출
이 단계에서는 NeMo-RL GRPO 학습 작업을 Ray 클러스터에 제출합니다.
Ray 대시보드에 연결
작업을 제출하고 측정항목을 보려면 Ray 대시보드에 연결해야 합니다. 대시보드가 GKE에 있으므로 포트 전달을 사용하여 Cloud Shell에서 액세스합니다.
# Run this in a separate Cloud Shell tab or in the background
kubectl port-forward service/${CLUSTER_NAME}-head-svc 8265:8265 &
실행 스크립트 만들기
run_nemo_rl.sh 파일을 만듭니다. 이 스크립트는 Ray 클러스터 작업자에서 실행됩니다. cat << EOF를 사용하여 이전에 설정한 환경 변수를 채웁니다.
cat << EOF > run_nemo_rl.sh
#!/bin/bash
set -ex
# Override job runtime conflicts (NeMo-RL passes os.environ to ray.init)
export RAY_OVERRIDE_JOB_RUNTIME_ENV=1
echo "--- Running on Ray Cluster ---"
cd /opt/nemo-rl
# Ensure directories exist on the high-speed Lustre drive
mkdir -p /lustre/huggingface_cache
mkdir -p /lustre/nemo_rl_qwen_72b_ds_cp
echo "Launching NeMo-RL GRPO training..."
uv run python examples/run_grpo_math.py \
--config examples/configs/grpo_math_70B_megatron.yaml \
policy.model_name='Qwen/Qwen2.5-72B-Instruct' \
policy.megatron_cfg.converter_type='Qwen2ForCausalLM' \
logger.wandb_enabled=False \
cluster.num_nodes=${NUM_NODES} \
cluster.gpus_per_node=${GPUS_PER_NODE} \
logger.wandb.name='nemo-rl-grpo-test1' \
grpo.max_num_steps=20 \
grpo.num_generations_per_prompt=8 \
grpo.num_prompts_per_step=32 \
policy.train_global_batch_size=256 \
checkpointing.enabled=True \
checkpointing.save_period=2 \
checkpointing.keep_top_k=2 \
checkpointing.metric_name=null \
checkpointing.checkpoint_dir=/lustre/nemo_rl_qwen_72b_ds_cp/nemo-rl-grpo-test1 \
data.dataset_name='DeepScaler'
EOF
chmod +x run_nemo_rl.sh
Ray 무시 파일 만들기
Ray가 크거나 불필요한 디렉터리를 업로드하지 못하도록 .rayignore 파일을 만듭니다.
cat << EOF > .rayignore
cluster-toolkit/
.git/
*.sh.log
EOF
런타임 환경 구성 만들기
환경 변수를 Ray 작업에 전달하는 JSON 파일을 만듭니다.
cat << EOF > ray_runtime_env_nemo.json
{
"env_vars": {
"HF_TOKEN": "${HF_TOKEN}",
"WANDB_API_KEY": "${WANDB_API_KEY}",
"HF_HOME": "/lustre/huggingface_cache",
"GLOO_SOCKET_IFNAME": "eth0",
"NCCL_SOCKET_IFNAME": "eth0"
}
}
EOF
작업 제출
Ray CLI를 사용하여 대시보드 엔드포인트에 작업을 제출합니다. Cloud Shell에서 ray 명령어를 찾을 수 없으면 pip install ray를 사용하여 설치할 수 있습니다.
ray job submit \
--address="http://localhost:8265" \
--working-dir . \
--runtime-env ray_runtime_env_nemo.json \
-- bash run_nemo_rl.sh
Cloud Shell 터미널에 로그가 스트리밍됩니다. 작업은 모델을 로드하고, Ray 작업자를 초기화하고, GRPO 학습 루프를 시작합니다.
7. 학습 성능 모니터링
이 단계에서는 학습 및 체크포인트 중에 Lustre 파일 시스템의 성능을 관찰합니다.
학습 로그 확인
학습이 진행되면 체크포인트가 /lustre/nemo_rl_qwen_72b_ds_cp/nemo-rl-grpo-test1에 저장되고 있음을 나타내는 로그가 표시됩니다. 체크포인트는 비동기적으로 발생하며 Ray 작업자를 오랫동안 차단하지 않습니다.
체크포인트 속도를 확인하려면 저장된 체크포인트를 나타내는 로그 줄을 찾으세요.
Cloud 콘솔에서 Lustre 측정항목 보기
Lustre 인스턴스의 측정항목을 보려면 다음 단계를 따르세요.
- Google Cloud 콘솔에서 Managed Service for Lustre를 검색합니다.
- 인스턴스 이름 (예:
${CLUSTER_NAME}-lustre또는rl-demo-gpu-lustre)을 클릭합니다. - 모니터링 탭을 클릭합니다.
여기에서 다음을 확인할 수 있습니다.
- 처리량 (바이트/초): 체크포인트 설정 중에 급증하는 것을 확인합니다.
- 용량: 체크포인트에서 사용 중인 공간을 모니터링합니다.
Lustre는 매우 빠른 속도로 쓰기가 가능하며 최소한의 시간으로 체크포인트를 작성할 수 있습니다.
8. 리소스 정리
Cloud Shell에서 다음 명령어를 실행하여 프로비저닝된 모든 인프라 (GKE 클러스터, GPU 노드 풀, 관리형 Lustre 인스턴스, VPC 네트워크)를 한 단계로 삭제합니다.
gcluster destroy "${CLUSTER_NAME}"
이 명령어는 포그라운드에서 동기적으로 실행되어 배포에서 관리하는 모든 인프라를 해체하고 진행 상황 로그를 터미널에 출력합니다. 명령어가 완전히 완료될 때까지 기다린 후 Cloud Shell 세션을 닫습니다.
9. 축하합니다
GKE 및 Managed Lustre를 사용한 강화 학습 확장 Codelab을 완료했습니다.
학습한 내용
- Cluster Toolkit을 사용하여 스팟 인스턴스 및 Managed Lustre 스토리지를 사용하여 GKE GPU 클러스터를 프로비저닝하는 방법
- KubeRay 클러스터를 배포하고 Lustre 스토리지를 마운트하는 방법
- NeMo-RL GRPO 학습 워크로드를 제출하는 방법
- 학습 중에 스토리지 성능을 관찰하는 방법
다음 단계
- NVIDIA NeMo-RL의 더 많은 기능을 살펴보세요.
- Google Cloud AI 하이퍼컴퓨터에 대해 자세히 알아보세요.
- Managed Service for Lustre 문서를 검토합니다.