如何在15分鐘內建立一個深度學習模型?
AiTechYun
編輯:xiaoshan
我們正在開源Lore,它是一個框架,可供機器學習研究人員使用。
Lore地址:https://github.com/instacart/lore
機器學習常常給人一種這樣的感覺:
論文沒有告訴我該如何工作……
常見問題
當你在Python或SQL等高層次編寫定製代碼時,性能瓶頸很容易受到影響。
代碼複雜性增長的原因在於有價值的模型是多次迭代變化的結果,因此隨著代碼以非結構化方式演變,使得個人洞察更難以維護和溝通。
隨著數據和庫依賴性不斷變化,可重複性受到影響。
信息過載使得在嘗試試驗最新論文,軟體包,特徵,修改錯誤時,很容易錯過最新可用的輕鬆實現目標的方法…對於剛進入該領域的人來說,情況更糟糕。
為了解決這些問題,我們將Lore中的機器學習標準化。在Instacart,我們三個團隊使用Lore進行所有新的機器學習開發,目前我們正在運行十幾種Lore模型。
TLDR
如果你想要一個超級快速的在沒有上下文的情況下進行預測的演示服務,你可以從github複製can。 如果你想要了解整個過程,請跳至15分鐘概要部分(如下)。
ip3 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分鐘內將自己的深度學習項目投入生產。如果你想在查看終端與開始編寫代碼之前查看特徵參數,請閱讀以下簡要概述:
模型支持使用數據Pipeline對估計器進行超參數搜索。他們將有效地利用帶有兩種不同策略的多個GPU(如果可用),並且水平可伸縮性可以保存和分發。
支持來自多個軟體包的估計器:Keras,XGBoost和SciKit Learn。它們都可以通過build, fit 或 predict覆蓋來進行分類,以完全自定義你的演算法和架構,同時還可以從其他任何方面受益。
Pipeline可以避免訓練和測試集之間的信息泄漏,一條Pipeline可以用許多不同的估計器進行實驗。如果超過了機器的可用RAM,則可使用基於磁碟的Pipeline。
變壓器標準化先進的特徵工程。例如,使用美國人口普查數據將名字轉換為其統計年齡或性別。從自由形式的電話號碼字元串中提取地理區號。常見的日期,時間和字元串操作通過pandas得到有效支持。
編碼器為估計器提供強大的輸入,並避免常見的缺失和長尾值問題。它們經過了充分測試,可以幫助你將垃圾排除出去。
對於流行的(無)sql資料庫,通過應用程序以標準方式配置和連接IO連接,對批量數據進行事務管理和讀寫優化,而不是典型的ORM單行操作。連接共享一個可配置的查詢緩存,除了用於分發模型和數據集的加密的S3存儲器之外。
開發中每個應用程序的依賴管理,可以100%複製到生產環境中。沒有打破python的手動激活,魔法環境變數或隱藏的文件。不需要venv,pyenv,pyvenv,virtualenv,virtualenvwrapper,pipenv,conda的知識。
模型測試可以在持續集成環境中運行,允許持續部署進行代碼和訓練更新,而無需增加基礎架構團隊的工作量。
工作流支持你是否喜歡命令行,Python控制台,jupyter notebook或IDE。每個環境都可以為生產和開發配置可讀的日誌和時序語句。
15分鐘概要
基本的python知識是必需的。如果你的機器拒絕學習,你可以在接下來的一年裡探索錯綜複雜的機器學習。
1. 創建一個新的應用程序 (3分鐘)
2. 設計一個模型 (1分鐘)
3. 生成一個支架(2分鐘)
4. 實現一個Pipeline5分鐘)
測試代碼(1分鐘)
1. 訓練模型(1分鐘)
2. 部署到生產環境(2分鐘)
1)創建一個新的應用程序
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安裝,只需將它的依賴關係鎖定到和的指定版本中。 這使得分享Lore應用程序的效率更高,並使我們向機器學習項目邁進了一步。
通過安裝Lore,你可以創建一個新的深度學習項目應用程序。Lore默認是模塊化和小變更(slim),因此我們需要指定來安裝此項目的深度學習依賴項。
$ lore init my_app --python-version=3.6.4 --keras
2)設計一個模型
對於demo,我們將建立一個模型,以預測Instacart網站上的產品僅基於其名稱和我們的參與將會產生多大的受歡迎程度。世界各地的製造商用各個不同的焦點小組測試產品名稱,同時零售商優化其產品以最大限度地提高吸引力。我們的簡的單人工智慧將提供相同的服務,因此零售商和製造商可以更好地了解商品在新市場中的銷售。
機器學習最難的部分之一就是獲取優質數據。幸運的是,Instacart已經發布了300萬份匿名雜貨訂單,我們將重新調整這項任務。然後,我們可以將我們的問題形成一個監督學習回歸模型,該模型根據2個特徵預測年銷售量:產品名稱和部門。
請注意,我們將建立的模型僅用於說明目的 – 事實上,它很糟糕。
3)生成一個支架
$ cd my_app$ lore generate scaffold product_popularity --keras --regression --holdout
每個lore模型都包含一個用來裝載和編碼數據的Pipeline,以及實現特定機器學習演算法的估計器。模型中有趣的部分是生成類的實現細節。
Pipeline從左側的原始數據開始,並將其編碼到右邊的期望型式中。然後使用編碼的數據對估計器進行訓練,在驗證集中進行早期停止,並在測試集上進行評估。所有的東西都可以序列化到模型存儲中,然後再載入一個liner進行部署。
通過它的生命周期剖析一個模型
4)實施Pipeline
非常適合機器學習演算法的原始數據很少見。通常我們從資料庫載入它或下載一個CSV文件,對演算法進行適當的編碼,然後將其分解為訓練集和測試集。中的基本類別將此邏輯封裝在標準工作流程中。
將我們的數據分割成訓練,驗證和測試集,並對我們的機器學習演算法進行編碼。我們的子類將負責定義3個方法:
methods:,, 和。
Instacart發布的數據分布在多個csv文件中,如資料庫表。
我們Pipeline的將下載原始Instacart數據,並使用pandas將其加入到具有以總單位為特徵(product_name, department)和響應(sales)的DataFrame中,例如:
下面是:
# my_app/pipelines/product_popularity.py part 1import osfrom lore.encoders import Token, Unique, Normimport lore.ioimport lore.pipelinesimport lore.envimport pandasclass Holdout(lore.pipelines.holdout.Base): # You can inspect the source data csv"s yourself from the command line with: # $ wget https://s3.amazonaws.com/instacart-datasets/instacart_
online_grocery_shopping_2017_05_01.tar.gz # $ tar -xzvf instacart_online_grocery_shopping_2017_05_01.tar.gz def get_data(self): url = "https://s3.amazonaws.com/instacart-datasets/instacart_online_
grocery_shopping_2017_05_01.tar.gz" # Lore will extract and cache files in lore.env.data_dir by default lore.io.download(url, cache=True, extract=True) # Defined to DRY up paths to 3rd party file hierarchy def read_csv(name): path = os.path.join( lore.env.data_dir, "instacart_2017_05_01", name + ".csv") return pandas.read_csv(path, encoding="utf8") # Published order data was split into irrelevant prior/train # sets, so we will combine them to re-purpose all the data. orders = read_csv("order_products__prior") orders = orders.append(read_csv("order_products__train")) # count how many times each product_id was ordered data = orders.groupby("product_id").size().to_frame("sales") # add product names and department ids to ordered product ids products = read_csv("products").set_index("product_id") data = data.join(products) # add department names to the department ids departments = read_csv("departments").set_index("department_id") data = data.set_index("department_id").join(departments) # Only return the columns we need for training data = data.reset_index() return data[["product_name", "department", "sales"]]
接下來,我們需要為每列指定一個編碼器。計算機科學家可能會認為編碼器是有效機器學習的一種類型注釋的形式。有些產品的名字長得可笑,所以我們會將它們截斷為前15個單詞。
# my_app/pipelines/product_popularity.py part 2 def get_encoders(self): return ( # An encoder to tokenize product names into max 15 tokens that # occur in the corpus at least 10 times. We also want the # estimator to spend 5x as many resources on name vs department # since there are so many more words in english than there are # grocery store departments. Token("product_name", sequence_length=15, minimum_occurrences=10,
embed_scale=5), # An encoder to translate department names into unique # identifiers that occur at least 50 times Unique("department", minimum_occurrences=50) ) def get_output_encoder(self): # Sales is floating point which we could Pass encode directly to the # estimator, but Norm will bring it to small values around 0, # which are more amenable to deep learning. return Norm("sales")
這是Pipeline的問題。我們的開始估計器將是的一個簡單的子類,它實現一個值典型的帶有合理默認的深度學習架構。
# my_app/estimators/product_popularity.pyimport lore.estimators.kerasclass Keras(lore.estimators.keras.Regression): pass
最後,我們的模型通過將它們委託給估計器,指定了深度學習體系結構的高級屬性,並從我們創建的Pipeline中提取數據。
# my_app/models/product_popularity.pyimport lore.models.kerasimport my_app.pipelines.product_popularityimport my_app.estimators.product_popularityclass Keras(lore.models.keras.Base): def __init__(self, pipeline=None, estimator=None): super(Keras, self).__init__( my_app.pipelines.product_popularity.Holdout(), my_app.estimators.product_popularity.Keras( hidden_layers=2, embed_size=4, hidden_width=256, batch_size=1024, sequence_embedding="lstm", ) )
5)測試代碼
當你生成過渡支架時,會自動為該模型創建一個煙霧測試。第一次運行需要一些時間來下載200MB的測試數據集。一個好的做法是減少緩存的文件,並在你的repo中檢查它們,以刪除網路依賴項並加速測試運行。
6) 訓練模型
訓練一個模型將在./data中緩存數據,並在。
$ lore fit my_app.models.product_popularity.Keras --test --score
跟蹤第二個終端的日誌,看看Lore是如何利用它的。
$ tail -f logs/development.log
嘗試添加更多的隱藏層,看看這是否有助於你的模型的。你可以編輯模型文件,或者通過命令行調用來直接傳遞屬性,例如: 。使用緩存的數據集大約需要30秒。
檢查模型的特性
你可以在lore環境中運行jupyter notebooks。Lore將會安裝一個定製的jupyter內核,它將會為你的和,引用你的應用程序的虛擬環境。
$ lore notebook
瀏覽到 並且「運行所有」可以看到模型最後一個擬合的一些可視化效果。
「生產」部門編碼為「20」
你可以看到模型的預測(藍色)是如何跟蹤測試集(金色)的,並對特定的特徵進行聚合。在這種情況下,有21個部門有相當好的重疊,除了「生產」,模型沒有完全解釋異常值是多少。
你還可以看到筆記本電腦上運行筆記本產生的深度學習架構notebooks/product_popularity/architecture.ipynb。
媒體不支持svg,所以這是不可讀的,但notebooks可以
在左邊的LSTM中,有15個標記化的部分,而department name被輸入到右側的嵌入中,然後通過隱藏的層。
服務你的模型
Lore應用程序可以作為一個HTTP API在本地運行。默認情況下,模型將通過HTTP GET端點公開他們的「預測」方法。
$ lore server &$ curl "http://localhost:5000/product_popularity.Keras/predict.json?product_
name=Banana&department=produce"$ curl "http://localhost:5000/product_popularity.Keras/predict.json?product_
name=Organic%20Banana&department=produce"$ curl "http://localhost:5000/product_popularity.Keras/predict.json?product_
name=Green%20Banana&department=produce"$ curl "http://localhost:5000/product_popularity.Keras/predict.json?product_
name=Brown%20Banana&department=produce"
我的結果表明,將「有機」添加到「香蕉」後,我們的「農產品」部門將銷售兩倍以上的水果。「綠色香蕉」預計會比「褐色香蕉」賣得更差。
7)部署到生產
Lore應用程序可以通過任何支持Heroku buildpack的基礎架構進行部署。Buildpacks將runtime.txt和requirements.txt中的規範安裝部署在容器中。如果你想在雲中進行橫向擴展,你可以按照heroku的入門指南進行操作。
你可以看到每次在i中發布命令的結果。該目錄和./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可以很容易地發布一個應用程序。查看他們的入門指南。
指南地址:https://devcenter.heroku.com/articles/getting-started-with-python#introduction
以下是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」
現在你可以用你的heroku應用程序名稱替換http://localhost:5000/,然後你可以從任何地方訪問你的預測!
*或者,你可以和我的heroku應用互動。
應用地址:https://myloreapp.herokuapp.com/product_popularity.Keras/predict.json?product_name=Banana&department=produce
下一個步驟
我們認為0.5版本是與社區一起構建為1.0的堅實基礎。修補程序版本將避免重大更改,但次要版本可能會根據社區需求更改功能。我們將棄用並發布警告,以保持現有應用程序的清晰升級路徑。
下面是我們想在1.0之前添加的一些特性:
用於模型/估計器/特性分析的可視化Web UI;
在模型訓練和數據處理期間集成分散式計算支持,即job queuing;
測試不良數據或體系結構,而不僅僅是損壞的代碼;
更多的文檔,估計器,編碼器和變壓器;
完整的Windows支持。
※谷歌、微軟等合作 提出了一種新的量子光子晶元量子系統結構模擬演算法
TAG:ATYUN訂閱號 |