如何評價Tensorflow和其它深度學習系統
Google開源了新一代深度學習引擎TensorFlow。本文解釋了一些TF里面我覺得可以從系統方面值得看的地方。
編程模型
TF目前的編程模型是符號編程 (symbolic computation)。大致的想法就是使用符號API去描述計算通過計算流圖的方式,以及更新邏輯,然后通過像服務器去發送計算流圖的方式來進行計算。原因是所有的計算全部需要通過計算流圖來描述,也就是其實通pythonAPI編寫的主要是Tensorflow這一門新的語言。然后通過session的run來進行一些交互。這樣子做的主要好處是計算流圖的執行可以進行比較多的優化,因為用戶只是指定了數據關系,以及需要什么,計算的中間變量如何分配,是否需要保留,都是可以進行優化的。這一點是相比于Torch和numpy的庫相對可以更多優化的地方。不過反過來說,和原有host語言的交互會相對比較有限一些,會比較難利用一些host語言(python)的特性來編寫如條件和更新法則之類的東西。
作為一個工程師,從優化性能的角度,很容易傾向于用symbolic描述所有東西,然后做盡量多的優化。而作為researcher(Torch來自NYU),更容易傾向于靈活性,而選擇過程計算風格的編程。
支持Mutation
和目前的符號語言比起來,TF最大的特點是強化了數據流圖,引入了mutation的概念。這一點是TF和包括Theano在內的符號編程框架最大的不同。所謂mutation,就是可以在計算的過程更改一個變量的值,而這個變量在計算的過程中會被帶入到下一輪迭代里面去。Mutation是機器學習優化算法幾乎必須要引入的東西(雖然也可以通過immutablereplacement來代替,但是會有效率的問題)。 Theano的做法是引入了updatestatement來處理mutation。TF選擇了純符號計算的路線,并且直接把更新引入了數據流圖中去。從目前的白皮書看還會支持條件和循環。這樣就幾乎讓TF本身成為一門獨立的語言。不過這一點會導致最后的API設計和使用需要特別小心,把mutation引入到數據流圖中會帶來一些新的問題,比如如何處理寫與寫之間的依賴。
細粒度操作優化
這一點是Google作為一個公司的資源帶來的優勢。TF大部分的操作是細粒度操作,可以來帶比較大的靈活性,不過反過來,也在工程上面需要比較多的優化開銷。一個更加偷懶的做法是直接支持常見的粗粒度操作,加上比較少的細粒度操作來做輔助,這樣基本上可以減低優化帶來的overhead,而對于大部分的問題也就可以比較輕松的應對了。caffe2和mxnet走了粗粒度操作加細粒度這條路也是基于同樣的原因。這屬于是在有限資源constraint下面做出的更加輕量級的選擇。
分布式支持
TF目前并沒有直接放出分布式的支持。從放出來的白皮書看,分布式的容錯采取了consistent checkpointrestart策略,似乎沒有更加fancy容錯,但是又非常實用。可以看到google對于系統的選擇還是非常現實的。同樣的也可以反思現在的分布式系統,機器學習是不是真的需要像比如lineage這樣的容錯機制其實要打一個很大的問號。
Parameter Server已經過時了?
在TF白皮書里面提到的一點是PS因為系統的abstraction直接成為計算流圖的一部分,相對弱化了PS作為一個系統的地位。這一點的主要原因是dependencytracking在計算流圖里面得到的強化,而PS本身的一大功能就是完成dependencytracking。如果你仔細看mxnet本身的kvstore的實現,就會發現本地的參數整合代碼幾乎完全是利用依賴引擎完成的,這樣的確可以大大簡化PS的代碼實現。不過PS本身作為一個abstraction,在通信和數據consistency上面還是可以提供一些不錯的dataparallel 解決方案。未來的方向應該是各個系統更加融合,ps本身也作為一個依賴調度中的primitive直接整合入深度學習引擎,而不再作為一個宿主系統存在了。
目前系統的關系
TF在編程模型上面最相似的是Theano,基本涵蓋了Theano所有的功能。在最近新的編程框架上面,比較相關的兩個,一個是caffe2,另外一個是mxnet。
caffe2的設計風格基本和TF一致,走的是符號計算的路線,唯一的不同是支持粗粒度的操作,這一點在之前也有提到,是為了輕量級而做的選擇。目前主要由yangqing一個人完成,可以認為是輕量級的TF。
mxnet的設計思路是符號計算和過程計算混合。在符號計算部分沒有引入mutation,而是允許把符號計算融入到過程計算中,通過host語言來表述更新法則,同時動態調度過程計算的和符號計算的指令。這么做對于調度引擎需要更多的一些要求,并且也可能帶來一些效率的影響(過程計算是動態執行的,有動態內存開銷,更少一些優化),不過如果合理地把主要的瓶頸部分放到符號計算里面去,剩下的部分用更加靈活的過程計算來做,最終的效率影響不會特別大。
這兩個系統在依賴調度和系統優化上面的思想應該和TF基本一致,有興趣的同學可以對比學習一下。
選擇什么
我本人參與了mxnet的設計,因此比較難公正地回答這個問題。不過有一點是肯定的,計算流圖和優化的思想,以及依賴關系的調度,和計算優化會是下一代深度學習系統的主題。
一些個人的note
DMLC團隊從五月份開始決定聯合三個項目做mxnet,六月份設計完成,到九月份初步版本確立。我個人在參與設計mxnet之后七月到G brain實習,接觸到了TF和內部的東西。個人的感覺,不同的項目設計是在不同的人力資源,目標(靈活度,效率)和taste的權衡下面做出不同優化的設計決定。mxnet,caffe2和TF的設計實現差別大概就在于此。沒有對錯,只看每個設計者的品味和想法了。因為這一點,讓我確信我們做了正確的選擇,并且決定繼續九月份結束實習后幫助團隊mxnet到目前相對完整的階段。yangqing因為工作的緣故可能限制更多一些,不過也希往每個人也都有機會實現每心中理想的系統。
一些資料
關于編程模型的區別可以參考http://mxnet.readthedocs.org/en/latest/program_model.html
來自:http://weibo.com/p/1001603907610737775666