CATS vs DOGS + FLASK + DOCKER + KUBERNETES

Haben Sie sich jemals gefragt, wie Sie eine maschinell lernende Web-App erstellen und bereitstellen, skalieren und für alle in der Cloud verwalten können? Sie sind an der richtigen Stelle angekommen. In diesem Beitrag gehe ich auf die grundlegenden Konzepte zum Containerisieren Ihrer ML-Web-App und zum Bereitstellen in der Google Cloud mithilfe der Kebernetes-Engine ein.

Den vollständigen Code finden Sie hier. Für eine kurze Demo besuchen Sie bitte http://130.211.229.36/.( Nur JPG-Bilder hochladen)

Voraussetzungen = Verständnis der Docker

Erstens, was ist Kubernetes? Kubernetes ist ein Open-Source-Orchestrierungssystem für Docker-Container, das die Planung auf Knoten in einem Compute-Cluster übernimmt und Workloads aktiv verwaltet, um sicherzustellen, dass ihr Status mit den vom Benutzer angegebenen Absichten übereinstimmt. Dabei werden die Container gruppiert, aus denen sich ein zusammensetzt Anwendung in logischen Einheiten für einfache Verwaltung und Erkennung.

Kubernetes Architektur

Die Übersicht über Kubernetes-Cluster mit Master- und Worker-Knoten. Alle Clusteraktivitäten werden vom Masterknoten gesteuert, auf dem eine API ausgeführt wird. Kubectl ist eine Befehlszeilenschnittstelle zum Ausführen von Befehlen für Kubernetes-Cluster.

Jeder Knoten ist beschriftet und mit Tags versehen. Ihre containerisierte App wird in einem Pod auf einem Knoten ausgeführt und im Masterknoten bereitgestellt.

Ein Knoten

Dies ist ein Knoten mit vielen Pods mit ihren Pod-IP-Adressen.

Pods - Dies sind die Grundeinheiten der Architektur, die normalerweise 2 Container enthalten. Jedem Pod in Kubernetes wird eine eindeutige Pod-IP-Adresse innerhalb des Clusters zugewiesen. Sie kann manuell über die Kubernetes-API verwaltet werden. Ein Pod kann ein Volume definieren, z. B. ein lokales Festplattenverzeichnis oder eine Netzwerkfestplatte, und es den Containern in der pod.

Und schließlich wird Ihre App mithilfe eines Dienstes verfügbar gemacht. Wenn ein Arbeitsknoten stirbt, gehen auch die auf dem Knoten ausgeführten Pods verloren. Durch ein Replikatset wird der Cluster möglicherweise dynamisch in den gewünschten Status zurückversetzt, indem neue Pods erstellt werden, damit Ihre Anwendung weiterhin ausgeführt wird. Dies erfolgt über die Datei service.yaml.

Zum besseren Verständnis der kubernetes-Infrastruktur empfehle ich ein Video, in dem alle Konzepte auf vereinfachte Weise verlinkt werden.

Beginnen wir mit unserer Web-App.

Ich habe mein neuronales Netzwerkmodell trainiert, in JSON gespeichert und die Gewichte in einer h5-Datei gespeichert. Ich habe eine use_model.py geschrieben, um das trainierte Modell von JSON zu laden und das neue Image vorherzusagen.

Ich habe FLASK verwendet, um eine Web-App zu erstellen. Die Anwendung ist einfach, sie nimmt das Bild auf und sagt mit use_model.py Katze oder Hund voraus und gibt zurück, ob Sie ein Hund oder eine Katze sind. Die app.py geht so (ich habe host = 0.0.0.0 beim Erstellen des Containers geändert.)

Der wichtigste Teil ist dann, das Dockerfie zu schreiben, um das Docker-Image erstellen zu können.

Führen Sie die folgenden Befehle aus: apt-get update && install python3…

Kopieren Sie Ihr aktuelles Verzeichnis. pip install requirements.txt

EXPOSE-Port (wo Ihre app.py dient)

Führen Sie dann den Befehl python3 app.py aus. CMD wird immer an Entrypoint angehängt, damit Sie den endgültigen Befehl zum Ausführen erhalten.

