强大的项目-秒变 Python 脚本为 ML 工具

简介: 强大的项目-秒变 Python 脚本为 ML 工具

痛点


以我的经验来看,每一个不平凡的机器学习项目最终都会使用一个错漏百出的难以维护的内部工具进行缝合。而这些工具(通常是 Jupyter Notebook 或者 Flask App)往往都难以部署,通常需要对客户端和服务器架构进行整合,而且无法与 TesorFlow GPU 等机器学习框架进行很好的结合。


这些问题,我在卡内基-梅隆大学、伯克利、谷歌 X 和后来的 Zoox 构建自动化机器人时就发现了。这些工具通常都产生于 Jupyter Notebook 笔记本当中,例如:传感器校准工具、模型比较程序、LIDAR 校准程序和场景重播工具等等。


接下来慢慢随着项目的变迁,产品经理开始介入,一些独立的项目开始孕育成脚本,并逐渐成为了繁琐的难以维护的项目。

而当工具变得越来越重要时,就产生了工具团队,他们书写 Vue 或 React,并有一套自身的设计流程

现在看起来很棒!但是这些工具都是需要新功能的,比如每周一次更新。可是工具团队可能在同时支撑10个项目,他们也许会告诉你:“我们会在两个月内完成这个工具的更新。”


所以我们不得不再次回到自己构建工具的道路上,部署 Flask 程序,编写 HTML、CSS 和 JavaScript 代码,以及尝试对所有项目代码进行版本控制。所以我的朋友和我开始思考:如果我们能够使得构建工具像编写 Python 脚本那样容易,那该有多好?


我们的愿景是希望机器学习工程师在无需工具团队的情况下就能够创建出精美的工具应用程序。这些内部工具应该作为 ML 工作流程的自然产物出现,编写此类工具应该就像在 Jupyter Noebook 中训练神经网络一样简单。同时我们还希望保留功能强大的应用程序框架的灵活性,我们想要创建出工程师可以炫耀的,漂亮的,高性能的工具。基于以上,我们设想的流程如下:

现在我们已经拥有了一个了不起的 Beta 社区,包括了来自 Uber、Twitter、Stitch Fix 和 Dropbox 等知名企业的工程师。我们花费了一年的时间,为 Stream ML 创建了一个完全免费开源的应用程序框架 Streamlit。对于每个原型,Streamlit 的核心原理都很简单

Streamlit 核心



拥抱 Python 脚本



Streamlit 应用程序实际上就是从上到下运行的脚本,它没有任何的隐藏状态,你也可以通过函数调用来分解代码。如果你知道如何编写 Python 脚本,那么你就可以轻松的编写 Streamlit 程序。例如:

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



视组件为变量



在 Streamlit 中是没有回调函数的,每一次交互都只是简单的从上至下运行脚本,这种方式可以产生非常干净的代码


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




重用数据和计算



如果你需要大量的数据或需要复杂的计算怎么办?其关键就是跨运行安全的重用信息。Streamlit 引入了一种缓存机制,可以让 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 的工作流程如下:

1. 对于每个用户的交互行为,整个脚本都是从头开始执行的

2. 在给定组件状态的情况下,为每个变量分配一个新值

3. 缓存允许 Streamlit 跳过冗余的数据获取和计算

开始使用

如果这些听起来很有趣,那么下面就可以立即尝试下了


$ pip install --upgrade streamlit
$ streamlit hello
   You can now view your Streamlit app in your browser.
   Local URL: http://localhost:8501
   Network URL: http://10.0.1.29:8501


这个命令会自动通过本地浏览器打开 Streamlit 程序,如果没有,那么需要手动输入。

OK,你从模型的游戏中回来了吗,这些可能会令人着迷。


在 Streamlit 中构建这样的工具是非常容易的。在这个演示 Streamlit 程序中,你可以在整个 Udacity 无人驾驶汽车照片数据集中执行语义搜索,可视化带有人工标注的地面标签,并从应用程序中实时运行完整的神经网络。




整个应用程序是一个完全自包含的300行 Python脚本,其中大多数都是机器学习代码。实际上,整个程序中,只有23个 Streamlit 的调用,可以使用如下命令运行这个演示示例

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



Streamlit 的优点



1. Streamlit 是纯 Python 文件,正因为如此,你可以在 Streamlit 中使用任何你喜欢的编辑器和调试器。



2. 与 Git 或其他代码控制软件无缝配合。

3. Streamlit 提供了实时编辑模式,当 Streamlit 检测到源文件有修改时,只需要单击重新运行按钮,就可以加载最新的文件代码


