Questo tutorial mostra come eseguire un modello linguistico di grandi dimensioni (LLM) in una pipeline Dataflow di streaming utilizzando l'API RunInference di Apache Beam.
Per saperne di più sull'API RunInference, consulta la sezione Informazioni su Beam ML nella documentazione di Apache Beam.
Il codice di esempio è disponibile su GitHub.
Obiettivi
- Crea argomenti e sottoscrizioni Pub/Sub per l'input e le risposte del modello.
- Carica il modello in Cloud Storage utilizzando un job personalizzato di Vertex AI.
- Esegui la pipeline.
- Fai una domanda al modello e ricevi una risposta.
Costi
In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:
Per generare una stima dei costi in base all'utilizzo previsto,
utilizza il calcolatore prezzi.
Al termine delle attività descritte in questo documento, puoi evitare l'addebito di ulteriori costi eliminando le risorse che hai creato. Per saperne di più, consulta Esegui la pulizia.
Prima di iniziare
Esegui questo tutorial su una macchina con almeno 5 GB di spazio libero per installare le dipendenze.
- Accedi al tuo account Google Cloud . Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti senza costi per l'esecuzione, il test e il deployment dei workload.
-
Installa Google Cloud CLI.
-
Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.
-
Per inizializzare gcloud CLI, esegui questo comando:
gcloud init -
Crea o seleziona un Google Cloud progetto.
Ruoli richiesti per selezionare o creare un progetto
- Seleziona un progetto: la selezione di un progetto non richiede un ruolo IAM specifico. Puoi selezionare qualsiasi progetto per il quale ti è stato concesso un ruolo.
-
Crea un progetto: per creare un progetto, devi disporre del ruolo Autore progetto
(
roles/resourcemanager.projectCreator), che contiene l'autorizzazioneresourcemanager.projects.create. Scopri come concedere i ruoli.
-
Creare un progetto Google Cloud :
gcloud projects create PROJECT_ID
Sostituisci
PROJECT_IDcon un nome per il progetto Google Cloud che stai creando. -
Seleziona il progetto Google Cloud che hai creato:
gcloud config set project PROJECT_ID
Sostituisci
PROJECT_IDcon il nome del progetto Google Cloud .
-
Verifica che la fatturazione sia abilitata per il tuo progetto Google Cloud .
Abilita le API Dataflow, Compute Engine, Cloud Storage, Pub/Sub e Vertex AI:
Ruoli richiesti per abilitare le API
Per abilitare le API, devi disporre del ruolo IAM Amministratore utilizzo dei servizi (
roles/serviceusage.serviceUsageAdmin), che include l'autorizzazioneserviceusage.services.enable. Scopri come concedere i ruoli.gcloud services enable dataflow.googleapis.com
compute.googleapis.com storage.googleapis.com pubsub.googleapis.com aiplatform.googleapis.com -
Se utilizzi una shell locale, crea credenziali di autenticazione locali per il tuo account utente:
gcloud auth application-default login
Non è necessario eseguire questa operazione se utilizzi Cloud Shell.
Se viene restituito un errore di autenticazione e utilizzi un provider di identità (IdP) esterno, verifica di aver acceduto a gcloud CLI con la tua identità federata.
-
Concedi ruoli al tuo account utente. Esegui il seguente comando una volta per ciascuno dei seguenti ruoli IAM:
roles/iam.serviceAccountUsergcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
Sostituisci quanto segue:
PROJECT_ID: il tuo ID progetto.USER_IDENTIFIER: l'identificatore del tuo account utente . Ad esempio:myemail@example.com.ROLE: il ruolo IAM che concedi al tuo account utente.
-
Installa Google Cloud CLI.
-
Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.
-
Per inizializzare gcloud CLI, esegui questo comando:
gcloud init -
Crea o seleziona un Google Cloud progetto.
Ruoli richiesti per selezionare o creare un progetto
- Seleziona un progetto: la selezione di un progetto non richiede un ruolo IAM specifico. Puoi selezionare qualsiasi progetto per il quale ti è stato concesso un ruolo.
-
Crea un progetto: per creare un progetto, devi disporre del ruolo Autore progetto
(
roles/resourcemanager.projectCreator), che contiene l'autorizzazioneresourcemanager.projects.create. Scopri come concedere i ruoli.
-
Creare un progetto Google Cloud :
gcloud projects create PROJECT_ID
Sostituisci
PROJECT_IDcon un nome per il progetto Google Cloud che stai creando. -
Seleziona il progetto Google Cloud che hai creato:
gcloud config set project PROJECT_ID
Sostituisci
PROJECT_IDcon il nome del progetto Google Cloud .
-
Verifica che la fatturazione sia abilitata per il tuo progetto Google Cloud .
Abilita le API Dataflow, Compute Engine, Cloud Storage, Pub/Sub e Vertex AI:
Ruoli richiesti per abilitare le API
Per abilitare le API, devi disporre del ruolo IAM Amministratore utilizzo dei servizi (
roles/serviceusage.serviceUsageAdmin), che include l'autorizzazioneserviceusage.services.enable. Scopri come concedere i ruoli.gcloud services enable dataflow.googleapis.com
compute.googleapis.com storage.googleapis.com pubsub.googleapis.com aiplatform.googleapis.com -
Se utilizzi una shell locale, crea credenziali di autenticazione locali per il tuo account utente:
gcloud auth application-default login
Non è necessario eseguire questa operazione se utilizzi Cloud Shell.
Se viene restituito un errore di autenticazione e utilizzi un provider di identità (IdP) esterno, verifica di aver acceduto a gcloud CLI con la tua identità federata.
-
Concedi ruoli al tuo account utente. Esegui il seguente comando una volta per ciascuno dei seguenti ruoli IAM:
roles/iam.serviceAccountUsergcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
Sostituisci quanto segue:
PROJECT_ID: il tuo ID progetto.USER_IDENTIFIER: l'identificatore del tuo account utente . Ad esempio:myemail@example.com.ROLE: il ruolo IAM che concedi al tuo account utente.
-
Concedi ruoli al account di servizio Compute Engine predefinito. Esegui il seguente comando una volta per ciascuno dei seguenti ruoli IAM:
roles/dataflow.adminroles/dataflow.workerroles/storage.adminroles/pubsub.editorroles/aiplatform.user
gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com" --role=SERVICE_ACCOUNT_ROLE
Sostituisci quanto segue:
PROJECT_ID: il tuo ID progetto.PROJECT_NUMBER: il numero del progetto. Per trovare il numero di progetto, utilizza il comandogcloud projects describe.SERVICE_ACCOUNT_ROLE: ogni singolo ruolo.
- Copia l'ID progetto Google Cloud . Questo valore ti servirà più avanti in questo tutorial.
Crea le Google Cloud risorse
Questa sezione spiega come creare le seguenti risorse:
- Un bucket Cloud Storage da utilizzare come posizione di archiviazione temporanea
- Un argomento Pub/Sub per i prompt del modello
- Un argomento e una sottoscrizione Pub/Sub per le risposte del modello
Crea un bucket Cloud Storage
Crea un bucket Cloud Storage utilizzando gcloud CLI. Questo bucket viene utilizzato come posizione di archiviazione temporanea dalla pipeline Dataflow.
Per creare il bucket, utilizza il comando gcloud storage buckets create:
gcloud storage buckets create gs://BUCKET_NAME --location=LOCATION
Sostituisci quanto segue:
- BUCKET_NAME: un nome per il bucket Cloud Storage che soddisfi i requisiti di denominazione dei bucket. I nomi dei bucket Cloud Storage devono essere univoci a livello globale.
- LOCATION: la posizione del bucket.
Copia il nome del bucket. Questo valore ti servirà più avanti in questo tutorial.
Crea argomenti e sottoscrizioni Pub/Sub
Crea due argomenti Pub/Sub e una sottoscrizione. Un argomento riguarda i prompt di input che invii al modello. L'altro argomento e il relativo abbonamento sono per le risposte del modello.
Per creare gli argomenti, esegui il comando
gcloud pubsub topics createdue volte, una per ogni argomento:gcloud pubsub topics create PROMPTS_TOPIC_ID gcloud pubsub topics create RESPONSES_TOPIC_IDSostituisci quanto segue:
- PROMPTS_TOPIC_ID: l'ID argomento per i prompt di input da inviare al modello, ad esempio
prompts - RESPONSES_TOPIC_ID: l'ID argomento per le risposte del modello, ad esempio
responses
- PROMPTS_TOPIC_ID: l'ID argomento per i prompt di input da inviare al modello, ad esempio
Per creare la sottoscrizione e collegarla all'argomento delle risposte, utilizza il comando
gcloud pubsub subscriptions create:gcloud pubsub subscriptions create RESPONSES_SUBSCRIPTION_ID --topic=RESPONSES_TOPIC_IDSostituisci RESPONSES_SUBSCRIPTION_ID con l'ID abbonamento per le risposte del modello, ad esempio
responses-subscription.
Copia gli ID argomento e l'ID abbonamento. Questi valori ti serviranno più avanti in questo tutorial.
prepara l'ambiente
Scarica gli esempi di codice e configura l'ambiente per eseguire il tutorial.
Gli esempi di codice nel repository GitHub python-docs-samples forniscono il codice necessario per eseguire questa pipeline. Quando sarai pronto a creare la tua pipeline, potrai utilizzare questo codice campione come modello.
Crea un ambiente virtuale Python isolato per eseguire il progetto della pipeline utilizzando venv. Un ambiente virtuale consente di isolare le dipendenze di un progetto da quelle di altri progetti. Per saperne di più su come installare Python e creare un ambiente virtuale, vedi Configurazione di un ambiente di sviluppo Python.
Utilizza il comando
git cloneper clonare il repository GitHub:git clone https://github.com/GoogleCloudPlatform/python-docs-samples.gitVai alla directory
run-inference:cd python-docs-samples/dataflow/run-inferenceSe utilizzi un prompt dei comandi, verifica che nel sistema siano in esecuzione Python 3 e
pip:python --version python -m pip --versionSe necessario, installa Python 3.
Se utilizzi Cloud Shell, puoi saltare questo passaggio perché Python è già installato.
Crea un ambiente virtuale Python:
python -m venv /tmp/env source /tmp/env/bin/activateInstalla le dipendenze:
pip install -r requirements.txt --no-cache-dir
Esempio di codice di caricamento del modello
Il codice di caricamento del modello in questo tutorial avvia un job personalizzato di Vertex AI che carica l'oggetto state_dict del modello in Cloud Storage.
Il file iniziale è simile al seguente:
Esempio di codice della pipeline
Il codice della pipeline in questo tutorial esegue il deployment di una pipeline Dataflow che esegue le seguenti operazioni:
- Legge un prompt da Pub/Sub e codifica il testo in tensori di token.
- Esegue la trasformazione
RunInference. - Decodifica i tensori dei token di output in testo e scrive la risposta in Pub/Sub.
Il file iniziale è simile al seguente:
Carica il modello
Gli LLM possono essere modelli molto grandi. I modelli più grandi addestrati con più parametri generalmente danno risultati migliori. Tuttavia, i modelli più grandi richiedono una macchina più grande e più memoria per essere eseguiti. I modelli più grandi possono anche essere più lenti da eseguire sulle CPU.
Prima di eseguire un modello PyTorch su Dataflow, devi caricare l'oggetto state_dict del modello. L'oggetto state_dict di un modello
memorizza i pesi del modello.
In una pipeline Dataflow che utilizza la trasformazione
RunInference di Apache Beam, l'oggetto state_dict del modello deve essere caricato in
Cloud Storage. La macchina che utilizzi per caricare l'oggettostate_dict
in Cloud Storage deve disporre di memoria sufficiente per caricare il modello. La
macchina ha anche bisogno di una connessione a internet veloce per scaricare i pesi e
caricarli in Cloud Storage.
La tabella seguente mostra il numero di parametri per ogni modello e la memoria minima necessaria per caricare ciascun modello.
| Modello | Parametri | Memoria necessaria |
|---|---|---|
google/flan-t5-small |
80 milioni | > 320 MB |
google/flan-t5-base |
250 milioni | > 1 GB |
google/flan-t5-large |
780 milioni | > 3,2 GB |
google/flan-t5-xl |
3 miliardi | > 12 GB |
google/flan-t5-xxl |
11 miliardi | > 44 GB |
google/flan-ul2 |
20 miliardi | > 80 GB |
Sebbene sia possibile caricare un modello più piccolo in locale, questo tutorial mostra come avviare un job personalizzato Vertex AI che carica il modello con una VM di dimensioni appropriate.
Poiché gli LLM possono essere molto grandi, l'esempio di questo tutorial salva l'oggetto
state_dict in formato float16 anziché nel formato float32 predefinito.
Con questa configurazione, ogni parametro utilizza 16 bit anziché 32 bit, riducendo
le dimensioni dell'oggetto state_dict della metà. Una dimensione più piccola riduce al minimo il tempo
necessario per caricare il modello. Tuttavia, la conversione del formato implica che la VM deve
adattare sia il modello sia l'oggetto state_dict alla memoria.
La seguente tabella mostra i requisiti minimi per caricare un modello dopo che l'oggetto state_dict è stato salvato nel formato float16. La tabella mostra anche i tipi di macchina suggeriti per caricare un modello utilizzando Vertex AI. La dimensione minima (e predefinita) del disco per Vertex AI è 100 GB, ma alcuni modelli potrebbero richiedere un disco più grande.
| Nome modello | Memoria necessaria | Tipo di macchina | Memoria VM | Disco VM |
|---|---|---|---|---|
google/flan-t5-small |
> 480 MB | e2-standard-4 |
16 GB | 100 GB |
google/flan-t5-base |
> 1,5 GB | e2-standard-4 |
16 GB | 100 GB |
google/flan-t5-large |
> 4,8 GB | e2-standard-4 |
16 GB | 100 GB |
google/flan-t5-xl |
> 18 GB | e2-highmem-4 |
32 GB | 100 GB |
google/flan-t5-xxl |
> 66 GB | e2-highmem-16 |
128 GB | 100 GB |
google/flan-ul2 |
> 120 GB | e2-highmem-16 |
128 GB | 150 GB |
Carica l'oggetto state_dict del modello in Cloud Storage utilizzando un
job personalizzato Vertex AI:
python download_model.py vertex \
--model-name="MODEL_NAME" \
--state-dict-path="gs://BUCKET_NAME/run-inference/MODEL_NAME.pt" \
--job-name="Load MODEL_NAME" \
--project="PROJECT_ID" \
--bucket="BUCKET_NAME" \
--location="LOCATION" \
--machine-type="VERTEX_AI_MACHINE_TYPE" \
--disk-size-gb="DISK_SIZE_GB"
Sostituisci quanto segue:
- MODEL_NAME: il nome del modello, ad esempio
google/flan-t5-xl. - VERTEX_AI_MACHINE_TYPE: il tipo di macchina su cui eseguire
il job personalizzato di Vertex AI, ad esempio
e2-highmem-4. - DISK_SIZE_GB: le dimensioni del disco per la VM, in GB. La dimensione minima è 100 GB.
A seconda delle dimensioni del modello, il caricamento potrebbe richiedere alcuni minuti. Per visualizzare lo stato, vai alla pagina Job personalizzati di Vertex AI.
esegui la pipeline.
Dopo aver caricato il modello, esegui la pipeline Dataflow. Per eseguire la pipeline, sia il modello che la memoria utilizzata da ogni worker devono rientrare nella memoria.
La tabella seguente mostra i tipi di macchine consigliati per eseguire una pipeline di inferenza.
| Nome modello | Tipo di macchina | Memoria VM |
|---|---|---|
google/flan-t5-small |
n2-highmem-2 |
16 GB |
google/flan-t5-base |
n2-highmem-2 |
16 GB |
google/flan-t5-large |
n2-highmem-4 |
32 GB |
google/flan-t5-xl |
n2-highmem-4 |
32 GB |
google/flan-t5-xxl |
n2-highmem-8 |
64 GB |
google/flan-ul2 |
n2-highmem-16 |
128 GB |
Esegui la pipeline:
python main.py \
--messages-topic="projects/PROJECT_ID/topics/PROMPTS_TOPIC_ID" \
--responses-topic="projects/PROJECT_ID/topics/RESPONSES_TOPIC_ID" \
--model-name="MODEL_NAME" \
--state-dict-path="gs://BUCKET_NAME/run-inference/MODEL_NAME.pt" \
--runner="DataflowRunner" \
--project="PROJECT_ID" \
--temp_location="gs://BUCKET_NAME/temp" \
--region="REGION" \
--machine_type="DATAFLOW_MACHINE_TYPE" \
--requirements_file="requirements.txt" \
--requirements_cache="skip" \
--experiments="use_sibling_sdk_workers" \
--experiments="no_use_multiple_sdk_containers"
Sostituisci quanto segue:
- PROJECT_ID: l'ID progetto
- PROMPTS_TOPIC_ID: l'ID argomento per i prompt di input da inviare al modello
- RESPONSES_TOPIC_ID: l'ID argomento per le risposte del modello
- MODEL_NAME: il nome del modello, ad esempio
google/flan-t5-xl - BUCKET_NAME: il nome del bucket
- REGION: la regione in cui eseguire il deployment del
job, ad esempio
us-central1 - DATAFLOW_MACHINE_TYPE: la VM su cui eseguire la pipeline, ad esempio
n2-highmem-4
Per assicurarti che il modello venga caricato una sola volta per worker e non esaurisca la memoria, configura i worker in modo che utilizzino un singolo processo impostando l'opzione della pipeline --experiments=no_use_multiple_sdk_containers. Non devi limitare il numero di thread perché la trasformazione RunInference condivide lo stesso modello con più thread.
La pipeline in questo esempio viene eseguita con le CPU. Per un modello più grande, è necessario più tempo per elaborare ogni richiesta. Se hai bisogno di risposte più rapide, puoi attivare le GPU.
Per visualizzare lo stato della pipeline, vai alla pagina Job di Dataflow.
Fare una domanda al modello
Dopo l'avvio della pipeline, fornisci un prompt al modello e ricevi una risposta.
Invia il prompt pubblicando un messaggio su Pub/Sub. Utilizza il comando
gcloud pubsub topics publish:gcloud pubsub topics publish PROMPTS_TOPIC_ID \ --message="PROMPT_TEXT"Sostituisci
PROMPT_TEXTcon una stringa che contiene il prompt che vuoi fornire. Racchiudi il prompt tra virgolette.Utilizza un prompt personalizzato o prova uno dei seguenti esempi:
Translate to Spanish: My name is LukaComplete this sentence: Once upon a time, there was aSummarize the following text: Dataflow is a Google Cloud service that provides unified stream and batch data processing at scale. Use Dataflow to create data pipelines that read from one or more sources, transform the data, and write the data to a destination.
Per ottenere la risposta, utilizza il comando
gcloud pubsub subscriptions pull.A seconda delle dimensioni del modello, la generazione di una risposta potrebbe richiedere alcuni minuti. I modelli più grandi richiedono più tempo per essere implementati e per generare una risposta.
gcloud pubsub subscriptions pull RESPONSES_SUBSCRIPTION_ID --auto-ackSostituisci
RESPONSES_SUBSCRIPTION_IDcon l'ID abbonamento per le risposte del modello.
Esegui la pulizia
Per evitare che al tuo Account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.
Elimina il progetto
Elimina un progetto Google Cloud :
gcloud projects delete PROJECT_ID
Elimina singole risorse
-
Esci dall'ambiente virtuale Python:
deactivate
-
Arresta la pipeline:
-
Elenca gli ID job per i job Dataflow in esecuzione e poi annota l'ID job per il job del tutorial:
gcloud dataflow jobs list --region=REGION --status=active
-
Annulla il job:
gcloud dataflow jobs cancel JOB_ID --region=REGION
-
-
Elimina il bucket e tutto ciò che contiene:
gcloud storage rm gs://BUCKET_NAME --recursive
-
Elimina gli argomenti e la sottoscrizione:
gcloud pubsub topics delete PROMPTS_TOPIC_ID gcloud pubsub topics delete RESPONSES_TOPIC_ID gcloud pubsub subscriptions delete RESPONSES_SUBSCRIPTION_ID
-
Revoca i ruoli che hai concesso all'account di servizio Compute Engine predefinito. Esegui il seguente comando una volta per ciascuno dei seguenti ruoli IAM:
roles/dataflow.adminroles/dataflow.workerroles/storage.adminroles/pubsub.editorroles/aiplatform.user
gcloud projects remove-iam-policy-binding PROJECT_ID --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com --role=SERVICE_ACCOUNT_ROLE
(Facoltativo) Revoca i ruoli dal tuo Account Google.
gcloud projects remove-iam-policy-binding PROJECT_ID --member="user:EMAIL_ADDRESS" --role=roles/iam.serviceAccountUser
-
(Facoltativo) Revoca le credenziali di autenticazione che hai creato ed elimina il file delle credenziali locale.
gcloud auth application-default revoke
-
(Facoltativo) Revoca le credenziali da gcloud CLI.
gcloud auth revoke
Passaggi successivi
- Esplora Dataflow ML.
- Scopri di più sull' API RunInference.
- Per informazioni dettagliate sull'utilizzo di ML con Apache Beam, consulta la documentazione sulle pipeline AI/ML di Apache Beam.
- Completa il notebook Utilizza RunInference per l'AI generativa.
- Esplora architetture, diagrammi e best practice di riferimento su Google Cloud. Consulta il nostro Cloud Architecture Center.