本文由 「AI前線」原創,原文連結:Keras作者力推開源框架Lore:15分鐘搞定深度學習模型從配置到部署
作者|Montana Low
譯者|Debra
編輯|Emily
AI 前線導讀:今天,Keras 的作者 Francois Chollet 轉推了一篇文章,教大家基於開源框架 Lore 在 15 分鐘內建立深度學習模型,用 Python 配置、構建、部署和維護深度學習模型。真的能在這麼短的時間內構建深度學習模型嗎?我們來一探究竟。
隨著 Instacart 的發展,我們學到了一些知識,但是獲取知識的方法卻並不簡單。我們的開源框架 Lore ,可以讓工程師距離機器學習更進一步,而且機器學習研究人員也可以操作。
開源框架 Lore 連結:
機器學習一般給人的印象是這樣的:
呃,這張紙並沒有告訴我它的工作方式......
常見問題
- 當你在 Python 或 SQL 等高層級編寫定製程式碼時,很容易觸及效能瓶頸。
- 程式碼複雜性增大的原因在於有價值的模型是多次迭代變化的結果,因此隨著程式碼以非結構化方式演變,個人會感覺到力不從心。
- 隨著資料和庫的依賴關係不斷變化,可重複性將受到影響。
- 當我們努力跟上最新的論文、元件、功能和錯誤的腳步時,資訊過載很容易導致錯過新的容易實現的目標。對於剛進入該領域的人來說,情況會更加糟糕。
為了解決這些問題,我們正在對 Lore 中的機器學習進行標準化。在 Instacart,我們的三個團隊正在使用 Lore 進行機器學習開發,目前已經可以執行十幾種 Lore 模型。
TLDR
以下是在沒有上下文的情況下進行快速預測的演示,你可以從 github 複製my_app
。如果想了解全程,請跳至大綱。
$ pip3 install lore
$ git clone https://github.com/montanalow/my_app.git
$ cd my_app
$ lore install # caching all dependencies locally takes a few minutes the first time
$ lore server &
$ curl "http://localhost:5000/product_popularity.Keras/predict.json?product_name=Banana&department=produce"
複製程式碼
功能規格
在 15 分鐘內將自己的深度學習專案投入生產,你就能充分體會到 Lore 的優勢在哪裡了。如果你想在編寫程式碼之前檢視一下功能規格,請參閱以下簡要概述:
- 模型 支援使用資料管道對估算器進行超引數搜尋。他們將有效地利用多個 GPU(如果可用)和兩種不同的策略,並且因水平可伸縮性可以儲存和分發。
- 支援來自多個軟體包的 估算器:Keras、XGBoost 和 SciKit Learn。它們都可以通過構建、除錯或預測覆蓋來進行分類,以完全自定義你的演算法和架構,同時還可以從其他很多方面受益。
- 管道 可以避免訓練和測試之間的資訊洩漏,一條管道可以用許多不同的估算器進行實驗。如果機器可用 RAM 空間不夠,則可使用基於磁碟的管道。
- 轉化器對高階功能程式設計進行標準化。例如,根據美國人口普查資料將美國名字轉換為其統計年齡或性別;從自由格式的電話號碼字串中提取地理區號;pandas 可有效支援常見的日期、時間和字串操作。
- 編碼器 為估算器提供足夠的輸入,並可以避免常見的缺失和長尾值問題。經過充分測試,它們可以幫助你節省從垃圾中檢索資訊的精力。
- 對於流行的 (No)SQL 資料庫,整個應用程式以標準化的方式配置 IO 連線,對批量資料進行交易管理和讀寫優化,而不是使用典型的 ORM 操作。除了用於分發模型和資料集的加密 S3 儲存桶之外,連線還共享一個可配置的查詢快取。
- 對開發中的每個應用程式進行依賴關係管理,並可以 100%複製到生產環境中。無需手動啟用,沒有破壞 Python 的環境變數或隱藏的檔案。無需 venv、pyenv、pyvenv、virtualenv、virtualenvwrapper、pipenv、conda 相關知識,不用在這種事情上費心。
- 可以在自己的持續整合環境中進行模型 測試,支援程式碼和訓練更新持續部署,而無需增加基礎架構團隊的工作量。
- 工作流程支援 命令列、Python 控制檯、jupyter 筆記本或 IDE。每個環境都可以為生產和開發配置可讀的日誌和時序語句。
15 分鐘構建深度學習框架大綱
只要懂得基本的 Python 知識,就可以開始這個任務了。如果你的機器不能進行學習,就可以用剩下的時間好好探索機器學習的複雜性。
- 建立一個新應用(3 分鐘)
- 設計模型(1 分鐘)
- 生成框架(2 分鐘)
- 管道部署(5 分鐘)
- 測試程式碼(1 分鐘)
- 訓練模型(1 分鐘)
- 投入生產(2 分鐘)
建立一個新的應用程式
Lore 獨立管理每個專案的依賴關係,以避免與你的系統 Python 或其他專案發生衝突。將 Lore 以標準的 pip 軟體包安裝:
# On Linux
$ pip install lore
# On OS X use homebrew python 2 or 3
$ brew install python3 && pip3 install lore
複製程式碼
當你無法建立相同的環境時,就很難重複別人的工作。 Lore 保留你的作業系統 Python 的工作方式,以防止依賴性錯誤和專案之間發生衝突。每個 Lore 應用程式都有它自己的目錄,有自己的 Python 安裝,以及把各自需要的依賴關係鎖定到 runtime.txt 和 requirements.txt 中的特定版本。這使得分享 Lore 應用程式的效率更高,並使我們的機器學習專案向避免重複性方面邁進了一步。
安裝 Lore 後,你就可以建立一個新的深度學習專案應用程式。Lore 預設是模組化的,因此我們需要指定keras
來安裝此專案的深度學習依賴項。
$ lore init my_app --python-version=3.6.4 --keras
複製程式碼
設計模型
我們將演示如何建立一個模型,僅根據名稱和所屬的分類預測商品在 Instacart 網站上受歡迎的程度。世界各地的製造商都會測試各種類產品的名稱,零售商則通過優化產品以最大限度地提高產品的吸引力。我們這個簡單的人工智慧將提供相同的服務。
機器學習最難的挑戰之一就是獲取優質資料。幸運的是,Instacart 已經為此任務公開了 300 萬份匿名貨物訂單,並重新進行調整。然後,我們可以將問題建立成一個監督式學習迴歸模型,該模型根據 2 個特徵預測年銷售量:產品名稱和分類。
請注意,我們將建立的模型僅用於演示,並無沒有實際用途。我們給好奇的讀者提供了一個很好的模型,僅供練習。
生成框架
$ cd my_app
$ lore generate scaffold product_popularity --keras --regression --holdout
複製程式碼
每個 Lore 模型包括一個用於載入和編碼資料的管道,以及一個部署特定機器學習演算法的估算器。這個模型有趣的地方在於類別生成實現過程的細節。
整個過程從左側的原始資料開始,並將其編碼為右側所需的形式。然後使用編碼資料、驗證測試提前終止資料對估算器進行訓練,並在測試集上進行評估。所有內容都可以在模型儲存區進行序列化,然後再次載入資料迴圈進行訓練。
模型工作原理示意圖
管道部署
很少有原始資料完全適用於機器學習演算法。通常我們從資料庫獲得原始資料或下載一個 CSV 檔案,進行調整以適應演算法,然後將其分為為訓練集和測試集。 lore.pipelines
中的基類將此邏輯按照標準化流程執行。
lore.pipelines.holdout.Base
將資料分成訓練、驗證和測試集,並對我們的機器學習演算法進行編碼。我們的子類將負責定義 3 種方法:get_data
,get_encoders
和get_output_encoder
。
Instacart 公佈的資料分佈在多個 csv 檔案中。
管道的get_data
將下載原始 Instacart 資料,並使用 pandas 將其加入到具有(product_name,department)
和對應的銷售總量(sales)
的DataFrame
中:
這是get_data
的部署:
接下來,我們需要為每列指定一個編碼器。電腦科學家可能會認為編碼器是有效機器學習的一種型別註釋形式。有些產品的名字挺好笑,所以我們會選取它們的前 15 個單詞。
這就是整個工作流程。我們的初始估算器將作為 lore.estimators.keras.Regression 的一個簡單子類,它構建了一個具有合理預設值的經典深度學習框架。
# my_app/estimators/product_popularity.py
import lore.estimators.keras
class Keras(lore.estimators.keras.Regression):
pass
複製程式碼
最後,我們的模型通過將它們返回估算器,並從構建的框架中提取資料,來實現深度學習架構的高階屬性。
測試程式碼
生成框架時,該模型會自動進行冒煙測試。第一次執行測試需要多花一些時間來下載 200MB 的測試資料集。最好先處理一下./tests/data
中的檔案快取,將其放入 repo 中,以消除網路依賴,加速測試。
$ lore test tests.unit.test_product_popularity
複製程式碼
訓練模型
訓練模型的資料將快取在./data
中,並將工件儲存在./models
中。
$ lore fit my_app.models.product_popularity.Keras --test --score
複製程式碼
按照第二個終端中的日誌檢視 Lore 的耗時情況。
$ tail -f logs/development.log
複製程式碼
試著新增更多的隱藏圖層,看看是否對模型score
有幫助。你可以編輯模型檔案,或直接通過命令列呼叫屬性以適應 --hidden_layers = 5
。快取資料集可能需要大約 30 秒。
檢查模型的功能
你可以在你的 Lore 環境中執行 jupyter 筆記本。Lore 將安裝一個自定義 jupyter 核心,並使用你建立的應用程式的虛擬 env,用於lore notebook
和lore console
。
瀏覽notebooks / product_popularity / features.ipynb
並“全部執行”以檢視模型最後一次適配的視覺化效果。
“生產”部門被編碼為“20”
可以看到,針對特定功能時,該模型的預測值和測試集(金色)吻合程度很高。在這個案例中,有 21 個種類都達到了很好的重疊效果,除了“produce”這個類別,因為模型沒有完全計算其有多少異常值。
你還可以看到由/ product_popularity / architecture.ipynb
指令碼生成的深度學習框架。
15 個標記名稱通過左側的 LSTM 執行,種類名稱放入右側的嵌入,然後兩者均通過隱藏層。
為模型提供服務
Lore 應用程式可以作為一個本地模型 HTTP API。預設情況下,模型將通過 HTTP GET 端點公開他們的“預測”方法。
我的結果表明,將“有機”新增到“香蕉”,"農產品"的銷量將提高兩倍。 “綠色香蕉”的銷量預計會比“布朗香蕉”差。
投入生產
Lore 可以通過所有支援 Heroku buildpack 的基礎架構進行部署。 部署容器的runtime.txt
和requirements.txt
中的 Buildpacks 安裝有具體規範。如果你想在雲端橫向擴充套件,可以按照 heroku 的入門指南進行操作。
你可以檢視每次在
./models/my_app.models.product_popularity/Keras/
中進行 lore fit 命令的結果。該目錄和./data/
預設位於.gitignore
中,因為你的程式碼可以隨時重建它們。一個簡單的部署策略,是插入所要釋出的模型版本。
$ git init .
$ git add .
$ git add -f models/my_app.models.product_popularity/Keras/1 # or your preferred fitting number to deploy
$ git commit -m "My first lore app!"
複製程式碼
Heroku 可以輕鬆釋出應用程式。這是他們的入門指南。
devcenter.heroku.com/articles/ge…
這是 TLDR:
$ heroku login
$ heroku create
$ heroku config:set LORE_PROJECT=my_app
$ heroku config:set LORE_ENV=production
$ git push heroku master
$ heroku open
$ curl “`heroku info -s | grep web_url | cut -d= -f2`product_popularity.Keras/predict.json?product_name=Banana&department=produce”
複製程式碼
下一步
我們認為這個框架的 0.5 版本為社群一起構建 1.0 版本奠定了堅實的基礎。釋出修補程式版本可以避免重大改動,但次要版本可能會根據社群需求更改功能,棄用舊版本並進行更新升級。
以下是我們計劃在 1.0 版本之前新增的一些功能:
- 帶有視覺化模型 / 估算器 / 特徵分析的 Web UI
- 整合在模型訓練和資料處理期間分散式計算支援,即排隊問題
- 測試不良資料或框架,而不僅僅是損壞的程式碼
- 更多文件、估算器、編碼器和轉換器
- 完整的 Windows 支援
感謝 Jeremy Stanley、Emmanuel Turlay 和 Shrikar Archak 對程式碼的貢獻。
原文連結:
tech.instacart.com/how-to-buil…
更多幹貨內容,可關注AI前線,ID:ai-front,後臺回覆「AI」、「TF」、「大資料」可獲得《AI前線》系列PDF迷你書和技能圖譜。