Tutorial ini menunjukkan cara menyesuaikan model bahasa besar (LLM) Llama-4-Scout-17 pada cluster Slurm multi-node dan multi-GPU di Google Cloud. Cluster ini menggunakan dua instance virtual machine (VM) A4 yang masing-masing memiliki 8 GPU NVIDIA B200.
Dua proses utama yang dijelaskan dalam tutorial ini adalah sebagai berikut:
- Deploy cluster Slurm berperforma tinggi dan berkualitas produksi menggunakan Cluster Toolkit. Sebagai bagian dari deployment ini, Anda akan membuat image VM kustom dengan software yang diperlukan yang telah diinstal sebelumnya. Anda juga akan mengonfigurasi jaringan RDMA berkecepatan tinggi dan membuat bucket Cloud Storage untuk menghosting status Terraform Anda.
- Setelah cluster di-deploy, Anda menjalankan tugas fine-tuning terdistribusi menggunakan kumpulan skrip yang disertakan dalam tutorial ini. Tugas ini memanfaatkan PyTorch Fully Sharded Data Parallel (FSDP), yang Anda akses melalui Transformer Reinforcement Learning library Hugging Face.
Tutorial ini ditujukan untuk engineer machine learning (ML), administrator dan operator platform, serta untuk spesialis data dan AI yang tertarik menggunakan kemampuan penjadwalan tugas Slurm untuk menangani workload penyesuaian.
Tujuan
Akses Llama 4 menggunakan Hugging Face.
Menyiapkan lingkungan Anda.
Membuat dan men-deploy cluster Slurm A4 High-GPU tingkat produksi.
Mengonfigurasi lingkungan multi-node untuk pelatihan terdistribusi dengan FSDP.
Sesuaikan model Llama 4 menggunakan
trl.SFTTrainerHugging Face.Menyiapkan data ke SSD lokal.
Memantau tugas Anda.
Jalankan pembersihan.
Biaya
Dalam dokumen ini, Anda akan menggunakan komponen Google Cloudyang dapat ditagih berikut:
Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda,
gunakan kalkulator harga.
Sebelum memulai
-
Instal Google Cloud CLI.
-
Konfigurasi gcloud CLI agar menggunakan identitas gabungan Anda.
Untuk mengetahui informasi selengkapnya, lihat Login ke gcloud CLI dengan identitas gabungan Anda.
-
Untuk melakukan inisialisasi gcloud CLI, jalankan perintah berikut:
gcloud init -
Buat atau pilih project Google Cloud .
Peran yang diperlukan untuk memilih atau membuat project
- Memilih project: Memilih project tidak memerlukan peran IAM tertentu—Anda dapat memilih project apa pun yang perannya telah diberikan kepada Anda.
-
Membuat project: Untuk membuat project, Anda memerlukan peran Project Creator
(
roles/resourcemanager.projectCreator), yang berisi izinresourcemanager.projects.create. Pelajari cara memberikan peran.
-
Buat project Google Cloud :
gcloud projects create PROJECT_ID
Ganti
PROJECT_IDdengan nama untuk Google Cloud project yang Anda buat. -
Pilih project Google Cloud yang Anda buat:
gcloud config set project PROJECT_ID
Ganti
PROJECT_IDdengan nama project Google Cloud Anda.
-
Pastikan penagihan diaktifkan untuk project Google Cloud Anda.
Aktifkan API yang diperlukan, jika belum diaktifkan:
Peran yang diperlukan untuk mengaktifkan API
Untuk mengaktifkan API, Anda memerlukan izin
serviceusage.services.enable. Jika Anda membuat project, kemungkinan Anda sudah memiliki izin ini melalui peran Pemilik (roles/owner). Jika tidak, Anda bisa mendapatkan izin ini melalui peran Service Usage Admin (roles/serviceusage.serviceUsageAdmin). Pelajari cara memberikan peran.gcloud services enable compute.googleapis.com logging.googleapis.com cloudresourcemanager.googleapis.com servicenetworking.googleapis.com
-
Berikan peran ke akun pengguna Anda. Jalankan perintah berikut satu kali untuk setiap peran IAM berikut:
roles/compute.admin, roles/iam.serviceAccountUser, roles/file.editor, roles/storage.admin, roles/serviceusage.serviceUsageAdmingcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
Ganti kode berikut:
PROJECT_ID: Project ID Anda.USER_IDENTIFIER: ID untuk akun pengguna akun. Untuk mengetahui contohnya, lihat Merepresentasikan pengguna workforce pool dalam kebijakan IAM.ROLE: Peran IAM yang Anda berikan ke akun pengguna Anda.
- Aktifkan akun layanan default untuk project Google Cloud Anda:
gcloud iam service-accounts enable PROJECT_NUMBER-compute@
--project=PROJECT_IDGanti PROJECT_NUMBER dengan nomor project Anda. Untuk meninjau nomor project Anda, lihat Mendapatkan project yang ada.
- Berikan peran Editor (
roles/editor) ke akun layanan default:gcloud projects add-iam-policy-binding PROJECT_ID
--member="serviceAccount:PROJECT_NUMBER-compute@"
--role=roles/editor - Buat kredensial autentikasi lokal untuk akun pengguna Anda:
gcloud auth application-default login
- Aktifkan Login OS untuk project Anda:
gcloud compute project-info add-metadata --metadata=enable-oslogin=TRUE
- Login atau buat akun Hugging Face.
- Instal dependensi yang diperlukan untuk menggunakan Cluster Toolkit.
Mengakses Llama 4 menggunakan Hugging Face
Untuk menggunakan Hugging Face guna mengakses Llama 4, lakukan hal berikut:
Buat token akses
readHugging Face.Klik Your Profile > Settings > Access tokens > +Create new token
Salin dan simpan nilai token
read access. Anda akan menggunakannya nanti dalam tutorial ini.
Menyiapkan lingkungan Anda
Untuk menyiapkan lingkungan Anda, ikuti langkah-langkah berikut:
Buat clone repositori GitHub Cluster Toolkit:
git clone https://github.com/GoogleCloudPlatform/cluster-toolkit.gitBuat bucket Cloud Storage untuk menghosting status Terraform Anda:
gcloud storage buckets create gs://BUCKET_NAME \ --project=PROJECT_IDGanti kode berikut:
BUCKET_NAME: nama untuk bucket Cloud Storage Anda yang mengikuti persyaratan penamaan bucket.PROJECT_ID: ID projectGoogle Cloud tempat Anda ingin membuat bucket Cloud Storage.
Membuat cluster Slurm A4
Untuk membuat cluster Slurm A4, ikuti langkah-langkah berikut:
Buka direktori
cluster-toolkit:cd cluster-toolkitJika ini pertama kalinya Anda menggunakan Cluster Toolkit, bangun biner
gcluster:makeBuka direktori
examples/machine-learning/a4-highgpu-8g:cd examples/machine-learning/a4-highgpu-8g/Buka file
a4high-slurm-deployment.yaml, lalu edit sebagai berikut:terraform_backend_defaults: type: gcs configuration: bucket: BUCKET_NAME vars: deployment_name: a4-high project_id: PROJECT_ID region: REGION zone: ZONE a4h_cluster_size: 2 a4h_reservation_name: RESERVATION_URLGanti kode berikut:
BUCKET_NAME: nama bucket Cloud Storage yang Anda buat di bagian sebelumnya.PROJECT_ID: IDGoogle Cloud project tempat bucket Anda berada dan tempat Anda ingin membuat cluster Slurm.REGION: region tempat pemesanan Anda berada.ZONE: zona tempat pemesanan Anda berada.RESERVATION_URL: URL pemesanan yang ingin Anda gunakan untuk membuat cluster Slurm. Berdasarkan project tempat pemesanan berada, tentukan salah satu nilai berikut:Pemesanan ada di project Anda:
RESERVATION_NAMEPemesanan ada di project lain, dan project Anda dapat menggunakan pemesanan tersebut:
projects/RESERVATION_PROJECT_ID/reservations/RESERVATION_NAME
Deploy cluster:
./gcluster deploy -d examples/machine-learning/a4-highgpu-8g/a4high-slurm-deployment.yaml examples/machine-learning/a4-highgpu-8g/a4high-slurm-blueprint.yaml --auto-approvePerintah
./gcluster deployadalah proses dua fase, yaitu sebagai berikut:Fase pertama membangun image kustom dengan semua software yang sudah diinstal sebelumnya, yang dapat memerlukan waktu hingga 35 menit untuk diselesaikan.
Fase kedua men-deploy cluster menggunakan image kustom tersebut. Proses ini akan selesai lebih cepat daripada fase pertama.
Jika fase pertama berhasil, tetapi fase kedua gagal, Anda dapat mencoba men-deploy cluster Slurm lagi dengan melewati fase pertama:
./gcluster deploy -d examples/machine-learning/a4-highgpu-8g/a4high-slurm-deployment.yaml examples/machine-learning/a4-highgpu-8g/a4high-slurm-blueprint.yaml --auto-approve --skip "image" -w
Menyiapkan workload Anda
Untuk menyiapkan workload, lakukan hal berikut:
Membuat skrip workload
Untuk membuat skrip yang akan digunakan workload fine-tuning Anda, ikuti langkah-langkah berikut:
Untuk menyiapkan lingkungan virtual Python, buat file
install_environment.shdengan konten berikut:#!/bin/bash # This script sets up a consistent environment for FSDP training. # It is meant to be run once on the login node of your Slurm cluster set -e # --- 1. Create the Python virtual environment --- VENV_PATH="$HOME/.venv/venv-fsdp" if [ ! -d "$VENV_PATH" ]; then echo "--- Creating Python virtual environment at $VENV_PATH ---" python3 -m venv $VENV_PATH else echo "--- Virtual environment already exists at $VENV_PATH ---" fi source $VENV_PATH/bin/activate # --- 2. Install Dependencies --- echo "--- [STEP 2.1] Upgrading build toolchain ---" pip install --upgrade pip wheel packaging echo "--- [STEP 2.2] Installing PyTorch Nightly ---" pip install --force-reinstall --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cu128 echo "--- [STEP 2.3] Installing application dependencies ---" if [ -f "requirements-fsdp.txt" ]; then pip install -r requirements-fsdp.txt else echo "ERROR: requirements-fsdp.txt not found!" exit 1 fi # --- 3. Download the Model --- echo "--- [STEP 2.4] Downloading Llama4 model ---" if [ -z "$HF_TOKEN" ]; then echo "ERROR: The HF_TOKEN environment variable is not set."; exit 1; fi pip install huggingface_hub[cli] # Execute the CLI using its full, explicit path $VENV_PATH/bin/huggingface-cli download meta-llama/Llama-4-Scout-17B-16E-Instruct --local-dir ~/Llama-4-Scout-17B-16E-Instruct --token $HF_TOKEN echo "--- Environment setup complete. ---"Skrip ini menyiapkan lingkungan virtual Python yang andal, menginstal versi PyTorch yang diupdate tiap hari, dan mendownload model Llama 4.
Untuk menentukan dependensi Python untuk skrip pelatihan, buat file
requirements-fsdp.txtdengan konten berikut:transformers==4.55.0 datasets==4.0.0 peft==0.16.0 accelerate==1.9.0 trl==0.21.0 # Other dependencies sentencepiece==0.2.0Tentukan
llama4-train-distributed.pysebagai skrip pelatihan utama:import torch from datasets import load_dataset from peft import LoraConfig, PeftModel from transformers import ( AutoModelForCausalLM, AutoTokenizer, TrainingArguments, HfArgumentParser, ) from torch.distributed import get_rank, get_world_size from transformers.models.llama4.modeling_llama4 import Llama4TextDecoderLayer from trl import SFTTrainer from dataclasses import dataclass, field from typing import Optional @dataclass class ScriptArguments: model_id: str = field(metadata={"help": "Hugging Face model ID from the Hub"}) dataset_name: str = field(default="philschmid/gretel-synthetic-text-to-sql", metadata={"help": "Dataset from the Hub"}) run_inference_after_training: bool = field(default=False, metadata={"help": "Run sample inference on rank 0 after training"}) dataset_subset_size: Optional[int] = field(default=None, metadata={"help": "Number of samples to use from the dataset for training. If None, uses the full dataset."}) @dataclass class PeftArguments: lora_r: int = field(default=16, metadata={"help": "LoRA attention dimension"}) lora_alpha: int = field(default=32, metadata={"help": "LoRA alpha scaling factor"}) lora_dropout: float = field(default=0.05, metadata={"help": "LoRA dropout probability"}) @dataclass class SftTrainingArguments(TrainingArguments): max_length: Optional[int] = field(default=2048, metadata={"help": "The maximum sequence length for SFTTrainer"}) packing: Optional[bool] = field(default=False, metadata={"help": "Enable packing for SFTTrainer"}) ddp_find_unused_parameters: Optional[bool] = field(default=True, metadata={"help": "When using FSDP activation checkpointing, this must be set to True"}) def formatting_prompts_func(example): system_message = "You are a text to SQL query translator. Users will ask you questions in English and you will generate a SQL query based on the provided SCHEMA." user_prompt = f"### SCHEMA:\n{example['sql_context']}\n\n### USER QUERY:\n{example['sql_prompt']}" response = f"\n\n### SQL QUERY:\n{example['sql']}" return f"{system_message}\n\n{user_prompt}{response}" def main(): parser = HfArgumentParser((ScriptArguments, PeftArguments, SftTrainingArguments)) script_args, peft_args, training_args = parser.parse_args_into_dataclasses() training_args.gradient_checkpointing = True training_args.gradient_checkpointing_kwargs = {"use_reentrant": False} training_args.optim = "adamw_torch_fused" training_args.fsdp = "full_shard" training_args.fsdp_config = { "fsdp_auto_wrap_policy": "TRANSFORMER_BASED_WRAP", "fsdp_transformer_layer_cls_to_wrap": [Llama4TextDecoderLayer], "fsdp_state_dict_type": "FULL_STATE_DICT", "fsdp_offload_params": False, "fsdp_forward_prefetch": True, } tokenizer = AutoTokenizer.from_pretrained(script_args.model_id, trust_remote_code=True) model = AutoModelForCausalLM.from_pretrained( script_args.model_id, torch_dtype=torch.bfloat16, trust_remote_code=True, attn_implementation="sdpa", ) peft_config = LoraConfig( r=peft_args.lora_r, lora_alpha=peft_args.lora_alpha, lora_dropout=peft_args.lora_dropout, bias="none", task_type="CAUSAL_LM", target_modules=["q_proj", "v_proj", "k_proj", "o_proj", "gate_proj", "up_proj", "down_proj"], ) rank = get_rank() world_size = get_world_size() dataset = load_dataset(script_args.dataset_name, split="train") if script_args.dataset_subset_size is not None: dataset = dataset.select(range(script_args.dataset_subset_size)) else: print(f"Using the full dataset with {len(dataset)} samples.") dataset = dataset.shuffle(seed=training_args.seed) print(f"Dataset shuffled with seed: {training_args.seed}.") if world_size > 1: print(f"Sharding dataset for Rank {rank} of {world_size}.") dataset = dataset.shard(num_shards=world_size, index=rank) print("Initializing SFTTrainer...") trainer = SFTTrainer( model=model, args=training_args, train_dataset=dataset, peft_config=peft_config, formatting_func=formatting_prompts_func, processing_class=tokenizer, ) trainer.train() trainer.save_model(training_args.output_dir) if script_args.run_inference_after_training and trainer.is_world_process_zero(): del model del trainer torch.cuda.empty_cache() run_post_training_inference(script_args, training_args, tokenizer) def run_post_training_inference(script_args, training_args, tokenizer): """ Loads the fine-tuned PEFT adapter from the local output directory and runs inference. This should only be called on rank 0 after training is complete. """ print("\n" + "="*50) print("=== RUNNING POST-TRAINING INFERENCE TEST ===") print("="*50 + "\n") # Load the base model and merge the adapter. base_model = AutoModelForCausalLM.from_pretrained( script_args.model_id, torch_dtype=torch.bfloat16, trust_remote_code=True, device_map="auto" ) # Load the PEFT adapter and merge it into the base model model = PeftModel.from_pretrained(base_model, training_args.output_dir) model = model.merge_and_unload() # Merge weights for faster inference model.eval() # Define the test case schema = "CREATE TABLE artists (Name TEXT, Country TEXT, Genre TEXT)" system_message = "You are a text to SQL query translator. Users will ask you questions in English and you will generate a SQL query based on the provided SCHEMA." question = "Show me all artists from the Country just north of the USA." # This must match the formatting_func exactly prompt = f"{system_message}\n\n### SCHEMA:\n{schema}\n\n### USER QUERY:\n{question}\n\n### SQL QUERY:\n" print(f"Test Prompt:\n{prompt}") inputs = tokenizer(prompt, return_tensors="pt").to("cuda") print("\n--- Generating SQL... ---") outputs = model.generate( **inputs, max_new_tokens=100, pad_token_id=tokenizer.eos_token_id, do_sample=False, temperature=None, top_p=None, ) generated_sql = tokenizer.decode(outputs[0], skip_special_tokens=True)[len(prompt):].strip() print(f"\n--- Generated SQL Query ---") print(generated_sql) print("\n" + "="*50) print("=== INFERENCE TEST COMPLETE ===") print("="*50 + "\n") if __name__ == "__main__": main()Skrip ini menggunakan TRL Supervised Fine-Tuning (SFT) Trainer untuk mengelola loop pelatihan FSDP, konfigurasi Low-Rank Adaptation (LoRA), dan pemformatan data.
Untuk menentukan tugas yang akan dijalankan oleh tugas di cluster Slurm, buat file
submit.slurmdengan konten berikut:#!/bin/bash #SBATCH --job-name=llama4-fsdp-fixed #SBATCH --nodes=2 #SBATCH --ntasks-per-node=8 #SBATCH --gpus-per-node=8 #SBATCH --partition=a4high #SBATCH --output=llama4-%j.out #SBATCH --error=llama4-%j.err set -e set -x echo "--- Slurm Job Started ---" echo "Job ID: $SLURM_JOB_ID" echo "Node List: $SLURM_JOB_NODELIST" # --- Define Paths --- LOCAL_SSD_PATH="/mnt/localssd/job_${SLURM_JOB_ID}" VENV_PATH="${HOME}/.venv/venv-fsdp" MODEL_PATH="${HOME}/Llama-4-Scout-17B-16E-Instruct" # --- STAGE 1: Stage Data to Local SSD on Each Node --- srun --ntasks=$SLURM_NNODES --ntasks-per-node=1 bash -c " echo '--- Staging on node: $(hostname) ---' mkdir -p ${LOCAL_SSD_PATH} echo 'Copying virtual environment...' rsync -a -q ${VENV_PATH}/ ${LOCAL_SSD_PATH}/venv/ echo 'Copying model weights...' rsync -a --info=progress2 ${MODEL_PATH}/ ${LOCAL_SSD_PATH}/model/ mkdir -p ${LOCAL_SSD_PATH}/hf_cache echo '--- Staging on $(hostname) complete ---' " echo "--- Staging complete on all nodes ---" # --- STAGE 2: Run the Training Job --- echo "--- Launching Distributed Training with GIB NCCL Plugin ---" nodes=( $( scontrol show hostnames "$SLURM_JOB_NODELIST" ) ) head_node=${nodes[0]} head_node_ip=$(srun --nodes=1 --ntasks=1 -w "$head_node" hostname --ip-address) export MASTER_ADDR=$head_node_ip export MASTER_PORT=29500 export NCCL_SOCKET_IFNAME=enp0s19 export NCCL_NET=gIB # export NCCL_DEBUG=INFO # Un-comment to diagnose NCCL issues if needed srun --cpu-bind=none --accel-bind=g bash -c ' # Activate the environment from the local copy source '${LOCAL_SSD_PATH}'/venv/bin/activate # Point Hugging Face cache to the local SSD export HF_HOME='${LOCAL_SSD_PATH}'/hf_cache export RANK=$SLURM_PROCID export WORLD_SIZE=$SLURM_NTASKS export LOCAL_RANK=$SLURM_LOCALID export LD_LIBRARY_PATH=/usr/local/gib/lib64:$LD_LIBRARY_PATH source /usr/local/gib/scripts/set_nccl_env.sh # --- Launch the training --- python \ '${SLURM_SUBMIT_DIR}'/llama4-train-distributed.py \ --model_id="'${LOCAL_SSD_PATH}'/model/" \ --output_dir="'${LOCAL_SSD_PATH}'/outputs/" \ --dataset_name="philschmid/gretel-synthetic-text-to-sql" \ --seed=900913 \ --bf16=True \ --num_train_epochs=1 \ --per_device_train_batch_size=2 \ --gradient_accumulation_steps=4 \ --learning_rate=2e-5 \ --logging_steps=10 \ --lora_r=16 \ --lora_alpha=32 \ --lora_dropout=0.05 \ --run_inference_after_training ' # --- STAGE 3: Copy Final Results Back to Persistent Storage --- echo "--- Copying final results from local SSD to shared storage ---" PERSISTENT_OUTPUT_DIR="${HOME}/outputs/llama4_job_${SLURM_JOB_ID}" mkdir -p "$PERSISTENT_OUTPUT_DIR" # Only copy from the head node where trl has combined the results srun --nodes=1 --ntasks=1 -w "$head_node" \ rsync -a --info=progress2 "${LOCAL_SSD_PATH}/outputs/" "${PERSISTENT_OUTPUT_DIR}/" # --- STAGE 4: Cleanup --- echo "--- Cleaning up local SSD on all nodes ---" srun --ntasks=$SLURM_NNODES --ntasks-per-node=1 bash -c "rm -rf ${LOCAL_SSD_PATH}" echo "--- Slurm Job Finished ---"
Mengupload skrip ke cluster Slurm
Untuk mengupload skrip yang Anda buat di bagian sebelumnya ke cluster Slurm, ikuti langkah-langkah berikut:
Untuk mengidentifikasi node login, cantumkan semua VM A4 di project Anda:
gcloud compute instances list --filter="machineType:a4-highgpu-8g"Nama node login mirip dengan
a4-high-login-001.Upload skrip Anda ke direktori utama node login:
gcloud compute scp --project="$PROJECT_ID" --zone="$ZONE" --tunnel-through-iap \ ./install_environment.sh \ ./requirements-fsdp.txt \ ./llama4-train-distributed.py \ ./submit.slurm \ "${LOGIN_NODE_NAME}":~/Ganti
LOGIN_NODE_NAMEdengan nama node login.
Menghubungkan ke cluster Slurm
Hubungkan ke cluster Slurm dengan menghubungkan ke node login melalui SSH:
gcloud compute ssh LOGIN_NODE_NAME \
--project=PROJECT_ID \
--tunnel-through-iap \
--zone=ZONE
Menginstal framework dan alat
Setelah Anda terhubung ke node login, instal framework dan alat dengan melakukan hal berikut:
Ekspor token Hugging Face Anda:
# On the login node export HF_TOKEN="hf_..." # Replace with your tokenJalankan skrip penginstalan:
# On the login node chmod +x install_environment.sh ./install_environment.shPerintah ini menyiapkan lingkungan virtual dengan semua dependensi yang diperlukan, dan mendownload bobot model ke dalam file
~/Llama-4-Scout-17B-16E-Instruct.Karena download model berukuran sangat besar (~200 GB), proses ini memerlukan waktu sekitar 30 menit, bergantung pada kondisi jaringan.
Memulai workload fine-tuning
Untuk mulai melatih workload, lakukan hal berikut:
Kirim tugas ke penjadwal Slurm:
sbatch submit.slurmPada node login di cluster Slurm, Anda dapat memantau progres tugas dengan memeriksa file output yang dibuat di direktori
home:# On the login node tail -f llama4-*.outJika tugas Anda berhasil dimulai, file
.errakan menampilkan status progres yang diperbarui seiring progres tugas Anda.Tugas ini akan memerlukan waktu sekitar satu jam lebih untuk diselesaikan di Cluster Slurm. Tugas ini memiliki dua fase utama:
- Menyalin model dasar yang besar ke SSD lokal setiap node komputasi.
- Tugas pelatihan, yang dimulai setelah penyalinan model selesai. Tugas ini memerlukan waktu sekitar 35 menit untuk dijalankan.
Pembersihan
Agar tidak perlu membayar biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus setiap resource.
Menghapus project Anda
Menghapus Google Cloud project:
gcloud projects delete PROJECT_ID
Menghapus cluster Slurm Anda
Untuk menghapus cluster Slurm, ikuti langkah-langkah berikut:
Buka direktori
cluster-toolkit.Gunakan perintah
gcluster destroyuntuk menghancurkan file Terraform dan semua resource yang dibuat:./gcluster destroy a4-high --auto-approve