Menyesuaikan model terbuka Gemma menggunakan beberapa GPU di GKE

Tutorial ini menunjukkan cara melakukan penyesuaian model bahasa besar (LLM) Gemma, yaitu keluarga model terbuka, menggunakan unit pemrosesan grafis (GPU) di Google Kubernetes Engine (GKE) dengan library Transformers dari Hugging Face. Penyesuaian adalah proses pembelajaran terawasi yang meningkatkan kemampuan model terlatih untuk melakukan tugas tertentu dengan memperbarui parameternya menggunakan set data baru. Dalam tutorial ini, Anda akan mendownload model keluarga Gemma yang telah dilatih sebelumnya dengan 2B parameter dari Hugging Face dan melakukan fine-tuning pada model tersebut di cluster Autopilot atau Standard GKE.

Panduan ini adalah titik awal yang baik jika Anda memerlukan kontrol terperinci, skalabilitas, ketahanan, portabilitas, dan efektivitas biaya Kubernetes terkelola saat melakukan penyesuaian LLM.

Praktik terbaik:

Coba solusi Vertex AI kami jika Anda memerlukan platform AI terkelola terpadu untuk membangun dan menayangkan model ML dengan cepat dan hemat biaya.

Latar belakang

Dengan menayangkan Gemma menggunakan GPU di GKE dengan library transformer, Anda dapat menerapkan solusi penayangan inferensi yang tangguh dan siap produksi dengan semua manfaat Kubernetes terkelola, termasuk skalabilitas yang efisien dan ketersediaan yang lebih tinggi. Bagian ini menjelaskan teknologi utama yang digunakan dalam panduan ini.

Gemma

Gemma adalah serangkaian model AI generatif ringan yang tersedia secara terbuka dan dirilis dengan lisensi terbuka. Model AI ini tersedia untuk dijalankan di aplikasi, hardware, perangkat seluler, atau layanan yang dihosting.

Dalam panduan ini, kami memperkenalkan Gemma untuk pembuatan teks. Anda juga dapat menyesuaikan model ini agar lebih mahir dalam melakukan tugas tertentu.

Set data yang Anda gunakan dalam dokumen ini adalah b-mc2/sql-create-context.

Untuk mempelajari lebih lanjut, lihat dokumentasi Gemma.

GPU

GPU memungkinkan Anda mempercepat workload tertentu yang berjalan di node Anda, seperti machine learning dan pemrosesan data. GKE menyediakan berbagai opsi jenis mesin untuk konfigurasi node, termasuk jenis mesin dengan GPU NVIDIA H100, L4, dan A100.

Sebelum menggunakan GPU di GKE, sebaiknya selesaikan jalur pembelajaran berikut:

  1. Pelajari ketersediaan versi GPU saat ini
  2. Pelajari GPU di GKE

Hugging Face Transformers

Dengan library Transformers dari Hugging Face, Anda dapat mengakses model pra-latih canggih. Library Transformers memungkinkan Anda mengurangi waktu, resource, dan biaya komputasi yang terkait dengan pelatihan model lengkap.

Dalam tutorial ini, Anda akan menggunakan API dan alat Hugging Face untuk mendownload dan menyesuaikan model terlatih ini.

Tujuan

Panduan ini ditujukan untuk pengguna baru atau lama GKE, Engineer ML, engineer MLOps (DevOps), atau administrator platform yang tertarik menggunakan kemampuan orkestrasi penampung Kubernetes untuk menyetel LLM di hardware GPU H100, A100, dan L4.

Pada akhir panduan ini, Anda akan dapat melakukan langkah-langkah berikut:

  1. Siapkan lingkungan Anda dengan cluster GKE dalam mode Autopilot.
  2. Buat container penyesuaian.
  3. Gunakan GPU untuk menyempurnakan model Gemma 2B dan upload model ke Hugging Face.

