CHATS vs CHIENS + FLASK + DOCKER + KUBERNETES

Vous êtes-vous déjà demandé comment créer et déployer une application Web d'apprentissage automatique, la faire évoluer et la gérer pour tous dans le cloud? Vous êtes au bon endroit. Dans cet article, je vais passer en revue les concepts de base de la conteneurisation de votre application Web ML et de son déploiement dans le nuage Google à l'aide du moteur kebernetes.

Vous pouvez trouver le code complet ici. Pour une démonstration rapide, consultez http://130.211.229.36/.(upload uniquement des images jpg)

Prérequis = Compréhension des dockers

D'abord, qu'est-ce que kubernetes? Kubernetes est un système d’orchestration open source pour les conteneurs Docker. Il gère la planification sur les noeuds d’un cluster de calcul et gère activement les charges de travail afin de s’assurer que leur état correspond aux intentions déclarées de l’utilisateur, en utilisant le concept des étiquettes et des pod application en unités logiques pour faciliter la gestion et la découverte.

Architecture Kubernetes

Vue d'ensemble du cluster Kubernetes avec les nœuds maître et de travail. Toutes les activités du cluster sont contrôlées à partir du noeud principal sur lequel une API est en cours d'exécution. Kubectl est une interface de ligne de commande permettant d'exécuter des commandes sur des clusters Kubernetes.

Chaque nœud porte une étiquette et reçoit une étiquette. Votre application conteneurisée s'exécute dans un pod d'un nœud et est déployée dans un nœud principal.

Un node

Il s'agit d'un nœud avec de nombreux pods avec leurs adresses IP.

Pods - Ce sont les unités de base de l'architecture qui contiennent généralement 2 conteneurs. Chaque pod de Kubernetes se voit attribuer une adresse IP de pod unique dans le cluster et peut être géré manuellement via l'API Kubernetes. Un pod peut définir un volume, tel qu'un répertoire de disque local ou un disque réseau, et l'exposer aux conteneurs du dossier. cosse.

Et enfin, exposer votre application à l'aide d'un service. Lorsqu'un noeud de travail meurt, les pods s'exécutant sur le noeud sont également perdus. Un jeu de répliques peut ensuite redonner dynamiquement le cluster à l'état souhaité via la création de nouveaux pods pour que votre application continue de fonctionner. Cela se fait via le fichier service.yaml.

Pour mieux comprendre l'infrastructure de kubernetes, je recommande une vidéo qui explique tous les concepts de manière simplifiée.

Commençons notre application Web.

J'ai formé mon modèle de réseau Neural et l'ai enregistré au format JSON, ainsi que les poids dans un fichier h5. J'ai écrit use_model.py pour charger le modèle formé à partir de JSON et prédire la nouvelle image.

J'ai utilisé FLASK pour créer une application Web. L’application est simple: elle prend l’image et prédit chat ou chien à l’aide de use_model.py et retourne si “Vous êtes un CHIEN” ou “Vous êtes un CAT”. App.py va comme ceci (j'ai changé host = 0.0.0.0 lors de la création du conteneur.)

Ensuite, la partie la plus importante est d’écrire Dockerfie pour pouvoir construire l’image de menu fixe.

Exécutez les commandes apt-get update && install python3…

Copiez votre répertoire actuel. pip installer exigences.txt

Port EXPOSE (où votre app.py sert)

Ensuite, exécutez la commande python3 app.py. CMD sera toujours ajouté à Entrypoint pour vous donner la dernière commande à exécuter.

Vous pouvez créer le conteneur localement et tester votre application de flacon conteneurisé (exécutez ces commandes dans le répertoire de votre projet).

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

Ceci exécutera votre application.py et, avec la redirection de port en place, vous pourrez accéder à l'application Web dans votre navigateur à l'adresse http: // localhost: 5000.

Vient maintenant la partie la plus attendue.

Créez un compte dans cloud.google.com pour permettre aux paiements d'accéder au moteur Kubernetes. Accédez au moteur kubernetes et cliquez sur le bouton Activer le shell cloud en haut de la fenêtre de la console. Vous obtiendrez une console en bas où vous pourrez exécuter des commandes. Cette console est pré-installée avec gcloud, docker et kubectl. Une fois dans la console:

git clone 
cd votre_projet

Définissez la variable d'environnement PROJECT_ID dans votre shell en récupérant l'ID de projet préconfiguré sur gcloud en exécutant la commande ci-dessous:

exportation PROJECT_ID = "$ (projet -q de configuration get gcloud -q)"

La valeur de PROJECT_ID sera utilisée pour baliser l'image du conteneur afin de la transférer dans votre registre de conteneurs privé.

Maintenant, vous pouvez construire l'image du conteneur:

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

Il faudra un peu de temps pour construire, après la construction, vous pouvez vérifier en utilisant la commande "Images Docker". Maintenant, vous pouvez créer votre cluster:

Construire l'image du conteneur

Création d'un cluster de conteneurs:

Maintenant que l'image du conteneur est stockée dans un registre, vous devez créer un cluster de conteneurs pour exécuter l'image du conteneur. Un cluster est constitué d'un pool d'instances de machine virtuelle Compute Engine exécutant Kubernetes.

Les clusters de conteneurs gcloud créent  - zone = us-central1-f --num-nodes = 2

Cela prendra un certain temps, puis vous pourrez vérifier avec la commande «gcloud compute instance list list».

Déploiement de votre application:

kubectl lance  --image = gcr.io / $ {ID PROJECT} / : 1.0.0 --port 3000

La commande “kubectl get pods” permet de voir le pod créé par le déploiement.

Exposer votre application sur Internet:

kubectl expose déploiement  --type = LoadBalancer --port 80 --target-port 3000

La commande kubectl expose ci-dessus crée une ressource Service qui fournit une prise en charge réseau et IP aux pods de votre application. L’indicateur - port spécifie le numéro de port configuré sur l’équilibreur de charge, et l’indicateur - target-port spécifie le numéro de port utilisé par le pod créé par la commande kubectl run de l'étape précédente.

kubectl obtenir le service

La sortie vous donnera une adresse IP externe (au bas de l'image ci-dessous):

Obtenez votre adresse IP externe

Une fois que vous avez déterminé l’adresse IP externe de votre application, copiez-la. Pointez votre navigateur sur cette URL (telle que http://130.211.229.36) pour vérifier si votre application est accessible.

En visitant une adresse IP externe

NOTE 1. Partout où j'ai utilisé <> n'hésitez pas à ajouter vos noms souhaités. 2. J'ai également écrit des fichiers yaml dans mon github si vous utilisez Digitalocean ou une autre plate-forme cloud.

Ce blog est utile. Pour tous les doutes et les questions commenter ci-dessous.