TensorFlow分布式(多GPU和多服务器)详解
本文介紹有關(guān) TensorFlow 分布式的兩個(gè)實(shí)際用例,分別是數(shù)據(jù)并行(將數(shù)據(jù)分布到多個(gè) GPU 上)和多服務(wù)器分配。
玩轉(zhuǎn)分布式TensorFlow:多個(gè)GPU和一個(gè)CPU
展示一個(gè)數(shù)據(jù)并行的例子,其中數(shù)據(jù)被切分到多個(gè) GPU 上。
具體做法
考慮在單個(gè) GPU 上運(yùn)行矩陣乘法的這段代碼:
通過(guò)圖內(nèi)拷貝模式中對(duì)代碼進(jìn)行了分割,如以下兩個(gè)不同 GPU 的代碼片段所示。請(qǐng)注意,CPU 充當(dāng) master 節(jié)點(diǎn),分配計(jì)算圖,并收集最終結(jié)果:
這是一個(gè)非常簡(jiǎn)單的案例,其中計(jì)算圖由作為 master 的 CPU 分成兩部分,并分配給作為 worker 的兩個(gè) GPU,計(jì)算結(jié)果由 CPU 收集。
玩轉(zhuǎn)分布式TensorFlow:多服務(wù)器
在這個(gè)案例中學(xué)習(xí)如何將 TensorFlow 計(jì)算分配到多個(gè)服務(wù)器中,其中需假設(shè) worker 和參數(shù)服務(wù)器的代碼是相同的,因此每個(gè)計(jì)算節(jié)點(diǎn)的作用就是傳遞命令行參數(shù)。
具體做法
考慮以下這段代碼,所采用的集群架構(gòu)包括一個(gè)在 192.168.1.1:1111 上運(yùn)行的master和兩個(gè)分別在 192.168.1.2:1111 和 192.168.1.3:1111 上運(yùn)行的 worker。
請(qǐng)注意,代碼被復(fù)制到多臺(tái)機(jī)器上,因此知道當(dāng)前執(zhí)行節(jié)點(diǎn)的角色是很重要的,從命令行中能得到這些信息。機(jī)器可以是一個(gè) worker 或一個(gè)參數(shù)服務(wù)器。
給定一個(gè)集群,運(yùn)行訓(xùn)練服務(wù),每個(gè)計(jì)算節(jié)點(diǎn)都能夠有一個(gè)角色(worker 或者 ps)和一個(gè) id。
根據(jù)計(jì)算節(jié)點(diǎn)的角色,計(jì)算是不同的:
如果角色是參數(shù)服務(wù)器,則條件是加入服務(wù)。請(qǐng)注意,在這種情況下,沒(méi)有要執(zhí)行的代碼,因?yàn)?worker 將不斷推送更新,而參數(shù)服務(wù)器必須執(zhí)行的唯一操作就是等待。
相反,worker 代碼將在集群內(nèi)的特定設(shè)備上執(zhí)行。這部分代碼與第一次構(gòu)建模型然后進(jìn)行本地訓(xùn)練的單個(gè)機(jī)器上執(zhí)行的代碼類(lèi)似。TensoFlow 輕松地完成了所有的工作分配以及更新結(jié)果的收集,并且提供了非常方便的 tf.train.replica_device_setter,可自動(dòng)將運(yùn)算操作分配給設(shè)備。
解讀分析
在這個(gè)案例中,已經(jīng)看到了如何創(chuàng)建一個(gè)具有多個(gè)計(jì)算節(jié)點(diǎn)的集群。節(jié)點(diǎn)既可以扮演參數(shù)服務(wù)器的角色,也可以扮演 worker 的角色。
在這兩種情況下,執(zhí)行的代碼是相同的,但是根據(jù)從命令行收集的參數(shù),代碼的執(zhí)行則是不同的。參數(shù)服務(wù)器只需要等待 worker 發(fā)送更新。tf.train.replica_device_setter(…) 的作用是自動(dòng)將運(yùn)算操作分配給可用設(shè)備,而 tf.train.ClusterSpec(…) 用于集群設(shè)置。
另外請(qǐng)注意,出于效率原因,可以使用多個(gè)參數(shù)服務(wù)器。利用參數(shù),服務(wù)器可以提供更好的網(wǎng)絡(luò)利用率,并允許將模型擴(kuò)展到更多的并行機(jī)器。
總結(jié)
以上是生活随笔為你收集整理的TensorFlow分布式(多GPU和多服务器)详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 在C++中加载TorchScript模型
- 下一篇: TensorFlow分布式详解