2
本文作者: 高婓 | 2016-09-14 12:58 |
編者按:OpenAI研究工程師Vicki Cheung, Jonas Schneider , Ilya Sutskever, and Greg Brockman在本文中分享了從事Deep Learning研究工作所需要的基礎設施(軟件、硬件、配置和編制),舉例說明如何運用開源Kubernetes-ec2-autoscaler自動擴展深度學習研究中的網(wǎng)絡模型,將有助于廣大深度學習研究愛好者構建自己的深度學習基礎設施。
深度學習是一門實證科學,一個研究團隊的基礎設施建設將對未來的研究工作產生重大影響。所幸,當今的開源生態(tài)系統(tǒng)能夠使任何人具備構建更為完善的深度學習基礎設施的能力。
在這篇文章中,我們將為大家介紹深度學習研究通常是如何進行的,描述我們?yōu)榱酥С稚疃葘W習研究所選擇基礎設施,和開源Kubernetes-ec2-autoscaler,一種用于Kubernetes的批次優(yōu)化擴展管理器。我們希望,這篇文章有助于你構建自己的深度學習基礎設施。
深度學習的發(fā)展通常源于一個構想,你運用一個小問題來測試該構想的可行性。在這個階段,你想要快速開展許多特設實驗。理想條件下,你僅需要運用SSH(外殼安全協(xié)議)連接一臺計算機,在屏幕上編寫腳本代碼,通過這樣的操作,獲取結果,整個研究過程耗時不超過一個小時。
要使構建的模型真的有用通常會經歷很多次失敗,之后找到可行的方案克服模型本身存在的局限性。(這一過程與隨意建立一種新型軟件系統(tǒng)相似,你需要多次重復運行自己的代碼,這樣之后才能夠想象出它們將產生何種結果)。
你需要多角度檢測自己的模型,才能想象出這些模型到底是如何學習的。Dario Amodei的這種強化學習智能體(控制右邊的球拍)在乒乓球比賽中獲得較高得分,但是,當你觀察它是如何打球時,會發(fā)現(xiàn)右邊的球拍一直停留在原地沒有移動。因此,深度學習基礎設施必須能夠允許用戶靈活地反觀所采用的模型,僅僅展示出總結性的統(tǒng)計結果是不夠的。
當你的模型一旦具有廣闊的應用前景時,你會想要將其擴展應用到更大的數(shù)據(jù)集中和分辨率更高的GPU中。這將是一個長遠的工作,需要做很多輪的檢測,會持續(xù)很多天。在擴展應用過程中,需要認真管理實驗過程,非常謹慎地選擇超參數(shù)變化范圍。
早期的研究過程缺乏系統(tǒng)性,且操作快;相比之下,后期的研究是有條不紊地進行的,雖然在某種程度上顯得費力,但是,對于獲取良好的實驗結果是必不可少的。
論文Improved Techniques for Training GANs開篇便講述了Tim Salimans曾設計出幾種方法,用于改進生成對抗性網(wǎng)絡(GAN)訓練。我們在這里將以最簡化的方式描述這些觀點(這些觀點恰好能夠產生最為美觀的樣本,盡管不是最好的半監(jiān)督學習)。
GANs由一個生成器網(wǎng)絡和一個鑒別器網(wǎng)絡構成的。生成器試圖愚弄鑒別器,鑒別器試圖區(qū)分生成性數(shù)據(jù)和真實數(shù)據(jù)。憑直覺,我們會認為一個能夠愚弄所有鑒別器的生成器必定具有良好的性能。但是,仍然存在一個難以克服的難題:總是輸出幾乎相同的(簡直是逼真的)樣本將致使生成器“崩潰”。
Tim提出下列觀點,即為鑒別器提供小批次的樣本作為輸入信息,而不是僅僅提供一個樣本。這樣一來,鑒別器能夠分辨出生成器是否總是產出一種單一圖像。當生成器“崩潰”時,網(wǎng)絡將對生成器進行梯度調整來糾正這一問題。
下一步將是基于MNIST和CIFAR-10的觀點構建原型。這要求盡可能快地為一個小型模型構建原型,然后,將所構建的模型原型在真實數(shù)據(jù)上運行,并檢測獲取的結果。經過幾次快速循環(huán)后,Tim獲取了CIFAR-10樣本,這一成果令人感到興奮不已,是我們見過的在該數(shù)據(jù)集中獲得的最好的樣本。
然而,深度學習(通常稱之為AI算法)必須得到擴展,使之真正取得令人印象深刻的應用成果——一個小型神經網(wǎng)絡能夠用來證實一個構想(或概念),但是,一個大型神經網(wǎng)絡能夠用于解決實際問題,得到切實可行的方案。因而,Ian Goodfellow曾深度擴展該模型,致力于研究ImageNet。
運用我們的模型學習生成的ImageNet圖像
利用一個更大的模型和一個更為大型的數(shù)據(jù)集,Ian需要在多個GPU中并行運行該模型。研究過程中每一階段的作業(yè)都將把多臺計算機的CPU與GPU利用率提升至90%,但是,即便是這種模型也需要花費很多天進行訓練。在這個研究過程中,所進行的每一個實驗都變得非常有價值,他將認真地記錄每個實驗的結果。
我們TensorFlow代碼的樣本
在我們的研究中,大部分代碼是用Python編寫的,這一點可以從我們的開源項目中略知一二。通常情況下,我們用TensorFlow(在特殊情況下,運用Theano)計算GPU;使用Numpy或其他框架計算CPU。有時,我們的研究員也運用一些優(yōu)于TensorFlow的框架來計算GPU或CPU,如Keras。
與很多深度學習研究團隊一樣,我們運用Python 2.7。通常我們使用能夠便捷打包且用于性能優(yōu)化的Anaconda處理難以打包的數(shù)據(jù)庫,如OpenCV,并優(yōu)化一些科學數(shù)據(jù)庫的性能。
對于一個理想的批次作業(yè),使集群中的結點數(shù)量成倍增長將會把代碼運行的時間縮減一半。遺憾的是,在深度學習中,人們通常從許多GPU中觀察到次線性加速現(xiàn)象。要具備高性能的模型需要頂級的GPU。我們也將多數(shù)CPU用于模擬器,強化學習環(huán)境,或小規(guī)模模型(在CPU上的運行速度并不比在GPU上快)。
Nvidia-smi下滿載的Titan Xs
AWS為我們慷慨地提供了大量的計算方法。我們正將這些計算方法應用到CPU實例中,并用于水平擴展GPU。我們也運行自己的服務器,主要以運行Titan X GPU為主。我們期望研發(fā)出一種混合云:對于用不同的GPU,連接和其他技術開展實驗極為重要,這將有助于未來深度學習研究工作的發(fā)展。
在htop上同樣的物理單元顯示有許多未占用的CPU。我們通常將CPU密集型工作與GPU密集型分開運行。
我們對待深度學習研究的基礎設施,就像許多公司對待自己的產品一樣:它必須能夠呈現(xiàn)出一種簡單的界面,可用性與功能性同等重要。我們運用一套相互關聯(lián)的工具管理所有的服務器,盡可能保證每臺服務器的配置都一樣。
Terraform配置片段管理自動擴展組。Terraform創(chuàng)建,調整,或銷毀運行的云資源來匹配你的配置文件。
我們運用Terraform建立AWS云資源(實例,網(wǎng)絡路由,DNS記錄等)。我們的云和物理結點現(xiàn)在運行Ubuntu,并用Chef進行配置。為了實現(xiàn)加速處理,我們運用Packe預處理AMI集群。我們的所有集群均使用非重疊的IP范圍,運用用戶的便攜式電腦上的OpenVPN和物理結點(用作AWS的用戶門戶)的strongSwan連接公共網(wǎng)絡。
我們將用戶的主目錄,數(shù)據(jù)集和結果存儲在NFS(在物理硬件上)和EFS/S3(在AWS上)上。
可擴展的基礎設施經常致使簡單地情況變復雜。我們對小規(guī)模工作和大規(guī)模工作一視同仁,投入相同的努力構建基礎設施。當前正在積極擴充工具包,以便用戶能夠同時享用分布式用例和局部用例。
我們?yōu)樘卦O的實驗提供一個SSH結點集群,運行Kubernetes作為物理結點和AWS結點的集群調度器。集群跨越3個AWS區(qū)域——我們的作業(yè)具有突發(fā)性,有時會突然占用某些單個區(qū)域的全部資源。
Kubernetes要求每一個作業(yè)都是一個Docker容器,這樣便能夠為我們提供依賴分離和代碼快照。但是,建立一個新的Docker容器能夠為研究員操作代碼循環(huán)增加額外的寶貴時間,因而,我們也提供工具,旨在透明地將研究員便攜式電腦上的代碼轉移到一幅標準圖像上。
在TensorBoard上構建學習曲線
我們將Kubernetes的flannel網(wǎng)絡直接應用到研究員的便攜式電腦上,允許用戶使用無縫網(wǎng)絡訪問研究員運行的作業(yè)。這對于訪問監(jiān)測服務,如TensorBoard,非常有用。(我們最初采用的方法要求——從嚴格的分離角度來看,更為快速無誤——要求人們?yōu)槠湎胍┞兜亩丝谔峁┮环NKubernets服務,但是,我們發(fā)現(xiàn)采用這種方法會遇到很多難題)。
我們的工作量具有突發(fā)性和不可預測性:一系列研究可能快速地從單臺計算機實驗擴展到1000臺。例如,幾周內,一個實驗從一個交互式階段發(fā)展到要在單一的Titan X上運行,再到需要60 Titan X,最后發(fā)展到需要在將近1600個 AWS GPU上運行。因而,我們的云基礎設施需要動態(tài)配置Kubernetes結點。
在自動擴展組內能夠很容易地運行Kubernetes結點,但是,要合理地控制這些自動擴展組的規(guī)模將變得越來越難。在批次作業(yè)結束后,集群將能夠準確地了解到自己所需要的資源,能夠直接分配這些資源。(與之形成鮮明對比的是,AWS的擴展策略能夠逐個加速每一個新結點,直到仍有剩余資源,這個擴展過程將持續(xù)多個循環(huán)。)因而,在集群終止這些結點前,需要洩流這些結點,以避免丟失正在運行的作業(yè)。
僅利用原始的EC2進行大批量作業(yè)是非常誘人的,的確,這也是我們研究工作的起點。但是,Kubernetes生態(tài)系統(tǒng)帶來的價值更大:低阻力的工具,日志,監(jiān)測,具備脫離正在運行的實例管理物理結點的能力等類似優(yōu)點。合理地擴展Kubernetes要比基于原始EC2重新構建該生態(tài)系統(tǒng)更為簡單。
我們將要發(fā)行Kubernetes-ec2-autoscaler,一種用于Kubernetes的批量優(yōu)化擴展管理器。這種管理器能夠在Kubernetes的一種常規(guī)Pod上運行,僅要求你的工作結點在自動擴展組內。
Kubernetes集群的啟動配置
自動擴展器通過搜集Kubernetes主結點的狀態(tài)進行工作,主節(jié)點的狀態(tài)包括需要用于計算集群資源問詢和能力的一切資源。在可用資源過量的條件下,自動擴展器洩流相關的結點,最終終止這些結點 。如果需要更多的資源,自動擴展器將計算得出應當創(chuàng)建什么類型的服務器,并適當?shù)財U大自動擴展組的規(guī)模(或簡單地釋放被洩流的結點,這將縮減新結點加速花費的時間)。
Kubernetes-ec2-autoscaler能夠同時兼顧多個自動擴展組,享有CPU之外的資源(內存和GPU),并且能夠精細地約束你所運行的作業(yè),如AWS區(qū)域和實例規(guī)模。此外,由于即便是AWS也不具備無限的內存,突發(fā)性工作量將導致自動擴展組超時運行,并產生誤差。在這種情況下,Kubernetes-ec2-autoscaler能夠檢測誤差,并將多余的作業(yè)分配到次級AWS區(qū)域。
我們用于深度學習的基礎設施旨在最大限度地提高深度學習研究者的工作效率,使他們能夠專心致志地投入到科研中。我們正在構建工具進一步改進我們的基礎設施,完善工作流程,并將在未來幾周和幾個月內分享這些工具。歡迎大家共同努力加快深度學習研究的發(fā)展!
via Vicki Cheung et al
本文由雷鋒網(wǎng)獨家編譯,未經允許拒絕轉載!
雷峰網(wǎng)原創(chuàng)文章,未經授權禁止轉載。詳情見轉載須知。