Menyajikan LLM di GPU L4 dengan Ray


Panduan ini menunjukkan cara menayangkan model bahasa besar (LLM) menggunakan Ray dan add-on Ray Operator dengan Google Kubernetes Engine (GKE).

Dalam panduan ini, Anda dapat menayangkan salah satu model berikut:

Panduan ini juga membahas teknik penayangan model seperti multipleksing model dan komposisi model yang didukung oleh framework Ray Serve.

Latar belakang

Framework Ray menyediakan platform AI/ML menyeluruh untuk pelatihan, pelatihan lanjutan, dan inferensi beban kerja machine learning. Ray Serve adalah framework di Ray yang dapat Anda gunakan untuk menayangkan LLM populer dari Hugging Face.

Bergantung pada format data model, jumlah GPU bervariasi. Dalam panduan ini, model Anda dapat menggunakan satu atau dua GPU L4.

Panduan ini membahas langkah-langkah berikut:

  1. Buat cluster GKE Autopilot atau Standard dengan add-on Ray Operator yang diaktifkan.
  2. Deploy resource RayService yang mendownload dan menayangkan model bahasa besar (LLM) dari Hugging Face.
  3. Men-deploy antarmuka dan dialog chat dengan LLM.

Sebelum memulai

Sebelum memulai, pastikan Anda telah menjalankan tugas berikut:

  • Aktifkan Google Kubernetes Engine API.
  • Aktifkan Google Kubernetes Engine API
  • Jika ingin menggunakan Google Cloud CLI untuk tugas ini, instal lalu lakukan inisialisasi gcloud CLI. Jika sebelumnya Anda telah menginstal gcloud CLI, dapatkan versi terbaru dengan menjalankan gcloud components update.
  • Buat akun Hugging Face, jika Anda belum memilikinya.
  • Pastikan Anda memiliki token Hugging Face.
  • Pastikan Anda memiliki akses ke model Hugging Face yang ingin digunakan. Hal ini biasanya diberikan dengan menandatangani perjanjian dan meminta akses dari pemilik model di halaman model Hugging Face.
  • Pastikan Anda memiliki kuota GPU di region us-central1. Untuk mempelajari lebih lanjut, lihat Kuota GPU.

Menyiapkan lingkungan Anda

  1. Di konsol Google Cloud, mulai instance Cloud Shell:
    Buka Cloud Shell

  2. Gandakan repositori sampel

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
    cd kubernetes-engine-samples/ai-ml/gke-ray/rayserve/llm
    export TUTORIAL_HOME=`pwd`
    
  3. Tetapkan variabel lingkungan default:

    gcloud config set project PROJECT_ID
    export PROJECT_ID=$(gcloud config get project)
    export COMPUTE_REGION=us-central1
    export CLUSTER_VERSION=CLUSTER_VERSION
    export HF_TOKEN=HUGGING_FACE_TOKEN
    

    Ganti kode berikut:

    • PROJECT_ID: project ID Google Cloud Anda.
    • CLUSTER_VERSION: versi GKE yang akan digunakan. Harus 1.30.1 atau yang lebih baru.
    • HUGGING_FACE_TOKEN: token akses Hugging Face Anda.

Membuat cluster dengan node pool GPU

Anda dapat menayangkan LLM di GPU L4 dengan Ray di cluster GKE Autopilot atau Standard menggunakan add-on Ray Operator. Secara umum, sebaiknya gunakan cluster Autopilot untuk pengalaman Kubernetes yang dikelola sepenuhnya. Pilih cluster Standar jika kasus penggunaan Anda memerlukan skalabilitas tinggi atau jika Anda ingin lebih mengontrol konfigurasi cluster. Untuk memilih mode operasi GKE yang paling sesuai untuk workload Anda, lihat Memilih mode operasi GKE.

Gunakan Cloud Shell untuk membuat cluster Autopilot atau Standard:

Autopilot

Buat cluster Autopilot dengan add-on Ray Operator yang diaktifkan:

gcloud container clusters create-auto rayserve-cluster \
    --enable-ray-operator \
    --cluster-version=${CLUSTER_VERSION} \
    --location=${COMPUTE_REGION}

Standard

Buat cluster Standard dengan add-on Ray Operator yang diaktifkan:

gcloud container clusters create rayserve-cluster \
    --addons=RayOperator \
    --cluster-version=${CLUSTER_VERSION} \
    --machine-type=g2-standard-24 \
    --location=${COMPUTE_ZONE} \
    --num-nodes=2 \
    --accelerator type=nvidia-l4,count=2,gpu-driver-version=latest

