Skripte in schöne Werkzeuge für maschinelles Lernen verwandeln

Wir erstellen eine semantische Suchmaschine mit maschinellem Lernen in Echtzeit für 300 Zeilen Python-Code.

Meine Erfahrung zeigt, dass jedes mehr oder weniger komplexe maschinelle Lernprojekt früher oder später zu einer Reihe komplexer, nicht unterstützter interner Tools wird. Diese Tools sind normalerweise eine Mischung aus Skripten von Jupyter Notebooks und Flask, die sich nur schwer bereitstellen und in Lösungen wie Tensorflow-GPU-Sitzungen integrieren lassen.


Ich habe dies zuerst an der Carnegie University, dann in Berkeley, bei Google X und schließlich bei der Erstellung von eigenständigen Robotern bei Zoox erlebt. Werkzeuge wurden in Form kleiner Jupyter-Notizbücher geboren: ein Sensorkalibrierungsdienstprogramm, ein Simulationsdienst, eine LIDAR-Anwendung, ein Skriptdienstprogramm usw.


Mit der wachsenden Bedeutung von Werkzeugen erschienen Manager. Die Bürokratie wuchs. Anforderungen erhöht. Aus kleinen Projekten wurden große, unangenehme Albträume.



Zyklus: 1. In Jupyter erkunden 2. In das Python-Skript kopieren und einfügen 3. Eine Flask-Anwendung mit HTML, JS und mehr schreiben 4. Weitere Funktionen hinzufügen. // Supportprobleme beginnen bereits in Schritt 3

Als das Tool kritisch wurde, beauftragten wir ein Team mit der Erstellung der Tools . Sie benutzten Vue und React. Ihre Laptops waren mit Aufklebern von deklarativen Rahmenkonferenzen bedeckt. Sie hatten ihren eigenen Debug-Prozess:


Ein optimierter Prozess: 1. Sammlung von Anforderungen 2. Vorlage für reaktive Komponenten 3. Erstellen einer Anwendung in HTML, CSS, Python, React usw. 4. Einen Monat später: „Die Anwendung ist fertig, wir können sie in ein paar Monaten aktualisieren.“ // Nach Schritt 4 bewegt sich die Arbeit mit einer Schildkrötengeschwindigkeit

Der Prozess war wunderbar. Hier sind nur die Tools, die jede Woche erscheinen. Das Tool-Team unterstützte zehn weitere Projekte. Das Hinzufügen neuer Funktionen dauerte Monate.


Also haben wir wieder unsere eigenen Tools erstellt, Flask-Anwendungen bereitgestellt, HTML, CSS und JavaScript geschrieben und versucht, all dies von Jupyter aus zu portieren, während die Stile beibehalten wurden. Mein alter Google X-Freund Thiago Teheheira und ich begannen über die Frage nachzudenken: Was wäre, wenn wir Tools so einfach erstellen könnten wie das Schreiben von Skripten in Python?


Wir wollten, dass Spezialisten für maschinelles Lernen elegante Anwendungen erstellen können, ohne dass Teams an der Erstellung von Tools beteiligt sind. Interne Tools sollten kein Selbstzweck sein, sondern ein Nebenprodukt der Arbeit mit ML. Das Schreiben eines Dienstprogramms sollte als Teil der Arbeit zum Trainieren eines neuronalen Netzwerks oder zum Durchführen von Analysen in Jupyter empfunden werden! Gleichzeitig wollten wir die Flexibilität und Leistungsfähigkeit eines Webframeworks haben. Tatsächlich wollten wir so etwas:


So arbeiten Sie in Streamlit: 1. Fügen Sie der API in Ihrem Skript einige Aufrufe hinzu. 2. Ein schönes Tool ist fertig!

Mit Hilfe einer exzellenten Community von Ingenieuren aus Uber, Twitter, Stitch Fix und Dropbox haben wir im Laufe des Jahres Streamlit entwickelt - ein kostenloses Open-Source- Framework zur Unterstützung von Mitarbeitern des maschinellen Lernens. Mit jeder weiteren Iteration wurden die Prinzipien im Kern von Streamlit einfacher. Dazu sind wir gekommen:


