眾所周知,,TensorFlow來(lái)自于Google第一代深度學(xué)習(xí)DistBelief的改進(jìn)。DistBelief基于參數(shù)服務(wù)器實(shí)現(xiàn)了數(shù)據(jù)并行,,而每個(gè)數(shù)據(jù)分片內(nèi)部可進(jìn)行模型并行,,如下圖所示。
Worker: TensorFlow由一個(gè)master進(jìn)程和數(shù)個(gè)worker進(jìn)程組成,master和worker之間通過(guò)接口通信,,單機(jī)版和分布式均包含這種抽象,,因此更改接口就實(shí)現(xiàn)了單機(jī)版和分布式的切換。每個(gè)worker負(fù)責(zé)管理一個(gè)或者多個(gè)Device(包含CPU和GPU),,Device是TensorFlow具體計(jì)算的硬件抽象,。 Cluster: cluster定義為T(mén)ensorFlow分布式執(zhí)行的任務(wù)集,cluster由一個(gè)或者多個(gè)job組成,,每個(gè)job由多個(gè)task組成,。每個(gè)task由一個(gè)worker來(lái)執(zhí)行, 在前邊的用TensorFlow手動(dòng)實(shí)現(xiàn)參數(shù)服務(wù)器的代碼中,,在ps job里,,并沒(méi)有指定task運(yùn)行的device:代碼用的是with tf.device("/job:ps/task:0")而不是with tf.device("/job:ps/task:0/gpu:0"),此時(shí)TensorFlow會(huì)自動(dòng)給task分配device,。根據(jù)TensorFlow白皮書(shū),,TensorFlow提供了一個(gè)代價(jià)模型來(lái)給計(jì)算流圖中各節(jié)點(diǎn)分配device的自動(dòng)分配算法,然而根據(jù)代碼,,盡管代價(jià)模型存在,,但目前TensorFlow(2016年7月版)并沒(méi)有采用,而是用了很簡(jiǎn)單的自動(dòng)分配算法,,這部分對(duì)應(yīng)的邏輯放在tensorflow/core/common_runtime/simple_placer.cc中,。該算法優(yōu)先分配GPU而非CPU,只有三種情況除外:一種是代碼要求運(yùn)行在CPU之上,,另外兩種是不同于TensorFlow白皮書(shū)的啟發(fā)式算法,,邏輯很簡(jiǎn)單,例如generator節(jié)點(diǎn),,就是那些在計(jì)算流圖中沒(méi)有入口只有一個(gè)出口的節(jié)點(diǎn),,會(huì)跟出口節(jié)點(diǎn)分配到同樣的device;而一些元數(shù)據(jù)操作節(jié)點(diǎn),,例如reshape,,也會(huì)跟執(zhí)行數(shù)據(jù)操作的節(jié)點(diǎn)運(yùn)行在同樣的device之上。 因此通用流程為:給定計(jì)算流圖,,simple_placer總是給sink,source之外的節(jié)點(diǎn)分配GPU:0,,如果想采用多個(gè)GPU,,或者在分布式環(huán)境下,,那么用戶(hù)需要在他們的代碼中手動(dòng)指定device。因此,,在目前看來(lái),,TensorFlow依賴(lài)程序員自身來(lái)實(shí)現(xiàn)數(shù)據(jù)并行和模型并行邏輯,因此如果想有效的利用硬件,,需要仔細(xì)地設(shè)計(jì)代碼,。 關(guān)于TensorFlow的cost model,它的實(shí)現(xiàn)在tensorflow/core/graph/costmodel.h以及tensorflow/core/common_runtime/costmodel_manage.cc中,,根據(jù)白皮書(shū)的定義,,該模型會(huì)在計(jì)算流圖生成的時(shí)候模擬每個(gè)device上的負(fù)載,并利用啟發(fā)式策略估計(jì)device上的完成時(shí)間,。啟發(fā)式策略會(huì)根據(jù)如下數(shù)據(jù)調(diào)整device的分配:節(jié)點(diǎn)任務(wù)執(zhí)行的總時(shí)間,;單個(gè)節(jié)點(diǎn)任務(wù)執(zhí)行的累計(jì)時(shí)間;單個(gè)節(jié)點(diǎn)輸出數(shù)據(jù)的尺寸,。但目前cost model還沒(méi)有生效:在costmodel.cc里,,AddToCostGraphDef函數(shù)"cnode->set_device(n->assigned_device_name());",目前該model包含的的都是已經(jīng)分配的節(jié)點(diǎn),,因此還沒(méi)生效,。 簡(jiǎn)單地評(píng)價(jià)下TensorFlow的分布式實(shí)現(xiàn),從0.8版本包含該功能以來(lái),,感覺(jué)TensorFlow目前還處于發(fā)展的初期階段,,這甚至可以類(lèi)比成Kubernetes這個(gè)同為Google力推的項(xiàng)目在2015年的狀態(tài),因此從效率,,易用性(主要指分布式計(jì)算資源的管理和調(diào)度)上面還需要很多改進(jìn)工作,,特別是在算法的收斂性上,TensorFlow依賴(lài)使用者實(shí)現(xiàn)Parameter Server的邏輯,,對(duì)于SSP等收斂性保證則缺乏考慮,,至于說(shuō)深度學(xué)習(xí)訓(xùn)練中的帶寬節(jié)省等方面因素,也幾乎沒(méi)有考慮(即便cost model投入使用,,也會(huì)只是簡(jiǎn)單的根據(jù)帶寬消耗進(jìn)行調(diào)度,,缺乏進(jìn)一步和整體考慮),因此,,在現(xiàn)階段我們只能說(shuō)在目前TensorFlow實(shí)現(xiàn)了基本的SDK,,而留了更多的工作給未來(lái),然而,,也正是因?yàn)轫?xiàng)目出自Google引發(fā)的從眾效應(yīng),,可以預(yù)計(jì)TensorFlow也會(huì)跟Kubernetes那樣快速發(fā)展。不過(guò)從Roadmap上來(lái)看[1],,對(duì)于這些因素目前Google還不認(rèn)為是大的問(wèn)題,。 本文內(nèi)容來(lái)自韓國(guó)人對(duì)TensorFlow的研究[2],,互聯(lián)網(wǎng)上對(duì)于TensorFlow的研究遍地開(kāi)花,然而多數(shù)對(duì)于內(nèi)在機(jī)理的剖析浮于表面,,這也是本號(hào)轉(zhuǎn)載的目的之一,。本文只代表個(gè)人觀點(diǎn),如有偏頗之處敬請(qǐng)指正,。 [1] https://github.com/tensorflow/tensorflow/blob/master/tensorflow/g3doc/resources/roadmap.md [2] http:///category/studies/tensorflow/ |
|
來(lái)自: 雪柳花明 > 《TensorFLow練習(xí)匯總》