當前位置:
首頁 > 科技 > LinkedIn開源TonY:在Hadoop上運行TensorFlow的框架

LinkedIn開源TonY:在Hadoop上運行TensorFlow的框架

作者 | Jonathan Hung

翻譯| 小大非

編輯 | Natalie

TensorFlow 支持分散式訓練,然而部署分散式 TensorFlow 並不是一個簡單的工作,開源的 TonY 可提供靈活、持續的方式彌補分散式 TensorFlow 分析能力和 Hadoop 伸縮能力之間的差距。本文將介紹 TonY 的內部細節、在 Hadoop 上實現並利用的擴展分散式 TensorFlow 的特性以及實驗結果。

LinkedIn 嚴重依賴人工智慧為其超過 5.75 億會員提供內容和創造經濟機會。隨著深度學習技術的迅速發展,人工智慧工程師已經開始在 LinkedIn 的關聯驅動產品中採用深度神經網路,包括反饋和智能回復。這些用例中的許多都構建在由谷歌編寫的深度學習框架 TensorFlow 上。

一開始,我們內部的 TensorFlow 用戶在小型的、非託管的「裸機」集群上運行框架。但我們很快意識到需要將 TensorFlow 與基於 Hadoop 的大數據平台的龐大計算和存儲能力結合起來。我們的 Hadoop 集群中存儲了數百 pb 的數據,這些數據可以用於深度學習,因此我們需要一種可伸縮的方式來處理所有這些信息。幸運的是,TensorFlow 支持分散式訓練,這是一種處理大型數據集的有效技術。然而,部署分散式 TensorFlow 並不是一個簡單的工作,也不是所有數據科學家和相關工程師都具備的專業知識或能力——尤其是因為它必須手工完成。我們想要一種靈活和可持續的方式來彌補分散式 TensorFlow 分析能力和 Hadoop 伸縮能力之間的差距。

開源 TonY

為了滿足我們的需求,並且我們知道還有許多其他對運行分散式機器學習感興趣的人也在運行大型的 Hadoop 部署,我們已經在 YARN(TonY)上構建了 TensorFlow,我們今天將其開源。你可以查看 GitHub 上的 TonY 項目,了解如何使用它的詳細信息。歡迎大家提意見並為其貢獻代碼!

開源項目傳送門:

https://github.com/linkedin/TonY

在本文的剩下部分中,我們將介紹 TonY 的內部細節、我們在 Hadoop 上實現並利用的擴展分散式 TensorFlow 的特性以及實驗結果。

現有解決方案

在對 Hadoop 上運行分散式 TensorFlow 的初步調查中,我們發現了一些現有的解決方案。然而,我們最終確定沒有一個滿足我們的特定需求,導致我們決定構建 TonY。

基於 Spark 的 TensorFlow 是一個開源的解決方案,它允許你在 Apache Spark 計算引擎上運行 TensorFlow。我們能夠在這個框架上裝載兩個內部的深度學習應用程序,但是遇到了一些問題,最明顯的是 GPU 調度和異構容器調度都存在不足。此外,我們將來想要進行的任何調度和應用程序生命周期增強都必須在 Spark 中完成,這比在獨立的 YARN 應用程序中進行更改要困難得多。

TensorFlowOnYARN 是另一個作為獨立庫運行的開源解決方案。不幸的是,這個項目中的容錯支持和可用性並不符合我們的需求。此外,這個項目已經不再被維護。

基於這些原因,我們決定構建 TonY,以便完全控制 Hadoop 集群中的資源。另外,由於 TonY 是直接在 YARN 上運行,並且作為輕量級依賴程序運行,因此我們可以很容易地將它與 YARN 中的堆棧的低級部分和 TensorFlow 中的堆棧的高級部分結合起來。

TonY 的工作原理

類似於 MapReduce 提供的可在 Hadoop 上運行 Pig/Hive 腳本的引擎,Spark 提供運行調用 Spark APIs 的 scala 代碼的引擎。TonY 旨在提供在 Hadoop 上運行 TensorFlow 任務的一流支持, 比如資源調度和容器環境設置。

TensorFlow 運行在 YARN 上的 TonY 上

TonY 有三個主要組件:Client、ApplicationMaster 和 TaskExecutor。下面是運行 TonY 作業的端到端過程:

用戶向 Client 提交 TensorFlow 模型訓練代碼、提交參數及其 Python 虛擬環境(包含 TensorFlow 依賴項)。

Client 設置 ApplicationMaster(AM)並將其提交給 YARN 集群。

AM 根據用戶的資源需求(參數伺服器和任務量、內存和 GPU)與 YARN 的資源管理器進行資源協商調度。

一旦 AM 接收到分配,它就會在分配的節點上生成 TaskExecutors。

TaskExecutors 啟動用戶的訓練代碼並等待其完成。

用戶的訓練代碼開始運行,TaskExecutors 和 AM 之間定期進行心跳檢查。

Tony 架構

除了支持在 Hadoop 上運行分散式 TensorFlow 作業的基本功能外,TonY 還實現了各種功能來提高運行大型訓練的體驗:

GPU 調度:最近,Hadoop 增加了對 GPU 調度和隔離的原生支持。對於用戶來說,這意味著他們可以確保一旦從 Hadoop 獲得了他們的容器分配,他們就可以可靠地獲得他們請求的 gpu 的數量。TonY 還可以獲得 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(在 8 個任務中有 1 個同時也使用 CPU 訓練),使用非同步訓練。該模型是一個著名的 ImageNet 深度神經網路,該數據集包含數百萬張用於訓練圖像分類模型的圖像。正如在 Inception v3 分散式訓練示例中一樣,我們測量 10 萬次,批處理大小為 32。結果如下:

產生這些結果的測試環境為 40G RAM / 1 CPU,Tesla K80 GPU, RHEL 6.6 和 TensorFlow 1.9。通過 GPU 訓練的 8 個任務進行 100,000 次後,最後的前 5 名錯誤率為 26.3%。

由於 TonY 位於協調分散式 TensorFlow 的層中,並且不干擾 TensorFlow 作業的實際執行,所以理論上它不產生開銷。實際上,對於 GPU 訓練,運行時是線性擴展的。我們還看到,在 CPU 訓練時運行 GPU 訓練,速度提高了大約 4 倍,考慮到模型的複雜性和深度,這一結果基本符合預期。

GitHub 項目地址:

https://github.com/linkedin/TonY

閱讀英文原文:

https://engineering.linkedin.com/blog/2018/09/open-sourcing-tony--native-support-of-tensorflow-on-hadoop


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 InfoQ 的精彩文章:

Kubernets贏了?「下一跳」在哪裡?
工作中你犯過最大的錯是什麼?怎麼處理的?丨Q言Q語

TAG:InfoQ |