Transformer les scripts en de magnifiques outils d'apprentissage automatique

Nous créons un moteur de recherche sémantique avec apprentissage automatique en temps réel pour 300 lignes de code Python.

Mon expérience suggère que tout projet d'apprentissage automatique plus ou moins complexe se transformera tôt ou tard en un ensemble d'outils internes complexes non pris en charge. Ces outils sont généralement un mélange de scripts de Jupyter Notebooks et Flask, qui sont difficiles à déployer et à intégrer avec des solutions telles que les sessions GPU Tensorflow.


Je l'ai rencontré pour la première fois à l'Université Carnegie, puis à Berkeley, à Google X, et enfin, lors de la création de robots autonomes chez Zoox. Les outils sont nés sous forme de petits cahiers Jupyter: un utilitaire de calibration de capteur, un service de simulation, une application LIDAR, un utilitaire de script, etc.


Avec l'importance croissante des outils, les managers sont apparus. La bureaucratie augmentait. Les exigences ont augmenté. Les petits projets se sont transformés en énormes cauchemars maladroits.



Cycle: 1. Explorez dans Jupyter 2. Copiez-collez dans le script Python 3. Écrivez une application Flask avec HTML, JS et plus 4. Ajoutez plus de fonctionnalités. // Les problèmes de support commencent dès l'étape 3

Lorsque l'outil est devenu critique, nous avons engagé une équipe pour créer les outils . Ils ont utilisé Vue et React. Leurs ordinateurs portables étaient couverts d'autocollants provenant de conférences-cadres déclaratives. Ils avaient leur propre processus débogué:


Un processus simplifié: 1. Collection d'exigences 2. Modèle de composants réactifs 3. Création d'une application en HTML, CSS, Python, React, etc. 4. Un mois plus tard: "L'application est prête, nous pouvons la mettre à jour dans quelques mois." // Après l'étape 4, le travail se déplace à une vitesse de tortue

Le processus a été merveilleux. Voici juste les outils apparus chaque semaine. Et l'équipe d'outils a soutenu dix autres projets. L'ajout de nouvelles fonctionnalités a pris des mois.


Nous avons donc recommencé à créer nos propres outils, à déployer des applications Flask, à écrire du HTML, du CSS et du JavaScript, et à essayer de porter tout cela depuis Jupyter tout en préservant les styles. Donc, mon vieil ami Google X Thiago Teheheira et moi avons commencé à réfléchir à la question: et si nous pouvions créer des outils aussi facilement que d'écrire des scripts en Python?


Nous voulions que les spécialistes du machine learning puissent créer des applications élégantes sans impliquer des équipes pour créer des outils. Les outils internes ne doivent pas être une fin en soi, mais un sous-produit du travail avec ML. L'écriture d'un utilitaire doit être ressentie dans le cadre du travail de formation d'un réseau neuronal ou de réalisation d'analyses dans Jupyter! Mais en même temps, nous voulions avoir la flexibilité et la puissance d'un framework web. En fait, nous voulions quelque chose comme ça:


Le processus de travail dans Streamlit: 1. Ajoutez quelques appels à l'API dans votre script 2. Un bel outil est prêt!

Avec l'aide d'une excellente communauté d'ingénieurs d'Uber, Twitter, Stitch Fix et Dropbox, nous avons développé Streamlit au cours de l' année - un framework open source gratuit pour aider les travailleurs du machine learning. À chaque itération ultérieure, les principes au cœur de Streamlit sont devenus plus simples. Voici à quoi nous en sommes arrivés:


# 1: Utilisez les connaissances Python. Les applications Streamlit sont des scripts qui s'exécutent de haut en bas. Il n'y a aucun état caché en eux. Si vous pouvez écrire en Python, vous pouvez créer des applications dans Streamlit. Voici comment l'écran s'affiche:


import streamlit as st st.write('Hello, world!') 

La première connaissance.