Membuat Secret Kubernetes untuk kredensial Hugging Face

Di Cloud Shell, buat Secret Kubernetes dengan melakukan hal berikut:

  1. Konfigurasi kubectl untuk berkomunikasi dengan cluster Anda:

    gcloud container clusters get-credentials ${CLUSTER_NAME} --location=${COMPUTE_REGION}
    
  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 -
    

Men-deploy model LLM

Repositori GitHub yang Anda clone memiliki direktori untuk setiap model yang mencakup konfigurasi RayService. Konfigurasi untuk setiap model mencakup komponen berikut:

  • Deployment Ray Serve: Deployment Ray Serve, yang mencakup konfigurasi resource dan dependensi runtime.
  • Model: ID model Hugging Face.
  • Cluster Ray: Cluster Ray yang mendasari dan resource yang diperlukan untuk setiap komponen, yang mencakup Pod head dan pekerja.

Gemma 2B IT

  1. Men-deploy model:

    kubectl apply -f gemma-2b-it/
    
  2. Tunggu hingga resource RayService siap:

    kubectl get rayservice gemma-2b-it -o yaml
    

    Outputnya mirip dengan hal berikut ini:

    status:
      activeServiceStatus:
        applicationStatuses:
          llm:
            healthLastUpdateTime: "2024-06-22T02:51:52Z"
            serveDeploymentStatuses:
              VLLMDeployment:
                healthLastUpdateTime: "2024-06-22T02:51:52Z"
                status: HEALTHY
            status: RUNNING
    

    Dalam output ini, status: RUNNING menunjukkan bahwa resource RayService sudah siap.

  3. Pastikan GKE membuat Layanan untuk aplikasi Ray Serve:

    kubectl get service gemma-2b-it-serve-svc
    

    Outputnya mirip dengan hal berikut ini:

    NAME                    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
    gemma-2b-it-serve-svc   ClusterIP   34.118.226.104   <none>        8000/TCP   45m
    

Gemma 7B IT

  1. Men-deploy model:

    kubectl apply -f gemma-7b-it/
    
  2. Tunggu hingga resource RayService siap:

    kubectl get rayservice gemma-7b-it -o yaml
    

    Outputnya mirip dengan hal berikut ini:

    status:
      activeServiceStatus:
        applicationStatuses:
          llm:
            healthLastUpdateTime: "2024-06-22T02:51:52Z"
            serveDeploymentStatuses:
              VLLMDeployment:
                healthLastUpdateTime: "2024-06-22T02:51:52Z"
                status: HEALTHY
            status: RUNNING
    

    Dalam output ini, status: RUNNING menunjukkan bahwa resource RayService sudah siap.

  3. Pastikan GKE membuat Layanan untuk aplikasi Ray Serve:

    kubectl get service gemma-7b-it-serve-svc
    

    Outputnya mirip dengan hal berikut ini:

    NAME                    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
    gemma-7b-it-serve-svc   ClusterIP   34.118.226.104   <none>        8000/TCP   45m
    

Llama 2 7B

  1. Men-deploy model:

    kubectl apply -f llama-2-7b/
    
  2. Tunggu hingga resource RayService siap:

    kubectl get rayservice llama-2-7b -o yaml
    

    Outputnya mirip dengan hal berikut ini:

    status:
      activeServiceStatus:
        applicationStatuses:
          llm:
            healthLastUpdateTime: "2024-06-22T02:51:52Z"
            serveDeploymentStatuses:
              VLLMDeployment:
                healthLastUpdateTime: "2024-06-22T02:51:52Z"
                status: HEALTHY
            status: RUNNING
    

    Dalam output ini, status: RUNNING menunjukkan bahwa resource RayService sudah siap.

  3. Pastikan GKE membuat Layanan untuk aplikasi Ray Serve:

    kubectl get service llama-2-7b-serve-svc
    

    Outputnya mirip dengan hal berikut ini:

    NAME                    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
    llama-2-7b-serve-svc    ClusterIP   34.118.226.104   <none>        8000/TCP   45m
    