Sebelum memulai

  • Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
  • In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  • Verify that billing is enabled for your Google Cloud project.

  • Enable the required APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  • In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  • Verify that billing is enabled for your Google Cloud project.

  • Enable the required APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  • Pastikan Anda memiliki peran berikut di project: roles/container.admin, roles/iam.serviceAccountAdmin, roles/cloudbuild.builds.editor

    Memeriksa peran

    1. Di konsol Google Cloud , buka halaman IAM.

      Buka IAM
    2. Pilih project.
    3. Di kolom Akun utama, temukan semua baris yang mengidentifikasi Anda atau grup yang Anda ikuti. Untuk mengetahui grup mana saja yang Anda ikuti, hubungi administrator Anda.

    4. Untuk semua baris yang menentukan atau menyertakan Anda, periksa kolom Peran untuk melihat apakah daftar peran menyertakan peran yang diperlukan.

    Memberikan peran

    1. Di konsol Google Cloud , buka halaman IAM.

      Buka IAM
    2. Pilih project.
    3. Klik Grant access.
    4. Di kolom New principals, masukkan ID pengguna Anda. Biasanya, ini adalah alamat email untuk Akun Google.

    5. Klik Pilih peran, lalu telusuri peran.
    6. Untuk memberikan peran tambahan, klik Add another role, lalu tambahkan tiap peran tambahan.
    7. Klik Simpan.
  • Buat akun Hugging Face, jika Anda belum memilikinya.
  • Pastikan project Anda memiliki kuota yang cukup untuk GPU L4. Untuk mempelajari lebih lanjut, lihat Tentang GPU dan Kuota alokasi.

Mendapatkan akses ke model

Untuk mendapatkan akses ke model Gemma untuk deployment ke GKE, Anda harus menandatangani perjanjian izin lisensi terlebih dahulu, lalu membuat token akses Hugging Face.

Anda harus menandatangani perjanjian izin untuk menggunakan Gemma. Ikuti petunjuk berikut:

  1. Akses halaman izin model di Kaggle.com.
  2. Verifikasi izin menggunakan akun Hugging Face Anda.
  3. Setujui persyaratan model.

Membuat token akses

Untuk mengakses model melalui Hugging Face, Anda memerlukan token Hugging Face.

Ikuti langkah-langkah berikut untuk membuat token baru jika Anda belum memilikinya:

  1. Klik Profil Anda > Setelan > Token Akses.
  2. Pilih New Token.
  3. Tentukan Nama sesuai pilihan Anda dan Peran minimal Write.
  4. Pilih Generate a token.
  5. Salin token yang dihasilkan ke papan klip Anda.

Menyiapkan lingkungan Anda

Dalam tutorial ini, Anda akan menggunakan Cloud Shell untuk mengelola resource yang dihosting di Google Cloud. Cloud Shell telah diinstal dengan software yang akan Anda perlukan untuk tutorial ini, termasuk kubectl dan gcloud CLI.

Untuk menyiapkan lingkungan Anda dengan Cloud Shell, ikuti langkah-langkah berikut:

  1. Di konsol Google Cloud , luncurkan sesi Cloud Shell dengan mengklik Ikon aktivasi Cloud Shell Aktifkan Cloud Shell di konsolGoogle Cloud . Tindakan ini akan meluncurkan sesi di panel bawah konsol Google Cloud .

  2. Tetapkan variabel lingkungan default:

    gcloud config set project PROJECT_ID
    export PROJECT_ID=$(gcloud config get project)
    export CONTROL_PLANE_LOCATION=CONTROL_PLANE_LOCATION
    export CLUSTER_NAME=CLUSTER_NAME
    export HF_TOKEN=HF_TOKEN
    export HF_PROFILE=HF_PROFILE
    

    Ganti nilai berikut:

    • PROJECT_ID: Project ID Google Cloud Anda.
    • CONTROL_PLANE_LOCATION: region Compute Engine dari bidang kontrol cluster Anda. Berikan region yang mendukung jenis akselerator yang ingin Anda gunakan, misalnya, us-central1 untuk GPU L4.
    • CLUSTER_NAME: nama cluster Anda.
    • HF_TOKEN: token Hugging Face yang Anda buat sebelumnya.
    • HF_PROFILE: ID Profil Hugging Face yang Anda buat sebelumnya.
  3. Clone repositori kode contoh dari GitHub:

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
    cd kubernetes-engine-samples/ai-ml/llm-finetuning-gemma
    

Membuat dan mengonfigurasi resource Google Cloud

