摘要: 一份機器學習過來人的經驗清單分享,主要是包含一些關於構建機器學習工做流以及Apache Spark應該注意的一些事項,但願這個清單可以幫助那些正在學習機器學習的相關人員少走一些彎路,節約一些時間。算法
當咱們學習任何一個新的內容或遇到新的事情時,隨着時間的推移,可能回過頭來會發現,當時要是怎樣結果又會怎樣。身邊不少人包括我本身在讀完大學後,發現若是高中再努力一些或從新把大學時間利用好,人生的路途是否是能更順利些……曾經聽一位老師說過「青春就像這樣,無論你怎樣過都會過得一團糟」。事實上,大多數學生沒有利用好時間是因爲沒有明確的方向。同理,對於新入職的員工而言,有一個師父在平時的工做中以他過來人的經驗引導一下,新員工的發展也會更順利些。那麼對於學習機器學習而言,這裏有一份過來人的經驗分享清單,但願這個清單可以幫助那些正在學習機器學習的相關人員少走一些彎路,節約一些時間。數據庫
這份清單主要是包含一些關於構建機器學習工做流以及Apache Spark相關的具體內容。編程
預測是困難的json
對於任何未知的事情,很難對其作出一個準確的時間預測,但咱們會朝着目標前進。然而隨着時間的推移,在努力的過程當中逐漸會出現錯誤,這是因爲咱們沒法預測採用哪一種方法就可以得出好的結果,可以作的只有確保項目組能夠快速地迭代更新。網絡
項目有很大的未知數,請確保團隊可以進行快速迭代更新框架
在開始以前驗證數據是否完整機器學習
當開始使用機器學習管道時,咱們已經收集了大約3年時間的原始數據。但沒有對原始數據作任何處理,只是將其存儲以防萬一。原始數據採用CSV文件形式,此時沒有注意到這些數據存在問題,另外編寫這些文件的代碼會隨着時間的推移而致使一些錯誤。所以在構建機器學習管道的同時,還須要修復形成錯誤的數據問題,最終在Apache Spark中編寫相關的代碼來清理歷史數據。在進行到中間時刻才發現問題,而不是在最初,這無疑增長了項目的難度。分佈式
**在開展工做以前,請確保數據正確工具
對數據進行一次預處理,對構建模型進行一百萬次訓練學習
在最初訓練機器學習模型時,咱們嘗試加載全部的數據。而採用的數據大小是TB級別,若是每次訓練都加載全部數據會致使訓練速度很慢。所以,每次訓練時不須要加載全部的數據,能夠對其作一些預處理,建立一個新的小數據集。此外,並無刪掉原始數據集,將其做爲備份以防後續過程當中出現新的錯誤。
不要將ETL和模型訓練混淆。若是你正在訓練1000個模型且不想執行1000次預處理,能夠只作一次預處理並保存,而後將其用於全部的模型訓練需求。
爲不一樣的團隊成員提供輕易的訪問途徑
在上文說過,咱們將原始數據存儲在AWS S3中備份。當開始使用機器學習開展工做時,發現爲每一個人提供輕鬆地訪問途徑顯得相當重要。只給予讀取權限是不夠的,科研人員不會經過筆記本下載TB級的數據,且不會隨身攜帶筆記本電腦來處理TB級的數據,這隻會浪費每一個人的時間。咱們發現使用支持像Apache Spark這樣環境的Notebook能夠達到這個目的,好比Jupyter、zeepelin等,讀者能夠根據本身的平臺選擇合適的Notebook。
爲小組人員提供訪問TB級數據的途徑,此外必須提供合適的工具使其可以從中很好的理解這些數據,好比Jupyter、zeppelin等這些基於spark集羣的Notebook。
對於大數據而言,監控是必須的
當處理大數據時,傳統的軟件工程方法是不起做用的。通常的程序可能花費幾分鐘就能夠運行完畢,但大數據可能須要幾小時到幾天的時間。與傳統軟件編程相比,如何在大數據狀況下減小批量處理做業的完成時間這一問題更爲複雜。使用雲計算能夠水平下降機器要求以及縮短運行時間。可是,咱們應該增長機器的數量仍是徹底改變機器的類型?分佈式環境中的瓶頸在哪裏?等等這些問題都是減小執行時間時須要解決的問題。
對於Apache Spark而言,很難弄清楚須要的機器類型。Amazon EMR帶有Ganglia,這讓咱們一眼就能夠監視集羣內存/CPU。但有時候也不得不去檢查底層的EC2實例監測,由於Ganglia並不完美,將兩者結合起來使用是很不錯的方法。此外,與訓練機器學習模型的做業相比,ETL做業具備不一樣的執行配置文件。ETL佔用了大量的網絡和內存,機器學習須要更多的計算,能夠爲這兩種類型的做業選擇不一樣的實例類型。
須要從CPU/內存/網絡/IO監控方面優化成本,此外發現不一樣的工做(ETL、機器學習)有不一樣的機器要求。
在一開始就須要對機器學習預測進行基準測試
對機器學習模型的預測有沒有延遲要求?若是有的話,在選擇任何具體框架以前,請肯定該框架的訓練模型是否能夠知足你的延遲要求。對於基礎模型而言,很容易就能掌握其中包含的數學基本理論,並理所固然的認爲它會運行得很快。但事實證實,還有一些其它因素可能會致使預測的速度不如理論上預期的那樣快。創建一個簡單的模型並進行基準測試。若是在創建管道後才發現問題,這可能會浪費大量的時間。當發現Spark不能知足延遲要求時,可使用mleap庫提高預測延遲。
若是有延遲需求,請從要使用的框架中製做出一個簡單模型,精度、準確率或其它指標都可有可無,只須要以預測延遲爲基準點。
不管AWS如何顯示,S3都不是一個文件系統
使用AWS的GUI或CLI很容易忘記S3不是一個文件系統,S3是一個對象存儲庫,存儲的對象是json、圖片等內容。這個區別很重要,由於在S3中重命名內容並不像在真正的文件系統中那樣快。若是在一個文件系統中移動一個對象,它可能會很快地移動,但這在S3中是沒法實現的。爲何這個顯得很重要呢?由於當經過Apache將數據寫入S3時,Apache Spark會產生臨時文件,而後將其移動到新的祕鑰中。基於以上緣由,Apache Spark有一個設置,能夠告訴它不寫入臨時文件,而是寫入最終輸出。咱們使用了這種設置,在寫入AWS s3上節約了大量的時間。
Apache Spark主要是基於Scala
若是使用的是Apache Spark,你應該知道它主要是基於Scala的。Java和Python等應用接口也能夠工做,可是網上的例子大可能是基於Scala的。而咱們使用的是Java,這是因爲以前的技術棧使用的是Java。在剛開始時,對於機器學習和Scala等方面都沒有任何專業知識,咱們簡單地認爲機器學習對於項目而言相當重要,而Scala不是。所以,沒法讓團隊像處理機器學習問題那樣處理Scala曲線。將Scala翻譯成Java並不難,但將Spark Scala翻譯爲Spark Java很困難,由於這些應用接口在Java中難以使用。
若是你不瞭解Scala而且還想使用 Spark Mllib,那麼可能須要在選擇語言方面考慮妥協。這種解決方案不是理想的工程解決方案,而是一個實用的解決方案。
知識分享對於團隊合做而言很重要
若是將機器學習與現有系統集成在一塊兒,那麼將不得不與其餘開發人員打交道。此外,還須要與業務、操做、營銷等人員進行交流。可是這些人員中的大多數人不會對機器學習有很好的理解,所以他們須要這方面的知識,可是他們又不能坐下來學習機器學習相關課程。這個時候就應該作一些機器學習方面的知識分享,只須要解釋一些涉及外行常見的術語便可,好比訓練集/測試集/驗證集、模型等,而沒必要教他們相關算法等深奧的內容。
對於專業人員來講,很容易忘記機器學習中充滿了術語,雖然你可能徹底熟悉這些術語,但對於團隊中的其餘人而言,這些可能會是徹底陌生的詞語,由於不是全部人都參加過機器學習課程。
對數據庫構建版本控制多是一個好的想法
可能須要對數據庫構建版本控制方案,而且能夠在不從新部署整個軟件的狀況下切換不一樣的模型訓練代碼以使用不一樣的數據集。咱們建立了一些模型,並用一些數據對其進行了嘗試,結果發現數據量不夠,模型工做得不夠好。所以,爲數據庫創建版本控制方案,以即可以在V1版本上訓練模型並繼續生成下一個版本。新版本中足夠的數據後,就能夠切換模型訓練代碼以使用新數據集。此外,還製做了一個UI界面,以便控制機器學習的參數、指定用於訓練的數據量等。基本上能夠經過UI能夠輕鬆地配置一些參數,以確保對用於訓練的數據進行更改時不須要從新部署相關參數。
文章標題《Things I wish we had known before we started our first Machine Learning project》,做者:Aseem Bansal
詳細內容請查看原文