花了一些時(shí)間看了一下TensorFlow 核心(core)部分的源代碼,主要是C++的部分。除了C++ 11的代碼實(shí)在有些燒腦以外,感嘆一下TensorFlow的架構(gòu)設(shè)計(jì)得真不錯(cuò):

首先TensorFlow core要解決的問(wèn)題全部集中在了圖上:每個(gè)節(jié)點(diǎn)(node)就是一個(gè)操作(op),比如說(shuō)矩陣乘法,每條邊(edge)就是操作的輸入也就是數(shù)據(jù)或者依賴關(guān)系(稱為control edge)。每個(gè)op對(duì)應(yīng)了不同的實(shí)現(xiàn),也被稱為kernel,比如說(shuō)用GPU去做矩陣運(yùn)算的實(shí)現(xiàn),或者FPGA去做加法的實(shí)現(xiàn)等等。

然后就是如何優(yōu)化了:
1) 首先是一個(gè)圖的變換操作:用戶輸入的圖根據(jù)op、kernel和輸入/中間數(shù)據(jù),被分布到不同的機(jī)器的硬件(device)上。這樣把一個(gè)大圖分拆成為了幾個(gè)子圖(每個(gè)device上一個(gè)?)。
2) 然后對(duì)分拆之后的子圖再進(jìn)行進(jìn)一步的優(yōu)化,比如說(shuō)把那些無(wú)法訪問(wèn)的節(jié)點(diǎn)(dead node)刪掉,把那些輸入、輸出、操作都一樣的子圖找出來(lái)防止重復(fù)計(jì)算 (Common Subexpression Elimination)等等
3)最后就是一些下層模塊的優(yōu)化,比如說(shuō)RPC怎么做更快,Kernel怎么實(shí)現(xiàn)更優(yōu)化等等。

這樣的架構(gòu)設(shè)計(jì)基本上能保證
1)不同層級(jí)之間的耦合很小,不至于一個(gè)改動(dòng)牽一而發(fā)動(dòng)全身。
2)項(xiàng)目的擴(kuò)展性很好,有很少的瓶頸。比如說(shuō)完全可以有一個(gè)小團(tuán)隊(duì)專門進(jìn)行RPC的實(shí)現(xiàn)(RDMA),或者說(shuō)用FPGA來(lái)實(shí)現(xiàn)不同op的kernel等等。這樣可以完全讓一個(gè)上百人的團(tuán)隊(duì)來(lái)并行的開(kāi)發(fā)kernel和周邊的東西。

目前讀下來(lái)唯一覺(jué)得可能會(huì)導(dǎo)致擴(kuò)展性的地方是Session還有圖優(yōu)化部分的實(shí)現(xiàn),很難讓大團(tuán)隊(duì)能夠在這個(gè)部分并行工作,不過(guò)這部分代碼也不是勞動(dòng)密集型的改動(dòng),所以看起來(lái)也沒(méi)什么大問(wèn)題



網(wǎng)友評(píng)論