跳轉到主要內容
公司博客上

MLflow TensorFlow,一個開源的節目

2019年8月19日 公司博客上

分享這篇文章

今年夏天,我實習在ML平台上的團隊。Beplay体育安卓版本我在工作MLflow機器學習,一個開源的管理框架。

這篇文章詳細描述了我做過的項目中,和我的經驗在磚。自動記錄功能我發達讓數據科學家更容易跟蹤他們的培訓課程,而無需改變任何代碼的訓練。我做了改進MLflow log_batch端點,這導致了戲劇性的減少日誌記錄時間。最後,我幫助修改MLflow的開源社區政策,改善我們的GitHub問題反應率。

自動記錄從Keras和TensorFlow

跟蹤與MLflow

培訓機器學習模型可能很複雜。它涉及到參數調優,多次迭代數據集,等等。MLflow的跟蹤API使其更容易找到一個合適的模型,為日誌記錄指標提供端點,從模型訓練參數和其他數據。數據從多個運行(單個執行培訓計劃)是集中在追蹤服務器,默認為本地存儲如果沒有設置一個外部數據庫。

讓我們看看如何添加MLflow跟蹤一些現有的ML代碼。我們先從Keras IMDB情緒分析的例子,並添加一個回調與日誌語句,每個日誌一個值。

MlflowCallback(keras.callbacks.Callback):#這個函數將調用每個時代之後。defon_epoch_end(自我,時代,日誌=沒有一個):如果日誌:返回#從Keras MLflow記錄指標mlflow.log_metric(“loss”, logs[“loss”], step=epoch)mlflow.log_metric(“acc”, logs[“acc”], step=epoch)#這個函數將調用訓練後完成。defon_train_end(自我,日誌=沒有一個):mlflow.log_param (“num_layers”,len(self.model.layers))mlflow.log_param (“optimizer_name”,類型(self.model.optimizer) .__name__)模型。編譯(損失=“categorical_crossentropy”,優化器=“亞當”,指標= [“準確性”])
              曆史=模型。適合(x_train, y_train,batch_size = batch_size,時代=時代,verbose =1,指標=(“準確性”)validation_split =0.1,回調函數= [MlflowCallback ()))

我們的數據已經被抓獲,我們可以通過MLflow UI視圖可視化。

自動跟蹤

跟蹤API是簡單和直接用於小型培訓工作。但在我們的代碼中添加日誌語句對更複雜的工作有幾個缺點:

  • 它可以是乏味的。
  • 大量的跟蹤代碼的存在可以使培訓的代碼難以推斷。
  • 它可能使跟蹤困難用於用戶不熟悉的技術細節的培訓。

如果我們的那些日誌語句後麵一個函數調用會記錄所有重要的信息嗎?我們可以照顧所有這些問題。進入自動對數。

出於演示,我將autolog函數調用添加到上麵的例子一樣。

進口mlflow.kerasmlflow.keras.autolog ()#這是你所需要的!max_words =1000年batch_size =32時代=5模型。編譯(損失=“categorical_crossentropy”,優化器=“亞當”,指標= [“準確性”])
              曆史=模型。適合(x_train, y_train,batch_size = batch_size,時代=時代,verbose =1validation_split =0.1)

運行程序後,您可以查看結果MLflow UI中。

https://www.youtube.com/watch?v=0A0mZ7fa2Lc

autologger已經產生一個對應於運行我們的單訓練通過。它包含了層數、優化器名稱、學習速率和ε值作為參數;損失和準確性在每一步的培訓和驗證階段;模型的總結,作為一個標簽;最後,作為工件模型檢查點。

引擎蓋下麵

目標:自動記錄重要信息零培訓代碼更改

在一個理想世界裏,你不需要任何日誌語句(即如果相關的培訓功能。model.fitKeras,estimator.train對於TensorFlow估計等)內部調用mlflow.log_metric在必要的時候。如果我們發生什麼呢?

因為功能一流的值在Python中,所有您需要做的是建立一個包裝器函數,你想要什麼,調用訓練函數,並設置訓練函數指包裝器函數!為了簡化獲取/設置功能的過程中,我使用大猩猩

這是如何mlflow.keras.autolog ()真正的工作:

defautolog():@gorilla.patch (keras.Model)def適合(自我,* args, * * kwargs):原始= gorilla.get_original_attribute (keras.Model,“健康”)如果len(args) > =6:l =列表(參數)l (5)+ = (__MLflowKerasCallback ())args =元組(左)elif“回調”kwargs:kwargs [“回調”)+ = (__MLflowKerasCallback ())其他的:kwargs [“回調”]= [__MLflowKerasCallback ())返回原始(自我,* args, * * kwargs)設置= gorilla.Settings (allow_hit =真正的store_hit =真正的)補丁= gorilla.Patch (keras.Model,“健康”、配合設置=設置)gorilla.apply(補丁)

我們構建一個實例的一個回調處理所有的日誌,並設置模型。適合指向一個包裝器函數,將實例插入到參數。上看到的代碼GitHub

日誌批量性能優化

MLflow提供端點日誌一批指標、參數和標簽。這應該是比單獨記錄每個參數。不幸的是,這個端點在磚的實現非常慢,這讓一個數據庫事務/參數!

切換到SQL批處理操作允許我們解決這個問題。這些讓我們提供整個參數設置為數據庫接口,隻有兩個事務。結果是一個20 x總日誌時間的減少。

提高開源社區的交互

MLflow GitHub社區存在正在蓬勃發展,但仍處於早期階段。社區成員渴望貢獻了拉請求和特性請求,但缺乏明確的渠道很難跟上。大量的問題也因此沒有得到解決,我們的社區互動缺乏。

為了改善這種情況,我們需要清楚地列明每種渠道的目的。我創建了一個組問題模板在GitHub上:

  • 錯誤報告
  • 文檔的整理
  • 特性請求
  • 安裝問題

每個模板指定所需的類型信息。結果是高質量和更詳細的問題,反應率更高。

我們還舉行了一次問題bash事件——一個時間聚在一起並關閉過時的和容易回答的問題。我們還發現了三個問題,以後固定在MLflow 1.2 !

結論

這些十二周已經令人難以置信的快節奏的和令人興奮的,但最重要的是,沒完沒了地獎勵。我經常學習,由於我從事廣泛的項目。

整個夏天,我和我的團隊確保經常離開辦公室各種偉大的事件和成鍵。

Run into us on the way to a Giants game…

…燒烤烤餅天使島上…

…周一或舊金山探索餐廳現場其他!

你會發現最勤勞,聰明,謙虛,在磚和友好的人,他們很高興看到實習生成功產生影響。每個人都從一開始就打開我的意見和反饋。我發現了一個豐富的資源在我同事,我從就業指導知識技術被引入。有趣的實習生事件之間,光滑的新員工培訓,迷人的工作和精彩的文化時,我發現在磚一個全能類如何運行實習。

最後,特別感謝我為一個偉大的夏天很棒的隊友——我的導師Sid默奇,我的經理保羅奧美,整個毫升平台團隊。Beplay体育安卓版本

免費試著磚
看到所有公司博客上的帖子
Baidu
map