4. 缓存简化了计算管道的设置,缓存的功能会自动创建高效的计算管道。


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)


事实上,所谓的管道就是 load_metadata -> create_summary。每次运行脚本,Streamlit 都会重新计算需要正确答案的管道子集。



5. Streamlit 是为 GPU 而创建的,Streamlit 允许直接访问机器级别原语,例如:TensorFlow 和 PyTorch,并做了相应补充。


在示例中,Streamlit 缓存了整个 NVIDIA 的名人头像,当用户更新滑动块时,就可以实现瞬时推断



6. Streamlit 是一个免费的开源库,而不是一个专门的 web 程序。你可以在自己本地轻松的运行 Streamlit,并且可以逐步把老的项目切换至 Streamlit

很高兴能够与社区一起共享 Streamlit,并看到大家使用它来构建新的东西。我们也希望你能够在将 Python 脚本转换为 ML 应用中找到应有的快乐。


原文地址:https://towardsdatascience.com/coding-ml-tools-like-you-code-ml-models-ddba3357eace

相关文章
|
23天前
|
安全 网络安全 文件存储
思科设备巡检命令Python脚本大集合
【10月更文挑战第18天】
57 1
思科设备巡检命令Python脚本大集合
|
19天前
|
关系型数据库 MySQL 数据库连接
python脚本:连接数据库,检查直播流是否可用
【10月更文挑战第13天】本脚本使用 `mysql-connector-python` 连接MySQL数据库,检查 `live_streams` 表中每个直播流URL的可用性。通过 `requests` 库发送HTTP请求,输出每个URL的检查结果。需安装 `mysql-connector-python` 和 `requests` 库,并配置数据库连接参数。
116 68
|
3天前
|
存储 Python
Python自动化脚本编写指南
【10月更文挑战第38天】本文旨在为初学者提供一条清晰的路径,通过Python实现日常任务的自动化。我们将从基础语法讲起,逐步引导读者理解如何将代码块组合成有效脚本,并探讨常见错误及调试技巧。文章不仅涉及理论知识,还包括实际案例分析,帮助读者快速入门并提升编程能力。
13 2
|
4天前
|
运维 监控 Python
自动化运维:使用Python脚本简化日常任务
【10月更文挑战第36天】在数字化时代,运维工作的效率和准确性成为企业竞争力的关键。本文将介绍如何通过编写Python脚本来自动化日常的运维任务,不仅提高工作效率,还能降低人为错误的风险。从基础的文件操作到进阶的网络管理,我们将一步步展示Python在自动化运维中的应用,并分享实用的代码示例,帮助读者快速掌握自动化运维的核心技能。
14 3
|
10天前
|
缓存 运维 NoSQL
python常见运维脚本_Python运维常用脚本
python常见运维脚本_Python运维常用脚本
15 3
|
10天前
|
数据采集 JSON 数据安全/隐私保护
Python常用脚本集锦
Python常用脚本集锦
13 2
|
10天前
|
运维 监控 应用服务中间件
自动化运维:如何利用Python脚本提升工作效率
【10月更文挑战第30天】在快节奏的IT行业中,自动化运维已成为提升工作效率和减少人为错误的关键技术。本文将介绍如何使用Python编写简单的自动化脚本,以实现日常运维任务的自动化。通过实际案例,我们将展示如何用Python脚本简化服务器管理、批量配置更新以及监控系统性能等任务。文章不仅提供代码示例,还将深入探讨自动化运维背后的理念,帮助读者理解并应用这一技术来优化他们的工作流程。
|
12天前
|
弹性计算 Linux iOS开发
Python 虚拟环境全解:轻松管理项目依赖
本文详细介绍了 Python 虚拟环境的概念、创建和使用方法,包括 `virtualenv` 和 `venv` 的使用,以及最佳实践和注意事项。通过虚拟环境,你可以轻松管理不同项目的依赖关系,避免版本冲突,提升开发效率。
|
12天前
|
运维 监控 Linux
自动化运维:如何利用Python脚本优化日常任务##
【10月更文挑战第29天】在现代IT运维中,自动化已成为提升效率、减少人为错误的关键技术。本文将介绍如何通过Python脚本来简化和自动化日常的运维任务,从而让运维人员能够专注于更高层次的工作。从备份管理到系统监控,再到日志分析,我们将一步步展示如何编写实用的Python脚本来处理这些任务。 ##
|
17天前
|
JSON 测试技术 持续交付
自动化测试与脚本编写:Python实践指南
自动化测试与脚本编写:Python实践指南
22 1