GKE ve Managed Lustre ile Pekiştirmeli Öğrenmeyi Ölçeklendirme

1. Giriş

Paketlenmiş komut dosyalarını adım adım eğitim olmadan doğrudan çalıştırmayı tercih ederseniz bunları GoogleCloudPlatform/devrel-demos deposunda bulabilirsiniz.

Bu codelab'de, Google Kubernetes Engine (GKE) ve Managed Lustre kullanarak pekiştirmeli öğrenme (RL) için yüksek performanslı bir eğitim ardışık düzenini nasıl dağıtacağınızı öğreneceksiniz.

Özellikle Group Relative Policy Optimization (GRPO) gibi algoritmaların kullanıldığı pekiştirmeli öğrenme iş yükleri, "Deneyim Oluşturma" sırasında büyük miktarda veri oluşturur ve sık sık kontrol noktası oluşturmayı gerektirir. Standart nesne depolama, bu G/Ç patlamaları sırasında darboğazlara neden olabilir ve pahalı hızlandırıcıları boşta bırakabilir.

Bu darboğazları ortadan kaldırmak ve daha yüksek eğitim işleme hızı elde etmek için paralel dosya sistemi olan Managed Lustre'ı kullanacaksınız.

Yapacaklarınız

  • GPU tabanlı bir Ray kümesi için ortam değişkenlerini yapılandırın.
  • Cluster Toolkit'i kullanarak GKE'de Spot GPU kümesi ve Managed Lustre örneği sağlama.
  • KubeRay kümesi dağıtın ve Lustre dosya sistemini bağlayın.
  • NeMo-RL eğitim iş yükü gönderin.
  • Cloud Monitoring'i kullanarak yüksek gönderim hacmi ve düşük kontrol noktası gecikmesini gözlemleyin.

GKE, KubeRay ve Managed Lustre'ın mimari şeması

İhtiyacınız olanlar

  • Chrome gibi bir web tarayıcısı
  • Faturalandırmanın etkin olduğu bir Google Cloud projesi.

Bu codelab, GKE ve depolama kavramlarına aşina olan ileri düzey teknik kullanıcılar, platform mühendisleri ve yapay zeka araştırmacıları içindir.

Tahmini toplam süre: 45-60 dakika artı 2 saatlik eğitim süresi

2. Başlamadan önce

Google Cloud projesi oluşturma

  1. Google Cloud Console'da bir Google Cloud projesi seçin veya oluşturun.
  2. Cloud projeniz için faturalandırmanın etkinleştirildiğinden emin olun.

Cloud Shell'i Başlatma

