新框架簡化了強化學習代理的分散式和可擴充套件培訓。
> Source: https://uber.github.io/fiber
我最近開始了以AI為重點的教育通訊,該通訊已經有70,000多個訂閱者。TheSequence是不面向BS(意味著沒有大肆宣傳,沒有新聞等)的面向ML的新聞通訊,需要5分鐘的閱讀時間。目的是使您瞭解機器學習專案,研究論文和概念的最新動態。請透過以下訂閱嘗試一下:
序列TheSequence解釋了主要的機器學習概念,並讓您及時瞭解最相關的專案和…計算成本是採用機器學習模型的主要挑戰之一。深度強化學習(DRL)等領域中一些最新的突破性模型具有計算要求,導致大多陣列織禁止這樣做,這導致DRL仍然侷限於大型AI研究實驗室的實驗。為了使DRL成為主流,它必須伴隨有效地解決複雜計算要求的高效分散式計算方法。最近,Uber開源了Fiber,這是一種可擴充套件的分散式計算框架,適用於DRL和基於人群的方法。
從培訓到模擬,跨機器學習生命週期的許多領域都需要分散式計算方法。在監督學習方法中,我們似乎已經在分散式培訓框架(如Horovod)方面取得了進步。但是,在分散式計算基礎架構方面,DRL方案帶來了一系列挑戰。
強化學習的分散式計算挑戰憑直覺,我們傾向於認為監督學習模型的分散式培訓框架應適用於DRL方法。但是,現實有點不同。鑑於經常使用各種各樣的模擬來訓練DRL方法,因此我們需要一個適應該獨特環境的分散式計算框架。首先,大多數模擬模型都在CPU上執行,並且並未針對GPU環境進行最佳化。從這個角度來看,分散式培訓方法應能夠根據特定要求同時使用大量資源。此外,DRL方法在整個培訓生命週期中通常需要不同的資源。DRL方法會根據其環境特徵逐漸擴大培訓規模,這很常見。這些因素使DRL培訓的規模擴充套件成為非常獨特的挑戰,並不十分適合為監督模型設計的分散式培訓框架。
除了DRL的獨特特徵外,分散式訓練/計算還具有非常獨特的障礙,應考慮以下因素:
使程式碼在膝上型電腦或桌上型電腦上本地工作與在生產叢集上執行程式碼之間存在巨大差距。您可以使MPI在本地工作,但是在計算機叢集上執行它是完全不同的過程。沒有動態縮放可用。如果您啟動需要大量資源的作業,那麼很可能需要等到所有內容分配完畢後才能執行作業。這種等待擴大規模的做法使效率降低。缺少錯誤處理。在執行時,某些作業可能會失敗。而且您可能會陷入非常討厭的境地,您必須恢復部分結果或放棄整個執行。學習費用高。每個系統都有不同的API和程式設計約定。為了使用新系統啟動作業,使用者必須先學習一組全新的約定,然後才能啟動作業。這些是Uber為其新的開放原始碼框架解決的挑戰。
引入FiberFiber是用於現代計算機叢集的基於Python的分散式計算庫。該框架使使用者能夠使用標準且熟悉的庫介面為大型計算機叢集編寫應用程式。從設計角度來看,Fiber封裝了一些關鍵功能,這些功能有助於DRL模型的分散式訓練:
易於使用。Fiber使您可以編寫在計算機群集上執行的程式,而無需深入研究計算機群集的詳細資訊。簡單易學。Fiber提供了與人們熟悉的Python標準多處理庫相同的API。快速的效能。Fiber的通訊主幹網建立在Nanomsg之上,Nanomsg是一個高效能的非同步訊息傳遞庫,可實現快速可靠的通訊。無需部署。您可以像在計算機群集上執行普通應用程式一樣執行Fiber應用程式,而Fiber會為您處理其餘的事情。可靠的計算。當您執行工作池時,Fiber具有內建的錯誤處理功能。為了實現上述目標,Fiber提供了一種體系結構,該體系結構分為三個不同的層:API,後端和群集。API層為Fiber之類的程序,佇列,池和管理器提供了基本的構建塊。它們具有與多處理相同的語義,但已擴充套件為可在分散式環境中工作。後端層處理諸如在不同叢集管理器上建立或終止作業的任務。最後,叢集層由不同的叢集管理器組成。儘管它們不是Fiber本身的一部分,但它們可以幫助光纖管理資源並跟蹤不同的作業,從而減少Fiber需要跟蹤的專案數量。
> Source: https://uber.github.io/fiber
Fiber中的分散式計算原語借鑑了並行和並行程式設計理論中的傳統工件。具體來說,Fiber多處理模型提供了一種架構,其中包括管道,佇列,池和管理器等元件。
Fiber中的佇列和管道的行為與多處理中的相同。區別在於,佇列和管道現在由在不同計算機上執行的多個程序共享。例如,下圖顯示了在三個不同的光纖程序之間共享的Fiber佇列。一個Fiber程序與該佇列位於同一臺計算機上,而其他兩個程序位於另一臺計算機上。一個程序正在寫入佇列,其他兩個程序正在從佇列讀取。
> Source: https://uber.github.io/fiber
池允許使用者管理工作程序池。Fibre擴充套件了具有工作支援流程的池,因此每個池可以管理數千個(遠端)工作者。由作業支援的過程可以在本地或跨大量遠端計算機的計算機群集中執行容器化的應用程式。
> Source: https://uber.github.io/fiber
最後,Fiber管理器使Fiber能夠支援諸如共享儲存之類的功能,這對分散式系統至關重要。通常,此功能由計算機群集上的外部儲存(如Cassandra,Redis等)處理。Fiber提供了內建的記憶體儲存供應用程式使用。該介面與多處理程式的Manager型別相同。
為了瞭解Fiber的實際應用,讓我們舉一個使用原型DRL模型執行的示例。以下簡化程式碼說明了使Fiber工作的步驟。本質上,開發人員需要啟動管理器(RemoveEnvManager),建立一系列環境,並在其中分佈模型以收集最終結果。顯然,此程式碼取決於您的光纖環境的基礎架構設定。
# fiber.BaseManager is a manager that runs remotelyclass RemoteEnvManager(fiber.managers.AsyncManager): passclass Env(gym.env): # gym env passRemoteEnvManager.register('Env', Env)def build_model(): # create a new policy model return modeldef update_model(model, observations): # update model with observed data return new_modeldef train(): model = build_model() manager = RemoteEnvManager() num_envs = 10 envs = [manager.Env() for i in range(num_envs)] handles = [envs[i].reset() for i in num_envs] obs = [handle.get() for handle in handles] for i in range(1000): actions = model(obs) handles = [env.step() for action in actions] obs = [handle.get() for handle in handles] model = update_model(model, obs)
Uber對Fiber進行了基準測試,並採用了跨不同標準的最新分散式計算方法,例如Spark或IPyParallel。結果表明,在大多數測試中,Fiber的效能均優於其他方法。例如,下圖顯示,Fiber能夠完成任務的速度比IPyParallel快24倍,比Spark快38倍。
> Source: https://uber.github.io/fiber
Fiber為DRL模型的分散式訓練提供了非常可靠的體系結構。Fiber實現了許多目標,包括有效利用大量異構計算硬體,動態擴充套件演算法以提高資源使用效率以及減輕使複雜演算法在計算機群集上工作所需的工程負擔。Fiber的初始版本已在GitHub上開源,並且也提供了研究論文。