在AWS上使用GPU實現分布式神經網絡

2020-12-06 CSDN技術社區

【編者按】Netflix公司擁有海量的視頻、圖片數據,公司不斷創新技術提升用戶使用體驗,最新消息顯示Netflix承認正在開發新的技術開展人工智慧領域的應用,該公司廣泛採用高級人工智慧技術,尤其以深度學習技術被大家所熟知。著眼深度學習可以讓Netflix的電影推薦更準確,但是深度學習領域還有很多技術難題未被解決,Netflix技術博客網站的Alex chen等人結合自身實踐,分享了在AWS上實現分布式人工智慧網絡的經驗。

以下為譯文:

在以前的博客中提到,Netflix一直不斷創新,努力通過尋找更好的方法為我們的會員找到最好的電影和電視節目。當一個新的算法技術例如深度學習在其他領域(如圖像識別、神經成像、語言模型和語音識別)展現非常好的前景時,我們沒有驚喜,而是試圖找出如何應用這些技術來改善我們的產品。在這篇文章中,我們將和大家分享在Netflix實驗這些方法過程中建立基礎設施的一些經驗。希望對從事類似算法的人有所幫助,尤其是那些也使用AWS基礎設施的人們。然而,我們不會詳細說明我們如何使用人工神經元網絡的變量實現個性化,因為它現在還在研究階段。 

許多研究人員指出,大部分流行的深度學習算法技術已經為大家熟知和了解。最近這一領域的革新已經能讓這些技術能夠實際應用,包括設計和實現的架構,可以在合理的資源和時間的情況下執行這些技術。第一個大規模深度學習成功實例是連續幾天使用1000臺機器的16000個CPU內核訓練一個神經網絡。儘管這具有裡程碑意義,但是所需的基礎設施、成本、計算時間仍然是不實際的。

Andrew Ng和他的團隊解決了這個問題。他們使用強大而廉價的GPU代替大型集群的CPU,使用此體系結構僅用3臺機器在幾天內就訓練出比原來大6.5倍的模型。在另一項研究中,Schwenk等人表明,在GPU上訓練這些模型可以大大提高性能,即使和高端的多核CPU相比。

考慮到我們在雲計算領域的技術和領導能力,我們利用GPU和AWS的優勢,實現大規模神經網絡訓練系統。我們想要使用合理數量的機器,利用神經網絡方法實現強大的機器學習解決方案。我們還需要避免在一個專用的數據中心裡使用特殊的機器,按需計算的能力可以在AWS上獲得。

分布式機器學習的層次

你們中的一些人可能會認為上面描述的場景不是傳統意義上的分布式機器學習。例如,在上面所提到Ng等人,他們將學習算法本身分配在不同的機器上。雖然這種方法在某些情況下可能有意義,但是我們發現它們並不是很規範,特別是當一個數據集可以存儲在單一實例上。要理解為什麼,我們首先需要解釋可分布式模型的不同層次。

在標準情況下,我們會有一個特定的模型與多個實例。這些實例在你的問題空間可能對應於不同的分區。典型的情況是不同國家或地區要有不同的模型訓練,因為分布特徵甚至主題空間各個國家和地區都是不同的。這代表第一個初始級別,在這裡我們可以決定分配學習過程。我們可以,例如,Netflix在41個國家運營,我們可以在每個國家都進行獨立的機器訓練,因為每個地區的訓練可以完全獨立。

然而,正如上面所解釋的,培訓單一實例實際上意味著訓練和測試數個模型,每個對應一個不同的hyperparameters組合。這是第二個層次,過程可以被分配。這個級別是特別有趣的,如果有許多參數優化和一個好的策略優化它們,如貝葉斯優化與高斯過程。運行之間唯一的的通信是hyperparameter設置和測試評價指標。 

最後,該算法訓練本身可以是分布式的。這也是有趣的,但它是有代價的。例如,培訓ANN是一個比較集中通信的過程。考慮到你可能會有成千上萬的核心在一個GPU實例上,如果你能充分利用GPU,避免進入昂貴的跨機器通信場景,這將是很方便的。因為在一臺機器上使用內存通信通常遠遠快於通過網絡。

下面下面的偽代碼演示了這三個層次:

 