# 2: Considérez les widgets comme des variables. Il n'y a aucun rappel dans Streamlit ! Chaque changement redémarre simplement le script de haut en bas. Cette approche vous permet d'écrire du nettoyeur de code:


 import streamlit as st x = st.slider('x') st.write(x, 'squared is', x * x) 

Une application interactive en trois lignes de code.

# 3: Utilisez les données et les calculs à plusieurs reprises. Et si vous téléchargiez beaucoup de données pour effectuer de longs calculs? Ensuite, il sera important de les réutiliser entre les redémarrages. Streamlit a une primitive pour la mise en cache persistante de l'état inchangé par défaut. Ainsi, par exemple, le code ci-dessous télécharge une fois les données du projet Udacity sur les voitures autogérées, produisant une application simple et belle:


 import streamlit as st import pandas as pd # Reuse this data across runs! read_and_cache_csv = st.cache(pd.read_csv) BUCKET = "https://streamlit-self-driving.s3-us-west-2.amazonaws.com/" data = read_and_cache_csv(BUCKET + "labels.csv.gz", nrows=1000) desired_label = st.selectbox('Filter to:', ['car', 'truck']) st.write(data[data.label == desired_label]) 

Pour exécuter le code ci-dessus, suivez les instructions à partir d'ici .

Et voici à quoi ressemblera le résultat.

En bref, Streamlit fonctionne comme ceci:


  1. Le script est réexécuté à chaque fois
  2. Streamlit attribue à chaque variable la valeur actuelle des widgets.
  3. La mise en cache évite un accès réseau inutile ou de longs recalculs.

Le travail de Streamlit en images:


L'entrée utilisateur redémarre le script. Entre les redémarrages, seul le cache est enregistré.

Êtes-vous intrigué? Essayez-le vous-même! Exécuter:


 $ pip install --upgrade streamlit $ streamlit hello     .  URL: http://localhost:8501  URL: http://10.0.1.29:8501 

Ce code ouvrira l'application Streamlit dans un navigateur. Si cela ne se produit pas, cliquez simplement sur le lien.


Pour voir plus d'exemples comme cette animation fractale, exécutez simplement streamlit hello depuis la ligne de commande.



Pas assez joué avec les fractales? Attention, les fractales peuvent rester longtemps.


La simplicité des exemples ne doit pas être trompeuse: vous pouvez créer d'énormes applications sur Streamlit. En travaillant chez Zoox et Google X, j'ai vu comment les projets automobiles autonomes se sont gonflés en gigaoctets de données visuelles qui devaient être trouvées et traitées, notamment en testant différents modèles pour comparer les performances. Chaque petit projet sur des machines autonomes s'est tôt ou tard développé au point de nécessiter une équipe de développement distincte.


Mais avec Streamlit, la création de telles applications est triviale. Voici une démo sur Streamlit , où une recherche sémantique à part entière est implémentée sur l'ensemble du tableau de données Udacity pour les machines autonomes , la visualisation des étiquettes annotées des personnes et le lancement d'un réseau de neurones à part entière ( YOLO ) en temps réel dans la même application [1].


Cette démo de 300 lignes sur Streamlit combine la recherche sémantique avec les résultats en temps réel d'un réseau de neurones.

L'application est complètement autosuffisante, la plupart des 300 lignes sont d'apprentissage automatique. De plus, l'API Streamlit n'est appelée que 23 fois . Essayez-le vous-même!


 $ pip install --upgrade streamlit opencv-python $ streamlit run https://raw.githubusercontent.com/streamlit/demo-self-driving/master/app.py 



Dans le processus de travail avec les équipes de machine learning, nous avons réalisé que quelques idées simples portaient leurs fruits:


Les applications Streamlit sont des fichiers Python standard. Ainsi, vous pouvez utiliser votre éditeur préféré pour développer l'ensemble de l'application.


Mon flux de travail avec Streamlit comprend VSCode à gauche et Chrome à droite.

