Mở rộng quy mô hoạt động học tăng cường bằng GKE và Managed Lustre

1. Giới thiệu

Nếu muốn chạy trực tiếp các tập lệnh được đóng gói mà không cần hướng dẫn từng bước, bạn có thể tìm thấy các tập lệnh này trong kho lưu trữ GoogleCloudPlatform/devrel-demos.

Trong lớp học lập trình này, bạn sẽ tìm hiểu cách triển khai một quy trình huấn luyện hiệu suất cao cho Học tăng cường (RL) bằng cách sử dụng Google Kubernetes Engine (GKE) và Managed Lustre.

Các khối lượng công việc Học tăng cường, đặc biệt là những khối lượng công việc sử dụng các thuật toán như Tối ưu hoá chính sách tương đối theo nhóm (GRPO), tạo ra lượng dữ liệu khổng lồ trong quá trình "Tạo trải nghiệm" và yêu cầu kiểm tra thường xuyên. Bộ nhớ đối tượng tiêu chuẩn có thể gây ra tình trạng tắc nghẽn trong các đợt I/O này, khiến các trình tăng tốc đắt tiền không hoạt động.

Bạn sẽ sử dụng Managed Lustre, một hệ thống tệp song song, để loại bỏ những điểm tắc nghẽn này và đạt được thông lượng huấn luyện cao hơn.

Bạn sẽ thực hiện

  • Định cấu hình các biến môi trường cho một cụm Ray dựa trên GPU.
  • Cung cấp một cụm GPU tại chỗ trên GKE và một phiên bản Managed Lustre bằng Cluster Toolkit.
  • Triển khai một cụm KubeRay và gắn hệ thống tệp Lustre.
  • Gửi khối lượng công việc huấn luyện NeMo-RL.
  • Theo dõi thông lượng cao và độ trễ thấp của điểm kiểm tra bằng Cloud Monitoring.

Sơ đồ cấu trúc của GKE, KubeRay và Managed Lustre

Bạn cần có

  • Một trình duyệt web như Chrome.
  • Một dự án trên Google Cloud đã bật tính năng thanh toán.

Lớp học lập trình này dành cho người dùng kỹ thuật cao cấp, kỹ sư nền tảng và nhà nghiên cứu AI đã quen thuộc với GKE và các khái niệm về bộ nhớ.

Tổng thời lượng ước tính: 45 đến 60 phút cộng với 2 giờ thời gian đào tạo

2. Trước khi bắt đầu

Tạo một dự án trên Google Cloud

  1. Trong Google Cloud Console, hãy chọn hoặc tạo một dự án trên đám mây của Google Cloud.
  2. Đảm bảo bạn đã bật tính năng thanh toán cho dự án trên Cloud.

Khởi động Cloud Shell

Cloud Shell là một môi trường dòng lệnh chạy trong Google Cloud và được tải sẵn các công cụ cần thiết.

  1. Nhấp vào Kích hoạt Cloud Shell ở đầu Cloud Console.
  2. Sau khi kết nối với Cloud Shell, hãy xác minh thông tin xác thực của bạn:
    gcloud auth list
    
  3. Xác nhận rằng dự án của bạn đã được định cấu hình:
    gcloud config get project
    
  4. Nếu dự án của bạn không được thiết lập như mong đợi, hãy thiết lập dự án:
    export PROJECT_ID=<YOUR_PROJECT_ID>
    gcloud config set project $PROJECT_ID
    

Cài đặt Cluster Toolkit

Lớp học lập trình này sử dụng Cluster Toolkit (gcluster) để triển khai cụm GKE. Để biết hướng dẫn về cách thiết lập Cluster Toolkit, hãy xem Hướng dẫn thiết lập Cluster Toolkit.

Bật API

Chạy lệnh này trong Cloud Shell để bật tất cả các API bắt buộc:

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

3. Định cấu hình các biến môi trường

Để các lệnh trong lớp học lập trình này nhất quán, hãy thiết lập một số biến môi trường.

Tạo một tệp có tên là env.sh rồi điền cấu hình của bạn vào tệp đó. Bạn có thể sử dụng mẫu sau:

# 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

Thay thế <YOUR_PROJECT_ID> và <YOUR_HF_TOKEN> bằng các giá trị thực tế của bạn.

Nguồn tệp để tải các biến vào phiên hiện tại:

source env.sh

4. Triển khai Cụm GKE và Lustre được quản lý bằng Cluster Toolkit

Trong bước này, bạn sẽ sử dụng Cluster Toolkit (gcluster) để triển khai một cụm GKE có GPU Spot và tự động cung cấp bộ nhớ Lustre được quản lý bằng trình điều khiển Lustre CSI và PersistentVolumeClaim được định cấu hình sẵn (lustre-pvc).

Chuẩn bị Bản thiết kế

Trước khi triển khai, hãy xem lại bản thiết kế examples/gke-a4/gke-a4.yaml (để biết thông tin chi tiết, hãy xem phần Tạo một cụm A4):

  1. Bật Managed Lustre: Huỷ nhận xét các phần mô-đun managed-lustre và lustre-pvc trong gke-a4.yaml.
  2. Bật tiện ích bổ sung RayOperator: Đặt enable_ray_operator: true trong phần cài đặt mô-đun gke_cluster trong gke-a4.yaml.

Triển khai cơ sở hạ tầng

Đặt CIDR được uỷ quyền để truy cập Cloud Shell và triển khai bằng 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

Chờ quá trình triển khai hoàn tất. Cluster Toolkit tự động cung cấp mạng VPC, quan hệ ngang hàng Quyền truy cập vào dịch vụ riêng tư (PSA), hệ thống tệp Lustre được quản lý, trình điều khiển Lustre CSI, tiện ích bổ sung RayOperator và yêu cầu lưu trữ Kubernetes (lustre-pvc) trong một quy trình triển khai phối hợp.

