Menyajikan model open source menggunakan TPU di GKE dengan Optimum TPU


Tutorial ini menunjukkan cara menyajikan model open source model bahasa besar (LLM), menggunakan Tensor Processing Unit (TPU) di Google Kubernetes Engine (GKE) dengan Optimum TPU penayangan dari Hugging Face. Dalam tutorial ini, Anda akan mendownload model open source dari Hugging Face dan men-deploy model tersebut di GKE Standard menggunakan container yang menjalankan Optimum TPU.

Panduan ini merupakan titik awal jika Anda memerlukan kontrol terperinci, skalabilitas, ketahanan, portabilitas, dan efektivitas biaya Kubernetes terkelola saat untuk men-deploy dan melayani workload AI/ML Anda.

Tutorial ini ditujukan untuk pelanggan AI Generatif dalam ekosistem Wajah Memeluk, baik model baru atau pengguna GKE, ML Engineer, engineer MLOps (DevOps) lama, atau administrator platform yang tertarik menggunakan container Kubernetes kemampuan orkestrasi untuk menginferensi LLM.

Sebagai pengingat, Anda memiliki beberapa opsi untuk inferensi LLM di Google Cloud yang mencakup penawaran seperti Vertex AI, GKE, dan Google Compute Engine. Di sini, Anda dapat menggabungkan library layanan seperti JetStream, vLLM, dan penawaran partner lainnya. Misalnya, Anda dapat menggunakan JetStream untuk mendapatkan pengoptimalan terbaru dari project. Jika lebih memilih opsi Wajah Memeluk, Anda dapat menggunakan Optimum TPU.

Optimum TPU mendukung fitur berikut:

  • Pengelompokan berkelanjutan
  • Streaming token
  • Greedy search dan pengambilan sampel multinomial menggunakan transformator.

Tujuan

  1. Menyiapkan cluster GKE Standar dengan topologi TPU yang direkomendasikan berdasarkan karakteristik model.
  2. Men-deploy Optimum TPU di GKE.
  3. Gunakan Optimum TPU untuk menayangkan model yang didukung melalui curl.

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.
  • Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  • Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  • Aktifkan API yang diperlukan.

    Mengaktifkan API

  • Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  • Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  • Aktifkan API yang diperlukan.

    Mengaktifkan API

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

    Memeriksa peran

    1. Di konsol Google Cloud, buka halaman IAM.

      Buka IAM
    2. Pilih project.
    3. Di kolom Akun utama, cari baris yang berisi alamat email Anda.

      Jika alamat email Anda tidak ada di kolom tersebut, berarti Anda tidak memiliki peran apa pun.

    4. Di kolom Peran untuk baris yang berisi alamat email Anda, periksa apakah daftar peran menyertakan peran yang diperlukan.

    Memberikan peran

    1. Di konsol Google Cloud, buka halaman IAM.

      Buka IAM
    2. Pilih project.
    3. Klik Berikan akses.
    4. Di kolom Akun utama baru, masukkan alamat email Anda.
    5. Di daftar Pilih peran, pilih peran.
    6. Untuk memberikan peran tambahan, klik Tambahkan peran lain, lalu tambahkan setiap peran tambahan.
    7. Klik Simpan.

Menyiapkan lingkungan

Dalam tutorial ini, Anda akan menggunakan Cloud Shell untuk mengelola resource yang dihosting di Google Cloud. Cloud Shell telah dilengkapi dengan software yang 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 Konsol Google 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 CLUSTER_NAME=CLUSTER_NAME
    export REGION=REGION_NAME
    export ZONE=ZONE
    

    Ganti nilai berikut:

    • PROJECT_ID: project ID Google Cloud Anda.
    • CLUSTER_NAME: nama cluster GKE Anda.
    • REGION_NAME: region tempat GKE Anda ada cluster, bucket Cloud Storage, dan TPU node. Wilayah berisi zona tempat jenis mesin TPU v5e tersedia (misalnya, us-west1, us-west4, us-central1, us-east1, us-east5, atau europe-west4).
    • (Khusus cluster standar) ZONE: zona tempat resource TPU tersedia (misalnya, us-west4-a). Untuk cluster Autopilot, Anda tidak perlu menentukan zona, hanya region.
  3. Buat clone repositori TPU Optimum:

    git clone https://github.com/huggingface/optimum-tpu.git
    

