Creamos un motor de búsqueda semántico con aprendizaje automático en tiempo real para 300 líneas de código Python.Mi experiencia sugiere que cualquier proyecto de aprendizaje automático más o menos complejo se convertirá tarde o temprano en un conjunto de herramientas internas complejas no compatibles. Estas herramientas suelen ser una mezcla de scripts de Jupyter Notebooks y Flask, que son difíciles de implementar e integrar con soluciones como las sesiones de GPU Tensorflow.
Encontré esto por primera vez en la Universidad Carnegie, luego en Berkeley, en Google X, y finalmente, al crear robots independientes en Zoox. Las herramientas nacieron en forma de pequeños cuadernos Jupyter: una utilidad de calibración de sensores, un servicio de simulación, una aplicación LIDAR, una utilidad de secuencias de comandos, etc.
Con la creciente importancia de las herramientas, aparecieron los gerentes. La burocracia estaba creciendo. Requerimientos incrementados. Los pequeños proyectos se convirtieron en enormes pesadillas incómodas.
Ciclo: 1. Explore en Jupyter 2. Copie y pegue en el script de Python 3. Escriba una aplicación Flask con HTML, JS y más 4. Agregue más funcionalidades. // Los problemas de soporte comienzan desde el paso 3Cuando la herramienta se volvió crítica, contratamos a un equipo para crear las herramientas . Usaron Vue y React. Sus computadoras portátiles estaban cubiertas con pegatinas de conferencias marco declarativas. Tenían su propio proceso depurado:
Un proceso simplificado: 1. Colección de requisitos 2. Plantilla para componentes reactivos 3. Creación de una aplicación en HTML, CSS, Python, React, etc. 4. Un mes después: "La aplicación está lista, podemos actualizarla en un par de meses". // Después del paso 4, el trabajo se mueve a la velocidad de una tortugaEl proceso fue maravilloso. Estas son solo las herramientas que aparecieron todas las semanas. Y el equipo de herramientas apoyó otros diez proyectos más. Agregar nuevas funcionalidades tomó meses.
Así que volvimos a crear nuestras propias herramientas, implementando aplicaciones de Flask, escribiendo HTML, CSS y JavaScript, e intentando portar todo esto desde Jupyter mientras preservamos los estilos. Entonces, mi viejo amigo de Google X, Thiago Teheheira, y yo comenzamos a reflexionar sobre la pregunta: ¿Qué pasaría si pudiéramos crear herramientas tan fácilmente como escribimos scripts en Python?
Queríamos que los especialistas en aprendizaje automático pudieran crear aplicaciones elegantes sin involucrar a los equipos para crear herramientas. Las herramientas internas no deberían ser un fin en sí mismo, sino un subproducto de trabajar con ML. ¡Escribir una utilidad debería sentirse como parte del trabajo de entrenar una red neuronal o realizar análisis en Jupyter! Pero al mismo tiempo, queríamos tener la flexibilidad y el poder de un marco web. De hecho, queríamos algo como esto:
El proceso de trabajar en Streamlit: 1. Agregue un par de llamadas a la API en su script 2. ¡Una hermosa herramienta está lista!Con la ayuda de una excelente comunidad de ingenieros de Uber, Twitter, Stitch Fix y Dropbox, hemos desarrollado Streamlit a lo largo del año, un marco de código abierto gratuito para ayudar a los trabajadores de aprendizaje automático. Con cada iteración posterior, los principios básicos de Streamlit se volvieron más simples. Esto es a lo que hemos llegado:
# 1: Usa el conocimiento de Python. Las aplicaciones Streamlit son scripts que se ejecutan de arriba a abajo. No hay estado oculto en ellos. Si puede escribir en Python, puede crear aplicaciones en Streamlit. Así es como se muestra la pantalla:
import streamlit as st st.write('Hello, world!')
El primer conocido.# 2: Piense en los widgets como variables. ¡No hay devoluciones de llamada en Streamlit ! Cada cambio simplemente reinicia el script de arriba a abajo. Este enfoque le permite escribir código más limpio:
import streamlit as st x = st.slider('x') st.write(x, 'squared is', x * x)
Una aplicación interactiva en tres líneas de código.# 3: Usa datos y cálculos repetidamente. ¿Qué pasa si descargó una gran cantidad de datos para realizar largos cálculos? Entonces será importante reutilizarlos entre reinicios. Streamlit tiene una primitiva para el almacenamiento en caché persistente del estado predeterminado sin cambios. Entonces, por ejemplo, el siguiente código descarga datos del proyecto Udacity en autos autogestionados una vez , produciendo una aplicación simple y hermosa:
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])
Para ejecutar el código anterior, siga las instrucciones desde aquí .
Y así es como se verá el resultado.En resumen, Streamlit funciona así:
- El script se vuelve a ejecutar cada vez
- Streamlit asigna a cada variable el valor actual de los widgets.
- El almacenamiento en caché evita el acceso innecesario a la red o largos recálculos.
El trabajo de Streamlit en imágenes:
La entrada del usuario reinicia el script. Entre reinicios, solo se guarda el caché.¿Estás intrigado? ¡Entonces pruébalo tú mismo! Ejecutar:
$ pip install --upgrade streamlit $ streamlit hello . URL: http://localhost:8501 URL: http://10.0.1.29:8501
Este código abrirá la aplicación Streamlit en un navegador. Si esto no sucede, simplemente haga clic en el enlace.
Para ver más ejemplos como esta animación fractal, simplemente ejecute streamlit hello desde la línea de comando.
¿No jugaste lo suficiente con fractales? Tenga cuidado, los fractales pueden quedarse por mucho tiempo.
La simplicidad de los ejemplos no debe ser engañosa: puede crear aplicaciones enormes en Streamlit. Al trabajar en Zoox y Google X, vi cómo los proyectos automotrices autónomos se inflaban a gigabytes de datos visuales que debían ser encontrados y procesados, incluida la prueba de diferentes modelos para comparar el rendimiento. Cada pequeño proyecto en máquinas autónomas, tarde o temprano, creció al tamaño de requerir un equipo de desarrollo separado.
Pero con Streamlit, la creación de tales aplicaciones es trivial. Aquí hay una demostración en Streamlit , donde se implementa una búsqueda semántica completa en todo el conjunto de datos de Udacity para máquinas autónomas , visualización de etiquetas anotadas de personas y el lanzamiento de una red neuronal completa ( YOLO ) en tiempo real dentro de la misma aplicación [1].
Esta demostración de 300 líneas en Streamlit combina la búsqueda semántica con resultados en tiempo real de una red neuronal.La aplicación es completamente autosuficiente, la mayoría de las 300 líneas son de aprendizaje automático. Además, la API Streamlit solo se llama 23 veces . Pruébalo tú mismo!
$ pip install --upgrade streamlit opencv-python $ streamlit run https://raw.githubusercontent.com/streamlit/demo-self-driving/master/app.py
En el proceso de trabajar con equipos de aprendizaje automático, nos dimos cuenta de que algunas ideas simples dan buenos resultados:
Las aplicaciones Streamlit son archivos Python normales. Por lo tanto, puede usar su editor favorito para desarrollar toda la aplicación.
Mi flujo de trabajo con Streamlit incluye VSCode a la izquierda y Chrome a la derecha.Los scripts limpios se almacenan sin problemas en Git u otros sistemas de control de versiones. Al trabajar con Python puro, obtienes un gran conjunto de herramientas listas para el desarrollo en equipo.
La aplicación Streamlit está totalmente alojada en Git.Streamlit es un entorno de codificación de respuesta instantánea. Simplemente haga clic en Volver a ejecutar siempre cuando Streamlit note un cambio en el archivo fuente.
Haga clic en "Volver a ejecutar siempre" para la codificación de respuesta instantánea.El almacenamiento en caché simplifica enormemente el trabajo con la cadena de cálculo. ¡Combinar múltiples resultados de almacenamiento en caché funciona muy bien como una tubería eficiente para la informática! Eche un vistazo a este código tomado de la demostración de 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 para la informática Streamlit. Para ejecutar el script, siga estas instrucciones .
De hecho, la canalización es load_metadata -> create_summary. Cada vez que se ejecuta el script, Streamlit cuenta solo lo que se necesita para el resultado correcto . Genial!
Para obtener el máximo rendimiento, Streamlit solo cuenta lo que realmente se necesita para actualizar la interfaz de usuario.Streamlit está diseñado para funcionar con la GPU. Streamlit le permite trabajar directamente con TensorFlow, PyTorch y otras bibliotecas similares. Por ejemplo, en esta demostración, el caché de Streamlit almacena GAN de celebridades de NVIDIA [2]. Esto le permite lograr una respuesta casi instantánea al cambiar los valores del control deslizante.
La aplicación Streamlit muestra la
GAN de caras de celebridades de NVIDIA [2] utilizando
TL-GAN de Shaobo Guan [3].
Streamlit es un proyecto de código abierto . Puede distribuir libremente aplicaciones en Streamlit sin pedirnos permiso. ¡Incluso puede ejecutar aplicaciones en Streamlit localmente sin una conexión a Internet! Y los proyectos existentes pueden implementar Streamlit gradualmente.
Varias formas de usar Streamlit. (Los iconos están tomados de fullvector / Freepik ).
Y esto es solo una descripción general de las características de Streamlit. Uno de los aspectos más geniales de la biblioteca es la facilidad de combinar primitivas en grandes aplicaciones. Tenemos más que contar sobre la infraestructura de Streamlit y los planes para el futuro, pero lo guardaremos para futuras publicaciones.
Diagrama de componentes Streamlit. ¡Espera más publicaciones!Estamos felices de compartir Streamlit con el mundo y esperamos que con él sus scripts Python ML se conviertan en hermosas aplicaciones completas.
Referencias
[1] J. Redmon y A. Farhadi, YOLOv3: An Incremental Improvement (2018), arXiv.
[2] T. Karras, T. Aila, S. Laine y J. Lehtinen, Progressive Growing of GANs for Improved Quality, Stability, and Variation (2018), ICLR.
[3] S. Guan, Síntesis y edición de imágenes controladas utilizando un nuevo modelo TL-GAN (2018), Insight Data Science Blog.