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