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:
- Buat cluster GKE Autopilot atau Standard dengan add-on Ray Operator yang diaktifkan.
- Deploy resource RayService yang mendownload dan menayangkan model bahasa besar (LLM) dari Hugging Face.
- 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
Di konsol Google Cloud, mulai instance Cloud Shell:
Buka Cloud ShellGandakan 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`
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. Harus1.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:
Konfigurasi
kubectl
untuk berkomunikasi dengan cluster Anda:gcloud container clusters get-credentials ${CLUSTER_NAME} --location=${COMPUTE_REGION}
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
Men-deploy model:
kubectl apply -f gemma-2b-it/
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.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
Men-deploy model:
kubectl apply -f gemma-7b-it/
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.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
Men-deploy model:
kubectl apply -f llama-2-7b/
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.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
Men-deploy model:
kubectl apply -f llama-3-8b/
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.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
Men-deploy model:
kubectl apply -f mistral-7b/
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.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.
Siapkan penerusan port ke Layanan
gradio
:kubectl port-forward service/gradio 8080:8080 &
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.
Deploy resource RayService:
kubectl apply -f model-multiplexing/
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.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
Siapkan penerusan port ke aplikasi Ray Serve:
kubectl port-forward svc/model-multiplexing-serve-svc 8000:8000
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#"]}
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."]}
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.
Deploy resource RayService:
kubectl apply -f model-composition/
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.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
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}'
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
- Di konsol Google Cloud, buka halaman Manage resource.
- Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
- 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.
Hapus cluster:
gcloud container clusters delete rayserve-cluster
Langkah selanjutnya
- Temukan cara menjalankan beban kerja AI/ML yang dioptimalkan dengan kemampuan orkestrasi platform GKE.
- Melatih model dengan GPU pada mode GKE Standard
- Pelajari cara menggunakan RayServe di GKE, dengan melihat contoh kode di GitHub.