Cloud Shell, Google Cloud'da çalışan ve gerekli araçların önceden yüklendiği bir komut satırı ortamıdır.

  1. Google Cloud Console'un üst kısmında Activate Cloud Shell'i (Cloud Shell'i Etkinleştir) tıklayın.
  2. Cloud Shell'e bağlandıktan sonra kimlik doğrulamanızı onaylayın:
    gcloud auth list
    
  3. Projenizin yapılandırıldığını onaylayın:
    gcloud config get project
    
  4. Projeniz beklendiği gibi ayarlanmamışsa ayarlayın:
    export PROJECT_ID=<YOUR_PROJECT_ID>
    gcloud config set project $PROJECT_ID
    

Cluster Toolkit'i yükleme

Bu codelab'de GKE kümesini dağıtmak için Cluster Toolkit (gcluster) kullanılır. Küme Araç Seti'ni ayarlama talimatları için Küme Araç Seti kurulum kılavuzuna bakın.

API'leri etkinleştir

Gerekli tüm API'leri etkinleştirmek için Cloud Shell'de şu komutu çalıştırın:

gcloud services enable \
  container.googleapis.com \
  lustre.googleapis.com \
  compute.googleapis.com \
  servicenetworking.googleapis.com

3. Ortam değişkenlerini yapılandırma

Bu codelab'deki komutların tutarlı olması için birkaç ortam değişkeni ayarlayın.

env.sh adlı bir dosya oluşturun ve yapılandırmanızı bu dosyaya ekleyin. Aşağıdaki şablonu kullanabilirsiniz:

# 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> ve <YOUR_HF_TOKEN> değerlerini gerçek değerlerinizle değiştirin.

Değişkenleri mevcut oturumunuza yüklemek için dosyayı kaynaklayın:

source env.sh

4. Küme Araç Seti'ni kullanarak GKE kümesi ve yönetilen Lustre dağıtma

Bu adımda, Spot GPU'lar içeren bir GKE kümesi dağıtmak ve Lustre CSI sürücüsü ile önceden yapılandırılmış PersistentVolumeClaim (lustre-pvc) ile yönetilen Lustre depolama alanını otomatik olarak sağlamak için Cluster Toolkit'i (gcluster) kullanırsınız.

Planı hazırlama

Dağıtım yapmadan önce examples/gke-a4/gke-a4.yaml planını inceleyin (ayrıntılar için A4 kümesi oluşturma başlıklı makaleye bakın):

  1. Enable Managed Lustre: gke-a4.yaml dosyasında managed-lustre ve lustre-pvc modülü bölümlerindeki yorum işaretini kaldırın.
  2. RayOperator eklentisini etkinleştirme: gke-a4.yaml'deki gke_cluster modül ayarlarında enable_ray_operator: true'ı ayarlayın.

Altyapı dağıtma

Cloud Shell erişimi için yetkili CIDR'nizi ayarlayın ve gcluster deploy kullanarak dağıtın:

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

Dağıtımın tamamlanmasını bekleyin. Cluster Toolkit, VPC ağını, Private Service Access (PSA) eşlemesini, Managed Lustre dosya sistemini, Lustre CSI sürücüsünü, RayOperator eklentisini ve Kubernetes depolama talebini (lustre-pvc) tek bir koordineli dağıtımda otomatik olarak sağlar.

5. GKE'de Ray kümesi dağıtma

Bu adımda, GKE düğümlerinize bir KubeRay kümesi dağıtacak ve Cluster Toolkit tarafından otomatik olarak sağlanan PersistentVolumeClaim'i (lustre-pvc) kullanarak Lustre dosya sistemini bağlayacaksınız.

RayCluster Yapılandırması Oluşturma

ray-cluster.yaml adlı bir dosya oluşturun. Bu, nvidia-b200 hızlandırıcı türünü kullanarak ve Lustre birimini /lustre konumuna monte ederek KubeRay baş ve çalışan düğümlerini belirtir.

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

Kümeye bağlanma

Cloud Shell oturumunuzun GKE kümenizde kimliğinin doğrulandığından emin olun:

gcloud container clusters get-credentials ${CLUSTER_NAME} \
  --region ${REGION} \
  --project ${PROJECT_ID}

RayCluster yapılandırmasını uygulama

Ray kümesi yapılandırmasını uygulayın:

kubectl apply -f ray-cluster.yaml

Küme durumunu doğrulama

Kapsüllerin oluşturulmasını izleyin:

kubectl get pods -w

Baş ve çalışan kapsüllerinin Running olmasını bekleyin.

6. Pekiştirmeli öğrenme iş yükü gönderme

Bu adımda, NeMo-RL GRPO eğitim işini Ray kümenize göndereceksiniz.

Ray kontrol paneline bağlanma

İş göndermek ve metrikleri görüntülemek için Ray Kontrol Paneli'ne bağlanmanız gerekir. Kontrol paneli GKE'de olduğundan Cloud Shell'den erişmek için bağlantı noktası yönlendirme kullanın:

# Run this in a separate Cloud Shell tab or in the background
kubectl port-forward service/${CLUSTER_NAME}-head-svc 8265:8265 &

Yürütme komut dosyasını oluşturma

run_nemo_rl.sh adlı bir dosya oluşturun. Bu komut dosyası, Ray kümesi çalışanlarında yürütülür. Daha önce ayarladığınız ortam değişkenlerini doldurmak için cat << EOF kullanırız.

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 Yoksayma Dosyası Oluşturma

Ray'in büyük veya gereksiz dizinleri yüklemesini önlemek için .rayignore dosyası oluşturun:

cat << EOF > .rayignore
cluster-toolkit/
.git/
*.sh.log
EOF

Çalışma zamanı ortamı yapılandırması oluşturma

Ortam değişkenlerini Ray işine aktarmak için bir JSON dosyası oluşturun:

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

İşi Gönderme

İşi kontrol paneli uç noktasına göndermek için Ray KSA'yı kullanın. ray komutu Cloud Shell'de bulunmuyorsa pip install ray ile yükleyebilirsiniz:

ray job submit \
    --address="http://localhost:8265" \
    --working-dir . \
    --runtime-env ray_runtime_env_nemo.json \
    -- bash run_nemo_rl.sh

Cloud Shell terminalinizde günlüklerin yayınlandığını görürsünüz. İş, modeli yükler, Ray çalışanlarını başlatır ve GRPO eğitim döngüsünü başlatır.

7. Eğitim performansını izleme

Bu adımda, eğitim ve kontrol noktası oluşturma sırasında Lustre dosya sisteminin performansını gözlemleyeceksiniz.

Eğitim günlüklerini kontrol etme

Eğitim ilerledikçe, kontrol noktalarının /lustre/nemo_rl_qwen_72b_ds_cp/nemo-rl-grpo-test1 konumuna kaydedildiğini belirten günlükler görürsünüz. Kontrol noktası oluşturma işleminin eşzamansız olarak gerçekleştiğini ve Ray çalışanlarını çok uzun süre engellemediğini unutmayın.

Kontrol noktası oluşturma hızını görüntülemek için kaydedilen kontrol noktalarını belirten günlük satırlarını bulun.

Cloud Console'da Lustre Metriklerini Görüntüleme

Lustre örneğinizin metriklerini görmek için:

  1. Google Cloud Console'da Managed Service for Lustre'ı arayın.
  2. Örnek adınızı (ör. ${CLUSTER_NAME}-lustre veya rl-demo-gpu-lustre) tıklayın.
  3. Monitoring (İzleme) sekmesini tıklayın.

Burada şunları gözlemleyebilirsiniz:

  • İşleme hızı (bayt/sn): Kontrol noktası oluşturma sırasında ani yükselişleri görün.
  • Kapasite: Kontrol noktaları tarafından ne kadar alan kullanıldığını izleyin.

Lustre performans grafiğiLustre, çok yüksek hızda yazabilir ve kontrol noktalarını en kısa sürede oluşturabilir

8. Kaynakları Temizleme

Cloud Shell'de aşağıdaki komutu çalıştırarak sağlanan tüm altyapıyı (GKE kümesi, GPU düğüm havuzları, yönetilen Lustre örneği ve VPC ağı) tek adımda yok edin:

gcluster destroy "${CLUSTER_NAME}"

Bu komut, ön planda eşzamanlı olarak çalışır, dağıtım tarafından yönetilen tüm altyapıyı yıkar ve ilerleme günlüklerini terminalinize verir. Cloud Shell oturumunuzu kapatmadan önce komutun tamamen tamamlanmasını bekleyin.

9. Tebrikler

GKE ve Yönetilen Lustre ile Güçlendirmeli Öğrenmeyi Ölçeklendirme adlı codelab'i başarıyla tamamladınız.

Öğrendikleriniz

  • Cluster Toolkit'i kullanarak Spot örnekleri ve yönetilen Lustre depolama alanı ile GKE GPU kümesi sağlama.
  • KubeRay kümesi dağıtma ve Lustre depolama alanı bağlama
  • NeMo-RL GRPO eğitim iş yükü gönderme
  • Eğitim sırasında depolama alanı performansını gözlemleme

Sonraki adımlar