当前位置: 首页 > 科技观察

从Python代码到APP,只需要一个小工具:GitHub有超过3000个star

时间:2023-03-18 18:02:36 科技观察

机器学习开发者做一个App有多难?其实你只需要会Python代码,剩下的工作都可以交给一个工具。近日,Streamlit联合创始人AdrienTreuille撰文介绍了他开发的机器学习工具开发框架——Streamlit,这是一个免费开源的为机器学习工程师打造的应用构建框架。该工具可以在您编写Python代码时实时更新您的应用程序。目前,Streamlit拥有超过3400个GitHubstar,在medim上的热度也达到了9000+。Streamlit网站:https://streamlit.io/GitHub地址:https://github.com/streamlit/streamlit/在300行Python代码中,编写了一个实时进行神经网络推理的语义搜索引擎。根据我的经验,每一个重要的机器学习项目都与错误的、难以维护的内部工具放在一起。这些工具通常用JupyterNotebooks和Flask应用程序编写,难以部署,需要在客户端-服务器架构(C/S架构)上进行推理,并且不能很好地与TensorflowGPU会话等机器学习组件集成。我第一次看到这样的工具是在卡内基梅隆大学,然后是在伯克利、GoogleX、Zoox。这些工具最初是作为小型Jupyter笔记本:传感器校准工具、模拟比较应用程序、LiDAR校准应用程序、场景再现工具等。当工具变得越来越重要时,项目经理介入:过程和需求增加。这些单独的项目变成了代码脚本,并逐渐发展成为漫长的“维护噩梦”……机器学习工程师创建应用程序的过程(临时)。当工具很关键时,我们会组建工具团队。他们熟练地编写Vue和React,并且在他们的笔记本电脑上贴满了声明式框架贴纸。他们的设计过程如下所示:工具团队构建应用程序(干净整洁,从头开始)。这简直太棒了!但所有这些工具都需要新功能,例如每周上线的新功能。虽然工具团队可能同时支持10个以上的项目,但他们会说,“我们将在两个月内更新您的工具。“我们回到了之前自己构建工具的过程:部署Flask应用程序,编写HTML、CSS和JavaScript,尝试对从笔记本到样式表的所有内容进行版本控制。我和在GoogleX工作的朋友ThiagoTeixeira开始思考:如果构建工具像编写Python脚本一样简单会怎么样?我们希望机器学习工程师能够在没有工具团队的情况下构建出色的应用程序。这些内部工具应该作为机器学习工作流程的自然副产品出现。编写此类工具感觉就像在Jupyter中训练神经网络或执行临时分析!同时,我们希望保留强大应用程序框架的灵活性。我们希望创造出让工程师引以为豪的伟大工具。我们想要的应用程序构建过程如下:Streamlit应用程序构建过程。我们与Uber、Twitter、StitchFix、Dropbox等公司的工程师一起,花了一年时间创建了Streamlit,这是一个面向机器学习工程师的免费开源应用程序框架。对于任何原型,Streamlit的核心原理都更加简单和纯粹。Streamlit的核心原则如下:1.拥抱PythonStreamlit应用程序是完全自上而下运行的脚本,没有隐藏状态。您可以使用函数调用来处理代码。只要可以编写Python脚本,就可以编写Streamlit应用程序。例如,你可以这样写到屏幕上:importstreamlitasstst.write('Hello,world!')2.把widget当作一个变量Streamlit中没有回调!每次交互都只是从上到下重新运行脚本。这种方法使代码非常干净:importstreamlitasstx=st.slider('x')st.write(x,'squaredis',x*x)是一个用3行代码编写的Streamlit交互式应用程序。3.重用数据和计算如果要下载大量数据或执行复杂计算怎么办?关键是在多次运行中安全地重用信息。Streamlit引入了缓存原语,它就像一个持久的默认不可变数据存储,允许Streamlit应用程序轻松安全地重用信息。比如下面的代码只从Udacity的自动驾驶汽车项目(https://github.com/udacity/self-driving-car)下载一次数据,就可以得到一个简单快速的app:使用st.cache,多次在Streamlit运行过程中保存数据。代码运行说明见:https://gist.github.com/treuille/c633dc8bc86efaa98eb8abe76478aa81#gistcomment-3041475。运行上述st.cache示例的输出。简而言之,Streamlit的工作流程如下:每次用户交互都需要从头开始运行整个脚本。Streamlit根据小部件状态为每个变量分配最新值。缓存确保Streamlit重用数据和计算。如下图所示:用户事件触发Streamlit从头开始??重新运行脚本。跨运行只保留缓存。如果你有兴趣,现在就可以尝试一下!只需运行以下行:Web浏览器将自动打开并转到本机Streamlit应用程序。如果没有出现浏览器窗口,只需单击链接即可。这些想法简洁但有效,使用Streamlit不会阻止您创建丰富有用的应用程序。在Zoox和GoogleX工作期间,我看到自动驾驶汽车项目演变为需要搜索和理解的千兆字节视觉数据,包括在图像数据上运行模型以比较性能。我见过的每个自动驾驶汽车项目都有整个团队为此开发工具。在Streamlit中构建此类工具非常简单。以下Streamlit演示对整个Udacity自动驾驶汽车照片数据集执行语义搜索,可视化人工注释的地面实况标签,并在应用程序中实时运行完整的神经网络(YOLO)。这个300行代码的Streamlit演示结合了语义视觉搜索和交互式神经网络推理。整个App只有300行Python代码,其中大部分是机器学习代码。事实上,整个应用程序中只有23次Streamlit调用。您可以尝试一下:当我们与机器学习团队合作开展他们的项目时,我们逐渐意识到这些简单的想法带来了很多重要的好处:Streamlit应用程序是纯Python文件。您可以使用自己喜欢的编辑器和调试器。在使用Streamlit构建应用程序时,我喜欢使用VSCode编辑器(左)和Chrome(右)。纯Python代码可与Git等源代码控制软件无缝协作,包括提交、拉取请求、问题和评论。由于Streamlit的底层语言是Python,您可以免费利用这些协作工具的优势。Streamlit应用程序是Python脚本,因此您可以使用Git轻松执行版本控制。Streamlit提供即时模式编程环境。当Streamlit检测到源文件更改时,只需单击始终重新运行。单击“始终重新运行”以确保实时编程。缓存简化了计算过程。一系列缓存函数自动创建一个高效的计算管道!您可以尝试此代码:Streamlit中的简单计算流程。运行上面的代码,查看说明:https://gist.github.com/treuille/ac7755eb37c63a78fac7dfef89f3517e#gistcomment-3041436。基本上,该流程涉及从加载元数据到创建摘要的步骤(load_metadata→create_summary)。每次运行脚本时,Streamlit只需要重新计算流程的一个子集。为了保持应用程序可执行,Streamlit仅计算更新UI所需的内容。Streamlit适用于GPU。Streamlit可以直接访问机器级原语(例如TensorFlow、PyTorch)并补充这些库。例如,在下面的演示中,Streamlit的缓存存储了整个NvidiaPGGAN。这种方法使应用程序能够在用户更新左侧滑块时执行近乎即时的推断。此Streamlit应用演示了使用TL-GAN的NVIDIAPGGAN的性能。Streamlit是一个免费的开源库,而不是专有的网络应用程序。您可以在本地部署Streamlit应用程序,而无需提前联系我们。您甚至可以在没有互联网连接的情况下在笔记本电脑上本地运行Streamlit。此外,现有项目也可以逐步使用Streamlit。递增使用Streamlit的几种方法。以上只是Streamlit能做的事情的冰山一角。最令人兴奋的是这些原语可以多么容易地组成看起来像简单脚本的复杂应用程序。这会涉及到架构的运行原理和功能,本文不做赘述。Streamlit组件图。我们很高兴与社区分享Streamlit,并希望它能帮助您轻松地将Python脚本变成美观实用的机器学习应用程序。