使用 Streamlit 部署 ML 模型的分步指南
已發表: 2020-12-07目錄
介紹
大多數機器學習愛好者都在報名參加一些課程和課程,以開始使用 AI 和 ML。 這些課程涵蓋了許多基礎知識,並巧妙地指導學習者構建和訓練最先進的 ML 模型。
但是大多數初學者都在努力解決的一件事是部署部分。 機器學習項目不能在沒有任何交互式應用程序的情況下保持原樣。 為了讓用戶能夠輕鬆地與模型交互,甚至展示我們的項目,我們需要將它們包裝到 Web 應用程序、Android 應用程序或使用雲服務的某種 API 結構中。
有多種方法可以為我們的模型構建這些包裝器,但在本文中,我將重點介紹如何使用 Streamlit 作為該問題的解決方案,以及為什麼我認為它是一個如此強大的工具。
本文將提供一步一步的指南,用於構建 ML 項目並使用 Streamlit 為其創建 Web 應用程序平台。 我們將要建設的項目是加州房價預測模型。 該網站將是動態的,學習率、神經元數量等超參數可以通過網絡應用程序進行更改和試驗。
如果您繼續使用 Flask 或 Django 等框架構建這樣的 Web 應用程序,我幾乎可以肯定,首先構建該 UI 將花費大量時間,然後將其託管在服務器上還有另一個問題每個人都可以訪問它。
這裡提出了一個主要問題,“為什麼機器學習愛好者必須把時間浪費在學習一些 UI 框架上,而他們可以利用這些寶貴的時間來學習構建更好的模型?”