5. Triển khai Cụm Ray trên GKE

Trong bước này, bạn sẽ triển khai một cụm KubeRay trên các nút GKE và gắn hệ thống tệp Lustre bằng PersistentVolumeClaim (lustre-pvc) do Cluster Toolkit tự động cung cấp.

Tạo cấu hình RayCluster

Tạo một tệp có tên là ray-cluster.yaml. Thao tác này chỉ định các nút đầu và nút worker của KubeRay, sử dụng loại trình tăng tốc nvidia-b200 và gắn ổ đĩa Lustre tại /lustre.

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ết nối với Cụm

Đảm bảo phiên Cloud Shell của bạn được xác thực với cụm GKE:

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

Áp dụng cấu hình RayCluster

Áp dụng cấu hình cụm Ray:

kubectl apply -f ray-cluster.yaml

Xác minh trạng thái của Cụm

Theo dõi quá trình tạo nhóm:

kubectl get pods -w

Đợi cho đến khi các nhóm đầu và nhóm worker là Running.

6. Gửi khối lượng công việc học tăng cường

Trong bước này, bạn sẽ gửi quy trình huấn luyện GRPO NeMo-RL đến cụm Ray.

Kết nối với Trang tổng quan Ray

Để gửi các công việc và xem chỉ số, bạn cần kết nối với Trang tổng quan của Ray. Vì trang tổng quan nằm trong GKE, hãy sử dụng tính năng chuyển tiếp cổng để truy cập vào trang tổng quan này từ Cloud Shell:

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

Tạo tập lệnh thực thi

Tạo một tệp có tên là run_nemo_rl.sh. Tập lệnh này sẽ được thực thi trên các worker của cụm Ray. Chúng ta sẽ dùng cat << EOF để điền vào các biến môi trường mà bạn đã đặt trước đó.

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

Tạo tệp bỏ qua Ray

Tạo tệp .rayignore để ngăn Ray tải lên các thư mục lớn hoặc không cần thiết:

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

Tạo cấu hình môi trường thời gian chạy

Tạo một tệp JSON để truyền các biến môi trường đến công việc Ray:

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

Gửi yêu cầu

Sử dụng Ray CLI để gửi công việc đến điểm cuối trang tổng quan. Nếu không tìm thấy lệnh ray trong Cloud Shell, bạn có thể cài đặt lệnh này bằng pip install ray:

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

Bạn sẽ thấy nhật ký truyền trực tuyến trong thiết bị đầu cuối Cloud Shell. Công việc này sẽ tải mô hình, khởi động các worker Ray và bắt đầu vòng lặp huấn luyện GRPO.

7. Theo dõi hiệu suất huấn luyện

Trong bước này, bạn sẽ quan sát hiệu suất của hệ thống tệp Lustre trong quá trình huấn luyện và kiểm tra.

Kiểm tra nhật ký huấn luyện

Khi quá trình huấn luyện diễn ra, bạn sẽ thấy nhật ký cho biết các điểm kiểm tra đang được lưu vào /lustre/nemo_rl_qwen_72b_ds_cp/nemo-rl-grpo-test1. Lưu ý rằng quá trình tạo điểm kiểm tra diễn ra không đồng bộ và không chặn các worker Ray trong thời gian quá dài.

Để xem tốc độ tạo điểm kiểm tra, hãy tìm các dòng nhật ký cho biết các điểm kiểm tra đã lưu.

Xem các chỉ số Lustre trong Cloud Console

Cách xem các chỉ số cho phiên bản Lustre:

  1. Trong Google Cloud Console, hãy tìm Managed Service for Lustre.
  2. Nhấp vào tên phiên bản của bạn (ví dụ: ${CLUSTER_NAME}-lustre hoặc rl-demo-gpu-lustre).
  3. Nhấp vào thẻ Giám sát.

Tại đây, bạn có thể quan sát:

  • Thông lượng (Bytes/giây): Xem các mức tăng đột biến trong quá trình tạo điểm kiểm tra.
  • Dung lượng: Theo dõi dung lượng mà các điểm kiểm tra đang sử dụng.

Biểu đồ hiệu suất của LustreLustre có khả năng ghi ở tốc độ rất cao, ghi các điểm kiểm tra trong thời gian tối thiểu

8. Dọn dẹp tài nguyên

Chạy lệnh sau trong Cloud Shell để huỷ tất cả cơ sở hạ tầng được cung cấp (cụm GKE, nhóm nút GPU, phiên bản Lustre được quản lý và mạng VPC) trong một bước:

gcluster destroy "${CLUSTER_NAME}"

Lệnh này chạy đồng bộ ở nền trước, phá huỷ mọi cơ sở hạ tầng do quá trình triển khai quản lý và xuất nhật ký tiến trình vào thiết bị đầu cuối. Vui lòng đợi lệnh hoàn tất hoàn toàn trước khi đóng phiên Cloud Shell.

9. Xin chúc mừng

Bạn đã hoàn tất thành công lớp học lập trình Mở rộng quy mô học tăng cường bằng GKE và Lustre được quản lý!

Kiến thức bạn học được

  • Cách sử dụng Cluster Toolkit để cung cấp một cụm GPU GKE bằng các phiên bản Spot và bộ nhớ Lustre được quản lý.
  • Cách triển khai một cụm KubeRay và gắn bộ nhớ Lustre.
  • Cách gửi khối lượng công việc huấn luyện GRPO NeMo-RL.
  • Cách quan sát hiệu suất bộ nhớ trong quá trình huấn luyện.

Các bước tiếp theo