百科知识

从源代码到软件,一步步教你搞定这件事

Streamlit 官网:https://streamlit.io/

GitHub 仓库:https://github.com/streamlit/streamlit/

仅需 300 行 Python 代码,即可构建一个能够实时执行神经网络推理的语义搜索引擎。

根据我的实践经验,每一个具有创新性的机器学习项目,往往都是通过一系列错误频出、维护困难的内部工具组合而成的。这些工具通常以 Jupyter Notebooks 和 Flask 应用为基础构建,部署过程复杂,需要对客户端-服务器架构(C/S 架构)有深入理解,且难以与 Tensorflow GPU 会话等机器学习组件实现高效集成。

我首次接触这类工具是在卡内基梅隆大学,随后又在伯克利、Google X、Zoox 等机构中观察到。这些工具最初仅是小型 Jupyter notebook,如传感器校准工具、仿真对比应用、激光雷达对齐应用、场景重现工具等。

当工具的重要性日益凸显时,项目经理将介入其中,导致进程和需求不断累积。这些独立项目逐渐演变为代码脚本,并最终演变成冗长且难以维护的「技术噩梦」……

机器学习工程师传统的应用程序开发流程(即兴式开发)。

工具团队构建应用程序的流程(规范、系统化)。

这种模式无疑是理想的!然而,所有这些工具都需要持续更新新功能,例如每周推出新版本。但工具团队可能同时支持超过 10 个项目,他们通常会承诺:「我们将在两个月内完成您的工具更新。」

我们重新审视先前自行构建工具的流程:部署 Flask 应用,编写 HTML、CSS 和 JavaScript,尝试对从 notebook 到样式表的所有元素进行版本控制。我和在 Google X 工作的朋友 Thiago Teixeira 开始思考:如果构建工具的过程能够像编写 Python 脚本一样简单呢?

我们期望在没有工具团队的支持下,机器学习工程师也能独立构建出色的应用程序。这些内部工具应当像机器学习工作流程的自然延伸一样出现。使用此类工具进行开发,感觉类似于训练神经网络或是在 Jupyter 中执行点对点分析(即兴分析)!同时,我们还想保留强大应用程序框架的灵活性。我们致力于创造出让工程师引以为傲的高质量工具。

我们期望的应用程序构建流程如下:

Streamlit 应用程序构建流程。

与来自 Uber、Twitter、Stitch Fix、Dropbox 等企业的工程师们共同协作,我们历时一年开发出了 Streamlit,这是一款面向机器学习工程师的免费开源应用程序框架。对于任何原型开发,Streamlit 的核心原则都是追求更简单、更纯粹的设计。

Streamlit 的核心原则包括:

1. 深度整合 Python 生态

Streamlit 应用程序完全基于自上而下的脚本运行,没有隐藏的状态。开发者可以通过函数调用来处理代码。只要掌握 Python 编程,你就能轻松编写 Streamlit 应用。例如,以下代码展示了如何在屏幕上执行写入操作:

2. 将 Widget 视为变量

Streamlit 中不存在回调函数!每一次交互都只是自上而下重新运行脚本。这种方法使得代码结构异常清晰:

用 3 行 Python 代码实现的 Streamlit 交互式应用程序。

3. 高效重用数据和计算

