花了一些時間看了一下TensorFlow 核心(core)部分的源代碼,主要是C++的部分。除了C++ 11的代碼實在有些燒腦以外,感嘆一下TensorFlow的架構(gòu)設(shè)計得真不錯:
首先TensorFlow core要解決的問題全部集中在了圖上:每個節(jié)點(node)就是一個操作(op),比如說矩陣乘法,每條邊(edge)就是操作的輸入也就是數(shù)據(jù)或者依賴關(guān)系(稱為control edge)。每個op對應(yīng)了不同的實現(xiàn),也被稱為kernel,比如說用GPU去做矩陣運算的實現(xiàn),或者FPGA去做加法的實現(xiàn)等等。
然后就是如何優(yōu)化了:
1) 首先是一個圖的變換操作:用戶輸入的圖根據(jù)op、kernel和輸入/中間數(shù)據(jù),被分布到不同的機器的硬件(device)上。這樣把一個大圖分拆成為了幾個子圖(每個device上一個?)。
2) 然后對分拆之后的子圖再進行進一步的優(yōu)化,比如說把那些無法訪問的節(jié)點(dead node)刪掉,把那些輸入、輸出、操作都一樣的子圖找出來防止重復(fù)計算 (Common Subexpression Elimination)等等
3)最后就是一些下層模塊的優(yōu)化,比如說RPC怎么做更快,Kernel怎么實現(xiàn)更優(yōu)化等等。
這樣的架構(gòu)設(shè)計基本上能保證
1)不同層級之間的耦合很小,不至于一個改動牽一而發(fā)動全身。
2)項目的擴展性很好,有很少的瓶頸。比如說完全可以有一個小團隊專門進行RPC的實現(xiàn)(RDMA),或者說用FPGA來實現(xiàn)不同op的kernel等等。這樣可以完全讓一個上百人的團隊來并行的開發(fā)kernel和周邊的東西。
目前讀下來唯一覺得可能會導(dǎo)致擴展性的地方是Session還有圖優(yōu)化部分的實現(xiàn),很難讓大團隊能夠在這個部分并行工作,不過這部分代碼也不是勞動密集型的改動,所以看起來也沒什么大問題