我们为300行Python代码创建了一个具有实时机器学习功能的语义搜索引擎。我的经验表明,任何或多或少复杂的机器学习项目迟早都会变成一组复杂的不受支持的内部工具。 这些工具通常是来自Jupyter Notebooks和Flask的脚本的混搭,难以部署和与Tensorflow GPU会话等解决方案集成。
我首先在卡内基大学(Carnegie University),然后在伯克利(Berkeley),在Google X,最后是在Zoox创建独立的机器人时遇到了这种情况。 工具以小型Jupyter笔记本的形式诞生:传感器校准实用程序,模拟服务,LIDAR应用程序,脚本实用程序等。
随着工具重要性的提高,管理人员出现了。 官僚机构在增长。 要求增加。 小项目变成了巨大的尴尬噩梦。
周期: 1.在Jupyter中探索2.复制粘贴到Python脚本3.用HTML,JS和更多内容编写Flask应用程序4.添加更多功能。 //支持问题最早可从第3步开始当工具变得至关重要时,我们请了一个团队来创建工具 。 他们使用了Vue和React。 他们的笔记本电脑上贴满了声明性框架会议的标贴。 他们有自己的调试过程:
简化的流程: 1 .需求集合2.反应组件的模板3.用HTML,CSS,Python,React等创建应用程序 4.一个月后:“应用程序准备就绪,我们可以在几个月内对其进行更新。” //步骤4之后,工作以乌龟速度移动这个过程很棒。 这里只是每周出现的工具。 工具团队还支持了另外十个项目。 添加新功能花了几个月的时间。
因此,我们回过头来创建自己的工具,部署Flask应用程序,编写HTML,CSS和JavaScript,并尝试在保留样式的同时从Jupyter移植所有这些内容。 因此,我的老Google X朋友Thiago Teheheira和我开始思考这个问题: 如果我们能像用Python编写脚本一样容易地创建工具,该怎么办?
我们希望机器学习专家能够制作精美的应用程序,而无需团队参与创建工具。 内部工具本身并不是目的,而是使用ML的副产品。 编写实用程序应该作为在Jupyter中训练神经网络或进行分析的工作的一部分! 但同时,我们希望拥有Web框架的灵活性和强大功能。 实际上,我们想要这样的东西:
在Streamlit中工作的过程: 1.在脚本中向API添加几个调用2.准备好漂亮的工具!在来自Uber,Twitter,Stitch Fix和Dropbox的优秀工程师社区的帮助下,我们在这一年中开发了Streamlit-一种免费的开源框架,可帮助机器学习人员。 随着每个后续迭代,Streamlit的核心原理变得更加简单。 这就是我们得出的结论:
#1:使用Python知识。 Streamlit应用程序是从上到下运行的脚本。 它们中没有隐藏状态。 如果可以用Python编写,则可以在Streamlit中创建应用程序。 屏幕显示方式如下:
import streamlit as st st.write('Hello, world!')
初次相识。#2:将小部件视为变量。 Streamlit中没有回调! 每次更改都只是从上到下重新启动脚本。 这种方法使您可以编写代码清理器:
import streamlit as st x = st.slider('x') st.write(x, 'squared is', x * x)
三行代码的交互式应用程序。#3:重复使用数据和计算。 如果您下载了大量数据以进行冗长的计算该怎么办? 然后,在重新启动之间重用它们很重要。 Streamlit具有用于保留默认未更改状态的持久缓存的原语。 因此,例如,下面的代码一次从Udacity项目的自助式汽车上下载数据,从而生成一个简单而美观的应用程序:
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])
要运行上面的代码,请按照此处的说明进行操作。
这就是结果的样子。简而言之,Streamlit的工作方式如下:
- 脚本每次都会重新运行
- Streamlit为小部件的每个变量分配当前值。
- 缓存可以避免不必要的网络访问或冗长的重新计算。
Streamlit在图片中的工作:
用户输入将重新启动脚本。 重新启动之间,仅保存缓存。你很感兴趣吗? 然后自己尝试! 运行:
$ pip install --upgrade streamlit $ streamlit hello . URL: http://localhost:8501 URL: http://10.0.1.29:8501
此代码将在浏览器中打开Streamlit应用程序。 如果没有发生,只需单击链接。
要查看更多类似这种分形动画的示例,只需从命令行运行streamlit hello 。
分形玩不够? 注意,分形可能会长时间黏附。
示例的简单性不应引起误解:您可以在Streamlit上创建大型应用程序。 在Zoox和Google X上工作时,我看到了自动驾驶汽车项目如何膨胀为需要查找和处理的千兆字节可视数据,包括测试不同的模型以比较性能。 无人驾驶机器上的每个小型项目迟早都会发展到需要一个单独的开发团队的规模。
但是使用Streamlit,创建此类应用程序是微不足道的。 这是Streamlit上的一个演示 ,其中在整个Udacity数据阵列中实现了自动驾驶机器的完整语义搜索,人员注释标签的可视化以及在同一应用程序中实时 启动了完整的神经网络( YOLO ) [1]。
这个在Streamlit上的300行演示结合了语义搜索和来自神经网络的实时结果。该应用程序是完全自给自足的,300条线中的大多数都是机器学习的。 此外,Streamlit API 仅被调用23次 。 自己尝试!
$ pip install --upgrade streamlit opencv-python $ streamlit run https://raw.githubusercontent.com/streamlit/demo-self-driving/master/app.py
在与机器学习团队合作的过程中,我们意识到一些简单的想法可带来丰厚的回报:
Streamlit应用程序是常规的Python文件。 因此,您可以使用自己喜欢的编辑器来开发整个应用程序。
我使用Streamlit的工作流在左侧包括VSCode,在右侧包括Chrome。干净的脚本可以毫无问题地存储在Git或其他版本控制系统中。 使用纯python,您会获得大量现成的工具,可以作为一个团队进行开发。
Streamlit应用程序完全托管在Git中。Streamlit是即时响应编码环境。 当Streamlit注意到源文件中的更改时,只需单击始终重新运行 。
单击“始终重新运行”以进行即时响应编码。缓存大大简化了计算链的工作。 结合多个缓存结果可作为高效的计算管道发挥作用! 看看以下来自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)
Streamlit计算的管道。 要运行脚本,请遵循以下说明 。
实际上,管道是load_metadata-> create_summary。 每次运行脚本时, Streamlit仅重新计算正确结果所需的内容 。 好酷!
为了获得最佳性能,Streamlit仅重新计算更新UI真正需要的内容。Streamlit旨在与GPU配合使用。 Streamlit允许您直接使用TensorFlow,PyTorch和其他类似的库。 例如,在此演示中,Streamlit的缓存存储了来自NVIDIA [2]的GAN名人 。 这使您在更改滑块的值时几乎可以立即获得响应。
Streamlit应用程序使用
管韶博的TL-GAN [3]演示了
NVIDIA [2]
的名人面孔 GAN 。
Streamlit是一个开源项目 。 您可以在Streamlit上自由分发应用程序,而无需征得我们的许可。 您甚至可以在没有互联网连接的情况下在本地的Streamlit上运行应用程序! 现有项目可以逐步实施Streamlit。
使用Streamlit的几种方法。 (图标取自fullvector / Freepik 。)
这只是Streamlit功能的一般概述。 该库最酷的方面之一是易于将原语组合到大型应用程序中。 我们还有更多关于Streamlit基础架构和未来计划的信息,但是我们会将其保存以备将来发布。
Streamlit组件图。 等待更多出版物!我们很高兴与世界分享Streamlit,并希望与您一起将Python ML脚本转变成精美的成熟应用程序。
参考文献:
[1] J. Redmon和A. Farhadi, YOLOv3:渐进式改进 (2018),arXiv。
[2] T. Karras, T。Aila,S。Laine和J. Lehtinen,《 渐进式增长GAN以提高质量,稳定性和变异性》 (2018年),ICLR。
[3] S. Guan,《 使用新型TL-GAN模型进行受控图像合成和编辑》 (2018年),Insight Data Science Blog。