Mendapatkan akses ke model

Anda dapat menggunakan model Gemma 2B atau Llama3 8B. Tutorial ini berfokus pada kedua model tersebut, tetapi Optimum TPU mendukung lebih banyak model.

Gemma 2 M

Guna mendapatkan akses ke model Gemma untuk di-deploy ke GKE, Anda harus menandatangani perjanjian izin lisensi terlebih dahulu, lalu membuat Token akses Wajah memeluk.

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

  1. Akses halaman izin model.
  2. Verifikasi izin menggunakan akun Wajah Memeluk Anda.
  3. Setujui persyaratan model.

Membuat token akses

Buat token Wajah Memeluk baru jika belum memilikinya:

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

Llama3 8 M

Anda harus menandatangani perjanjian izin untuk menggunakan Llama3 8b di Hugging Face Repo

Membuat token akses

Buat token Wajah Memeluk baru jika belum memilikinya:

  1. Klik Profil Anda > Pengaturan > Token Akses.
  2. Pilih New Token.
  3. Tentukan Nama pilihan Anda dan Peran minimal Read.
  4. Pilih Buat token.
  5. Salin token yang dihasilkan ke papan klip.

Membuat cluster GKE

Buat cluster GKE Standar dengan 1 node CPU:

gcloud container create CLUSTER_NAME \
    --project=PROJECT_ID \
    --num-nodes=1 \
    --location=ZONE

Membuat node pool TPU

Buat kumpulan node TPU v5e dengan 1 node dan 8 chip:

gcloud container node-pools create tpunodepool \
    --location=ZONE \
    --num-nodes=1 \
    --machine-type=ct5lp-hightpu-8t \
    --cluster=CLUSTER_NAME

Konfigurasikan kubectl untuk berkomunikasi dengan cluster Anda:

gcloud container clusters get-credentials ${CLUSTER_NAME} --location=${REGION}

Buat container

Menjalankan perintah make untuk membuat image

cd optimum-tpu && make tpu-tgi

Mengirim image ke Artifact Registry

gcloud artifacts repositories create optimum-tpu --repository-format=docker --location=REGION_NAME && \
gcloud auth configure-docker REGION_NAME-docker.pkg.dev && \
docker image tag huggingface/optimum-tpu REGION_NAME-docker.pkg.dev/PROJECT_ID/optimum-tpu/tgi-tpu:latest && \
docker push REGION_NAME-docker.pkg.dev/PROJECT_ID/optimum-tpu/tgi-tpu:latest

Membuat Rahasia Kubernetes untuk kredensial Memeluk Wajah

Buat Rahasia Kubernetes yang berisi token Wajah Memeluk:

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

Men-deploy TPU Optimum

Deploy TPU Optimum:

Gemma 2 M

  1. Simpan manifes berikut sebagai optimum-tpu-gemma-2b-2x4.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: tgi-tpu
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: tgi-tpu
      template:
        metadata:
          labels:
            app: tgi-tpu
        spec:
          nodeSelector:
            cloud.google.com/gke-tpu-topology: 2x4
            cloud.google.com/gke-tpu-accelerator: tpu-v5-lite-podslice
          containers:
          - name: tgi-tpu
            image: REGION_NAME-docker.pkg.dev/PROJECT_ID/optimum-tpu/tgi-tpu:latest
            args:
            - --model-id=google/gemma-2b
            - --max-concurrent-requests=4
            - --max-input-length=32
            - --max-total-tokens=64
            - --max-batch-size=1
            securityContext:
                privileged: true
            env:
              - name: HF_TOKEN
                valueFrom:
                  secretKeyRef:
                    name: hf-secret
                    key: hf_api_token
            ports:
            - containerPort: 80
            resources:
              limits:
                google.com/tpu: 8
            livenessProbe:
              httpGet:
                path: /health
                port: 80
              initialDelaySeconds: 300
              periodSeconds: 120
    
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: service
    spec:
      selector:
        app: tgi-tpu
      ports:
        - name: http
          protocol: TCP
          port: 8080
          targetPort: 80
    

    Manifes ini menjelaskan deployment TPU Optimum dengan load balancer internal pada port TCP 8080.

  2. Menerapkan manifes

    kubectl apply -f optimum-tpu-gemma-2b-2x4.yaml
    