在本文裡,我們將闡述在我們的用例中如何解決級別1和2分布。請注意,我們不需要解決3層分布的原因之一是因為我們的模型有數百萬的參數。

優化CUDA Kernel

我們處理分布問題之前,必須確保基於GPU的並行訓練是有效的。我們首先在自己開發的機器上進行概念驗證,然後再來處理如何擴展機器問題。我們開始使用

Nvidia Quadro 600

GPU的聯想S20工作站。這個GPU有98內核,並且為我們的實驗提供了一個有用的基準,特別是考慮到我們打算在AWS上使用一個更強大的機器。我們第一次嘗試訓練神經網絡模型花了7個小時。

然後我們在EC2的cg1.4xlarge實例中運行相同的代碼來訓練該模型,它有一個更強大的448內核的Tesla M2050 。然而,訓練時間從7小時上升到20小時以上。分析表明,大部分時間是花在Nvidia性能原始庫函數調用,例如nppsMulC_32f_I、nppsExp_32f_I。cg1實例比聯想S20重複調用npps函數多花費了十幾倍的系統時間。

當我們試圖找出問題的根源,我們使用定製的cudakernel重新實現npps函數,例如將nppsMulC_32f_I函數替換為:


用這種方法取代所有npps函數這樣的神經網絡代碼使cg1實例上的總培訓時間從20多小時減少到47分鐘。訓練100萬樣本用去96秒GPU的時間。使用相同的方法在聯想S20總訓練時間也從7小時減少到2小時。

PCI 配置空間和虛擬環境

當我們處理這個問題時,我們也曾與AWS團隊找到一個好的解決方案,不需要內核補丁。在這樣做的時候,我們發現,相關性能下降與NVreg_CheckPCIConfigSpace內核參數有關。從RedHat得知,將這個參數設置為0,將會讓訪問PCI配置空間非常緩慢。在虛擬環境中,如AWS,這些訪問導致hypervisor陷阱,導致更慢的訪問。

NVreg_CheckPCIConfigSpace是一個參數,可以設置:


我們使用基準測試這個參數變化的影響,反覆調用MulC(128 x1000次)。下面是我們cg1.4xlarge實例運行時間(秒):


如你所見,禁用訪問PCI空間在最初的函數調用時有驚人的效果,減少95%運行時間。效果是顯著的,甚至在我們優化內核函數時,運行時間也節省近25%。然而,重要的是,即使PCI訪問是禁用的,我們的定製函數性能比默認的也提升60%。

我們還應該指出,還有其他方法,我們到目前為止還沒有找到,但對其它也是有用的。首先,我們可以將我們的代碼優化,通過應用一個內核融合技巧,合併一些計算步驟到一個內核將會減少內存訪問。最後,我們可以考慮使用Theano,GPU匹配Python編譯器,也應該可以在這些情況下提高性能。

G2 實例

雖然我們最初的工作是使用cg1.4xlarge EC2實例,但是我們對新的EC2 GPU g2.2xlarge實例類型同樣感興趣,它具有1536內核

GRID K520 

GPU (GK104 chip)。目前我們的應用程式也被GPU內存帶寬限制,GRID K520內存帶寬是198 GB /秒,相比Tesla M2050的148 GB /秒已經有所改善。當然,使用GPU與更快的內存將會更快(例如TITAN的內存帶寬達到288 GB / sec)。

我們用默認的函數和自己的函數在g2.2xlarge實例上重複相同的比較(有或沒有PCI空間訪問)。

最初令人驚訝的事實是,當啟用PCI訪問時,我們測出g2實例比cg1性能更差。然而,禁用它,相比cg1實例改進的性能在45%-65%之間。我們KernelMulC定製函數功能要好70%以上,基準時間在1秒內。因此,切換到G2,正確的配置將會使我們的實驗更快。

分布式貝葉斯hyperparameter優化

一旦我們優化了單節點訓練和測試操作,我們就準備解決hyperparameter優化的問題。如果你不熟悉這個概念,這裡可以簡單解釋為:大多數機器學習算法的參數優化,這通常被稱為hyperparameters,以便和學習算法產生的模型參數區分。例如,在神經網絡中,我們可以考慮優化隱藏單位、學習速率等。為了優化這些,你需要訓練和測試不同的hyperparameters 組合和為你的最終模型選擇最佳的。當面對一個複雜的模型,其中每訓練一個都有時間消耗,以及有很多hyperparameters調整,執行這些詳盡的網格搜索代價非常大。幸運的是,通過考慮參數調整你可以做的比這更好。