Ikuti petunjuk berikut untuk membuat resource yang diperlukan.

Membuat cluster dan node pool GKE

Anda dapat menayangkan Gemma di GPU dalam cluster GKE Autopilot atau Standard. Untuk memilih mode operasi GKE yang paling sesuai untuk workload Anda, lihat Memilih mode operasi GKE.

Praktik terbaik:

Gunakan Autopilot untuk pengalaman Kubernetes yang terkelola sepenuhnya.

Autopilot

Jalankan perintah berikut di Cloud Shell:

gcloud container clusters create-auto CLUSTER_NAME \
    --project=PROJECT_ID \
    --location=CONTROL_PLANE_LOCATION \
    --release-channel=rapid \
    --cluster-version=CLUSTER_VERSION

Ganti nilai berikut:

  • PROJECT_ID: Project ID Google Cloud Anda.
  • CONTROL_PLANE_LOCATION: region Compute Engine dari bidang kontrol cluster Anda. Berikan region yang mendukung jenis akselerator yang ingin Anda gunakan, misalnya, us-central1 untuk GPU L4.
  • CLUSTER_NAME: nama cluster Anda.
  • CLUSTER_VERSION: versi GKE, yang harus mendukung Saluran rilis cepat. Untuk mengetahui informasi selengkapnya, lihat Memeriksa versi default dan yang tersedia.

GKE membuat cluster Autopilot dengan node CPU dan GPU seperti yang diminta oleh workload yang di-deploy.

Standar

  1. Di Cloud Shell, jalankan perintah berikut untuk membuat cluster Standar:

    gcloud container clusters create CLUSTER_NAME \
        --project=PROJECT_ID \
        --location=CONTROL_PLANE_LOCATION \
        --workload-pool=PROJECT_ID.svc.id.goog \
        --release-channel=rapid \
        --num-nodes=1
    

    Ganti nilai berikut:

    • PROJECT_ID: Project ID Google Cloud Anda.
    • CONTROL_PLANE_LOCATION: region Compute Engine dari bidang kontrol cluster Anda. Berikan region yang mendukung jenis akselerator yang ingin Anda gunakan, misalnya, us-central1 untuk GPU L4.
    • CLUSTER_NAME: nama cluster Anda.

    Pembuatan cluster mungkin memerlukan waktu beberapa menit.

  2. Jalankan perintah berikut untuk membuat node pool untuk cluster Anda:

    gcloud container node-pools create gpupool \
        --accelerator type=nvidia-l4,count=8,gpu-driver-version=latest \
        --project=PROJECT_ID \
        --location=CONTROL_PLANE_LOCATION \
        --node-locations=CONTROL_PLANE_LOCATION-a \
        --cluster=CLUSTER_NAME \
        --machine-type=g2-standard-96 \
        --num-nodes=1
    

    GKE membuat satu node pool yang berisi dua GPU L4 untuk setiap node.

Buat secret Kubernetes untuk kredensial Hugging Face

Di Cloud Shell, lakukan hal berikut:

  1. Konfigurasi kubectl untuk berkomunikasi dengan cluster Anda:

    gcloud container clusters get-credentials CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION
    

    Ganti nilai berikut:

    • CONTROL_PLANE_LOCATION: region Compute Engine dari bidang kontrol cluster Anda.
    • CLUSTER_NAME: nama cluster Anda.
  2. Buat Secret Kubernetes yang berisi token Hugging Face:

    kubectl create secret generic hf-secret \
        --from-literal=hf_api_token=$HF_TOKEN \
        --dry-run=client -o yaml | kubectl apply -f -
    

    Ganti $HF_TOKEN dengan token Hugging Face yang Anda buat sebelumnya, atau gunakan variabel lingkungan jika Anda menyetelnya.

Membuat container penyesuaian dengan Docker dan Cloud Build