這裡將涉及很多關於如何在您的項目中使用 Streamlit 的主題。 隨意跳到您想了解更多的任何部分。
- 為什麼選擇流光?
- 構建基本 ML 模型
- 添加使用魔法的 Streamlit
- 部署 Streamlit Web 應用程序
- 結論
為什麼選擇流光?
Streamlit 讓我們可以非常輕鬆快捷地構建機器學習網絡應用程序。 可用於為 ML 模型開發此類包裝器的其他方法不是很舒服。
Flask是一個 Python 框架,允許用戶開發 Web 應用程序並使用 Python 語言部署它們。 它需要對python有很好的了解,我們也需要花時間學習它。 即使在那之後,與 Streamlit 相比,開發 Web 應用程序也不是一件容易的事。
Django是另一個基於 Python 的 Web 開發框架。 可以說它是 Flask 的一個更好、更複雜的版本。 學習這個框架需要大量的專門時間,最終使用它構建一個 Web 應用程序並沒有我們希望的那麼快。
Tensorflow.js是保存與 Web 平台兼容的模型的非常好的方法,然後這些模型可用於構建 Web 應用程序。 Tensorflow.js 尚不支持 ML 模型和高級架構的許多複雜實現。 有許多模型可以在 Python 中運行,但可能不適用於 Tensorflow.js 庫中的 Javascript。
正如我之前所說,我們不應該浪費時間學習這些框架,而應該學習如何構建好的 ML 模型。 這就是 Streamlit 出現的地方。 它是開發 Web 應用程序的最簡單、最快捷的方式。 使用 Streamlit 構建的 Web 應用程序具有出色的 UI 元素並且非常易於使用。
為了支持我關於 Streamlit 是構建 ML Web 應用程序的最簡單、最快捷的方式的說法,讓我與您分享我是如何遇到這個框架的。 我正在學習如何構建 GAN 並使用它來生成人造人臉、將黑白草圖轉換為彩色草圖以及諸如此類的實現。
這些模型在 Jupyter notebook 中運行良好,但我想與其他人分享。 我開始尋找構建應用程序和託管模型的框架,但我不想浪費時間學習另一個框架,因為我想探索其他 GAN 實現。
我查看了我之前在本文中談到的所有替代資源。 Sketch-To-Color 生成項目中使用的生成器模型有點複雜。 它是一個 U-Net 架構模型,需要您跳過連接。
由於其高度複雜性,我無法使用 Tensorflow.js 將最終模型轉換為 Javascript。 從頭開始學習 Flask 或 Django 對我來說不是一個選擇,所以我開始尋找其他一些框架或庫。
這是我遇到 Streamlit 的時候。 在 Adrien Treuille 的一篇文章中,他展示了他如何用不到 13 行代碼為 TL-GAN 構建了一個令人驚嘆的 Web 應用程序。 這一切都是可能的,只是因為 Streamlit。
他們官方網站上的文檔也非常精確和有用。 我嘗試為我的 Sketch to Color GANs 模型製作一個 Streamlit 網絡應用程序,這太棒了。 我只需要在我現有的 python 代碼中添加 12 行代碼。 這就是為什麼我最終繼續探索 Streamlit 並使用它構建其他項目的原因。
構建基本 ML 模型
如前所述,我們將在此示例中查看加利福尼亞房價預測問題。 首先,讓我們看看我們通常如何為此構建模型。 這是一個回歸問題。
首先,我們將為我們的簡單 ML 模型導入所需的庫。 在這裡,我們將使用 TensorFlow、pandas 和 NumPy。
將張量流導入為 tf
將 numpy 導入為 np
將熊貓導入為 pd
現在,我們將使用來自 Scikit-Learn 的數據集來下載加州住房數據集。
從 sklearn.datasets 導入 fetch_california_housing
住房 = fetch_california_housing()
接下來,我們需要將加載的數據拆分為訓練集、驗證集和測試集。 有很多方法可以做到這一點。 我們將使用 Scikit-Learn 庫中提供的 train_test_split 函數。 使用它兩次會將數據集分為 3 組訓練、驗證和測試。
從 sklearn.model_selection 導入 train_test_split
X_train_full, X_test, y_train_full, y_test = train_test_split(
住房數據,住房目標
)
X_train, X_valid, y_train, y_valid = train_test_split(
X_train_full, y_train_full
)
我們可用的數據有每個條目的經度和緯度值。 為了更好地可視化這一點,我們可以在地圖上製作散點圖。 要使用地圖,我們將導入Altair庫。
將 altair 導入為 alt
map_data = pd.DataFrame(
X_train,
列=[
'醫藥公司',
《宅時代》,
'AveRooms',
'AveBedrms',
'人口',
'AveOccup',
'緯度',
'經度'
])
中點 = (np.average(map_data[“latitude”]), np.average(map_data[“longitude”]))
st.write(pdk.Deck(
map_style="mapbox://styles/mapbox/light-v9",
初始視圖狀態={
“緯度”:中點[0],
“經度”:中點[1],
“縮放”:6,
“音高”:75,
},
層=[
pdk.圖層(
“六邊形層”,
數據=地圖數據,
get_position=[“經度”、“緯度”]、
半徑=1000,
海拔尺度=4,
海拔範圍=[0, 10000],
可挑選=真,
擠壓=真,
),
],
))
我們現在擁有的數據沒有針對模型進行很好的處理。 我們需要進行預處理以獲得更好的結果。 首先,我們需要對值進行歸一化,因為大多數機器學習模型在數據處於較小值範圍內時效果最佳。 為此,我們將使用 sklearn 庫中的 StandardScaler 類。
從 sklearn.preprocessing 導入 StandardScaler
縮放器 = 標準縮放器()
X_train = scaler.fit_transform(X_train)
X_valid = scaler.transform(X_valid)
X_test = scaler.transform(X_test)
準備好數據後,我們現在將創建一個模型。 該模型將是一個神經網絡,在第一輸入層具有指定數量的神經元,在最後一層具有單個神經元,因為它是一個回歸問題。 這可以通過使用 TensorFlow 庫來實現。
將張量流導入為 tf
模型 = tf.keras.models.Sequential([
tf.keras.layers.Dense(n_neurons, activation='relu', input_shape=X_train.shape[1:]),
tf.keras.layers.Dense(1)
])
在 TensorFlow 中,我們必須在構建模型後對其進行編譯。 在這裡,我們必須提到我們將使用的損失函數以及我們想要的優化器。 我們將使用均方誤差損失函數和具有特定學習率的 SGD 優化器。
模型.編譯(
損失='mean_squared_error',
優化器=tf.keras.optimizers.SGD(l_rate)
)
現在一切就緒。 我們所要做的就是訓練模型。 在 TensorFlow 中,這可以通過簡單地調用 fit() 方法來完成。 我們可以將所有日誌保存在變量history中。
歷史 = model.fit(
X_train,
y_train,
epochs=n_epochs,
驗證數據=(X_valid,y_valid)
)
訓練結束後,我們還可以使用 evaluate() 方法評估模型的準確性和損失。
評估 = model.evaluate(X_test, y_test)
現在,如果我們想使用這個模型來預測任何房價,我們可以通過調用方法predict()來完成。
X_new = X_test[:3]
預測 = model.predict(X_new)
這是使用 TensorFlow、scikit-learn 和 pandas 構建簡單房價預測模型的方法。 但是你可以看到的問題是,沒有辦法向其他用戶展示這個模型,他們可以與之交互,這只是 Jupyter Notebook 中的一個模型。 所以現在讓我們用 Streamlit 添加一些魔法!
另請閱讀:機器學習項目理念
使用 Streamlit 添加魔法
要製作機器學習 Web 應用程序,您只需為 Streamlit 函數調用添加幾行代碼即可。 您不需要任何 HTML、CSS 或 Javascript。 只是純蟒蛇!
是的,你沒看錯。 您不必擔心其他任何事情。 只需將 Streamlit 安裝到您的系統上,您就可以開始使用了。 在終端中使用以下命令:
點安裝流光
您可以使用以下命令在他們的 hello world 應用程序中進行探索。 這是一個很好的例子,展示了使用 Streamlit 的 Web 應用程序的外觀。:
流光你好
在本地安裝 Streamlit 並將神奇的行添加到代碼後,您只需執行以下命令即可在本地運行應用程序:
流光運行 file_name.py
所以現在的問題是,“那些神奇的代碼行是什麼?” 它們很簡單。 我將首先解釋 Streamlit 中使用的基本功能,然後我將展示代碼,以便您可以直接將其與示例聯繫起來。
首先,我們將使用以下代碼行導入 streamlit 庫:
導入 streamlit 作為 st
第一個重要功能是您可以簡單地在 3 個雙引號中鍵入任何內容,它只會顯示 Web 應用程序上的文本。 它支持markdown語言語法。 所以你可以做很多事情,比如標題、項目符號、表格等等。 您也可以使用st.write()函數代替此表示法。 它具有相同的功能。
接下來是with st.echo():函數。 這基本上會執行其中編寫的 python 代碼,然後它還會在 Web 應用程序上顯示它。 通過這種方式,我們可以構建一個展示其構建方式的 Web 應用程序。
st.empty()是稍後為某些動態內容保留的區域。
當執行一段代碼有一些延遲時, st.spinner() 會顯示一個加載元素。
st.success()以綠色顯示一條消息。 這具有成功對話的一個很好的設計方面。
st.sidebar()默認在左側邊欄中顯示內容。
st.sidebar.slider()在側邊欄中提供一個滑塊,用於從給定數字範圍內選擇值。 st.sidebar.selectbox()允許您從給定列表中選擇一個值,而Streamlit 還包含更多精彩的功能和特性。 部分功能如下:
- 保存文件時實時更改
- 只需按鍵盤上的 R 即可重新運行應用程序
- 只需按鍵盤上的 C 即可清除緩存
- 錄製網絡應用程序並在本地保存視頻文件以與所有人共享
…以及更多
必讀:機器學習職業
代碼
導入 streamlit 作為 st
將 altair 導入為 alt
將 pydeck 導入為 pdk
train_area = st.empty()
“”
# 加州房價
這是加利福尼亞房價數據集,其中包含來自 1990 年美國人口普查的數據。 下表提供了數據集中每個特徵的描述、數據范圍和數據類型。
##我們先來看看imports