Sie können den Container lokal erstellen und Ihre containerisierte Kolben-App testen (führen Sie diese Befehle in Ihrem Projektverzeichnis aus).

docker build -t image_classifier: Neueste.
docker run -it -p 5500: 3000 image_classifier

Dadurch wird Ihre app.py ausgeführt. Wenn die Portweiterleitung aktiviert ist, können Sie in Ihrem Browser unter http: // localhost: 5000 auf die Webanwendung zugreifen.

Jetzt kommt der am meisten erwartete Teil.

Erstellen Sie ein Konto in cloud.google.com, damit Zahlungen auf die Kubernetes-Engine zugreifen können. Navigieren Sie zu kubernetes engine und klicken Sie oben im Konsolenfenster auf die Schaltfläche zum Aktivieren der Cloud-Shell. Unten sehen Sie eine Konsole, auf der Sie Befehle ausführen können. Auf dieser Konsole sind gcloud, docker und kubectl vorinstalliert. Einmal in der Konsole:

Git-Klon 
cd your_project

Legen Sie die Umgebungsvariable PROJECT_ID in Ihrer Shell fest, indem Sie die vorkonfigurierte Projekt-ID in gcloud abrufen, indem Sie den folgenden Befehl ausführen:

export PROJECT_ID = "$ (gcloud config get-value Projekt -q)"

Der Wert von PROJECT_ID wird verwendet, um das Container-Image zu markieren, damit es in Ihre private Container-Registrierung verschoben werden kann.

Jetzt können Sie das Container-Image erstellen:

docker build -t gcr.io/${PROJECT_ID}/:1.0.0
Docker-Push gcr.io/${PROJECT_ID}/:1.0.0

Das Erstellen dauert einige Zeit. Nach dem Erstellen können Sie mithilfe des Befehls "Docker-Images" überprüfen. Jetzt können Sie Ihren Cluster erstellen:

Das Container-Image erstellen

Erstellen eines Containerclusters:

Nachdem das Container-Image in einer Registrierung gespeichert wurde, müssen Sie einen Container-Cluster erstellen, um das Container-Image auszuführen. Ein Cluster besteht aus einem Pool von Compute Engine-VM-Instanzen, auf denen Kubernetes ausgeführt wird.

gcloud-Containercluster erstellen  - zone = us-central1-f --num-node = 2

Es wird eine Weile dauern, bis der Vorgang abgeschlossen ist. Anschließend können Sie ihn mit dem Befehl "gcloud compute instance list" überprüfen.

Anwendung bereitstellen:

kubectl run  --image = gcr.io / $ {PROJECT_ID} / : 1.0.0 --port 3000

Mit dem Befehl "kubectl get pods" können Sie den durch die Bereitstellung erstellten Pod anzeigen.

Ihre Bewerbung im Internet veröffentlichen:

kubectl expose deployment  --type = LoadBalancer --port 80 --target-port 3000

Der obige Befehl kubectl expose erstellt eine Service-Ressource, die Netzwerk- und IP-Unterstützung für die Pods Ihrer Anwendung bietet. Das Flag - port gibt die im Load Balancer konfigurierte Portnummer an und das Flag - target-port gibt die von verwendete Portnummer an Der Pod, der mit dem Befehl kubectl run aus dem vorherigen Schritt erstellt wurde.

Kubectl erhalten Service

Die Ausgabe gibt Ihnen eine externe IP (unten im Bild):

Holen Sie sich Ihre externe IP

Nachdem Sie die externe IP-Adresse für Ihre Anwendung ermittelt haben, kopieren Sie die IP-Adresse. Zeigen Sie mit Ihrem Browser auf diese URL (z. B. http://130.211.229.36), um zu überprüfen, ob auf Ihre Anwendung zugegriffen werden kann.

Beim Besuch einer externen IP

ANMERKUNG 1. Überall, wo ich <> verwendet habe, können Sie Ihre gewünschten Namen hinzufügen. 2. Ich habe Yaml-Dateien auch in meinen Github geschrieben, wenn Sie Digitalocean oder eine andere Cloud-Plattform verwenden.

Dieser Blog ist hilfreich. Für irgendwelche Zweifel und Fragen kommentieren Sie unten.