Die Bereitstellung von Anwendungen, die auf Sprachmodellen (LLMs) basieren, kann zahlreiche Herausforderungen mit sich bringen, insbesondere wenn es um Datenschutz, Zuverlässigkeit und einfache Bereitstellung geht (siehe: Finden Sie Ihren Weg durch den Hype um große Sprachmodelle - GetInData). Eine Möglichkeit ist die Bereitstellung von LLMs in Ihrer eigenen Infrastruktur. Dies ist jedoch oft mit einer komplizierten Einrichtung und Wartung verbunden, was für viele Entwickler eine entmutigende Aufgabe darstellt. Darüber hinaus kann es aufgrund von Datenschutzbeschränkungen, die von Unternehmen auferlegt werden, die die Nutzung externer Dienste einschränken und/oder wertvolle Daten verarbeiten, die personenbezogene Daten enthalten, nicht möglich sein, sich ausschließlich auf öffentliche APIs für LLMs zu verlassen (siehe:
Falcon - das neue klassenbeste, quelloffene Großsprachenmodell (zumindest im Juni 2023 🙃)
Falcon LLM selbst ist eines der beliebten Open Source Large Language Models, das vor kurzem die OSS-Gemeinschaft im Sturm erobert hat. Sehen Sie sich das Open LLM Leaderboard an, um die verschiedenen Modelle zu vergleichen. Dieser Leitfaden konzentriert sich auf den Einsatz der Version Falcon-7B-Instruct. Der gleiche Ansatz kann jedoch auch auf andere Modelle angewendet werden, einschließlich Falcon-40B oder andere, je nach verfügbarer Hardware und Budget.
Voraussetzungen
Bevor Sie mit dem Einsatz von Falcon LLM in Ihrem privaten GKE Autopilot-Cluster beginnen, müssen Sie einige Voraussetzungen erfüllen:
- Zugang zu einem GCP-Projekt und einem erstellten GKE Autopilot-Cluster: Stellen Sie sicher, dass Sie Zugang zu einem Google Cloud Platform (GCP)-Projekt haben und einen GKE Autopilot-Cluster eingerichtet haben. Der Autopilot-Cluster bietet eine verwaltete Kubernetes-Umgebung mit automatischer Skalierung und effizienter Ressourcenzuweisung, ohne dass eine manuelle Clusterkonfiguration erforderlich ist, und eignet sich daher perfekt für schnelle Bereitstellungen.
Stellen Sie sicher, dass sich der Cluster in einer Region/Zone befindet, die GPUs unterstützt. - Kontingent für den Betrieb von T4-GPUs (oder A100 für Falcon-40B): Vergewissern Sie sich, dass Ihr GCP-Projekt über das erforderliche Kontingent für den Betrieb von T4-GPUs (bzw. A100-GPUs für Falcon-40B) verfügt.
- Artefakt-Register: Richten Sie eine Artifact Registry für Docker-Container innerhalb Ihres GCP-Projekts ein. Stellen Sie sicher, dass sich die Artifact Registry in der gleichen Region wie der GKE-Cluster
befindet, um eine schnelle Netzwerkübertragung zu gewährleisten. - Google Cloud Storage (GCS) Bucket: Erstellen Sie einen GCS-Bucket in der gleichen Region
wie Ihr GKE-Cluster. Der GCS-Bucket wird zum Speichern von Modellgewichten verwendet. - Grundlegende Kenntnisse von Kubernetes: Ein grundlegendes Verständnis der Kubernetes-Konzepte und -Operationen ist für die Verwendung dieses Bereitstellungsprozesses erforderlich.
Das folgende Diagramm zeigt die Zielinfrastruktur, die Sie nach der Lektüre dieses Blogbeitrags erhalten werden.

Vorbereitung der Modelldateien
Um die Bereitstellung privat und zuverlässig zu gestalten, müssen Sie zunächst die Dateien des Modells (Gewichte, Konfiguration und sonstige Dateien) herunterladen und in GCS speichern.
Sie haben dafür 3 Möglichkeiten:
- Manueller Download: Besuchen Sie die Falcon-7B-Instruct Modellseite auf dem Hugging Face Hub(https://huggingface.co/tiiuae/falcon-7b-instruct) und laden Sie die Modelldateien manuell über Ihren Webbrowser herunter.
Git LFS Klonen: Alternativ können Sie auch Git LFS verwenden, um das Modell-Repository zu klonen. Führen Sie den folgenden Befehl aus:
git lfs clone --depth=1 https://huggingface.co/tiiuae/falcon-7b-instruct
Beachten Sie, dass die für das Klonen erforderliche Festplattengröße aufgrund des Git-Overheads in der Regel doppelt so groß ist wie die Modellgröße.
- Hugging Face Hub SDK: Eine weitere Option ist die Verwendung des Hugging Face Hub SDK, das eine bequeme Möglichkeit bietet, Modelle programmatisch abzurufen und mit ihnen zu interagieren. In der Dokumentation zum Hugging Face Hub SDK(https://huggingface.co/docs/huggingface_hub/quick-start) finden Sie eine Kurzanleitung zur Verwendung des SDK.
Nachdem Sie die Modelldateien heruntergeladen haben, sollten Sie die folgende Struktur auf Ihrer lokalen Festplatte haben:
falcon-7b-instruct
├── [9.6K] README.md
├── [ 667] config.json
├── [2.5K] configuration_RW.py
├── [ 111] generation_config.json
├── [1.1K] handler.py
├── [ 46K] modelling_RW.py
├── [9.3G] pytorch_model-00001-of-00002.bin
├── [4.2G] pytorch_model-00002-of-00002.bin
├── [ 17K] pytorch_model.bin.index.json
├── [ 281] special_tokens_map.json
├── [2.6M] tokenizer.json
└── [ 220] tokenizer_config.json
Laden Sie nun die Dateien in Google Cloud Storage (GCS) hoch.
gsutil -m rsync -rd falcon-7b-instruct gs://<your bucket name>/llm/deployment/falcon-7b-instruct
Vorbereitung des Docker-Images
Die Texterzeugungs-Inferenz von Hugging Face wird mit einem vorgefertigten Docker-Image geliefert, das für den Einsatz bereit ist und von https://ghcr.io/huggingface/text-generation-inference abgerufen werden kann. Für private und sichere Einsätze ist es jedoch besser, sich nicht auf eine externe Container-Registry zu verlassen - ziehen Sie dieses Image und speichern Sie es sicher in der Google Artifact Registry. Das komprimierte Image hat eine Größe von ca. 4 GB.
docker pull ghcr.io/huggingface/text-generation-inference:latest
docker tag ghcr.io/huggingface/text-generation-inference:latest <region>-docker.pkg.dev/<project id>/<name of the artifact registry>/huggingface/text-generation-inference:latest
docker push <region>-docker.pkg.dev/<project id>/<name of the artifact registry>/huggingface/text-generation-inference:latest
Die gleichen Aktionen (pull/tag/push) sollten Sie auch für das google/cloud-sdk:slim-Image durchführen, das zum Herunterladen von Modelldateien im initContainer der Bereitstellung verwendet wird.
Kubernetes-Bereitstellung
Einrichten des Zugangs
GKE Autopilot-Cluster verwenden standardmäßig Workload Identity. Folgen Sie zur Einrichtung der offiziellen Dokumentation:
- Ein Kubernetes-Dienstkonto im GKE Autopilot-Cluster
- Ein neues Dienstkonto in GCP, das mit dem Kubernetes-Dienstkonto verbunden wird
- IAM-Berechtigungen für das GCP-Servicekonto in IAM (der Storage Object Viewer auf dem Bucket mit den Dateien des Modells sollte ausreichen).
Vorbereitungen für die Bereitstellung
Speicherklasse (storage.yaml)
Beginnen Sie mit der Erstellung einer Speicherklasse, die schnelle SSD-Laufwerke für Volumes verwendet. Dies gewährleistet eine optimale Leistung für den Einsatz von Falcon LLM - Sie möchten die Modelldateien von GCS kopieren und sie so schnell wie möglich laden.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ssd
provisioner: pd.csi.storage.gke.io
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
parameters:
type: pd-ssd
Bereitstellung (deployment.yaml)
Das Bereitstellungsmanifest ist für die Bereitstellung des auf Textgenerierung und Inferenz basierenden Modells verantwortlich, das die im obigen Diagramm gezeigten APIs bereitstellt. Außerdem enthält es einen initContainer, der die erforderlichen Falcon LLM-Dateien von GCS in einen ephemeren Persistent Volume Claim (PVC) zieht, der vom Hauptcontainer geladen wird.
apiVersion: apps/v1
kind: Deployment
metadata:
name: falcon-7b-instruct
spec:
replicas: 1
selector:
matchLabels:
app: falcon-7b-instruct
template:
metadata:
labels:
app: falcon-7b-instruct
spec:
serviceAccountName: marcin-autopilot-sa
nodeSelector:
iam.gke.io/gke-metadata-server-enabled: "true"
cloud.google.com/gke-accelerator: nvidia-tesla-t4
volumes:
- name: model-storage
ephemeral:
volumeClaimTemplate:
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "ssd"
resources:
requests:
storage: 64Gi
initContainers:
- name: init
image: google/cloud-sdk:slim
command: ["sh", "-c", "gcloud alpha storage cp -r gs://<bucket name>/llm/deployment/falcon-7b-instruct /data"]
volumeMounts:
- name: model-storage
mountPath: /data
resources:
requests:
cpu: 7.0
containers:
- name: model
image: <region>-docker.pkg.dev/<project id>/<artifact registry name>/huggingface/text-generation-inference:latest
command: ["text-generation-launcher", "--model-id", "tiiuae/falcon-7b-instruct", "--quantize", "bitsandbytes", "--num-shard", "1", "--huggingface-hub-cache", "/usr/src/falcon-7b-instruct", "--weights-cache-override", "/usr/src/falcon-7b-instruct"]
env:
- name: HUGGINGFACE_OFFLINE
value: "1"
- name: PORT
value: "8080"
volumeMounts:
- name: model-storage
mountPath: /usr/src/
resources:
requests:
cpu: 7.0
memory: 32Gi
limits:
nvidia.com/gpu: 1
ports:
- containerPort: 8080
Die wichtigsten Punkte im Manifest sind:
nodeSelector:
iam.gke.io/gke-metadata-server-enabled: "true"
cloud.google.com/gke-accelerator: nvidia-tesla-t4
Die Knotenselektoren weisen den GKE Autopilot an, den Metadatenserver für die Bereitstellung zu aktivieren (Workload Identity zu verwenden) und einen nvidia-tesla-t4-Grafikprozessor an den Knoten anzuschließen, der die Bereitstellung ausführen wird. Mehr über GPU-basierte Workloads im GKE Autocluster erfahren Sie hier.
initContainers:
- name: init
image: google/cloud-sdk:slim
command: ["sh", "-c", "gcloud alpha storage cp -r gs://<bucket name>/llm/deployment/falcon-7b-instruct /data"]
Der init-Container kopiert die Daten von GCS in die lokale SSD-gestützte PVC. Beachten Sie, dass wir den Befehl gcloud alpha storage verwenden. Dabei handelt es sich um die neue, durchsatzoptimierte CLI-Schnittstelle für den Betrieb mit Google Cloud Storage, mit der der Benutzer einen Durchsatz von etwa 550 MB/s erreichen kann (*dies kann je nach Zone/Cluster usw. variieren).
containers:
- name: model
image: <region>-docker.pkg.dev/<project id>/<artifact registry name>/huggingface/text-generation-inference:latest
command: ["text-generation-launcher", "--model-id", "tiiuae/falcon-7b-instruct", "--quantize", "bitsandbytes", "--num-shard", "1", "--huggingface-hub-cache", "/usr/src/falcon-7b-instruct", "--weights-cache-override", "/usr/src/falcon-7b-instruct"]
env:
- name: HUGGINGFACE_OFFLINE
value: "1"
- name: PORT
value: "8080"
Der Hauptcontainer (Modell) startet text-generation-launcher mit dem quantisierten Modell (8-Bit-Quantisierung) und - was am wichtigsten ist - mit den überschriebenen Parametern --weights-cache-override und --huggingface-hub-cache, die zusammen mit der Umgebung HUGGINGFACE_OFFLINE verhindern, dass der Container irgendetwas direkt vom Hugging Face Hub herunterlädt, so dass Sie die volle Kontrolle über die Bereitstellung haben.
Service (service.yaml)
Das letzte Teil des Puzzles ist ein einfacher Kubernetes-Dienst, um die Bereitstellung zu ermöglichen:
apiVersion: v1
kind: Service
metadata:
name: falcon-7b-instruct-service
spec:
selector:
app: falcon-7b-instruct
type: ClusterIP
ports:
- name: http
port: 8080
targetPort: 8080
Einsatz von Falcon-7b-Instruct in GKE
Sobald die Manifeste fertig sind, wenden Sie sie an:
kubectl apply -f storage.yaml
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
Nach ein paar Minuten sollte die Bereitstellung abgeschlossen sein.
kubectl get pods -l app=falcon-7b-instruct
NAME READY STATUS RESTARTS AGE
falcon-7b-instruct-68d7b85f56-vbcsv 1/1 Running 0 8m
Sie können jetzt eine Verbindung mit dem Modell herstellen!
Verbindung mit dem privaten Falcon-7B-Instruct Modell
Jetzt, wo das Modell bereitgestellt ist, können Sie sich mit dem Modell vom Cluster oder von Ihrem lokalen Rechner aus verbinden, indem Sie eine Port-Weiterleitung zum Dienst erstellen:
kubectl port-forward svc/falcon-7b-instruct-service 8080:8080
Um das Modell abzufragen, können Sie direkt die HTTP-API verwenden
curl 127.0.0.1:8081/generate \
-X POST \
-d '{"inputs":"Who is James Hetfield?","parameters":{"max_new_tokens":17}}' \
-H 'Content-Type: application/json'
Response:
{"generated_text":"\nJames Hetfield is a guitarist and singer for the American heavy metal band Metallica"}
Oder Sie verwenden Python (das Beispiel zeigt eine Textklassifizierung / Stimmungsanalyse zum Nulltarif):
from text_generation import Client
client = Client("http://127.0.0.1:8080")
query = """
Answer the question using ONLY the provided context between triple backticks, and if the answer is not contained within the context, answer: "I don't know".
Only focus on the information within the context. Do NOT use any outside information. If the question is not about the context, answer: "I don't know".
Context:
```
I really like the new Metallica 72 Seasons album! I can't wait to hear the next one.
```
Question: What is the sentiment of the text? Answer should be one of the following words: "positive" / "negative" / "unknown".
"""
text = ""
for response in client.generate_stream(query, max_new_tokens=128):
if not response.token.special:
text += response.token.text
print(response.token.text, end="")
print("")
Ergebnis:
> python query.py
Answer: "positive"
Die vollständige Dokumentation der API des Dienstes finden Sie hier.
Zusammenfassung
Wenn Sie die Schritte in diesem Blogbeitrag befolgen, können Sie Falcon LLMs(oder andere große OSS-Sprachmodelle) nahtlos innerhalb der sicheren, privaten GKE Autopilot-Cluster. Dieser Ansatz ermöglicht es Ihnen, den Datenschutz und die Kontrolle über Ihre Daten zu bewahren und gleichzeitig die Vorteile einer verwalteten Kubernetes-Umgebung in Bezug auf die Skalierbarkeit zu nutzen .
Die Nutzung der Leistungsfähigkeit von Open-Source-LLMs ermöglicht es Ihnen, zuverlässige, effiziente und datenschutzfreundliche Anwendungen zu entwickeln, die sich die Fähigkeiten modernster Sprachmodelle zunutze machen.
Verfasst von
Marcin Zabłocki
Unsere Ideen
Weitere Blogs
Contact