Les scripts propres sont stockés sans problème dans Git ou d'autres systèmes de contrôle de version. En travaillant avec du python pur, vous obtenez un énorme pool d'outils prêts à l'emploi pour le développement en équipe.


L'application Streamlit est entièrement hébergée dans Git.

Streamlit est un environnement de codage à réponse instantanée. Cliquez simplement sur Toujours réexécuter lorsque Streamlit remarque un changement dans le fichier source.


Cliquez sur «Toujours réexécuter» pour le codage de réponse instantanée.

La mise en cache simplifie considérablement le travail avec la chaîne de calcul. La combinaison de plusieurs résultats de mise en cache fonctionne très bien comme un pipeline efficace pour l'informatique! Jetez un œil à ce code extrait de la démo Udacity :


 import streamlit as st import pandas as pd @st.cache def load_metadata(): DATA_URL = "https://streamlit-self-driving.s3-us-west-2.amazonaws.com/labels.csv.gz" return pd.read_csv(DATA_URL, nrows=1000) @st.cache def create_summary(metadata, summary_type): one_hot_encoded = pd.get_dummies(metadata[["frame", "label"]], columns=["label"]) return getattr(one_hot_encoded.groupby(["frame"]), summary_type)() # Piping one st.cache function into another forms a computation DAG. summary_type = st.selectbox("Type of summary:", ["sum", "any"]) metadata = load_metadata() summary = create_summary(metadata, summary_type) st.write('## Metadata', metadata, '## Summary', summary) 

Pipeline pour l'informatique Streamlit. Pour exécuter le script, suivez ces instructions .



En fait, le pipeline est load_metadata -> create_summary. Chaque fois que le script est exécuté, Streamlit ne raconte que ce qui est nécessaire pour le résultat correct . Cool!


Pour des performances maximales, Streamlit ne raconte que ce qui est vraiment nécessaire pour mettre à jour l'interface utilisateur.

Streamlit est conçu pour fonctionner avec le GPU. Streamlit vous permet de travailler directement avec TensorFlow, PyTorch et d'autres bibliothèques similaires. Par exemple, dans cette démo, le cache de Streamlit stocke les GAN de célébrités de NVIDIA [2]. Cela vous permet d'obtenir une réponse presque instantanée lors du changement des valeurs du curseur.


L'application Streamlit montre le GAN des visages de célébrités de NVIDIA [2] en utilisant le TL-GAN de Shaobo Guan [3].

Streamlit est un projet open source . Vous pouvez distribuer librement des applications sur Streamlit sans nous demander la permission. Vous pouvez même exécuter des applications sur Streamlit localement sans connexion Internet! Et les projets existants peuvent implémenter Streamlit progressivement.


Plusieurs façons d'utiliser Streamlit. (Les icônes sont extraites de fullvector / Freepik .)



Et ce n'est qu'un aperçu général des fonctionnalités de Streamlit. L'un des aspects les plus sympas de la bibliothèque est la facilité de combiner des primitives dans d'énormes applications. Nous avons plus à dire sur l'infrastructure Streamlit et les plans pour l'avenir, mais nous l'enregistrerons pour de futures publications.


Diagramme des composants rationalisé. Attendez d'autres publications!

Nous sommes heureux de partager Streamlit avec le monde et nous espérons que vos scripts Python ML se transformeront en de belles applications à part entière.




Références:


[1] J. Redmon et A. Farhadi, YOLOv3: An Incremental Improvement (2018), arXiv.


[2] T. Karras, T. Aila, S. Laine et J. Lehtinen, Progressive Growing of GANs for Improved Quality, Stability, and Variation (2018), ICLR.


[3] S. Guan, Synthèse et édition d'images contrôlées à l'aide d'un nouveau modèle TL-GAN (2018), Insight Data Science Blog.

Source: https://habr.com/ru/post/fr473196/


All Articles