開始
加載和管理數據
處理數據
horovod.spark
政府
參考和資源
2023年2月24日更新
給我們反饋
HorovodRunner是一個通用API,用於在Databricks上運行分布式深度學習工作負載Horovod框架。把Horovod和Spark整合起來障模式Databricks能夠在Spark上為長期運行的深度學習訓練作業提供更高的穩定性。HorovodRunner采用Python方法,包含帶有Horovod鉤子的深度學習訓練代碼。HorovodRunner在驅動程序上pickle該方法,並將其分發給Spark工作人員。Horovod MPI作業使用barrier執行模式嵌入為Spark作業。第一個執行程序收集所有任務執行程序使用的IP地址BarrierTaskContext觸發一個Horovod作業mpirun.每個Python MPI進程加載pickle用戶程序,反序列化它,並運行它。
BarrierTaskContext
mpirun
HorovodRunner讓你啟動Horovod培訓作業作為Spark作業。HorovodRunner API支持表中所示的方法。詳細信息請參見HorovodRunner API文檔.
方法及簽名
描述
init(自我,np)
創建一個HorovodRunner實例。
運行(自我,主要的,* * kwargs)
運行一個Horovod訓練作業調用主要(* * kwargs).main函數和關鍵字參數使用cloudpickle進行序列化,並分發給集群工作者。
主要(* * kwargs)
使用HorovodRunner開發分布式培訓程序的一般方法是:
創建一個HorovodRunner實例初始化的節點數。
HorovodRunner
定義一個Horovod訓練方法Horovod用法,確保在方法中添加任何import語句。
將訓練方法傳遞給HorovodRunner實例。
例如:
人力資源=HorovodRunner(np=2)def火車():進口tensorflow作為特遣部隊hvd.初始化()人力資源.運行(火車)
在driver上運行HorovodRunnern子流程,使用人力資源=HorovodRunner (np = - n).例如驅動節點上有4個圖形處理器,可以選擇n到4.查看參數的詳細信息np,請參閱HorovodRunner API文檔.有關如何為每個子進程固定一個GPU的詳細信息,請參見Horovod使用指南.
n
人力資源=HorovodRunner (np = - n)
4
np
一個常見的錯誤是無法找到或pickle TensorFlow對象。當庫導入語句沒有分發給其他執行程序時,就會發生這種情況。要避免此問題,請包含所有import語句(例如,進口tensorflow作為特遣部隊)這兩個在Horovod訓練方法的頂部,以及在Horovod訓練方法中調用的任何其他用戶定義函數內部。
進口tensorflow作為特遣部隊
Horovod有能力記錄其活動的時間軸,稱為Horovod時間表.
重要的
Horovod Timeline對性能有重大影響。當啟用Horovod Timeline時,Inception3的吞吐量可以降低~40%。要加速HorovodRunner作業,請不要使用Horovod Timeline。
在訓練進行中,您無法查看霍洛維德時間線。
要錄製霍洛維德時間線,請設置HOROVOD_TIMELINE將環境變量移到要保存時間軸文件的位置。Databricks建議使用共享存儲上的位置,以便可以輕鬆檢索時間軸文件。例如,你可以使用DBFS本地文件api如圖所示:
HOROVOD_TIMELINE
timeline_dir=“/ dbfs /毫升/ horovod-timeline /% s"%uuid.uuid4()操作係統.makedirs(timeline_dir)操作係統.環境[“HOROVOD_TIMELINE”]=timeline_dir+“/ horovod_timeline.json”人力資源=HorovodRunner(np=4)人力資源.運行(run_training_horovod,參數個數=參數個數)
然後,在訓練函數的開始和結束添加特定於時間軸的代碼。下麵的筆記本包括示例代碼,您可以使用作為一個變通方法來查看培訓進度。
在新標簽頁打開筆記本
若要下載時間軸文件,請使用數據庫命令行設置和文檔或FileStore,然後使用Chrome瀏覽器chrome: / /跟蹤查看它的設施。例如:
chrome: / /跟蹤
這些是將單節點深度學習代碼遷移到分布式訓練的一般步驟。的例子本節將說明這些步驟。
準備單節點代碼:使用TensorFlow、Keras或PyTorch準備和測試單節點代碼。
遷移到Horovod:按照從Horovod用法用Horovod遷移代碼並在驅動程序上測試:
添加hvd.init ()來初始化Horovod。
hvd.init ()
這個進程使用固定的服務器GPUconfig.gpu_options.visible_device_list.對於每個進程一個GPU的典型設置,這可以設置為本地rank。在這種情況下,服務器上的第一個進程將被分配第一個GPU,第二個進程將被分配第二個GPU,以此類推。
config.gpu_options.visible_device_list
包括數據集的一個碎片。這個數據集操作符在運行分布式訓練時非常有用,因為它允許每個工作者讀取一個唯一的子集。
將學習率按工人數量縮放。在同步分布式訓練中,有效批大小是由工人數量來縮放的。提高學習率可以補償增加的批處理大小。
封裝優化器hvd。DistributedOptimizer.分布式優化器將梯度計算委托給原始優化器,使用allreduce或allgather平均梯度,然後應用平均梯度。
hvd。DistributedOptimizer
添加hvd.BroadcastGlobalVariablesHook (0)將初始變量狀態從秩0廣播到所有其他進程。當培訓以隨機權重開始或從檢查點恢複時,這對於確保所有工作人員的一致初始化是必要的。或者,如果你不使用MonitoredTrainingSession,則可以執行hvd.broadcast_global_variables初始化全局變量後的操作。
hvd.BroadcastGlobalVariablesHook (0)
MonitoredTrainingSession
hvd.broadcast_global_variables
修改代碼,隻保存工作人員0上的檢查點,以防止其他工作人員破壞它們。
遷移到HorovodRunner:HorovodRunner通過調用Python函數來運行Horovod訓練作業。必須將主要訓練過程包裝成一個Python函數。然後您可以在本地模式和分布式模式下測試HorovodRunner。
請注意
這篇文章引用了這個術語奴隸Databricks沒有使用這個術語。當這個術語從軟件中刪除後,我們將從本文中刪除它。
如果升級或降級TensorFlow、Keras或PyTorch,必須重新安裝Horovod,以便根據新安裝的庫進行編譯。例如,如果你想升級TensorFlow, Databricks建議使用TensorFlow安裝說明並將以下TensorFlow特定的Horovod安裝代碼附加到它的末尾。看到Horovod安裝說明使用不同的組合,例如升級或降級PyTorch和其他庫。
Add-apt-repository -y ppa:ubuntu-toolchain-r/test apt update#使用與TensorFlow編譯Horovod相同的編譯器Apt install g++-7 -y update-alternatives——install /usr/bin/gcc60——slave /usr/bin/g++ g++ /usr/bin/g++HOROVOD_GPU_ALLREDUCE=NCCLHOROVOD_CUDA_HOME=/usr/local/cuda PIP安裝horovod= =0.18.1——force-重裝——no-deps——no-cache-dir
下麵的例子,基於MNIST數據集,演示如何使用HorovodRunner將單節點深度學習程序遷移到分布式深度學習。
如果支持在Databricks回購文件在工作空間中啟用,那麼HorovodRunner將不工作如果np設置為大於1,並且筆記本從repo內的其他文件導入。考慮使用horovod.spark而不是HorovodRunner.