# 1: Verwenden Sie Python-Kenntnisse. Streamlit-Anwendungen sind Skripte, die von oben nach unten ausgeführt werden. Es gibt keinen verborgenen Zustand in ihnen. Wenn Sie in Python schreiben können, können Sie Anwendungen in Streamlit erstellen. So wird der Bildschirm angezeigt:


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

Die erste Bekanntschaft.

# 2: Stellen Sie sich Widgets als Variablen vor. Es gibt keine Rückrufe in Streamlit ! Bei jeder Änderung wird das Skript einfach von oben nach unten neu gestartet. Mit diesem Ansatz können Sie Code Cleaner schreiben:


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

Eine interaktive Anwendung in drei Codezeilen.

# 3: Verwenden Sie Daten und Berechnungen wiederholt. Was ist, wenn Sie viele Daten heruntergeladen haben, um lange Berechnungen durchzuführen? Dann ist es wichtig, sie zwischen Neustarts wiederzuverwenden. Streamlit verfügt über ein Grundelement für das dauerhafte Zwischenspeichern des unveränderten Standardstatus. So lädt der folgende Code beispielsweise einmal Daten aus dem Udacity-Projekt für selbstverwaltete Autos herunter und erstellt so eine einfache und schöne Anwendung:


 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]) 

Befolgen Sie die Anweisungen hier , um den obigen Code auszuführen.

Und so wird das Ergebnis aussehen.

Kurz gesagt, Streamlit funktioniert folgendermaßen:


  1. Das Skript wird jedes Mal neu ausgeführt
  2. Streamlit weist jeder Variablen den aktuellen Wert aus den Widgets zu.
  3. Durch das Caching werden unnötiger Netzwerkzugriff oder langwierige Neuberechnungen vermieden.

Streamlits Arbeit in Bildern:


Benutzereingaben starten das Skript neu. Zwischen den Neustarts wird nur der Cache gespeichert.

Bist du fasziniert? Dann probieren Sie es selbst! Ausführen:


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

Dieser Code öffnet die Streamlit-Anwendung in einem Browser. Wenn dies nicht der Fall ist, klicken Sie einfach auf den Link.


Um weitere Beispiele wie diese fraktale Animation zu sehen, führen Sie einfach Streamlit Hello über die Befehlszeile aus.



Nicht genug mit Fraktalen gespielt? Seien Sie vorsichtig, Fraktale können lange Zeit haften bleiben.


Die Einfachheit der Beispiele sollte nicht irreführend sein: Sie können große Anwendungen auf Streamlit erstellen. Bei meiner Arbeit bei Zoox und Google X habe ich gesehen, wie sich selbstfahrende Autoprojekte auf Gigabyte visueller Daten aufblähten, die gefunden und verarbeitet werden mussten, einschließlich des Testens verschiedener Modelle, um die Leistung zu vergleichen. Jedes kleine Projekt an selbstfahrenden Maschinen wurde früher oder später so groß, dass ein separates Entwicklungsteam erforderlich war.


Mit Streamlit ist das Erstellen solcher Anwendungen jedoch trivial. Hier ist eine Demo zu Streamlit , in der eine vollständige semantische Suche über das gesamte Udacity -Datenarray für selbstfahrende Maschinen , die Visualisierung von mit Personen versehenen Etiketten und der Start eines vollwertigen neuronalen Netzwerks ( YOLO ) in Echtzeit in derselben Anwendung implementiert wird [1].


Diese 300-Zeilen-Demo auf Streamlit kombiniert semantische Suche mit Echtzeitergebnissen aus einem neuronalen Netzwerk.

Die Anwendung ist völlig autark, die meisten der 300 Zeilen sind maschinelles Lernen. Darüber hinaus wird die Streamlit-API nur 23 Mal aufgerufen. Probieren Sie es selbst aus!


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