当需要处理大量数据或执行复杂计算时,关键在于如何在多次运行中安全地重用信息。Streamlit 引入了缓存机制(cache primitive),它充当一个持续且不可变的默认数据存储器,确保 Streamlit 应用程序能够轻松、安全地重用信息。例如,以下代码仅从 Udacity 自动驾驶项目(https://github.com/udacity/self-driving-car)中下载一次数据,即可快速构建一个简单的应用程序:

使用 st.cache 在 Streamlit 多次运行中保存数据。代码运行示例,请参考: https://gist.github.com/treuille/c633dc8bc86efaa98eb8abe76478aa81#gistcomment-3041475。

运行上述 st.cache 示例的输出结果。

简而言之,Streamlit 的工作流程如下:

每次用户交互都会触发整个脚本的重新运行。Streamlit 根据 Widget 的状态为每个变量分配最新值。缓存机制确保 Streamlit 重用数据和计算结果。如下图所示:

用户交互事件触发 Streamlit 从头开始重新运行脚本。不同运行周期中仅保留缓存的数据。

感兴趣的开发者可以立即尝试!只需运行以下命令:

网页浏览器将自动打开,并自动跳转到本地 Streamlit 应用程序。如果未自动打开浏览器窗口,请点击提供的链接。

这些理念简洁而高效,使用 Streamlit 不会妨碍你创建功能丰富、实用性强的应用程序。我在 Zoox 和 Google X 工作期间,目睹了自动驾驶汽车项目从处理数 G 级别的视觉数据,到需要搜索和理解这些数据,再到在图像数据上运行模型并对比性能的过程。我观察到,几乎每个自动驾驶汽车项目都拥有专门团队负责开发相关工具。

在 Streamlit 中构建此类工具极为简单。以下 Streamlit 演示程序能够对整个 Udacity 自动驾驶汽车照片数据集执行语义搜索,可视化人类标注的真值标签,并在应用程序内实时运行完整的神经网络(YOLO)。

这个由 300 行 Python 代码构建的 Streamlit 演示程序,巧妙地结合了语义视觉搜索和交互式神经网络推理功能。

整个应用程序仅包含 300 行 Python 代码,其中大部分是机器学习相关的代码。实际上,整个应用程序中仅使用了 23 次 Streamlit 调用。你可以亲自尝试:

在与机器学习团队合作,为他们的项目贡献力量时,我们逐渐意识到这些简单理念能够带来显著的价值:

纯 Python 代码可以与 Git 等版本控制工具无缝集成,包括提交(commits)、拉取请求(pull requests)、问题(issues)和评论(comments)。由于 Streamlit 的底层语言是 Python,因此你可以免费享受这些协作工具带来的便利。

Streamlit 应用程序作为 Python 脚本,可以轻松使用 Git 进行版本控制。

Streamlit 提供即时模式的编程环境。当 Streamlit 检测到源文件变更时,只需点击「始终重新运行」(Always rerun)即可。

点击「始终重新运行」,开启实时编程模式。

缓存机制简化了计算流程。一系列缓存函数能够自动构建高效的计算流程!你可以尝试以下代码:

Streamlit 中的简单计算流程。运行上述代码,请参考说明: https://gist.github.com/treuille/ac7755eb37c63a78fac7dfef89f3517e#gistcomment-3041436。

基本上,该流程涉及从加载元数据到创建摘要等步骤(load_metadata → create_summary)。每次运行时,Streamlit 仅需重新计算该流程的子集即可。

为了保证应用程序的响应性,Streamlit 仅计算更新 UI 所必需的部分。

Streamlit 兼容 GPU。Streamlit 能够直接访问机器级原语(如 TensorFlow、PyTorch),并对这些库进行补充。例如,以下演示程序中,Streamlit 的缓存机制存储了整个英伟达 PGGAN 模型。这种方法使得用户在更新左侧滑块时,应用程序能够执行近乎即时的推理。

该 Streamlit 应用程序展示了英伟达 PGGAN 的实际效果。

Streamlit 是一款免费开源库,而非私有的网络应用程序。你可以本地部署 Streamlit 应用程序,无需事先联系开发者。你甚至可以在不联网的情况下,在笔记本电脑上本地运行 Streamlit。此外,现有项目也可以逐步采用 Streamlit。

逐步采用 Streamlit 的几种方法。

以上只是 Streamlit 功能的一部分。它最令人兴奋的特点是,这些原语能够轻松组合成复杂的应用程序,但看起来却只是简单的脚本。这涉及到架构运作原理和功能,本文暂不深入探讨。

Streamlit 组件示意图。

我们非常高兴与社区分享 Streamlit,并期望它能帮助大家轻松将 Python 脚本转化为美观且实用的机器学习应用程序。

今天,我们向大家介绍一本名为《Python 进阶》的书籍,它是《Intermediate Python》的中文译本。这本书具有以下优点:简洁、易读、易译。这些都不是重点,重点是:它是一本能够激发思维的书。无论你是 Python 初学者,还是 Python 高手,它所展现给你的永远是 Python 中的精华。

特点

每个章节都非常精简,只需 5 分钟即可阅读完毕,用最简洁的例子清晰地阐述原理。每个章节都会通过提问,引导读者主动思考答案。每个章节都会引导读者进行延伸阅读,让有兴趣的读者能够进一步拓展知识。每个章节都是独立的,你可以自由选择任意章节开始阅读,不受限制。资料获取方法