解決這種問題的一種方法是使用貝葉斯優化,算法的性能將被高斯過程建模為一個示例。高斯過程對回歸分析非常有效,但是他們擴展到大的問題時還是有困難的,當數據有限時。他們運行的很好,就像我們遇到在執行hyperparameter優化一樣。我們使用package spearmint  執行貝葉斯優化,為神經網絡訓練算法找到最好的hyperparameters。我們通過選擇一套hyperparameters使spearmint和我們的訓練算法關聯,然後使用我們GPU優化代碼訓練神經網絡。然後測試這個模型,測試度量結果用於更新hyperparameter。

我們從GPU得到高性能,但我們每臺機器只有1 -2 GPU,所以我們想利用AWS的分布式計算能力為所有的配置來執行hyperparameter調優,如每個國際地區用不同的模型。為此,我們使用分布式任務隊列Celery 將任務發送到GPU。每個worker process聽從任務隊列,並且在一個GPU上運行。這將讓我們每天可以為所有的國際地區調優,訓練,和升級模型。

儘管Spearmint+ Celery系統一直在運行,但是我們目前正在評估使用HTCondor或StarCluster更完整和複雜的解決方案。HTCondor可以用來管理任何DirectedAcyclic Graph (DAG)工作流。它處理輸入/輸出文件傳輸和資源管理。為了使用Condor,我們需要每個計算節點用給定的ClassAd(例如SLOT1_HAS_GPU = TRUE;STARD_ATTRS = HAS_GPU)註冊為管理人員。然後用戶可以通過配置「需求=HAS_GPU」提交作業,這樣的工作只運行在AWS實例上,並且要有一個可用的GPU。使用Condor的主要優勢是,它還管理不同模型的訓練所需的分布式數據。Condor也允許我們以管理員身份進行SpearmintBayesian優化運行,而不必在每個worker運行。

另一個替代方法是使用StarCluster,它是由麻省理工大學為AWS EC2開發的一個開源集群計算框架。StarCluster以一種容錯性方式運行在Oracle Grid Engine 上(以前是 Sun Grid Engine),完全由Spearmint支持。最後,我們還在研究,將Spearmint 和 Jobman整合以便更好地管理hyperparameter搜索工作流。下圖是使用Spearmint plus Celery、 Condor或是StarCluster的一般設置:


結語

使用GPU實現前沿解決方案,比如訓練大規模神經網絡需要艱苦的努力。如果你需要在自己定製的基礎設施上實現它、成本和複雜性將不可思議的。利用AWS有明顯的好處,在實例的定製和使用資源時會有一定的支持。我們希望通過分享我們的經驗來讓別人更方便開發類似應用程式。

原文連結:

Distributed Neural Networks with GPUs in the AWS Cloud

 (編譯/魏偉 審校/毛夢琪)

本文為CSDN編譯整理,未經允許不得轉載,如需轉載請聯繫market#csdn.net(#換成@)

