. OTUS Machine Learning: . , -, — (Senior Data Scientist Oura) , .
En tant que Data Scientists, notre objectif principal est de traiter les données et de développer et d'améliorer des modèles d'apprentissage automatique. Il existe une opinion selon laquelle le traitement des données est l'étape la plus chronophage de l'ensemble du projet et l'exactitude du modèle détermine le succès du produit d'information. Cependant, l'industrie est maintenant dans une phase de transition "de l'ère de la découverte à l'ère de la mise en œuvre" (Superpuissances dans le domaine de l'intelligence artificielle: Chine, Silicon Valley, et le nouvel ordre mondial dans ce domaine est dicté par Li Kaifu). La situation s’élargit maintenant et l’accent passe de la création du modèle à la fourniture du modèle aux utilisateurs en tant que service et de la performance du modèle à sa valeur commerciale. L'exemple le plus célèbre ici est Netflix, qui n'a jamais utilisé les modèles gagnants de leur algorithme de 1 million de dollars en raison des coûts d'ingénierie - WIRED , malgré les gains de performances importants promis par ces moteurs .
De la compréhension à la réalité (diapositives de la conférence Strata Data - Kubeflow a expliqué: Apprentissage automatique portable sur Kubernetes ) La
mise en œuvre du modèle est extrêmement importante et les produits d'information peuvent désormais être considérés comme des produits logiciels, car ils ont une structure de projet, une gestion et un cycle de vie similaires. Par conséquent, nous avons le droit d'utiliser toutes les techniques connues du domaine du développement logiciel pour déployer des modèles d'apprentissage automatique en production.
La conteneurisation est une méthode largement utilisée pour déployer des produits logiciels à la fois sur une plateforme cloud et sur un serveur local. Fondamentalement, nous parlons de code d'emballage et de dépendances dans une boîte appelée conteneur. Voici la définition d'un conteneur dans le contexte du développement logiciel:
Depuis le site Docker , un
conteneur est une unité standard de logiciel qui regroupe le code et toutes ses dépendances afin qu'une application puisse s'exécuter rapidement et de manière fiable dans différents environnements informatiques.
Docker est une plate-forme qui peut vous aider à accélérer le développement, la conteneurisation et le déploiement de notre modèle d'apprentissage automatique dans d'autres environnements. Dans cette série d'articles, je vais vous montrer comment stocker un modèle, l'utiliser comme point de terminaison d'API, conteneuriser votre application ML et l'exécuter sur le moteur Docker.
Première question "Pourquoi Docker?"
Avant de commencer, vous devrez vous inscrire avec un identifiant Docker si vous n'en avez pas, puis utiliser cet identifiant pour télécharger et installer Docker sur votre machine.
Quand j'ai commencé mon travail à la banque, on m'a confié un projet qui impliquait le traitement de données, et le premier MVP (produit minimum viable) devait être livré en un mois. Cela semble stressant, mais nous, dans l'équipe, utilisons la méthodologie Agile dans le développement de tous les principaux produits, et le principal objectif de ce MVP était de tester l'hypothèse sur la praticité et l'efficacité du produit (pour plus d'informations sur la méthodologie Agile, voir le livre d'Eric Ries "Lean Startup" ). Mon responsable voulait que je déploie mon modèle sur son ordinateur portable, c'est-à-dire que je l'exécute et que je l'utilise pour la prédiction.
Si vous avez imaginé toutes les étapes que je devais suivre pour préparer l'ordinateur portable du responsable à exécuter mon projet, alors vous pourriez avoir de nombreuses questions, telles que:
- Sur quel système d'exploitation le modèle devra-t-il fonctionner, puisqu'il utilise un Macbook et un ThinkPad? Je pourrais bien sûr lui poser des questions à ce sujet, mais supposons qu'à ce moment de ma vie, mon patron était très méchant et ne voulait pas que je connaisse cette information. (Cette pensée est là pour vous faire prendre conscience du problème de dépendance du système d'exploitation, et mon patron est une très bonne personne.)
- Deuxième question: "Python est-il installé?" Si oui, quelle version, 2 ou 3? Lequel: 2,6, 2,7 ou 3,7?
- Qu'en est-il des packages requis comme scikit-learn, pandas et numpy? A-t-il les mêmes versions que celles que j'ai sur ma machine?
Avec toutes ces questions à l'esprit, c'est ce que j'ai dû faire avec son ordinateur pour faire fonctionner mon modèle dessus.
- Installez Python.
- Installez tous les packages.
- Configurez des variables d'environnement.
- Transférez le code dans la voiture.
- Exécutez le code avec les paramètres requis.
Toutes ces étapes demandent beaucoup d'efforts et il existe un risque d'incompatibilité lors de l'exécution de code dans différents environnements.
Ainsi, si Docker est déjà installé et en cours d'exécution, vous pouvez ouvrir un terminal et exécuter la commande suivante:
docker run --rm -p 5000:5000 datascienceexplorer/classifier
Après quelques minutes, vous devriez voir quelque chose de similaire dans votre terminal:
* Serving Flask app "main" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
Ouvrez maintenant votre navigateur préféré et accédez à cette adresse:
http://localhost:5000/apidocs/
Cliquez sur la ligne de prédiction de l'API puis sur le bouton d' essai à droite, l'interface ressemblera à ceci:
Page Swagger pour l'API sur le backend Vous
vous souvenez du jeu de données standard Iris Flowers avec lequel vous avez joué? Cette petite application vous aidera à prédire le type de fleur en fonction d'informations sur certaines mesures basées sur un modèle de classification. En fait, vous utilisez déjà mon modèle d'apprentissage automatique en tant que service, et tout ce que vous avez installé n'est que Docker, et je n'avais pas besoin d'installer Python ni aucun package sur votre machine.
C'est la force de Docker. Cela m'aide à résoudre les problèmes de dépendance afin de pouvoir déployer rapidement mon code dans différents environnements, ou dans ce cas, votre machine.
Science des données DevOps
Maintenant, j'espère que je vous ai suffisamment motivé pour continuer à lire, et si vous voulez simplement ignorer ces parties et passer directement au code, alors ce n'est pas grave, car cela signifie que vous voulez conteneuriser votre modèle d'apprentissage automatique avec Docker et l'exposer comme un service. Cependant, pour l'instant, nous devons nous arrêter un peu et mettre de côté tout le matériel sur l'apprentissage automatique et Docker pour réfléchir à DevOps dans la science des données et pourquoi cela est nécessaire.
Qu'est-ce que DevOps?
De Wikipedia,L'objectif des développeurs de logiciels est la livraison en temps opportun du code avec toutes les fonctionnalités nécessaires, tout en étant facilité d'utilisation, fiabilité, évolutivité, mise en réseau, pare-feu, infrastructure, etc. restent souvent des problèmes opérationnels. En raison des différents objectifs finaux et des KPI probables, ces équipes ne s'entendent généralement pas sous le même toit. Par conséquent, le spécialiste DevOps pourrait agir en tant que liaison et aider ces équipes à travailler ensemble, voire à assumer la responsabilité des deux parties, de sorte qu'à la fin vous ayez une équipe, menant le développement du début à la fin. Après tout, vous ne pouvez pas simplement donner votre ordinateur au client car le code fonctionne comme il se doit.
DevOps est un ensemble de pratiques qui combinent le développement de logiciels et les services de technologie de l'information, dont le but est de raccourcir le cycle de vie de développement du système et d'assurer une livraison continue de logiciels de haute qualité.
Mais avec le notebook Jupyter je suis content !!!Les scientifiques des données ont une histoire similaire, car encore une fois, vous ne pouvez pas simplement prendre et donner votre ordinateur portable exécutant Jupyter Notebook pour que le client l'utilise simplement. Nous avons besoin d'un moyen d'utiliser le modèle afin qu'il puisse servir un grand nombre d'utilisateurs à tout moment, n'importe où, et augmenter avec un temps d'arrêt minimal (utilisabilité, fiabilité, évolutivité).
Pour cette raison, les entreprises recherchent des scientifiques de données dotés de compétences DevOps capables de déployer et de déployer leurs modèles d'apprentissage automatique en production et de fournir une valeur commerciale à l'entreprise, plutôt que de simplement prouver des concepts et de se concentrer sur l'amélioration de la précision des modèles. Ces personnes sont appelées licornes.
Il existe de nombreuses façons de déployer un modèle d'apprentissage automatique, mais Docker est un outil puissant qui vous offre la flexibilité dont vous avez besoin tout en maintenant la robustesse et l'encapsulation de votre code. Bien sûr, nous ne demanderons pas à nos clients d'installer Docker et d'ouvrir un terminal pour l'exécuter. Mais cette phase de conteneurisation deviendra éventuellement la base lorsque vous commencerez à travailler avec de vrais projets où vous devrez déployer vos modèles sur des plates-formes cloud ou des serveurs sur site.
Stockage du modèle entraîné
De retour à l'université, nous avons appris que le projet Data Science se compose de six étapes, comme le montre l'image ci-dessous. Si l'automatisation et le déploiement du modèle en production sont notre objectif ultime, alors comment «faire entrer» le modèle dans la phase de déploiement?
Six étapes d'un projet Data Science
Le moyen le plus simple auquel vous pouvez penser est de copier tout ce qui se trouve dans notre bloc-notes, de le coller dans un fichier .py et de l'exécuter. Cependant, chaque fois que nous devons faire une prédiction, nous exécuterons ce fichier et entraînerons à nouveau le modèle sur les mêmes données. Si cette approche est en quelque sorte applicable pour des modèles simples avec un petit ensemble de données d'entraînement, elle ne sera pas efficace pour les modèles complexes avec beaucoup de données d'entraînement (pensez au temps qu'il vous faudra pour former un modèle ANN ou CNN). Cela signifie que lorsqu'un utilisateur soumet une demande de modèle pour la prédiction, il devra attendre de plusieurs minutes à plusieurs heures pour obtenir le résultat, car il faudra beaucoup de temps pour terminer l'étape de formation du modèle.
Comment stocker le modèle immédiatement après sa formation?
Dans la plupart des cas, un modèle d'apprentissage automatique en Python sera stocké en mémoire en tant qu'objet Python pendant l'exécution du code, puis supprimé une fois le programme terminé. Si nous pouvions enregistrer cet objet sur le disque dur immédiatement après l'entraînement du modèle, la prochaine fois que nous devrons faire une prédiction, nous pourrons simplement charger le modèle fini en mémoire et ne pas passer par les étapes d'initialisation et d'apprentissage. En informatique, le processus de conversion d'un objet en un flux d'octets pour le stockage est appelé sérialisation . En Python, cela peut être facilement fait avec un package appelé pickle , qui prend en charge nativement Python. Les développeurs Python appellent également "pickling" le processus de sérialisation d'un objet à l'aide de pickle....
Dans le notebook Jupyter, vous pouvez facilement enregistrer l'objet modèle (dans mon cas "knn") dans un fichier pkl , qui se trouve dans le même répertoire que le code:
import pickle
with open('./model.pkl', 'wb') as model_pkl:
pickle.dump(knn, model_pkl)
Sauvegarder le modèle dans le répertoire courant
Mon notebook, je recommande de prendre à partir d'ici , afin que nous ayons des résultats similaires à l'avenir. Vous pouvez également utiliser votre propre modèle, mais assurez-vous de disposer de tous les packages requis ainsi que des entrées de modèle correctes.
Vous avez terminé la première étape, vous avez enregistré le modèle entraîné. De plus, nous réutiliserons le modèle pour la prévision, mais plus à ce sujet dans la deuxième partie de l'article.