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

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

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

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

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

開源框架 Lore 連結:

github.com/instacart/l…

機器學習一般給人的印象是這樣的:

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

呃,這張紙並沒有告訴我它的工作方式......

常見問題

  1. 當你在 Python 或 SQL 等高層級編寫定製程式碼時,很容易觸及效能瓶頸。
  2. 程式碼複雜性增大的原因在於有價值的模型是多次迭代變化的結果,因此隨著程式碼以非結構化方式演變,個人會感覺到力不從心。
  3. 隨著資料和庫的依賴關係不斷變化,可重複性將受到影響。
  4. 當我們努力跟上最新的論文、元件、功能和錯誤的腳步時,資訊過載很容易導致錯過新的容易實現的目標。對於剛進入該領域的人來說,情況會更加糟糕。

為了解決這些問題,我們正在對 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 的優勢在哪裡了。如果你想在編寫程式碼之前檢視一下功能規格,請參閱以下簡要概述:

  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 模型包括一個用於載入和編碼資料的管道,以及一個部署特定機器學習演算法的估算器。這個模型有趣的地方在於類別生成實現過程的細節。

整個過程從左側的原始資料開始,並將其編碼為右側所需的形式。然後使用編碼資料、驗證測試提前終止資料對估算器進行訓練,並在測試集上進行評估。所有內容都可以在模型儲存區進行序列化,然後再次載入資料迴圈進行訓練。

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

模型工作原理示意圖

管道部署

很少有原始資料完全適用於機器學習演算法。通常我們從資料庫獲得原始資料或下載一個 CSV 檔案,進行調整以適應演算法,然後將其分為為訓練集和測試集。 lore.pipelines中的基類將此邏輯按照標準化流程執行。

lore.pipelines.holdout.Base 將資料分成訓練、驗證和測試集,並對我們的機器學習演算法進行編碼。我們的子類將負責定義 3 種方法:get_dataget_encodersget_output_encoder

Instacart 公佈的資料分佈在多個 csv 檔案中。

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

管道的get_data將下載原始 Instacart 資料,並使用 pandas 將其加入到具有(product_name,department)和對應的銷售總量(sales)DataFrame中:

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

這是get_data的部署:

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

接下來,我們需要為每列指定一個編碼器。電腦科學家可能會認為編碼器是有效機器學習的一種型別註釋形式。有些產品的名字挺好笑,所以我們會選取它們的前 15 個單詞。

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

這就是整個工作流程。我們的初始估算器將作為 lore.estimators.keras.Regression 的一個簡單子類,它構建了一個具有合理預設值的經典深度學習框架。

# my_app/estimators/product_popularity.py

import lore.estimators.keras


class Keras(lore.estimators.keras.Regression):
    pass
複製程式碼

最後,我們的模型通過將它們返回估算器,並從構建的框架中提取資料,來實現深度學習架構的高階屬性。

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


測試程式碼

生成框架時,該模型會自動進行冒煙測試。第一次執行測試需要多花一些時間來下載 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 秒。

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


檢查模型的功能

你可以在你的 Lore 環境中執行 jupyter 筆記本。Lore 將安裝一個自定義 jupyter 核心,並使用你建立的應用程式的虛擬 env,用於lore notebooklore console

瀏覽notebooks / product_popularity / features.ipynb並“全部執行”以檢視模型最後一次適配的視覺化效果。

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

“生產”部門被編碼為“20”

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

你還可以看到由/ product_popularity / architecture.ipynb指令碼生成的深度學習框架。

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


15 個標記名稱通過左側的 LSTM 執行,種類名稱放入右側的嵌入,然後兩者均通過隱藏層。

為模型提供服務

Lore 應用程式可以作為一個本地模型 HTTP API。預設情況下,模型將通過 HTTP GET 端點公開他們的“預測”方法。

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

我的結果表明,將“有機”新增到“香蕉”,"農產品"的銷量將提高兩倍。 “綠色香蕉”的銷量預計會比“布朗香蕉”差。

投入生產

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迷你書和技能圖譜。


相關文章