資源 | 領英開源TonY:構建在Hadoop YARN上的TensorFlow框架
選自engineering.linkedin
作者:
Jonathan Hung、Keqiu Hu、Anthony Hsu
機器之心編譯
參與:張倩、王淑婷、Geek AI
領英用戶超過 5.75 億,其 Hadoop 集群中存儲了數百 PB 的數據,因此需要一種可擴展的方式處理所有這些信息。TensorFlow 支持分散式訓練,但構建分散式 TensorFlow 框架並非易事,因此需要將分散式 TensorFlow 的分析能力和 Hadoop 的擴展能力結合起來,領英在 YARN 上構建了一個 TensorFlow 框架 TonY 並將其開源。本文介紹了 TonY 的內部細節、領英實現並用來在 Hadoop 上擴展分散式 TensorFlow 的功能以及實驗結果。
領英(LinkedIn)高度依賴人工智慧技術為其超過 5.75 億的會員提供原創內容,並創造賺錢的機會。隨著最近深度學習技術的快速發展,我們的人工智慧工程師們已經開始在由相關性驅動的領英產品中使用深度神經網路,包括 feed 流訂閱和智能回復(Smart Replies)。許多這類用例都是構建在 TensorFlow 平台上的,TensorFlow 是一個由谷歌編寫的流行的深度學習框架。
起初,我們內部的 TensorFlow 用戶在小型、缺乏管理的「裸機」集群上運行這套框架。但是,我們很快意識到,我們需要將 TensorFlow 與基於 Hadoop 的大數據平台的強大計算和存儲能力結合在一起。在我們的 Hadoop 集群中存儲了數百 PB 的數據,這些數據可以被用於深度學習。因此,我們需要一種可擴展的方式處理所有這些信息。幸運的是,TensorFlow 支持分散式訓練,這是一種有效的處理大型數據集的技術。然而,構建分散式 TensorFlow 框架並非易事,也不是所有數據科學家和相關的工程師都具備所需的專業知識,或想要這樣做——尤其是因為這項工作必須手動完成。我們想要一種靈活、可持續的方式將分散式 TensorFlow 的分析能力和 Hadoop 的擴展能力結合起來。
開源 TonY
為了滿足以上需求,我們在 YARN 上構建了 TensorFlow on YARN(TonY),同時我們也知道很多對分散式機器學習感興趣的人正在運行大型 Hadoop 部署,所以我們決定將該項目開源。使用細節見 TonY 項目 Github 鏈接。
地址:https://github.com/linkedin/TonY。
下面將介紹 TonY 的內部細節、我們實施並用來在 Hadoop 上擴展分散式 TensorFlow 的功能以及實驗結果。
現有的解決方案
在 Hadoop 上運行分散式 TensorFlow 的初步探索中,我們找到了幾個現有的解決方案,但最終發現沒有一個方案可以滿足自己的需求,因此我們決定構建 TonY。
TensorFlow on Spark 是來自 Yahoo 一種開源解決方案,使得用戶可以在 Apache Spark 計算引擎上運行 TensorFlow。我們得以在這一框架上搭載我們的內部深度學習應用,但也遇到了幾個問題,最顯著的問題是缺乏 GPU 調度和異構容器調度。此外,我們將來想要做的任何調度和應用程序生命周期增強都必須在 Spark 中完成,這比在獨立的 YARN 應用程序中進行更改要困難得多。
另一個開源解決方案是 Intel BigData 組研發的 TensorFlowOnYARN。但是,這一項目的容錯支持和可用性不能滿足我們的需要。而且,該項目已經終止。
出於以上種種原因,我們決定構建 TonY 以實現我們對 Hadoop 群集資源的完全控制。此外,由於 TonY 直接在 YARN 上運行,而且運行時屬於輕量級依賴,我們可以輕鬆地使其與 YARN 堆棧的較低級部分或 TensorFlow 中的較高級部分一起進化。
TonY 是如何工作的?
類似於 MapReduce 提供的在 Hadoop 上運行 Pig/Hive 腳本的引擎,Spark 提供使用 Spark API 運行 scala 代碼的引擎,TonY 旨在通過處理資源協商和容器環境設置等任務,為在 Hadoop 上運行 TensorFlow 作業提供同樣頂級的支持。
在 YARN 的 TonY 上運行 TensorFlow
TonY 主要包含三個要素:Client、ApplicationMaster 和 TaskExecutor。運行 TonY 作業的端到端處理過程如下:
1.用戶向 Client 提交 TensorFlow 模型訓練代碼、參數及其 Python 虛擬環境(包含 TensorFlow 依賴)。
2.Client 設置 ApplicationMaster(AM)並將其提交給 YARN 集群。
3.AM 與 YARN 基於用戶資源請求的資源管理(Resource Manager)進行資源協商(參數伺服器及線程、內存和 GPU 的數量)。
4.一旦 AM 收到分配,它就會在分配的節點上生成 TaskExecutor。
5.TaskExecutor 啟動用戶的訓練代碼並等待其完成。
6.用戶的訓練代碼啟動,TonY 定期在 TaskExecutor 和 AM 之間跳動,以檢查其活性。
TonY 的架構
除了支持在 Hadoop 上運行分散式 TensorFlow 作業的基本功能之外,TonY 還實現了各種功能來改善運行大規模訓練的體驗:
GPU 調度
:最近,YARN 增加了對 GPU 調度和隔離的本地支持。這意味著用戶可以確保一旦從 YARN 接收到容器分配,他們就能可靠地獲取自己請求的 GPU 數量。TonY 搭建在 YARN 基礎上,於是也有 GPU 資源意識,因此它能夠利用 Hadoop 的 API 從集群中請求 GPU 資源。
細粒度的資源請求
:由於 TonY 支持請求不同的實體(如參數伺服器和線程)作為單獨的組件,用戶可以對每種類型進行不同的資源請求。例如,參數伺服器和線程可能有不同的內存需求。用戶還可能想在 GPU 或其它一些專用硬體上運行訓練,但是在參數伺服器上使用 CPU 就足夠了。這意味著更多地控制用戶應用程序的資源需求,對於集群管理來說,這有助於避免昂貴硬體的資源浪費。
TensorBoard 支持
:TensorBoard 是一種工具,可以使 TensorFlow 程序更易理解、調優和優化。由於 TensorBoard 是由一個線程在應用程序未知的地方啟動的,因此我們通常無法從 Hadoop UI 中看到 TensorBoard。我們最近向 YARN 提供了代碼,允許我們將 Hadoop 應用程序的跟蹤 URL 重定向至 TensorBoard,這樣僅需點擊一下就可以查看 TensorBoard 了。
容錯
:TensorFlow 訓練可能需要幾個小時或幾天,要使用大量機器。因此,長時間運行的 TensorFlow 作業比短時間運行的作業更容易受到瞬時錯誤或搶佔的影響。TensorFlow 包含容錯 API,用於將檢查點保存到 HDFS,並根據以前保存的檢查點恢復訓練狀態。TonY 通過提供一個彈性分散式基礎設施來從節點故障中恢復,從而促進了這一過程。如果一個線程沒有跳躍到 AM 或者超時,TonY 將重新啟動應用程序,並從以前的檢查點恢復訓練。
實驗結果
我們在 TonY 上運行了 Inception v3 模型,有 1 到 8 個線程,每個線程有一個 GPU,使用非同步訓練(也有一個執行在八個線程上使用 CPU 訓練)。該模型是 ImageNet 的一個著名的深層神經網路,而 ImageNet 數據集包含了數百萬幅用於訓練圖像分類模型的圖像。正如在 Inception v3 分散式訓練示例中一樣,我們測量了批大小為 32 時,達到 10 萬步所需的時間。結果如下:
這些結果是在 RHEL 6.6 和 TensorFlow 1.9 上得出的,每個線程上一個 CPU 的內存是 40G,使用的 GPU 是 Tesla K80 GPU。接受 GPU 訓練的 8 個線程在達到 10 萬步後,最終的前 5 名錯誤率為 26.3 %。
由於 TonY 在編排分散式 TensorFlow 的層中,並且不干擾 TensorFlow 作業的實際執行,我們預計這部分不會有開銷。實際上,我們看到,對於 GPU 訓練,運行時間線性擴展。我們還發現,運行 GPU 訓練的速度比 CPU 訓練快了大約四倍,考慮到模型的複雜性和深度,這種結果不出所料。
原文鏈接:https://engineering.linkedin.com/blog/2018/09/open-sourcing-tony—native-support-of-tensorflow-on-hadoop
本文為機器之心編譯,
轉載請聯繫本公眾號獲得授權
。?------------------------------------------------
加入機器之心(全職記者 / 實習生):hr@jiqizhixin.com
投稿或尋求報道:
content
@jiqizhixin.com廣告 & 商務合作:bd@jiqizhixin.com
※領英開源TonY:構建在Hadoop YARN上的TensorFlow框架
※TensorFlow 2.0將把Eager Execution變為默認執行模式
TAG:機器之心 |