全文共4706字,預計學習時長9分鐘
本文將介紹一個機器學習工程師專用的應用程式框架Streamlit。
根據自身經驗,每一個非平凡機器學習項目最終都布滿漏洞,其內部工具均難以維護。這些工具通常是由Jupyter Notebook和Flask應用程式拼湊而成,故很難部署,需要對主從式架構進行推理,並且不能很好地與TensorFlow GPU會話等機器學習架構整合。
卡耐基·梅隆大學、伯克利大學、Google X實驗室、Zoox的自動機器人都出現了這一特點。這些工具起初通常是小的Jupyter notebook,包括傳感器校準工具,模擬比較應用程式,雷射雷達對準應用程式,場景回放工具等等。
工具越來越重要,也就需要項目管理。進程推進,需求也越來越多,這些單獨的項目催生了腳本,最後維護將變成人們的噩夢。
如果工具成為主角,就需要組建工具團隊。他們可以編寫絕佳的Vue和React代碼,在筆記本電腦上貼滿聲明性框架的標籤。他們有這樣的一個設計流程:
這流程真是太棒了。但是這些工具都需要新性能,比如每周更新。工具團隊當時還有另外十個項目,他們會說:「兩個月後我們會再次更新你的工具。」
因此需要重新開始構建自己的工具,部署Flask應用程式,編寫HTML、CSS和JavaScript代碼,並對從筆記本到樣式表的所有內容進行版本控制。因此,我和我的Google X老朋友Thiago Teixeira開始思考一個問題:如果可以讓構建工具像編寫Python腳本一樣簡單,會怎麼樣?
我們希望機器學習工程師能夠在不需要工具團隊的情況下創建極佳的應用程式。這些內部工具應該是機器學習工作流的自然副產物。創建這樣的工具應該感覺像是訓練一個神經網絡或執行一個特殊的Jupyter分析!同時,我們希望保留一個強大應用程式框架應有的靈活性。我們想要創造出工程師們可以炫耀的、漂亮的、高性能的工具。基本上,我們的想法是這樣的:
我們擁有一個絕佳的測試社區,其中包括來自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引入了一個緩存原語,它就像一個持久的,默認情況下不變的數據存儲區,可以讓Streamlit應用程式安全地、輕鬆地重用信息。例如,此代碼僅從Udacity自動駕駛汽車項目(https://github.com/udacity/self-driving-car)下載一次數據,從而生成一個簡單快速的應用程式:
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])
使用st.cache在Streamlit運行中持久化數據。若要運行此代碼,請按照說明操作::https://gist.github.com/treuille/c633dc8bc86efaa98eb8abe76478aa81
運行上例的st.cache輸出。
總而言之,Streamlit是這樣工作的:
1. 為每個用戶交互從頭開始運行整個腳本。
2. Streamlit為每個變量配置指定微件狀態的最新值。
3. 緩存允許Streamlit跳過冗餘的數據提取和計算步驟。
圖示:
如果聽起來不錯,現在就可以試試!只需運行:
$ pip install --upgrade streamlit
$ streamlit hello
現在可以在瀏覽器中查看Streamlit應用程式。
本地URL: http://localhost:8501
網絡URL: http://10.0.1.29:8501
屆時會自動彈出一個連結到本地Streamlit應用程式的Web瀏覽器。如果沒有彈出,就單擊連結。
對於分形還意猶未盡嗎嗎?這可能很迷人。
這些想法很簡單,但並不妨礙使用Streamlit創建非常豐富和有用的應用程式。在Zoox和Google X工作期間,我經歷了無人駕駛汽車項目迅速擴充成幾千兆字節的視覺數據,這些數據需要搜索和分析,包括在圖像上運行模型以比較性能。筆者了解的每一個無人駕駛汽車項目最終都會有整個團隊專攻這個工具。
在Streamlit中構建這樣的工具很容易。這個Streamlit演示可以在整個Udacity自動駕駛汽車圖像數據集中進行語義搜索,可視化基於人工標註的地面實況標記,並在應用程式[1]中實時運行完整的神經網絡(YOLO)。
整個應用程式是一個完全獨立的300行Python腳本,其中大部分是機器學習代碼。但事實上,整個應用程式中只有23個Streamlit調用。現在就來親自操作吧!
$ pip install --upgrade streamlit opencv-python
$ streamlit run
https://raw.githubusercontent.com/streamlit/demo-self-driving/master/app.py
在與機器學習團隊合作進行他們的項目時,我們意識到這些簡單的想法有許多明顯的優勢:
Streamlit應用程式是純Python文件。因此可以同時使用自己最喜歡的編輯器和調試器。
純Python腳本可以與Git以及其他原始碼管理軟體協同,包括提交、拉拽請求、問題和注釋。因為Streamlit的底層語言是純Python,所以可以免費享受這些協作工具的帶來的優質體驗。
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中的一個簡單計算流程。若要運行此代碼,請按照說明操作:https://gist.github.com/treuille/ac7755eb37c63a78fac7dfef89f3517e。
一般的程序是load_metadata→create_summary。每次運行腳本時,Streamlit只重新計算所需流程的任何子集,以獲得準確信息。
Streamlit是為GPU構建的。Streamlit允許直接訪問機器原語(如TensorFlow和Pytorch),並對這些庫進行補充。例如,在此演示中,Streamlit的緩存存儲了所有英偉達名人的照片GAN[2]。當用戶更新滑塊時,這種方法幾乎可以即時進行推理。
Streamlit是一個免費的開源庫,而不是一個專營的Web應用程式。可以在不與我們聯繫的情況下在使用Streamlit應用程式的預置軟體,甚至可以在沒有網際網路連接的筆記本電腦上本地運行Streamlit!此外,現有項目也可以採用Streamlit。
這只是對Streamlit功能的一個粗淺的描述。Streamlit最令人興奮的是如何將這些原語輕鬆地組合,實現腳本形式的複雜應用程式。
留言 點讚 關注
我們一起分享AI學習與發展的乾貨
如需轉載,請後臺留言,遵守轉載規範