Llama 3 8B

  1. Men-deploy model:

    kubectl apply -f llama-3-8b/
    
  2. Tunggu hingga resource RayService siap:

    kubectl get rayservice llama-3-8b -o yaml
    

    Outputnya mirip dengan hal berikut ini:

    status:
      activeServiceStatus:
        applicationStatuses:
          llm:
            healthLastUpdateTime: "2024-06-22T02:51:52Z"
            serveDeploymentStatuses:
              VLLMDeployment:
                healthLastUpdateTime: "2024-06-22T02:51:52Z"
                status: HEALTHY
            status: RUNNING
    

    Dalam output ini, status: RUNNING menunjukkan bahwa resource RayService sudah siap.

  3. Pastikan GKE membuat Layanan untuk aplikasi Ray Serve:

    kubectl get service llama-3-8b-serve-svc
    

    Outputnya mirip dengan hal berikut ini:

    NAME                    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
    llama-3-8b-serve-svc    ClusterIP   34.118.226.104   <none>        8000/TCP   45m
    

Mistral 7B

  1. Men-deploy model:

    kubectl apply -f mistral-7b/
    
  2. Tunggu hingga resource RayService siap:

    kubectl get rayservice mistral-7b -o yaml
    

    Outputnya mirip dengan hal berikut ini:

    status:
      activeServiceStatus:
        applicationStatuses:
          llm:
            healthLastUpdateTime: "2024-06-22T02:51:52Z"
            serveDeploymentStatuses:
              VLLMDeployment:
                healthLastUpdateTime: "2024-06-22T02:51:52Z"
                status: HEALTHY
            status: RUNNING
    

    Dalam output ini, status: RUNNING menunjukkan bahwa resource RayService sudah siap.

  3. Pastikan GKE membuat Layanan untuk aplikasi Ray Serve:

    kubectl get service mistral-7b-serve-svc
    

    Outputnya mirip dengan hal berikut ini:

    NAME                    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
    mistral-7b-serve-svc    ClusterIP   34.118.226.104   <none>        8000/TCP   45m
    

Menayangkan model

Model Llama2 7B dan Llama3 8B menggunakan spesifikasi chat OpenAI API. Model lainnya hanya mendukung pembuatan teks, yang merupakan teknik yang membuat teks berdasarkan perintah.

Menyiapkan penerusan port

Siapkan penerusan port ke server inferensi:

Gemma 2B IT

kubectl port-forward svc/gemma-2b-it-serve-svc 8000:8000

Gemma 7B IT

kubectl port-forward svc/gemma-7b-it-serve-svc 8000:8000

Llama2 7B

kubectl port-forward svc/llama-7b-serve-svc 8000:8000

Llama 3 8B

kubectl port-forward svc/llama-3-8b-serve-svc 8000:8000

Mistral 7B

kubectl port-forward svc/mistral-7b-serve-svc 8000:8000

Berinteraksi dengan model menggunakan curl

Gunakan curl untuk melakukan chat dengan model Anda:

Gemma 2B IT

Dalam sesi terminal baru:

curl -X POST http://localhost:8000/ -H "Content-Type: application/json" -d '{"prompt": "What are the top 5 most popular programming languages? Be brief.", "max_tokens": 1024}'

Gemma 7B IT

Dalam sesi terminal baru:

curl -X POST http://localhost:8000/ -H "Content-Type: application/json" -d '{"prompt": "What are the top 5 most popular programming languages? Be brief.", "max_tokens": 1024}'

Llama2 7B

Dalam sesi terminal baru:

curl http://localhost:8000/v1/chat/completions     -H "Content-Type: application/json"     -d '{
      "model": "meta-llama/Llama-2-7b-chat-hf",
      "messages": [
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "What are the top 5 most popular programming languages? Please be brief."}
      ],
      "temperature": 0.7
    }'

Llama 3 8B

Dalam sesi terminal baru:

curl http://localhost:8000/v1/chat/completions     -H "Content-Type: application/json"     -d '{
      "model": "meta-llama/Meta-Llama-3-8B-Instruct",
      "messages": [
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "What are the top 5 most popular programming languages? Please be brief."}
      ],
      "temperature": 0.7
    }'

Mistral 7B

Dalam sesi terminal baru:

curl -X POST http://localhost:8000/ -H "Content-Type: application/json" -d '{"prompt": "What are the top 5 most popular programming languages? Be brief.", "max_tokens": 1024}'

Karena model yang Anda tayangkan tidak menyimpan histori apa pun, setiap pesan dan balasan harus dikirim kembali ke model untuk menciptakan pengalaman dialog interaktif. Contoh berikut menunjukkan cara membuat dialog interaktif menggunakan model Llama 3 8B:

Buat dialog dengan model menggunakan curl:

curl http://localhost:8000/v1/chat/completions \
    -H "Content-Type: application/json" \
    -d '{
      "model": "meta-llama/Meta-Llama-3-8B-Instruct",
      "messages": [
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "What are the top 5 most popular programming languages? Please be brief."},
        {"role": "assistant", "content": " \n1. Java\n2. Python\n3. C++\n4. C#\n5. JavaScript"},
        {"role": "user", "content": "Can you give me a brief description?"}
      ],
      "temperature": 0.7
}'

Outputnya mirip dengan hal berikut ini:

{
  "id": "cmpl-3cb18c16406644d291e93fff65d16e41",
  "object": "chat.completion",
  "created": 1719035491,
  "model": "meta-llama/Meta-Llama-3-8B-Instruct",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "Here's a brief description of each:\n\n1. **Java**: A versatile language for building enterprise-level applications, Android apps, and web applications.\n2. **Python**: A popular language for data science, machine learning, web development, and scripting, known for its simplicity and ease of use.\n3. **C++**: A high-performance language for building operating systems, games, and other high-performance applications, with a focus on efficiency and control.\n4. **C#**: A modern, object-oriented language for building Windows desktop and mobile applications, as well as web applications using .NET.\n5. **JavaScript**: A versatile language for client-side scripting on the web, commonly used for creating interactive web pages, web applications, and mobile apps.\n\nNote: These descriptions are brief and don't do justice to the full capabilities and uses of each language."
      },
      "logprobs": null,
      "finish_reason": "stop",
      "stop_reason": null
    }
  ],
  "usage": {
    "prompt_tokens": 73,
    "total_tokens": 245,
    "completion_tokens": 172
  }
}

(Opsional) Menghubungkan ke antarmuka chat

Anda dapat menggunakan Gradio untuk mem-build aplikasi web yang memungkinkan Anda berinteraksi dengan model. Gradio adalah library Python yang memiliki wrapper ChatInterface yang membuat antarmuka pengguna untuk chatbot. Untuk Llama 2 7B dan Llama 3 7B, Anda menginstal Gradio saat men-deploy model LLM.

  1. Siapkan penerusan port ke Layanan gradio:

    kubectl port-forward service/gradio 8080:8080 &
    
  2. Buka http://localhost:8080 di browser Anda untuk melakukan chat dengan model.

Menayangkan beberapa model dengan multiplexing model

Multipleks model adalah teknik yang digunakan untuk menayangkan beberapa model dalam cluster Ray yang sama. Anda dapat merutekan traffic ke model tertentu menggunakan header permintaan atau dengan load balancing.

Dalam contoh ini, Anda membuat aplikasi Ray Serve multipleks yang terdiri dari dua model: Gemma 7B IT dan Llama 3 8B.

  1. Deploy resource RayService:

    kubectl apply -f model-multiplexing/
    
  2. Tunggu hingga resource RayService siap:

    kubectl get rayservice model-multiplexing -o yaml
    

    Outputnya mirip dengan yang berikut ini:

    status:
      activeServiceStatus:
        applicationStatuses:
          llm:
            healthLastUpdateTime: "2024-06-22T14:00:41Z"
            serveDeploymentStatuses:
              MutliModelDeployment:
                healthLastUpdateTime: "2024-06-22T14:00:41Z"
                status: HEALTHY
              VLLMDeployment:
                healthLastUpdateTime: "2024-06-22T14:00:41Z"
                status: HEALTHY
              VLLMDeployment_1:
                healthLastUpdateTime: "2024-06-22T14:00:41Z"
                status: HEALTHY
            status: RUNNING
    

    Dalam output ini, status: RUNNING menunjukkan bahwa resource RayService sudah siap.

  3. Pastikan GKE membuat Layanan Kubernetes untuk aplikasi Ray Serve:

    kubectl get service model-multiplexing-serve-svc
    

    Outputnya mirip dengan hal berikut ini:

    NAME                           TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
    model-multiplexing-serve-svc   ClusterIP   34.118.226.104   <none>        8000/TCP   45m
    
  4. Siapkan penerusan port ke aplikasi Ray Serve:

    kubectl port-forward svc/model-multiplexing-serve-svc 8000:8000
    
  5. Kirim permintaan ke model IT Gemma 7B:

    curl -X POST http://localhost:8000/ -H "Content-Type: application/json" --header "serve_multiplexed_model_id: google/gemma-7b-it" -d '{"prompt": "What are the top 5 most popular programming languages? Please be brief.", "max_tokens": 200}'
    

    Outputnya mirip dengan hal berikut ini:

    {"text": ["What are the top 5 most popular programming languages? Please be brief.\n\n1. JavaScript\n2. Java\n3. C++\n4. Python\n5. C#"]}
    
  6. Kirim permintaan ke model Llama 3 8B:

    curl -X POST http://localhost:8000/ -H "Content-Type: application/json" --header "serve_multiplexed_model_id: meta-llama/Meta-Llama-3-8B-Instruct" -d '{"prompt": "What are the top 5 most popular programming languages? Please be brief.", "max_tokens": 200}'
    

    Outputnya mirip dengan hal berikut ini:

    {"text": ["What are the top 5 most popular programming languages? Please be brief. Here are your top 5 most popular programming languages, based on the TIOBE Index, a widely used measure of the popularity of programming languages.\r\n\r\n1. **Java**: Used in Android app development, web development, and enterprise software development.\r\n2. **Python**: A versatile language used in data science, machine learning, web development, and automation.\r\n3. **C++**: A high-performance language used in game development, system programming, and high-performance computing.\r\n4. **C#**: Used in Windows and web application development, game development, and enterprise software development.\r\n5. **JavaScript**: Used in web development, mobile app development, and server-side programming with technologies like Node.js.\r\n\r\nSource: TIOBE Index (2022).\r\n\r\nThese rankings can vary depending on the source and methodology used, but this gives you a general idea of the most popular programming languages."]}
    
  7. Kirim permintaan ke model acak dengan mengecualikan header serve_multiplexed_model_id:

    curl -X POST http://localhost:8000/ -H "Content-Type: application/json" -d '{"prompt": "What are the top 5 most popular programming languages? Please be brief.", "max_tokens": 200}'
    

    Output ini adalah salah satu output dari langkah sebelumnya.

