領英開源TonY:構建在Hadoop YARN上的TensorFlow框架

ofollow,noindex" target="_blank">機器之心 翻譯
張倩 王淑婷 Geek AI 編譯
領英開源TonY:構建在Hadoop YARN上的TensorFlow框架
領英使用者超過 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 應用程式中進行更改要困難得多。
另一個開源解決方案是IntelBigData 組研發的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 作業的端到端處理過程如下:
- 使用者向 Client 提交TensorFlow 模型訓練程式碼、引數及其 Python 虛擬環境(包含TensorFlow 依賴)。
- Client 設定 ApplicationMaster(AM)並將其提交給 YARN 叢集。
- AM 與 YARN 基於使用者資源請求的資源管理(Resource Manager)進行資源協商(引數伺服器及執行緒、記憶體和 GPU 的數量)。
- 一旦 AM 收到分配,它就會在分配的節點上生成 TaskExecutor。
- TaskExecutor 啟動使用者的訓練程式碼並等待其完成。
- 使用者的訓練程式碼啟動,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
工程 領英 GPU TensorFlow
相關資料
Artificial Intelligence
在學術研究領域,人工智慧通常指能夠感知周圍環境並採取行動以實現最優的可能結果的智慧體(intelligent agent)
來源: Russell, S., & Norvig, P. (2003). Artificial Intelligence: A Modern Approach.
Neural Network
(人工)神經網路是一種起源於 20 世紀 50 年代的監督式機器學習模型,那時候研究者構想了「感知器(perceptron)」的想法。這一領域的研究者通常被稱為「聯結主義者(Connectionist)」,因為這種模型模擬了人腦的功能。神經網路模型通常是通過反向傳播演算法應用梯度下降訓練的。目前神經網路有兩大主要型別,它們都是前饋神經網路:卷積神經網路(CNN)和迴圈神經網路(RNN),其中 RNN 又包含長短期記憶(LSTM)、門控迴圈單元(GRU)等等。深度學習是一種主要應用於神經網路幫助其取得更好結果的技術。儘管神經網路主要用於監督學習,但也有一些為無監督學習設計的變體,比如自動編碼器和生成對抗網路(GAN)。
來源:機器之心
Deep neural network
深度神經網路(DNN)是深度學習的一種框架,它是一種具備至少一個隱層的神經網路。與淺層神經網路類似,深度神經網路也能夠為複雜非線性系統提供建模,但多出的層次為模型提供了更高的抽象層次,因而提高了模型的能力。
來源:機器之心 Techopedia
ImageNet
Machine Learning
機器學習是人工智慧的一個分支,是一門多領域交叉學科,涉及概率論、統計學、逼近論、凸分析、計算複雜性理論等多門學科。機器學習理論主要是設計和分析一些讓計算機可以自動“學習”的演算法。因為學習演算法中涉及了大量的統計學理論,機器學習與推斷統計學聯絡尤為密切,也被稱為統計學習理論。演算法設計方面,機器學習理論關注可以實現的,行之有效的學習演算法。
來源:Mitchell, T. (1997). Machine Learning. McGraw Hill.
Scheduling
排程在計算機中是分配工作所需資源的方法。資源可以指虛擬的計算資源,如執行緒、程序或資料流;也可以指硬體資源,如處理器、網路連線或擴充套件卡。 進行排程工作的程式叫做排程器。排程器通常的實現使得所有計算資源都處於忙碌狀態,允許多位使用者有效地同時共享系統資源,或達到指定的服務質量。 see planning for more details
來源: 維基百科
TensorBoard
一個資訊中心,用於顯示在執行一個或多個 TensorFlow 程式期間儲存的摘要資訊。
Deep learning
深度學習(deep learning)是機器學習的分支,是一種試圖使用包含複雜結構或由多重非線性變換構成的多個處理層對資料進行高層抽象的演算法。 深度學習是機器學習中一種基於對資料進行表徵學習的演算法,至今已有數種深度學習框架,如卷積神經網路和深度置信網路和遞迴神經網路等已被應用在計算機視覺、語音識別、自然語言處理、音訊識別與生物資訊學等領域並獲取了極好的效果。
來源: LeCun, Y., Bengio, Y., & Hinton, G. (2015). Deep learning. nature, 521(7553), 436.
Intel
英特爾是計算創新領域的全球領先廠商,致力於拓展科技疆界,讓最精彩體驗成為可能。英特爾創始於1968年,已擁有近半個世紀產品創新和引領市場的經驗。英特爾1971年推出了世界上第一個微處理器,後來又促進了計算機和網際網路的革命,改變了整個世界的程序。如今,英特爾正轉型成為一家資料公司,制定了清晰的資料戰略,憑藉雲和資料中心、物聯網、儲存、FPGA以及5G構成的增長良性迴圈,提供獨到價值,驅動日益發展的智慧互聯世界。英特爾專注於技術創新,同時也積極支援中國的自主創新,與產業夥伴攜手推動智慧互聯的發展。基於明確的資料戰略和智慧互聯全棧實力,英特爾瞄準人工智慧、無人駕駛、5G、精準醫療、體育等關鍵領域,與中國深度合作。面向未來,英特爾致力於做中國高價值合作伙伴,在新科技、新經濟、新消費三個方面,著力驅動產業協同創新,為實體經濟增值,促進消費升級。
涉及領域
Tensor
張量是一個可用來表示在一些向量、標量和其他張量之間的線性關係的多線性函式,這些線性關係的基本例子有內積、外積、線性對映以及笛卡兒積。其座標在 維空間內,有 個分量的一種量,其中每個分量都是座標的函式,而在座標變換時,這些分量也依照某些規則作線性變換。稱為該張量的秩或階(與矩陣的秩和階均無關係)。 在數學裡,張量是一種幾何實體,或者說廣義上的“數量”。張量概念包括標量、向量和線性運算元。張量可以用座標系統來表達,記作標量的陣列,但它是定義為“不依賴於參照系的選擇的”。張量在物理和工程學中很重要。例如在擴散張量成像中,表達器官對於水的在各個方向的微分透性的張量可以用來產生大腦的掃描圖。工程上最重要的例子可能就是應力張量和應變張量了,它們都是二階張量,對於一般線性材料他們之間的關係由一個四階彈性張量來決定。
來源: 維基百科

機器之心是國內領先的前沿科技媒體和產業服務平臺,關注人工智慧、機器人和神經認知科學,堅持為從業者提供高質量內容和多項產業服務。
推薦文章