“”
使用 st.echo():
將張量流導入為 tf
將 numpy 導入為 np
將熊貓導入為 pd
“”
## 加載數據集
我們將使用 scikit-learn 的數據集模塊來引導已經為我們清理過且僅具有數字特徵的數據。
“”
使用 st.echo():
從 sklearn.datasets 導入 fetch_california_housing
住房 = fetch_california_housing()
“”
這會將整個數據加載到 `housing` 變量中,如下所示
“”
st.subheader('輸入特徵')
住房數據
st.subheader('輸出標籤')
住房.目標
“”
## 將數據拆分為訓練集、測試集和開發集
這是任何機器學習解決方案開始時最重要的事情之一,因為任何模型的結果都很大程度上取決於您將數據分配到這些集合中的程度。
對我們來說幸運的是,我們有 scikit-learn 來拯救它,它變得像 2 行代碼一樣簡單。
“”
使用 st.echo():
從 sklearn.model_selection 導入 train_test_split
X_train_full, X_test, y_train_full, y_test = train_test_split(
住房數據,住房目標
)
X_train, X_valid, y_train, y_valid = train_test_split(
X_train_full, y_train_full
)
“”
`train_test_split()` 函數將數據分成 2 個集合,其中測試集占總數據集的 25%。 我們在 train_full 上再次使用相同的函數將其拆分為訓練集和驗證集。 25% 是默認參數,您可以根據需要對其進行調整。 從 [Scikit-Learn 的文檔](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html) 中查看它。
##看一下火車數據
這些列代表以下數據:
“”
st.write(housing.feature_names)
“”
現在讓我們通過使用緯度和經度值將其繪製在地圖上來查看房屋的位置:
“”
使用 st.echo():
map_data = pd.DataFrame(
X_train,
列=[
'醫藥公司',
《宅時代》,
'AveRooms',
'AveBedrms',
'人口',
'AveOccup',
'緯度',
'經度'
])
中點 = (np.average(map_data[“latitude”]), np.average(map_data[“longitude”]))
st.write(pdk.Deck(
map_style="mapbox://styles/mapbox/light-v9",
初始視圖狀態={
“緯度”:中點[0],
“經度”:中點[1],
“縮放”:6,
“音高”:75,
},
層=[
pdk.圖層(
“六邊形層”,
數據=地圖數據,
get_position=[“經度”、“緯度”]、
半徑=1000,
海拔尺度=4,
海拔範圍=[0, 10000],
可挑選=真,
擠壓=真,
),
],
))
“”
**在按 ALT 鍵的同時隨意放大或拖動以根據需要更改地圖的 3D 視角。**
## 預處理
正如前面所指出的,這個數據集已經被 scikit-learn 很好地預處理了,我們可以直接使用,而不用擔心任何 NaN 值和其他東西。
雖然,我們將通過使用“StandardScaler”來縮放特定範圍內的值,以幫助我們的模型有效地工作。
“”
使用 st.echo():
從 sklearn.preprocessing 導入 StandardScaler
縮放器 = 標準縮放器()
X_train = scaler.fit_transform(X_train)
X_valid = scaler.transform(X_valid)
X_test = scaler.transform(X_test)
“”
## 創建模型
我們將創建一個簡單的序列模型,第一層包含 30 個神經元和 RELU 的激活函數。
下一層將是沒有激活函數的單個神經元層,因為我們希望模型預測一系列值,而不僅僅是分類問題之類的二元或多類結果。
“”
st.sidebar.title('超參數')
n_neurons = st.sidebar.slider('神經元', 1, 128, 30)
l_rate = st.sidebar.selectbox('學習率', (0.0001, 0.001, 0.01), 1)
n_epochs = st.sidebar.number_input('曆元數', 1, 50, 20)
#n_neurons、l_rate 和 _nepochs 是從用戶那裡獲取的用於訓練模型的輸入。 還設置了它們的默認值。 n_neurons 的默認值是 30,l_rate 的默認值是 0.01,n_epochs 的默認值是 20。所以一開始模型將在第一層有 30 個神經元,學習率為 0.01,epoch 數為模型將訓練的對像是 20。
使用 st.echo():
將張量流導入為 tf
模型 = tf.keras.models.Sequential([
tf.keras.layers.Dense(n_neurons, activation='relu', input_shape=X_train.shape[1:]),
tf.keras.layers.Dense(1)
])
“”
##編譯模型
Tensorflow keras API 為我們提供了“model.compile()”函數來為模型分配優化器、損失函數和一些其他細節。
“”
使用 st.echo():
模型.編譯(
損失='mean_squared_error',
優化器=tf.keras.optimizers.SGD(l_rate)
)
“”
## 訓練模型
為了訓練模型,您只需在模型上調用“fit()”函數,並使用訓練和驗證集以及您希望模型訓練的多個時期。
**嘗試使用左側邊欄中的超參數,然後單擊下面給出的“訓練模型”按鈕開始訓練。**
“”
train = st.button('火車模型')
如果火車:
使用 st.spinner('訓練模型...'):
使用 st.echo():
model.summary(print_fn=lambda x: st.write(“{}”.format(x)))
歷史 = model.fit(
X_train,
y_train,
epochs=n_epochs,
驗證數據=(X_valid,y_valid)
)
st.success('模型訓練完成!')
“”
## 模型性能
“”
使用 st.echo():
st.line_chart(pd.DataFrame(history.history))
“”
## 在測試集上評估模型
另一個重要但簡單的步驟是根據以前從未見過的測試數據評估您的模型。 請記住,只有在您對所構建的模型有足夠的把握之後才應該這樣做,並且在評估測試集上的模型之後,您應該拒絕進行任何超參數調整,因為它只會使測試集變得更好,並且會再次出現當模型將在生產階段看到新數據時,這是一個泛化問題。
“”
使用 st.echo():
評估 = model.evaluate(X_test, y_test)
評估
“”
> 測試集上的這種損失比驗證集上的損失要差一些,這與預期的一樣,因為模型從未見過來自測試集的圖像。
“”
“”
## 使用模型的預測
“”
使用 st.echo():
X_new = X_test[:3]
預測 = model.predict(X_new)
“”
### 預測
“”
預測
“”
### 基本事實
“”
y_test[:3]
就是這樣! 只需幾行額外的代碼,您就已經構建了一個很棒的 Web 應用程序,它看起來很漂亮,並且還具有動態內容。 沒那麼難,不是嗎? 嘗試從他們的文檔中構建不同的項目並使用 Streamlit 的其他功能。 它非常簡單直觀。
閱讀:使用 Python 進行機器學習
部署 Streamlit Web 應用程序
Streamlit Web 應用程序可以通過 Internet 上的各種可用選項直接使用。 我們可以簡單地瀏覽一下它們,看看它是如何完成的。
在進入任何其他可以幫助我們部署 Web 應用程序的平台之前,讓我們看看 Streamlit 可以為我們提供什麼。 他們最近發布的一個功能版本是 Streamlit Sharing。 這允許用戶單擊一下即可部署他們的 Streamlit Web 應用程序。
如果您將代碼上傳到 GitHub 存儲庫,您只需從 Streamlit 的儀表板中選擇存儲庫,它就會自動為您託管。 到目前為止,它非常棒並且完全免費。 部署機器學習 Web 應用程序之前沒有任何更簡單的方法。
Heroku是另一種部署 Streamlit Web 應用程序的好方法。 這樣您就不必選擇任何云服務器,然後在其中設置虛擬實例。 這一切都由 Heroku 負責。
Heroku 有一個簡單的缺點,它的免費版本不允許您在免費版本中擁有超過 512MB 大小的所有包。 我用於項目的 TensorFlow 2.2.0 比指定的空間大一點,所以我不得不使用其他服務。
AWS(亞馬遜網絡服務)也是部署 Streamlit 應用程序的好方法。 對於初學者來說有點複雜,但是當你使用它時,它會變得更容易設置。 他們為新用戶提供免費的 EC2 實例。 您可以使用 Ubuntu 18.04 或更高版本啟動一個並安裝該應用程序所需的所有依賴項。
一切設置好後,您可以使用命令 - streamlit run filename.py 運行應用程序。 在這裡,您將獲得一個可以與所有人共享的公共 URL。 這裡的一個主要缺點是,如果您關閉實例,該應用程序將無法在線使用。 所以免費實例會有一些限制。
如果您在 GitHub 存儲庫中有代碼,還有另一種很酷的方式來託管您的應用程序。 它不是很專業和合法,因為用戶也需要在他們的系統上安裝 Streamlit。
如果 Streamlit 在系統上可用,並且您有 Streamlit 應用程序的 python 文件的鏈接,那麼您只需執行以下命令即可運行 Web 應用程序: streamlit run url 。 如果您安裝了 Streamlit,您可以在本地查看我的應用程序。 在終端中使用以下命令:

