In dieser Anleitung erfahren Sie, wie Sie mithilfe der Apache Beam RunInference API ein großes Sprachmodell (LLM) in einer Dataflow-Streamingpipeline ausführen.
Weitere Informationen zur RunInference API finden Sie in der Apache Beam-Dokumentation unter Beam ML.
Der Beispielcode ist auf GitHub verfügbar.
Ziele
- Pub/Sub-Themen und -Abos für die Eingaben und Antworten des Modells erstellen.
- Das Modell mit einem benutzerdefinierten Vertex AI-Job in Cloud Storage laden.
- Pipeline ausführen.
- Dem Modell eine Frage stellen und eine Antwort erhalten.
Kosten
In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:
Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen.
Nach Abschluss der in diesem Dokument beschriebenen Aufgaben können Sie weitere Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.
Vorbereitung
Führen Sie diese Anleitung auf einem Computer aus, auf dem mindestens 5 GB freier Speicherplatz zur Installation der Abhängigkeiten verfügbar sind.
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Dataflow, Compute Engine, Cloud Storage, Pub/Sub, and Vertex AI APIs:
gcloud services enable dataflow.googleapis.com
compute.googleapis.com storage.googleapis.com pubsub.googleapis.com aiplatform.googleapis.com -
If you're using a local shell, then create local authentication credentials for your user account:
gcloud auth application-default login
You don't need to do this if you're using Cloud Shell.
-
Grant roles to your user account. Run the following command once for each of the following IAM roles:
roles/iam.serviceAccountUser
gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
- Replace
PROJECT_ID
with your project ID. -
Replace
USER_IDENTIFIER
with the identifier for your user account. For example,user:myemail@example.com
. - Replace
ROLE
with each individual role.
- Replace
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Dataflow, Compute Engine, Cloud Storage, Pub/Sub, and Vertex AI APIs:
gcloud services enable dataflow.googleapis.com
compute.googleapis.com storage.googleapis.com pubsub.googleapis.com aiplatform.googleapis.com -
If you're using a local shell, then create local authentication credentials for your user account:
gcloud auth application-default login
You don't need to do this if you're using Cloud Shell.
-
Grant roles to your user account. Run the following command once for each of the following IAM roles:
roles/iam.serviceAccountUser
gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
- Replace
PROJECT_ID
with your project ID. -
Replace
USER_IDENTIFIER
with the identifier for your user account. For example,user:myemail@example.com
. - Replace
ROLE
with each individual role.
- Replace
-
Weisen Sie Ihrem Compute Engine-Standarddienstkonto Rollen zu. Führen Sie den folgenden Befehl für jede der folgenden IAM-Rollen einmal aus:
roles/dataflow.admin
roles/dataflow.worker
roles/storage.admin
roles/pubsub.editor
roles/aiplatform.user
gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com" --role=SERVICE_ACCOUNT_ROLE
Ersetzen Sie dabei Folgendes:
PROJECT_ID
: Ihre Projekt-ID.PROJECT_NUMBER
: Ihre Projektnummer. Verwenden Sie den Befehlgcloud projects describe
, um Ihre Projektnummer zu ermitteln.SERVICE_ACCOUNT_ROLE
: Jede einzelne Rolle.
- Kopieren Sie die Google Cloud-Projekt-ID. Sie benötigen diesen Wert später in dieser Anleitung.
Google Cloud -Ressourcen erstellen
In diesem Abschnitt werden die folgenden Ressourcen erstellt:
- Ein Cloud Storage-Bucket, der als temporärer Speicherort verwendet werden soll
- Ein Pub/Sub-Thema für die Prompts des Modells
- Ein Pub/Sub-Thema und -Abo für die Antworten des Modells
Cloud Storage-Bucket erstellen
Erstellen Sie einen Cloud Storage-Bucket mit der gcloud CLI. Dieser Bucket wird von der Dataflow-Pipeline als temporärer Speicherort verwendet.
Verwenden Sie den Befehl gcloud storage buckets create
, um den Bucket zu erstellen:
gcloud storage buckets create gs://BUCKET_NAME --location=LOCATION
Ersetzen Sie dabei Folgendes:
- BUCKET_NAME: Ein Name für Ihren Cloud Storage-Bucket, der den Anforderungen für Bucket-Namen entspricht. Cloud Storage-Bucket-Namen müssen global einmalig sein.
- LOCATION: der Speicherort für den Bucket.
Kopieren Sie den Bucket-Namen. Sie benötigen diesen Wert später in dieser Anleitung.
Pub/Sub-Themen und -Abos erstellen
Erstellen Sie zwei Pub/Sub-Themen und ein Abo. Ein Thema ist für die Prompts, die Sie an das Modell senden. Das andere Thema und das zugehörige Abo wird für die Antworten des Modells genutzt.
Führen Sie zum Erstellen der Themen den Befehl
gcloud pubsub topics create
zweimal aus, einmal für jedes Thema:gcloud pubsub topics create PROMPTS_TOPIC_ID gcloud pubsub topics create RESPONSES_TOPIC_ID
Ersetzen Sie dabei Folgendes:
- PROMPTS_TOPIC_ID: Die Themen-ID für die Prompts, die an das Modell gesendet werden sollen, z. B.
prompts
- RESPONSES_TOPIC_ID: Die Themen-ID für die Antworten des Modells, z. B.
responses
- PROMPTS_TOPIC_ID: Die Themen-ID für die Prompts, die an das Modell gesendet werden sollen, z. B.
Verwenden Sie den Befehl
gcloud pubsub subscriptions create
, um das Abo zu erstellen und an das Thema für Antworten anzuhängen:gcloud pubsub subscriptions create RESPONSES_SUBSCRIPTION_ID --topic=RESPONSES_TOPIC_ID
Ersetzen Sie RESPONSES_SUBSCRIPTION_ID durch die Abo-ID für die Antworten des Modells, z. B.
responses-subscription
.
Kopieren Sie die Themen-IDs und die Abo-ID. Sie benötigen diese Werte später in dieser Anleitung.
Umgebung vorbereiten
Laden Sie die Codebeispiele herunter und richten Sie dann Ihre Umgebung für die Ausführung der Anleitung ein.
Die Codebeispiele im GitHub-Repository „python-docs-samples“ enthalten den Code, den Sie zum Ausführen dieser Pipeline benötigen. Wenn Sie Ihre eigene Pipeline erstellen möchten, können Sie diesen Beispielcode als Vorlage verwenden.
Sie erstellen eine isolierte virtuelle Python-Umgebung, um Ihr Pipeline-Projekt mit venv auszuführen. Mit einer virtuellen Umgebung können Sie die Abhängigkeiten eines Projekts von den Abhängigkeiten anderer Projekte isolieren. Weitere Informationen zum Installieren von Python und zum Erstellen einer virtuellen Umgebung finden Sie unter Python-Entwicklungsumgebung einrichten.
Klonen Sie das GitHub-Repository mit dem Befehl
git clone
:git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
Rufen Sie das Verzeichnis
run-inference
auf:cd python-docs-samples/dataflow/run-inference
Wenn Sie eine Eingabeaufforderung verwenden, prüfen Sie, ob Python 3 und
pip
in Ihrem System ausgeführt werden:python --version python -m pip --version
Installieren Sie bei Bedarf Python 3.
Wenn Sie Cloud Shell verwenden, können Sie diesen Schritt überspringen, da Python bereits in Cloud Shell installiert ist.
Erstellen Sie eine virtuelle Python-Umgebung::
python -m venv /tmp/env source /tmp/env/bin/activate
Installieren Sie die Abhängigkeiten:
pip install -r requirements.txt --no-cache-dir
Codebeispiel zum Laden von Modellen
Der Code zum Laden des Modells in dieser Anleitung startet einen benutzerdefinierten Vertex AI-Job, der das state_dict
-Objekt des Modells in Cloud Storage lädt.
Die Startdatei sieht so aus:
Beispiel für Pipelinecode
Mit dem Pipelinecode in dieser Anleitung wird eine Dataflow-Pipeline bereitgestellt, die Folgendes tut:
- Liest einen Prompt aus Pub/Sub und codiert den Text in Tokentensoren.
- Führt die Transformation
RunInference
aus. - Decodiert die Ausgabetokentensoren in Text und schreibt die Antwort in Pub/Sub.
Die Startdatei sieht so aus:
Modell laden
LLMs können sehr große Modelle sein. Größere Modelle, die mit mehr Parametern trainiert werden, liefern in der Regel bessere Ergebnisse. Größere Modelle benötigen jedoch einen größeren Rechner und mehr Arbeitsspeicher. Größere Modelle können auf CPUs auch langsamer ausgeführt werden.
Bevor Sie ein PyTorch-Modell in Dataflow ausführen können, müssen Sie das state_dict
-Objekt des Modells laden. Im state_dict
-Objekt eines Modells werden die Gewichte für das Modell gespeichert.
In einer Dataflow-Pipeline, die die Apache Beam-Transformation RunInference
verwendet, muss das state_dict
-Objekt des Modells in Cloud Storage geladen werden. Der Rechner, den Sie zum Laden des state_dict
-Objekts in Cloud Storage verwenden, muss genügend Arbeitsspeicher haben, um das Modell zu laden. Der Rechner benötigt außerdem eine schnelle Internetverbindung, um die Gewichtungen herunterzuladen und in Cloud Storage hochzuladen.
In der folgenden Tabelle sehen Sie die Anzahl der Parameter für die einzelnen Modelle und den Mindestspeicher, der zum Laden der jeweiligen Modelle erforderlich ist.
Modell | Parameter | Erforderlicher Arbeitsspeicher |
---|---|---|
google/flan-t5-small |
80 Millionen | > 320 MB |
google/flan-t5-base |
250 Millionen | > 1 GB |
google/flan-t5-large |
780 Millionen | > 3,2 GB |
google/flan-t5-xl |
3 Milliarden | > 12 GB |
google/flan-t5-xxl |
11 Milliarden | > 44 GB |
google/flan-ul2 |
20 Milliarden | > 80 GB |
Sie können zwar ein kleineres Modell lokal laden, in dieser Anleitung wird jedoch gezeigt, wie Sie einen benutzerdefinierten Vertex AI-Job starten, bei dem das Modell mit einer VM der entsprechenden Größe geladen wird.
Da LLMs so groß sein können, wird das state_dict
-Objekt im Beispiel in dieser Anleitung im float16
-Format statt im Standardformat float32
gespeichert.
Bei dieser Konfiguration verwendet jeder Parameter 16 Bits anstelle von 32 Bits, sodass das state_dict
-Objekt nur halb so groß ist. Eine kleinere Größe minimiert die Zeit, die zum Laden des Modells benötigt wird. Die Konvertierung des Formats bedeutet jedoch, dass die VM sowohl das Modell als auch das state_dict
-Objekt in ihren Speicher aufnehmen muss.
In der folgenden Tabelle sind die Mindestanforderungen zum Laden eines Modells aufgeführt, nachdem das state_dict
-Objekt im float16
-Format gespeichert wurde. Die Tabelle enthält auch die vorgeschlagenen Rechnertypen zum Laden eines Modells mithilfe von Vertex AI. Die minimale (und standardmäßige) Laufwerkgröße für Vertex AI beträgt 100 GB. Bei einigen Modellen ist jedoch möglicherweise ein größeres Laufwerk erforderlich.
Modellname | Erforderlicher Arbeitsspeicher | Maschinentyp | VM-Arbeitsspeicher | VM-Laufwerk |
---|---|---|---|---|
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 |
Laden Sie das state_dict
-Objekt des Modells mit einem benutzerdefinierten Vertex AI-Job in Cloud Storage:
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"
Ersetzen Sie dabei Folgendes:
- MODEL_NAME: Der Name des Modells, z. B.
google/flan-t5-xl
. - VERTEX_AI_MACHINE_TYPE: Der Maschinentyp, auf dem der benutzerdefinierte Vertex AI-Job ausgeführt werden soll, z. B.
e2-highmem-4
. - DISK_SIZE_GB: Die Laufwerksgröße für die VM in GB. Die Mindestgröße beträgt 100 GB.
Je nach Größe des Modells kann es einige Minuten dauern, bis es geladen ist. Den Status finden Sie auf der Seite Benutzerdefinierte Jobs in Vertex AI.
Benutzerdefinierte Jobs aufrufen
Pipeline ausführen
Nachdem Sie das Modell geladen haben, führen Sie die Dataflow-Pipeline aus. Zum Ausführen der Pipeline müssen sowohl das Modell als auch der von den verschiedenen Workers verwendete Arbeitsspeicher in den Speicher passen.
In der folgenden Tabelle sind die empfohlenen Maschinentypen für die Ausführung einer Inferenzpipeline aufgeführt.
Modellname | Maschinentyp | VM-Arbeitsspeicher |
---|---|---|
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 |
Führen Sie die Pipeline aus:
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"
Ersetzen Sie dabei Folgendes:
- PROJECT_ID: die Projekt-ID
- PROMPTS_TOPIC_ID: die Themen-ID für die Prompts, die an das Modell gesendet werden sollen
- RESPONSES_TOPIC_ID: Die Themen-ID für die Antworten des Modells
- MODEL_NAME: der Name des Modells, z. B.
google/flan-t5-xl
. - BUCKET_NAME: Der Name des Buckets
- REGION: die Region, in der der Job bereitgestellt werden soll, z. B.
us-central1
- DATAFLOW_MACHINE_TYPE: die VM, auf der die Pipeline ausgeführt werden soll, z. B.
n2-highmem-4
Damit das Modell nur einmal pro Worker geladen wird und genügend Arbeitsspeicher zur Verfügung steht, konfigurieren Sie die Worker zur Verwendung einer einzelnen Methode. Dazu legen Sie die Pipelineoption --experiments=no_use_multiple_sdk_containers
fest. Sie müssen die Anzahl der Threads nicht begrenzen, da die RunInference
-Transformation dasselbe Modell für mehrere Threads verwendet.
Die Pipeline in diesem Beispiel wird mit CPUs ausgeführt. Bei einem größeren Modell benötigt die Verarbeitung jeder Anfrage mehr Zeit. Wenn Sie schnellere Antworten benötigen, können Sie GPUs aktivieren.
Rufen Sie die Dataflow-Seite Jobs auf, um den Status der Pipeline aufzurufen.
Dem Modell eine Frage stellen
Nachdem die Pipeline ausgeführt wird, übergeben Sie dem Modell einen Prompt und erhalten eine Antwort.
Senden Sie eine Nachricht an Pub/Sub, um Ihren Prompt zu senden. Führen Sie den Befehl
gcloud pubsub topics publish
aus:gcloud pubsub topics publish PROMPTS_TOPIC_ID \ --message="PROMPT_TEXT"
Ersetzen Sie
PROMPT_TEXT
durch einen String, der den Prompt enthält, den Sie bereitstellen möchten. Setzen Sie den Prompt in Anführungszeichen.Verwenden Sie einen eigenen Prompt oder versuchen Sie es mit einem der folgenden Beispiele:
Translate to Spanish: My name is Luka
Complete this sentence: Once upon a time, there was a
Summarize 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.
Verwenden Sie den Befehl
gcloud pubsub subscriptions pull
, um die Antwort abzurufen.Je nach Größe des Modells kann es einige Minuten dauern, bis eine Antwort generiert wird. Bei größeren Modellen dauern Bereitstellung und Generation einer Antwort länger.
gcloud pubsub subscriptions pull RESPONSES_SUBSCRIPTION_ID --auto-ack
Ersetzen Sie
RESPONSES_SUBSCRIPTION_ID
durch die Abo-ID für die Antworten des Modells.
Bereinigen
Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder Sie behalten das Projekt und löschen die einzelnen Ressourcen.
Projekt löschen
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
Einzelne Ressourcen löschen
-
Beenden Sie die virtuelle Python-Umgebung:
deactivate
-
Beenden Sie die Pipeline:
-
Listen Sie die Job-IDs der Dataflow-Jobs auf, die derzeit ausgeführt werden, und notieren Sie sich die Job-ID des Jobs für das Tutorial:
gcloud dataflow jobs list --region=REGION --status=active
-
So brechen Sie den Job ab:
gcloud dataflow jobs cancel JOB_ID --region=REGION
-
-
Löschen Sie den Bucket und seinen Inhalt:
gcloud storage rm gs://BUCKET_NAME --recursive
-
Löschen Sie die Themen und das Abo:
gcloud pubsub topics delete PROMPTS_TOPIC_ID gcloud pubsub topics delete RESPONSES_TOPIC_ID gcloud pubsub subscriptions delete RESPONSES_SUBSCRIPTION_ID
-
Widerrufen Sie die Rollen, die Sie dem Compute Engine-Standarddienstkonto zugewiesen haben. Führen Sie den folgenden Befehl für jede der folgenden IAM-Rollen einmal aus:
roles/dataflow.admin
roles/dataflow.worker
roles/storage.admin
roles/pubsub.editor
roles/aiplatform.user
gcloud projects remove-iam-policy-binding PROJECT_ID --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com --role=SERVICE_ACCOUNT_ROLE
Optional: Löschen Sie Rollen aus Ihrem Google-Konto.
gcloud projects remove-iam-policy-binding PROJECT_ID --member="user:EMAIL_ADDRESS" --role=roles/iam.serviceAccountUser
-
Optional: Revoke the authentication credentials that you created, and delete the local credential file.
gcloud auth application-default revoke
-
Optional: Revoke credentials from the gcloud CLI.
gcloud auth revoke
Wie geht es weiter?
- Dataflow ML entdecken.
- Weitere Informationen zur RunInference API.
- Ausführliche Informationen zur Verwendung von ML mit Apache Beam finden Sie in der Dokumentation zu KI/ML-Pipelines in Apache Beam.
- Sehen Sie sich das Notebook RunInference für generative KI verwenden an.
- Referenzarchitekturen, Diagramme und Best Practices zu Google Cloud kennenlernen. Weitere Informationen zu Cloud Architecture Center