Container ini menggunakan kode PyTorch dan Hugging Face Transformers untuk menyesuaikan model Gemma terlatih yang ada.

  1. Buat Repositori Docker Artifact Registry:

    gcloud artifacts repositories create gemma \
        --project=PROJECT_ID \
        --repository-format=docker \
        --location=us \
        --description="Gemma Repo"
    

    Ganti PROJECT_ID dengan ID project Google Cloud Anda.

  2. Build dan kirim image:

    gcloud builds submit .
    
  3. Ekspor IMAGE_URL untuk digunakan nanti dalam tutorial ini.

    export IMAGE_URL=us-docker.pkg.dev/PROJECT_ID/gemma/finetune-gemma-gpu:1.0.0
    

Menjalankan tugas penyesuaian di GKE

Di bagian ini, Anda akan men-deploy Tugas penyesuaian Gemma. Pengontrol Tugas di Kubernetes membuat satu atau beberapa Pod dan membantu memastikan bahwa Pod tersebut berhasil menjalankan tugas tertentu.

  1. Buka file finetune.yaml.

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: finetune-job
      namespace: default
    spec:
      backoffLimit: 2
      template:
        metadata:
          annotations:
            kubectl.kubernetes.io/default-container: finetuner
        spec:
          terminationGracePeriodSeconds: 600
          containers:
          - name: finetuner
            image: $IMAGE_URL
            resources:
              limits:
                nvidia.com/gpu: "8"
            env:
            - name: MODEL_NAME
              value: "google/gemma-2b"
            - name: NEW_MODEL
              value: "gemma-2b-sql-finetuned"
            - name: LORA_R
              value: "8"
            - name: LORA_ALPHA
              value: "16"
            - name: TRAIN_BATCH_SIZE
              value: "1"
            - name: EVAL_BATCH_SIZE
              value: "2"
            - name: GRADIENT_ACCUMULATION_STEPS
              value: "2"
            - name: DATASET_LIMIT
              value: "1000"
            - name: MAX_SEQ_LENGTH
              value: "512"
            - name: LOGGING_STEPS
              value: "5"
            - name: HF_TOKEN
              valueFrom:
                secretKeyRef:
                  name: hf-secret
                  key: hf_api_token
            volumeMounts:
            - mountPath: /dev/shm
              name: dshm
          volumes:
          - name: dshm
            emptyDir:
              medium: Memory
          nodeSelector:
            cloud.google.com/gke-accelerator: nvidia-l4
          restartPolicy: OnFailure
  2. Terapkan manifes untuk membuat tugas penyesuaian:

    envsubst < finetune.yaml | kubectl apply -f -
    

    Petunjuk ini mengganti IMAGE_URL dengan variabel dalam manifes.

  3. Pantau Job dengan menjalankan perintah berikut:

    watch kubectl get pods
    
  4. Periksa log tugas dengan menjalankan perintah berikut:

    kubectl logs job.batch/finetune-job -f
    

    Resource Job mendownload data model, lalu menyetel model di semua delapan GPU. Proses ini memerlukan waktu hingga 20 menit.

  5. Setelah Tugas selesai, buka akun Hugging Face Anda. Model baru bernama HF_PROFILE/gemma-2b-sql-finetuned akan muncul di profil Hugging Face Anda.

Menyajikan model yang telah disesuaikan di GKE