Membuat beberapa model dengan komposisi model

Komposisi model adalah teknik yang digunakan untuk menyusun beberapa model menjadi satu aplikasi. Komposisi model memungkinkan Anda merantai input dan output di beberapa LLM dan menskalakan model sebagai satu aplikasi.

Dalam contoh ini, Anda akan menulis dua model, Gemma 7B IT dan Llama 3 8B, ke dalam satu aplikasi. Model pertama adalah model asisten yang menjawab pertanyaan yang diberikan dalam perintah. Model kedua adalah model ringkasan. Output model asisten dirantai ke input model peringkas. Hasil akhirnya adalah versi ringkasan respons dari model asisten.

  1. Deploy resource RayService:

    kubectl apply -f model-composition/
    
  2. Tunggu hingga resource RayService siap:

    kubectl get rayservice model-composition -o yaml
    

    Outputnya mirip dengan yang berikut ini:

    status:
      activeServiceStatus:
        applicationStatuses:
          llm:
            healthLastUpdateTime: "2024-06-22T14:00:41Z"
            serveDeploymentStatuses:
              MutliModelDeployment:
                healthLastUpdateTime: "2024-06-22T14:00:41Z"
                status: HEALTHY
              VLLMDeployment:
                healthLastUpdateTime: "2024-06-22T14:00:41Z"
                status: HEALTHY
              VLLMDeployment_1:
                healthLastUpdateTime: "2024-06-22T14:00:41Z"
                status: HEALTHY
            status: RUNNING
    

    Dalam output ini, status: RUNNING menunjukkan bahwa resource RayService sudah siap.

  3. Pastikan GKE membuat Layanan untuk aplikasi Ray Serve:

    kubectl get service model-composition-serve-svc
    

    Outputnya mirip dengan hal berikut ini:

    NAME                           TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
    model-composition-serve-svc    ClusterIP   34.118.226.104   <none>        8000/TCP   45m
    
  4. Kirim permintaan ke model:

    curl -X POST http://localhost:8000/ -H "Content-Type: application/json" -d '{"prompt": "What is the most popular programming language for machine learning and why?", "max_tokens": 1000}'
    
  5. Outputnya mirip dengan hal berikut ini:

    {"text": ["\n\n**Sure, here is a summary in a single sentence:**\n\nThe most popular programming language for machine learning is Python due to its ease of use, extensive libraries, and growing community."]}
    

Menghapus project

  1. Di konsol Google Cloud, buka halaman Manage resource.

    Buka Manage resource

  2. Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.

Menghapus resource satu per satu

Jika Anda telah menggunakan project yang sudah ada dan tidak ingin menghapusnya, Anda dapat menghapus resource individual tersebut.

  1. Hapus cluster:

    gcloud container clusters delete rayserve-cluster
    

Langkah selanjutnya