Questa guida mostra come pubblicare modelli linguistici di grandi dimensioni (LLM) utilizzando Ray e il componente aggiuntivo Ray Operator con Google Kubernetes Engine (GKE). Il framework Ray fornisce una piattaforma AI/ML end-to-end per l'addestramento, il fine-tuning e l'inferenza dei carichi di lavoro di machine learning. Ray Serve è un framework di Ray che puoi utilizzare per pubblicare LLM popolari da Hugging Face.
Prima di leggere questa guida, assicurati di conoscere il modello che vuoi pubblicare in questo tutorial. Puoi pubblicare uno dei seguenti modelli:
Questa pagina è rivolta agli ingegneri di machine learning (ML) e agli amministratori e operatori della piattaforma che facilitano i workload ML. Per scoprire di più sui ruoli comuni e sulle attività di esempio a cui facciamo riferimento nei contenuti, consulta Ruoli e attività utente comuni di GKE Enterprise. Trusted Cloud by S3NS
Questa guida illustra i seguenti passaggi:
- Crea un cluster GKE Autopilot o Standard con il componente aggiuntivo Ray Operator abilitato.
- Esegui il deployment di una risorsa RayService che scarica e gestisce un modello linguistico di grandi dimensioni (LLM) da Hugging Face.
- Esegui il deployment di un'interfaccia di chat e di una finestra di dialogo con gli LLM.
Prima di iniziare
Prima di iniziare, assicurati di aver eseguito le seguenti operazioni:
- Attiva l'API Google Kubernetes Engine. Attiva l'API Google Kubernetes Engine
- Se vuoi utilizzare Google Cloud CLI per questa attività,
installala e poi
inizializzala. Se hai già installato gcloud CLI, scarica l'ultima versione eseguendo
gcloud components update
.
- Crea un account Hugging Face, se non ne hai già uno.
- Assicurati di avere un token Hugging Face.
- Assicurati di avere accesso al modello Hugging Face che vuoi utilizzare. In genere viene concesso firmando un contratto e richiedendo l'accesso al proprietario del modello nella pagina del modello Hugging Face.
- Assicurati di disporre di una quota di GPU nella regione
us-central1
. Per saperne di più, consulta Quota GPU.
prepara l'ambiente
Nella console Trusted Cloud , avvia un'istanza Cloud Shell:
Apri Cloud ShellClona il repository di esempio:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git cd kubernetes-engine-samples/ai-ml/gke-ray/rayserve/llm export TUTORIAL_HOME=`pwd`
Imposta le variabili di ambiente predefinite:
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
Sostituisci quanto segue:
PROJECT_ID
: il tuo Trusted Cloud ID progetto.CLUSTER_VERSION
: la versione di GKE da utilizzare. Deve essere1.30.1
o successiva.HUGGING_FACE_TOKEN
: il tuo token di accesso a Hugging Face.
Crea un cluster con un pool di nodi GPU
Puoi gestire un LLM su GPU L4 con Ray in un cluster GKE Autopilot o Standard utilizzando il componente aggiuntivo Operatore Ray. In genere, consigliamo di utilizzare un cluster Autopilot per un'esperienza Kubernetes completamente gestita. Scegli invece un cluster Standard se il tuo caso d'uso richiede un'elevata scalabilità o se vuoi un maggiore controllo sulla configurazione del cluster. Per scegliere la modalità operativa GKE più adatta ai tuoi carichi di lavoro, consulta Scegliere una modalità operativa GKE.
Utilizza Cloud Shell per creare un cluster Autopilot o Standard:
Autopilot
Crea un cluster Autopilot con il componente aggiuntivo Ray Operator abilitato:
gcloud container clusters create-auto rayserve-cluster \
--enable-ray-operator \
--cluster-version=${CLUSTER_VERSION} \
--location=${COMPUTE_REGION}
Standard
Crea un cluster standard con il componente aggiuntivo Ray Operator abilitato:
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
Crea un secret di Kubernetes per le credenziali di Hugging Face
In Cloud Shell, crea un secret di Kubernetes nel seguente modo:
Configura
kubectl
per comunicare con il cluster:gcloud container clusters get-credentials ${CLUSTER_NAME} --location=${COMPUTE_REGION}
Crea un secret di Kubernetes che contenga il token Hugging Face:
kubectl create secret generic hf-secret \ --from-literal=hf_api_token=${HF_TOKEN} \ --dry-run=client -o yaml | kubectl apply -f -
Esegui il deployment del modello LLM
Il repository GitHub che hai clonato ha una directory per ogni modello che include una configurazione RayService. La configurazione per ogni modello include i seguenti componenti:
- Deployment di Ray Serve: il deployment di Ray Serve, che include la configurazione delle risorse e le dipendenze di runtime.
- Modello: l'ID modello Hugging Face.
Cluster Ray: il cluster Ray sottostante e le risorse richieste per ogni componente, inclusi i pod head e worker.
Gemma 2B IT
Esegui il deployment del modello:
kubectl apply -f gemma-2b-it/
Attendi che la risorsa RayService sia pronta:
kubectl get rayservice gemma-2b-it -o yaml
L'output è simile al seguente:
status: activeServiceStatus: applicationStatuses: llm: healthLastUpdateTime: "2024-06-22T02:51:52Z" serveDeploymentStatuses: VLLMDeployment: healthLastUpdateTime: "2024-06-22T02:51:52Z" status: HEALTHY status: RUNNING
In questo output,
status: RUNNING
indica che la risorsa RayService è pronta.Verifica che GKE abbia creato il servizio per l'applicazione Ray Serve:
kubectl get service gemma-2b-it-serve-svc
L'output è simile al seguente:
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
Esegui il deployment del modello:
kubectl apply -f gemma-7b-it/
Attendi che la risorsa RayService sia pronta:
kubectl get rayservice gemma-7b-it -o yaml
L'output è simile al seguente:
status: activeServiceStatus: applicationStatuses: llm: healthLastUpdateTime: "2024-06-22T02:51:52Z" serveDeploymentStatuses: VLLMDeployment: healthLastUpdateTime: "2024-06-22T02:51:52Z" status: HEALTHY status: RUNNING
In questo output,
status: RUNNING
indica che la risorsa RayService è pronta.Verifica che GKE abbia creato il servizio per l'applicazione Ray Serve:
kubectl get service gemma-7b-it-serve-svc
L'output è simile al seguente:
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
Esegui il deployment del modello:
kubectl apply -f llama-2-7b/
Attendi che la risorsa RayService sia pronta:
kubectl get rayservice llama-2-7b -o yaml
L'output è simile al seguente:
status: activeServiceStatus: applicationStatuses: llm: healthLastUpdateTime: "2024-06-22T02:51:52Z" serveDeploymentStatuses: VLLMDeployment: healthLastUpdateTime: "2024-06-22T02:51:52Z" status: HEALTHY status: RUNNING
In questo output,
status: RUNNING
indica che la risorsa RayService è pronta.Verifica che GKE abbia creato il servizio per l'applicazione Ray Serve:
kubectl get service llama-2-7b-serve-svc
L'output è simile al seguente:
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
Esegui il deployment del modello:
kubectl apply -f llama-3-8b/
Attendi che la risorsa RayService sia pronta:
kubectl get rayservice llama-3-8b -o yaml
L'output è simile al seguente:
status: activeServiceStatus: applicationStatuses: llm: healthLastUpdateTime: "2024-06-22T02:51:52Z" serveDeploymentStatuses: VLLMDeployment: healthLastUpdateTime: "2024-06-22T02:51:52Z" status: HEALTHY status: RUNNING
In questo output,
status: RUNNING
indica che la risorsa RayService è pronta.Verifica che GKE abbia creato il servizio per l'applicazione Ray Serve:
kubectl get service llama-3-8b-serve-svc
L'output è simile al seguente:
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
Esegui il deployment del modello:
kubectl apply -f mistral-7b/
Attendi che la risorsa RayService sia pronta:
kubectl get rayservice mistral-7b -o yaml
L'output è simile al seguente:
status: activeServiceStatus: applicationStatuses: llm: healthLastUpdateTime: "2024-06-22T02:51:52Z" serveDeploymentStatuses: VLLMDeployment: healthLastUpdateTime: "2024-06-22T02:51:52Z" status: HEALTHY status: RUNNING
In questo output,
status: RUNNING
indica che la risorsa RayService è pronta.Verifica che GKE abbia creato il servizio per l'applicazione Ray Serve:
kubectl get service mistral-7b-serve-svc
L'output è simile al seguente:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE mistral-7b-serve-svc ClusterIP 34.118.226.104 <none> 8000/TCP 45m
Pubblica il modello
I modelli Llama2 7B e Llama3 8B utilizzano la specifica di chat dell'API OpenAI. Gli altri modelli supportano solo la generazione di testo, una tecnica che genera testo in base a un prompt.
Configurare il port forwarding
Configura il port forwarding al server di inferenza:
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
Interagisci con il modello utilizzando curl
Utilizza curl per chattare con il modello:
Gemma 2B IT
In una nuova sessione del terminale:
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
In una nuova sessione del terminale:
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
In una nuova sessione del terminale:
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
In una nuova sessione del terminale:
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
In una nuova sessione del terminale:
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}'
Poiché i modelli che hai pubblicato non conservano la cronologia, ogni messaggio e risposta deve essere inviato nuovamente al modello per creare un'esperienza di dialogo interattivo. Il seguente esempio mostra come creare una finestra di dialogo interattiva utilizzando il modello Llama 3 8B:
Crea un dialogo con il modello utilizzando 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
}'
L'output è simile al seguente:
{
"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
}
}
(Facoltativo) Connettersi all'interfaccia di chat
Puoi utilizzare Gradio per creare applicazioni web che ti consentono di interagire con il tuo modello. Gradio è una libreria Python che include un wrapper ChatInterface
che
crea interfacce utente per chatbot. Per Llama 2 7B e Llama 3 7B, hai
installato Gradio durante il deployment del modello LLM.
Configura il port forwarding per il servizio
gradio
:kubectl port-forward service/gradio 8080:8080 &
Apri http://localhost:8080 nel browser per chattare con il modello.
Pubblicare più modelli con il multiplexing dei modelli
Il multiplexing dei modelli è una tecnica utilizzata per pubblicare più modelli all'interno dello stesso cluster Ray. Puoi instradare il traffico a modelli specifici utilizzando le intestazioni delle richieste o il bilanciamento del carico.
In questo esempio, crei un'applicazione Ray Serve multiplexata composta da due modelli: Gemma 7B IT e Llama 3 8B.
Esegui il deployment della risorsa RayService:
kubectl apply -f model-multiplexing/
Attendi che la risorsa RayService sia pronta:
kubectl get rayservice model-multiplexing -o yaml
L'output è simile al seguente:
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
In questo output,
status: RUNNING
indica che la risorsa RayService è pronta.Verifica che GKE abbia creato il servizio Kubernetes per l'applicazione Ray Serve:
kubectl get service model-multiplexing-serve-svc
L'output è simile al seguente:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE model-multiplexing-serve-svc ClusterIP 34.118.226.104 <none> 8000/TCP 45m
Configura il port forwarding per l'applicazione Ray Serve:
kubectl port-forward svc/model-multiplexing-serve-svc 8000:8000
Invia una richiesta al modello Gemma 7B IT:
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}'
L'output è simile al seguente:
{"text": ["What are the top 5 most popular programming languages? Please be brief.\n\n1. JavaScript\n2. Java\n3. C++\n4. Python\n5. C#"]}
Invia una richiesta al modello 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}'
L'output è simile al seguente:
{"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."]}
Invia una richiesta a un modello casuale escludendo l'intestazione
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}'
L'output è uno degli output dei passaggi precedenti.
Comporre più modelli con la composizione dei modelli
La composizione del modello è una tecnica utilizzata per comporre più modelli in un'unica applicazione. La composizione dei modelli consente di concatenare input e output in più LLM e scalare i modelli come una singola applicazione.
In questo esempio, componi due modelli, Gemma 7B IT e Llama 3 8B, in un'unica applicazione. Il primo modello è il modello dell'assistente che risponde alle domande fornite nel prompt. Il secondo modello è il modello di riepilogo. L'output del modello di assistente viene concatenato all'input del modello di riepilogo. Il risultato finale è la versione riassunta della risposta del modello di assistente.
Esegui il deployment della risorsa RayService:
kubectl apply -f model-composition/
Attendi che la risorsa RayService sia pronta:
kubectl get rayservice model-composition -o yaml
L'output è simile al seguente:
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
In questo output,
status: RUNNING
indica che la risorsa RayService è pronta.Conferma che GKE ha creato il servizio per l'applicazione Ray Serve:
kubectl get service model-composition-serve-svc
L'output è simile al seguente:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE model-composition-serve-svc ClusterIP 34.118.226.104 <none> 8000/TCP 45m
Invia una richiesta al modello:
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}'
L'output è simile al seguente:
{"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."]}
Elimina il progetto
- In the Trusted Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Elimina le singole risorse
Se hai utilizzato un progetto esistente e non vuoi eliminarlo, puoi eliminare le singole risorse.
Elimina il cluster:
gcloud container clusters delete rayserve-cluster
Passaggi successivi
- Scopri come eseguire carichi di lavoro di AI/ML ottimizzati con le funzionalità di orchestrazione della piattaforma GKE.
- Addestra un modello con GPU in modalità GKE Standard
- Scopri come utilizzare RayServe su GKE visualizzando il codice di esempio su GitHub.