Di bagian ini, Anda akan men-deploy container vLLM untuk menayangkan model Gemma. Tutorial ini menggunakan Deployment Kubernetes untuk men-deploy container vLLM. Deployment adalah objek Kubernetes API yang memungkinkan Anda menjalankan beberapa replika Pod yang didistribusikan di antara node dalam cluster.

  1. Buat manifes serve-gemma.yaml berikut:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: vllm-gemma-deployment
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: gemma-server
      template:
        metadata:
          labels:
            app: gemma-server
            ai.gke.io/model: gemma-2b
            ai.gke.io/inference-server: vllm
            examples.ai.gke.io/source: user-guide
        spec:
          containers:
          - name: inference-server
            image: docker.io/vllm/vllm-openai:v0.10.0
            resources:
              requests:
                cpu: "2"
                memory: "7Gi"
                ephemeral-storage: "10Gi"
                nvidia.com/gpu: 1
              limits:
                cpu: "2"
                memory: "7Gi"
                ephemeral-storage: "10Gi"
                nvidia.com/gpu: 1
            command: ["python3", "-m", "vllm.entrypoints.openai.api_server"]
            args:
            - --model=$(MODEL_ID)
            - --tensor-parallel-size=1
            env:
            - name: LD_LIBRARY_PATH
              value: ${LD_LIBRARY_PATH}:/usr/local/nvidia/lib64
            - name: MODEL_ID
              value: google/gemma-2b
            - name: HUGGING_FACE_HUB_TOKEN
              valueFrom:
                secretKeyRef:
                  name: hf-secret
                  key: hf_api_token
            volumeMounts:
            - mountPath: /dev/shm
              name: dshm
          volumes:
          - name: dshm
            emptyDir:
                medium: Memory
          nodeSelector:
            cloud.google.com/gke-accelerator: nvidia-l4
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: llm-service
    spec:
      selector:
        app: gemma-server
      type: ClusterIP
      ports:
        - protocol: TCP
          port: 8000
          targetPort: 8000
  2. Buat variabel lingkungan untuk MODEL_ID baru:

    export MODEL_ID=HF_PROFILE/gemma-2b-sql-finetuned
    

    Ganti HF_PROFILE dengan ID Profil Hugging Face yang Anda buat sebelumnya.

  3. Ganti MODEL_ID dalam manifes:

    sed -i "s|google/gemma-2b|$MODEL_ID|g" serve-gemma.yaml
    
  4. Terapkan manifes:

    kubectl apply -f serve-gemma.yaml
    

    Pod di cluster mendownload bobot model dari Hugging Face dan memulai mesin penayangan.

  5. Tunggu hingga Deployment tersedia:

    kubectl wait --for=condition=Available --timeout=700s deployment/vllm-gemma-deployment
    
  6. Lihat log dari Deployment yang sedang berjalan:

    kubectl logs -f -l app=gemma-server
    

Resource Deployment mendownload data model. Proses ini dapat memerlukan waktu beberapa menit. Outputnya mirip dengan hal berikut ini:

INFO 01-26 19:02:54 model_runner.py:689] Graph capturing finished in 4 secs.
INFO:     Started server process [1]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)

Pastikan model didownload sepenuhnya sebelum melanjutkan ke bagian berikutnya.

Menyajikan model

Di bagian ini, Anda akan berinteraksi dengan model.

Menyiapkan penerusan port

Setelah model di-deploy, jalankan perintah berikut untuk menyiapkan penerusan port ke model:

kubectl port-forward service/llm-service 8000:8000

Outputnya mirip dengan hal berikut ini:

Forwarding from 127.0.0.1:8000 -> 8000

Berinteraksi dengan model menggunakan curl

Dalam sesi terminal baru, gunakan curl untuk memulai percakapan dengan model Anda:

Contoh perintah berikut adalah untuk TGI:

USER_PROMPT="Question: What is the total number of attendees with age over 30 at kubecon eu? Context: CREATE TABLE attendees (name VARCHAR, age INTEGER, kubecon VARCHAR)"

curl -X POST http://localhost:8000/generate \
  -H "Content-Type: application/json" \
  -d @- <<EOF
{
    "prompt": "${USER_PROMPT}",
    "temperature": 0.1,
    "top_p": 1.0,
    "max_tokens": 24
}
EOF

Output berikut menunjukkan contoh respons model:

{"generated_text":" Answer: SELECT COUNT(age) FROM attendees WHERE age > 30 AND kubecon = 'eu'\n"}

Bergantung pada kueri Anda, Anda mungkin harus mengubah max_token untuk mendapatkan hasil yang lebih baik. Anda juga dapat menggunakan model yang disesuaikan untuk mengikuti perintah guna mendapatkan pengalaman percakapan yang lebih baik.

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 resource yang di-deploy

Agar tidak menimbulkan biaya pada akun Google Cloud Anda untuk resource yang Anda buat dalam panduan ini, jalankan perintah berikut:

gcloud container clusters delete CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION

Ganti nilai berikut:

  • CONTROL_PLANE_LOCATION: region Compute Engine dari bidang kontrol cluster Anda. Berikan region yang mendukung jenis akselerator yang ingin Anda gunakan, misalnya, us-central1 untuk GPU L4.
  • CLUSTER_NAME: nama cluster Anda.

Langkah berikutnya