流光運行 https://raw.githubusercontent.com/tejasmorkar/housing_price_prediction_aws/master/CaliforniaHousingPrices.py
結論
您已經看到 Streamlit 是多麼簡單而強大。 在此之前我還沒有遇到過這樣的工具,它對我有這麼大的幫助,讓我的開發生活更輕鬆。 所以,這就是為什麼我覺得 Streamlit 是一個令人印象深刻的框架,它可以幫助每個人專注於機器學習開發的重要部分,並幫助我們更多地專注於 AI 和 ML 的主要學習。 這使學習曲線變得更加容易,並使我們能夠輕鬆地構建和部署愛好項目。
使這個框架的實現如此簡單的一件事是他們的官方文檔。 文檔中寫的所有內容都是精確而簡單的。 我建議您應該瀏覽一下文檔並嘗試實施一個新項目。 這是開始使用任何新框架的最佳方式。 在以下鏈接中找到 Streamlit 官方文檔 — https://docs.streamlit.io/en/stable/ target=”_blank” rel=”nofollow” 。
社區始終是學習事物和發現我們解決方案問題的最佳資源。 Streamlit 有一個很棒的論壇,您可以在其中發布有關 Streamlit 應用程序開發過程的任何問題、有關部署、功能請求、錯誤報告以及任何其他可能有助於成功構建應用程序的疑問。 通過以下鏈接加入討論論壇 — https://discuss.streamlit.io/
如果您有興趣了解有關機器學習的更多信息,請查看 IIIT-B 和 upGrad 的機器學習和人工智能 PG 文憑,該文憑專為工作專業人士設計,提供 450 多個小時的嚴格培訓、30 多個案例研究和作業、IIIT- B 校友身份、5 個以上實用的實踐頂點項目和頂級公司的工作協助。
部署機器學習項目的最大困難是什麼?
部署機器學習項目的最大困難是數據收集的不完整。 大多數時候,時間和金錢不足以收集進行準確分析所需的所有數據。 因此,收集的數據必須可靠且質量好。 此外,必須選擇正確的數據。 數據的選擇是項目部署的關鍵。
機器學習中的 Streamlit 是什麼?
Streamlit 是一種用於機器學習的增量算法。 它利用了神經網絡的搜索空間很大,訓練速度快的特點,因此不需要搜索整個空間,而是可以在本地建立一個神經網絡。 StreamLit 是一種用於處理順序數據的長短期內存。 它是一種深度學習算法,使用 RNN 將數據編碼為數字向量。 這些向量可用於表示圖形或文本中的數據。 它還可用於生成自然語言文本。
如何使用 Streamlit 進行部署?
使用 Streamlit 進行部署很簡單。 首先,您必須有一個 Streamlit 帳戶。 其次,您需要可以部署的軟件。 例如,Beanstalk、S3 或 rsync。 第三,您需要為部署準備軟件。 使用 rsync 將您的應用程序複製到您的 Web 服務器。 如果您正在部署一個新網站,那麼該網站就是您複製的目錄。 如果您正在部署現有網站,則上傳的網站就是您複製的目錄。 在屏幕左側下方