Bei der Arbeit mit Teams für maschinelles Lernen haben wir festgestellt, dass sich einige einfache Ideen gut auszahlen:


Streamlit-Anwendungen sind reguläre Python-Dateien. Sie können also Ihren bevorzugten Editor verwenden, um die gesamte Anwendung zu entwickeln.


Mein Workflow mit Streamlit umfasst links VSCode und rechts Chrome.

Saubere Skripte werden problemlos in Git oder anderen Versionskontrollsystemen gespeichert . Wenn Sie mit reinem Python arbeiten, erhalten Sie einen riesigen Pool an vorgefertigten Tools für die Entwicklung als Team.


Die Streamlit-App wird vollständig in Git gehostet.

Streamlit ist eine Sofortantwort-Codierungsumgebung. Klicken Sie einfach auf Immer erneut ausführen, wenn Streamlit eine Änderung in der Quelldatei feststellt.


Klicken Sie auf "Immer erneut ausführen", um eine sofortige Antwortcodierung zu erhalten.

Das Caching vereinfacht die Arbeit mit der Rechenkette erheblich. Das Kombinieren mehrerer Caching-Ergebnisse eignet sich hervorragend als effiziente Pipeline für die Datenverarbeitung! Schauen Sie sich diesen Code aus der Udacity-Demo an :


 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 für Streamlit-Computing. Befolgen Sie diese Anweisungen , um das Skript auszuführen.



Tatsächlich lautet die Pipeline load_metadata -> create_summary. Jedes Mal, wenn das Skript ausgeführt wird, gibt Streamlit nur das wieder, was für das richtige Ergebnis erforderlich ist . Cool!


Für maximale Leistung gibt Streamlit nur das wieder, was zum Aktualisieren der Benutzeroberfläche wirklich erforderlich ist.

Streamlit funktioniert mit der GPU. Mit Streamlit können Sie direkt mit TensorFlow, PyTorch und anderen ähnlichen Bibliotheken arbeiten. In dieser Demo speichert der Streamlit-Cache beispielsweise GANs von Prominenten von NVIDIA [2]. Auf diese Weise können Sie beim Ändern der Werte des Schiebereglers eine fast sofortige Reaktion erzielen.


Die Streamlit-App demonstriert das GAN von Promi-Gesichtern von NVIDIA [2] mit Shaobo Guans TL-GAN [3].

Streamlit ist ein Open Source Projekt . Sie können Anwendungen auf Streamlit frei verteilen, ohne uns um Erlaubnis zu bitten. Sie können sogar Anwendungen auf Streamlit lokal ohne Internetverbindung ausführen! Bestehende Projekte können Streamlit schrittweise implementieren.


Verschiedene Möglichkeiten, Streamlit zu verwenden. (Die Symbole stammen von fullvector / Freepik .)



Dies ist nur eine allgemeine Übersicht über die Funktionen von Streamlit. Einer der coolsten Aspekte der Bibliothek ist die einfache Kombination von Grundelementen zu großen Anwendungen. Wir haben mehr über die Streamlit-Infrastruktur und Pläne für die Zukunft zu erzählen, aber wir werden sie für zukünftige Veröffentlichungen speichern.


Optimiertes Komponentendiagramm. Warten Sie auf weitere Veröffentlichungen!

Wir freuen uns, Streamlit mit der Welt zu teilen und hoffen, dass Ihre Python ML-Skripte damit zu wunderschönen vollwertigen Anwendungen werden.




Referenzen:


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


[2] T. Karras, T. Aila, S. Laine und J. Lehtinen, Progressives Wachstum von GANs für verbesserte Qualität, Stabilität und Variation (2018), ICLR.


[3] S. Guan, Kontrollierte Bildsynthese und -bearbeitung mit einem neuartigen TL-GAN-Modell (2018), Insight Data Science Blog.

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


All Articles