相關焦點

  • MXNet 宣布支持 Keras 2,可更加方便快捷地實現 CNN 及 RNN 分布式...
    Keras-MXNet 更加方便快捷地實現 CNN 及 RNN 分布式訓練。Keras 是用 Python 編寫的高級神經網絡 API,以快速簡單的 CNN 和  RNN 原型而聞名。Keras 開發人員現在可以使用高性能 MXNet 深度學習引擎進行 CNN 和遞歸神經網絡 RNN 的分布式訓練。通過更新幾行代碼,Keras 開發人員可以使用 MXNet 的多 GPU 分布式訓練功能來提高訓練速度。保存 MXNet 模型是該發行版本一個極具價值的功能。
  • 盤點:GPU加速的神經網絡與JavaScript的交叉
    雖然它的特性集面向神經網絡,但deeplearn.js可以被描述為通用機器學習框架。Propel是一個提供自動微分的科學計算的庫。Gpu.js提供了一種方便的方式來運行GPU上的JavaScript函數。Brain.js是舊的神經網絡庫的延續,並使用Gpu.js硬體加速。
  • Pytorch中的分布式神經網絡訓練
    隨著深度學習的多項進步,複雜的網絡(例如大型transformer 網絡,更廣更深的Resnet等)已經發展起來,從而需要了更大的內存空間。 經常,在訓練這些網絡時,深度學習從業人員需要使用多個GPU來有效地訓練它們。 在本文中,我將向您介紹如何使用PyTorch在GPU集群上設置分布式神經網絡訓練。通常,分布式訓練會在有一下兩種情況。
  • PyTorch中使用DistributedDataParallel進行多GPU分布式模型訓練
    在研究分布式和數據並行之前,我們需要先了解一些關於分布式訓練的背景知識。目前普遍使用的分布式訓練基本上有兩種不同形式:數據並行化和模型並行化。在數據並行化中,模型訓練作業是在數據上進行分割的。作業中的每個GPU接收到自己獨立的數據批處理切片。每個GPU使用這些數據來獨立計算梯度更新。
  • 亞馬遜開源神經機器翻譯框架Sockeye:基於Apache MXNet的NMT平臺
    近來,深度神經網絡(DNN)顯著提升了這些模型的性能。Sockeye 同時提供了一個當前最優的神經機器翻譯(NMT)模型的實現和一個開展 NMT 研究的平臺。Sockeye 是一個基於 Apache MXNet 的快速而可擴展的深度學習庫。Sockeye 代碼庫具有來自 MXNet 的獨特優勢。
  • Pytorch中的分布式神經網絡訓練|pytorch|bat|拆分|調用_網易訂閱
    隨著深度學習的多項進步,複雜的網絡(例如大型transformer 網絡,更廣更深的Resnet等)已經發展起來,從而需要了更大的內存空間。 經常,在訓練這些網絡時,深度學習從業人員需要使用多個GPU來有效地訓練它們。 在本文中,我將向您介紹如何使用PyTorch在GPU集群上設置分布式神經網絡訓練。
  • GPU上的隨機森林:比Apache Spark快2000倍
    由於其集成特徵的特點,隨機森林是一種可以在分布式計算環境中實現的算法。樹可以在集群中跨進程和機器並行訓練,結果比使用單個進程的訓練時間快得多。在本文中,我們探索了使用Apache Spark在CPU機器集群上實現分布式隨機森林訓練,並將其與使用NVIDIA RAPIDS和Dask的GPU機器集群上的訓練性能進行了比較。
  • 基於神經網絡的分布式交互指揮系統的方案設計
    基於神經網絡的分布式交互指揮系統的方案設計 佚名 發表於 2020-12-02 10:47:50 一、指揮系統的核心需求 按照首長提出的「指揮決策要由逐級決策向分布交互決策轉變
  • 代碼詳解:用Pytorch訓練快速神經網絡的9個技巧
    估計你還在用32位精度或*GASP(一般活動仿真語言)*訓練,甚至可能只在單GPU上訓練。如果市面上有99個加速指南,但你可能只看過1個?(沒錯,就是這樣)。但這份終極指南,會一步步教你清除模型中所有的(GP模型)。不要讓你的神經網絡變成這樣。(圖片來源:Monsters U)這份指南的介紹從簡單到複雜,一直介紹到你可以完成的大多數PITA修改,以充分利用你的網絡。
  • 使用神經網絡為圖像生成標題
    我們都知道,神經網絡可以在執行某些任務時複製人腦的功能。神經網絡在計算機視覺和自然語言生成方面的應用已經非常引人注目。本文將介紹神經網絡的一個這樣的應用,並讓讀者了解如何使用CNNs和RNNs (LSTM)的混合網絡實際為圖像生成標題(描述)。
  • 沒錯,純SQL查詢語句可以實現神經網絡
    但本文從另一角度嵌套SQL查詢語句而構建了一個簡單的三層全連接網絡,雖然由於語句的嵌套過深而不能高效計算,但仍然是一個非常有意思的實驗。在這篇文章中,我們將純粹用SQL實現含有一個隱藏層(以及帶 ReLU 和 softmax 激活函數)的神經網絡。這些神經網絡訓練的步驟包含前向傳播和反向傳播,將在 BigQuery 的單個SQL查詢語句中實現。
  • AWS在中國推出AWS Educate計劃
    (AWS) 今日在中國推出 AWS Educate 計劃,以此幫助中國教育工作者和學生在課堂中使用雲技術,為中國雲計算產業儲備人才。目前,一批來自清華大學、北京大學、上海交通大學、哈爾濱工業大學和西安交通大學的教授已率先加入AWS Educate 計劃,並將針對雲計算、物聯網 (IOT)、軟體工程和計算機科學 (CS) 基礎等主題的試點課程進行開發。
  • 神經網絡算法原理_神經網絡算法的應用_神經網絡算法實例說明
    神經網絡是一種模擬人腦結構的算法模型。其原理就在於將信息分布式存儲和並行協同處理。雖然每個單元的功能非常簡單,但大量單元構成的網絡系統就能實現非常複雜的數據計算,並且還是一個高度複雜的非線性動力學習系統。   神經網絡的結構更接近於人腦,具有大規模並行、分布式存儲和處理、自組織、自適應和自學能力。
  • 神經記憶網絡技術白皮書NMN
    《神經記憶網絡技術白皮書》——基於仿生學原理的分布式數據分類、傳遞和存儲解決方案神經記憶網絡來源:origin仿生學原理仿生學(Bionics)是研究生物系統的結構、性狀、原理、行為,為工程技術提供新的設計思想、工作原理和系統構成的技術科學,是一門生命科學、物質科學、數學與力學、信息科學、工程技術以及系統科學等學科的交叉學科
  • 環信人工智慧專家李理:詳解卷積神經網絡
    深度學習受到大家的關注很大一個原因就是Alex等人實現的AlexNet(一種深度卷積神經網絡)在LSVRC-2010 ImageNet這個比賽中取得了非常好的成績。此後,卷積神經網絡及其變種被廣泛應用於各種圖像相關任務。 這裡主要參考了Neural Networks and Deep Learning和cs231n的課程來介紹CNN,兩部分都會有理論和代碼。
  • 初學AI神經網絡應該選擇Keras或是Pytorch框架?
    TensorFlow框架儘管意義非凡,引起極大關注和神經網絡學習風潮,但對一般開發者用戶太不友好。軟體開發者畢竟不是科學家,很多時候簡單易學易用是程式設計師選擇的第一要素。目前,兩個主要的深度學習庫Keras和Pytorch獲得了大量關注,主要是因為它們的使用比較簡單。
  • 人工智慧之卷積神經網絡
    神經網絡的概念和組成部分人工神經網絡(Artificial Neural Networks,簡寫為ANNs)也簡稱為神經網絡(NNs)或稱作連接模型(Connection Model),它是一種模仿動物神經網絡行為特徵,進行分布式並行信息處理的算法數學模型。這種網絡依靠系統的複雜程度,通過調整內部大量節點之間相互連接的關係,從而達到處理信息的目的。
  • 【深度】機器學習進化史:從線性模型到神經網絡
    機器學習工具比如今我們使用的要更加簡單,他們包括邏輯回歸分析,SVMs(支持向量機),支持向量機內核,網頁排名等。利用這些技術,Google獲得了巨大成功,比如Google News就非常成功,還有Gmai垃圾郵件分類器,它利用易分布式算法進行排名和文本分類。到了上世紀90年代中期,這些技術已經變得十分成熟了。大約在2005年左右,神經網絡又開始捲土重來。
  • 從GPU、TPU到FPGA及其它:一文讀懂神經網絡硬體平臺戰局
    近日,多家公司的技術顧問 Matt Hurd 在其博客上發表了一篇全面評點各種神經網絡硬體平臺的長文,機器之心對本文進行了編譯介紹。這是我幾周前做的一個傳統的 90 年代風格的性別識別神經網絡的很好的隱藏節點。
  • 如何評價Google神經機器翻譯(GNMT)系統?
    (GNMT:Google Neural Machine Translation)系統,在官方博客中Google稱該系統使用了當前最先進的訓練技術,能夠實現到當下機器翻譯質量上最大的提升。機器翻譯需要海量的數據存儲空間以及高效的運算能力,而 Google 擁有 GoogleMapReduce(分布式計算系統)和 BigTable(分布式存儲系統),恰好滿足了這兩方面需求。幾年前,Google開始使用循環神經網絡來直接學習一個輸入序列(如一種語言的一個句子)到一個輸出序列(另一種語言的同一個句子)的映射。