Keras做者力推開源框架Lore:15分鐘搞定深度學習模型從配置到部署

本文由 「AI前線」原創,原文連接: Keras做者力推開源框架Lore:15分鐘搞定深度學習模型從配置到部署
做者|Montana Low
譯者|Debra
編輯|Emily

AI 前線導讀:今天,Keras 的做者 Francois Chollet 轉推了一篇文章,教你們基於開源框架 Lore 在 15 分鐘內創建深度學習模型,用 Python 配置、構建、部署和維護深度學習模型。真的能在這麼短的時間內構建深度學習模型嗎?咱們來一探究竟。python

隨着 Instacart 的發展,咱們學到了一些知識,可是獲取知識的方法卻並不簡單。咱們的開源框架 Lore ,可讓工程師距離機器學習更進一步,並且機器學習研究人員也能夠操做。git

開源框架 Lore 連接:github

github.com/instacart/l…web

機器學習通常給人的印象是這樣的:算法

呃,這張紙並無告訴我它的工做方式......數據庫

常見問題編程

  1. 當你在 Python 或 SQL 等高層級編寫定製代碼時,很容易觸及性能瓶頸。
  2. 代碼複雜性增大的緣由在於有價值的模型是屢次迭代變化的結果,所以隨着代碼以非結構化方式演變,我的會感受到力不從心。
  3. 隨着數據和庫的依賴關係不斷變化,可重複性將受到影響。
  4. 當咱們努力跟上最新的論文、組件、功能和錯誤的腳步時,信息過載很容易致使錯過新的容易實現的目標。對於剛進入該領域的人來講,狀況會更加糟糕。

爲了解決這些問題,咱們正在對 Lore 中的機器學習進行標準化。在 Instacart,咱們的三個團隊正在使用 Lore 進行機器學習開發,目前已經能夠運行十幾種 Lore 模型。json

TLDR緩存

如下是在沒有上下文的狀況下進行快速預測的演示,你能夠從 github 複製my_app。若是想了解全程,請跳至大綱。bash

$ 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 的優點在哪裏了。若是你想在編寫代碼以前查看一下功能規格,請參閱如下簡要概述:

  1. 模型 支持使用數據管道對估算器進行超參數搜索。他們將有效地利用多個 GPU(若是可用)和兩種不一樣的策略,而且因水平可伸縮性能夠保存和分發。
  2. 支持來自多個軟件包的 估算器:Keras、XGBoost 和 SciKit Learn。它們均可以經過構建、調試或預測覆蓋來進行分類,以徹底自定義你的算法和架構,同時還能夠從其餘不少方面受益。
  3. 管道 能夠避免訓練和測試之間的信息泄漏,一條管道能夠用許多不一樣的估算器進行實驗。若是機器可用 RAM 空間不夠,則可以使用基於磁盤的管道。
  4. 轉化器對高級功能編程進行標準化。例如,根據美國人口普查數據將美國名字轉換爲其統計年齡或性別;從自由格式的電話號碼字符串中提取地理區號;pandas 可有效支持常見的日期、時間和字符串操做。
  5. 編碼器 爲估算器提供足夠的輸入,並能夠避免常見的缺失和長尾值問題。通過充分測試,它們能夠幫助你節省從垃圾中檢索信息的精力。
  6. 對於流行的 (No)SQL 數據庫,整個應用程序以標準化的方式配置 IO 鏈接,對批量數據進行交易管理和讀寫優化,而不是使用典型的 ORM 操做。除了用於分發模型和數據集的加密 S3 存儲桶以外,鏈接還共享一個可配置的查詢緩存。
  7. 對開發中的每一個應用程序進行依賴關係管理,並能夠 100%複製到生產環境中。無需手動激活,沒有破壞 Python 的環境變量或隱藏的文件。無需 venv、pyenv、pyvenv、virtualenv、virtualenvwrapper、pipenv、conda 相關知識,不用在這種事情上費心。
  8. 能夠在本身的持續集成環境中進行模型 測試,支持代碼和訓練更新持續部署,而無需增長基礎架構團隊的工做量。
  9. 工做流程支持 命令行、Python 控制檯、jupyter 筆記本或 IDE。每一個環境均可覺得生產和開發配置可讀的日誌和時序語句。

15 分鐘構建深度學習框架大綱

只要懂得基本的 Python 知識,就能夠開始這個任務了。若是你的機器不能進行學習,就能夠用剩下的時間好好探索機器學習的複雜性。

  1. 建立一個新應用(3 分鐘)
  2. 設計模型(1 分鐘)
  3. 生成框架(2 分鐘)
  4. 管道部署(5 分鐘)
  5. 測試代碼(1 分鐘)
  6. 訓練模型(1 分鐘)
  7. 投入生產(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_dataget_encodersget_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 notebooklore console

瀏覽notebooks / product_popularity / features.ipynb並「所有運行」以查看模型最後一次適配的可視化效果。

「生產」部門被編碼爲「20」

能夠看到,針對特定功能時,該模型的預測值和測試集(金色)吻合程度很高。在這個案例中,有 21 個種類都達到了很好的重疊效果,除了「produce」這個類別,由於模型沒有徹底計算其有多少異常值。

你還能夠看到由/ product_popularity / architecture.ipynb腳本生成的深度學習框架。


15 個標記名稱經過左側的 LSTM 運行,種類名稱放入右側的嵌入,而後二者均經過隱藏層。

爲模型提供服務

Lore 應用程序能夠做爲一個本地模型 HTTP API。默認狀況下,模型將經過 HTTP GET 端點公開他們的「預測」方法。

個人結果代表,將「有機」添加到「香蕉」,"農產品"的銷量將提升兩倍。 「綠色香蕉」的銷量預計會比「布朗香蕉」差。

投入生產

Lore 能夠經過全部支持 Heroku buildpack 的基礎架構進行部署。 部署容器的runtime.txtrequirements.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迷你書和技能圖譜。

相關文章
相關標籤/搜索