Llama3 8 M

  1. Simpan manifes berikut sebagai optimum-tpu-llama3-8b-2x4.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: tgi-tpu
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: tgi-tpu
      template:
        metadata:
          labels:
            app: tgi-tpu
        spec:
          nodeSelector:
            cloud.google.com/gke-tpu-topology: 2x4
            cloud.google.com/gke-tpu-accelerator: tpu-v5-lite-podslice
          containers:
          - name: tgi-tpu
            image: REGION_NAME-docker.pkg.dev/PROJECT_ID/optimum-tpu/tgi-tpu:latest
            args:
            - --model-id=meta-llama/Meta-Llama-3-8B
            - --max-concurrent-requests=4
            - --max-input-length=32
            - --max-total-tokens=64
            - --max-batch-size=1
            env:
              - name: HF_TOKEN
                valueFrom:
                  secretKeyRef:
                    name: hf-secret
                    key: hf_api_token
            ports:
            - containerPort: 80
            resources:
              limits:
                google.com/tpu: 8
            livenessProbe:
              httpGet:
                path: /health
                port: 80
              initialDelaySeconds: 300
              periodSeconds: 120
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: service
    spec:
      selector:
        app: tgi-tpu
      ports:
        - name: http
          protocol: TCP
          port: 8080
          targetPort: 80
    

    Manifes ini menjelaskan deployment TPU Optimum dengan load balancer internal pada port TCP 8080.

  2. Menerapkan manifes

    kubectl apply -f optimum-tpu-llama3-8b-2x4.yaml
    

Lihat log dari Deployment yang berjalan:

kubectl logs -f -l app=tgi-tpu

Outputnya akan mirip dengan berikut ini:

2024-07-09T22:39:34.365472Z  WARN text_generation_router: router/src/main.rs:295: no pipeline tag found for model google/gemma-2b
2024-07-09T22:40:47.851405Z  INFO text_generation_router: router/src/main.rs:314: Warming up model
2024-07-09T22:40:54.559269Z  INFO text_generation_router: router/src/main.rs:351: Setting max batch total tokens to 64
2024-07-09T22:40:54.559291Z  INFO text_generation_router: router/src/main.rs:352: Connected
2024-07-09T22:40:54.559295Z  WARN text_generation_router: router/src/main.rs:366: Invalid hostname, defaulting to 0.0.0.0

Pastikan model telah didownload sepenuhnya sebelum melanjutkan ke bagian berikutnya.

Menyajikan model

Siapkan penerusan port ke model:

kubectl port-forward svc/service 8080:8080

Berinteraksi dengan server model menggunakan curl

Verifikasi model yang di-deploy:

Dalam sesi terminal baru, gunakan curl untuk melakukan chat dengan model:

curl 127.0.0.1:8080/generate     -X POST     -d '{"inputs":"What is Deep Learning?","parameters":{"max_new_tokens":40}}'     -H 'Content-Type: application/json'

Outputnya akan mirip dengan berikut ini:

{"generated_text":"\n\nDeep learning is a subset of machine learning that uses artificial neural networks to learn from data.\n\nArtificial neural networks are inspired by the way the human brain works. They are made up of multiple layers"}

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 ke akun Google Cloud Anda untuk resource yang Anda buat dalam panduan ini, jalankan perintah berikut:

gcloud container clusters delete CLUSTER_NAME \
  --location=ZONE

Langkah selanjutnya