原創(chuàng)|行業(yè)資訊|編輯:龔雪|2017-03-09 14:11:10.000|閱讀 405 次
概述:高階機器學(xué)習(xí)中必不可少的TensorFlow框架的深度學(xué)習(xí)!
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
TensorFlow 是相對高階的機器學(xué)習(xí)庫,用戶可以方便地用它設(shè)計神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),而不必為了追求高效率的實現(xiàn)親自寫 C++或 CUDA 代碼。它和 Theano 一樣都支持自動求導(dǎo),用戶不需要再通過反向傳播求解梯度。TensorFlow 是相對高階的機器學(xué)習(xí)庫,用戶可以方便地用它設(shè)計神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),而不必為了追求高效率的實現(xiàn)親自寫 C++或 CUDA 代碼。它和 Theano 一樣都支持自動求導(dǎo),用戶不需要再通過反向傳播求解梯度。其核心代碼和 Caffe 一樣是用 C++編寫的,使用 C++簡化了線上部署的復(fù)雜度,并讓手機這種內(nèi)存和CPU資源都緊張的設(shè)備可以運行復(fù)雜模型(Python 則會比較消耗資源,并且執(zhí)行效率不高)。除了核心代碼的 C++接口,TensorFlow 還有官方的 Python、Go 和 Java 接口,是通過 SWIG(Simplified Wrapper and Interface Generator)實現(xiàn)的,這樣用戶就可以在一個硬件配置較好的機器中用 Python進行實驗,并在資源比較緊張的嵌入式環(huán)境或需要低延遲的環(huán)境中用 C++部署模型。SWIG 支持給 C/C++代碼提供各種語言的接口,因此其他腳本語言的接口未來也可以通過 SWIG 方便地添加。不過使用 Python 時有一個影響效率的問題是,每一個 mini-batch 要從 Python 中 feed 到網(wǎng)絡(luò)中,這個過程在 mini-batch 的數(shù)據(jù)量很小或者運算時間很短時,可能會帶來影響比較大的延遲。
TensorFlow 也有內(nèi)置的 TF.Learn 和 TF.Slim 等上層組件可以幫助快速地設(shè)計新網(wǎng)絡(luò),并且兼容 Scikit-learn estimator 接口,可以方便地實現(xiàn) evaluate、grid search、cross validation 等功能。同時 TensorFlow 不只局限于神經(jīng)網(wǎng)絡(luò),其數(shù)據(jù)流式圖支持非常自由的算法表達,當(dāng)然也可以輕松實現(xiàn)深度學(xué)習(xí)以外的機器學(xué)習(xí)算法。事實上,只要可以將計算表示成計算圖的形式,就可以使用 TensorFlow 。用戶可以寫內(nèi)層循環(huán)代碼控制計算圖分支的計算,TensorFlow 會自動將相關(guān)的分支轉(zhuǎn)為子圖并執(zhí)行迭代運算。TensorFlow 也可以將計算圖中的各個節(jié)點分配到不同的設(shè)備執(zhí)行,充分利用硬件資源。定義新的節(jié)點只需要寫一個 Python 函數(shù),如果沒有對應(yīng)的底層運算核,那么可能需要寫 C++或者 CUDA 代碼實現(xiàn)運算操作。
在數(shù)據(jù)并行模式上,TensorFlow 和 Parameter Server 很像,但 TensorFlow 有獨立的 Variable node,不像其他框架有一個全局統(tǒng)一的參數(shù)服務(wù)器,因此參數(shù)同步更自由。TensorFlow 和 Spark 的核心都是一個數(shù)據(jù)計算的流式圖,Spark 面向的是大規(guī)模的數(shù)據(jù),支持 SQL 等操作,而 TensorFlow 主要面向內(nèi)存足以裝載模型參數(shù)的環(huán)境,這樣可以最大化計算效率。
TensorFlow 的另外一個重要特點是它靈活的移植性,可以將同一份代碼幾乎不經(jīng)過修改就輕松地部署到有任意數(shù)量 CPU 或 GPU 的 PC、服務(wù)器或者移動設(shè)備上。相比于 Theano,TensorFlow 還有一個優(yōu)勢就是它極快的編譯速度,在定義新網(wǎng)絡(luò)結(jié)構(gòu)時,Theano 通常需要長時間的編譯,因此嘗試新模型需要比較大的代價,而 TensorFlow 完全沒有這個問題。TensorFlow 還有功能強大的可視化組件 TensorBoard,能可視化網(wǎng)絡(luò)結(jié)構(gòu)和訓(xùn)練過程,對于觀察復(fù)雜的網(wǎng)絡(luò)結(jié)構(gòu)和監(jiān)控長時間、大規(guī)模的訓(xùn)練很有幫助。TensorFlow 針對生產(chǎn)環(huán)境高度優(yōu)化,它產(chǎn)品級的高質(zhì)量代碼和設(shè)計都可以保證在生產(chǎn)環(huán)境中穩(wěn)定運行,同時一旦 TensorFlow 廣泛地被工業(yè)界使用,將產(chǎn)生良性循環(huán),成為深度學(xué)習(xí)領(lǐng)域的事實標(biāo)準(zhǔn)。
除了支持常見的網(wǎng)絡(luò)結(jié)構(gòu)(卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network,CNN)、循環(huán)神經(jīng)網(wǎng)絡(luò)(Recurent Neural Network,RNN))外,TensorFlow 還支持深度強化學(xué)習(xí)乃至其他計算密集的科學(xué)計算(如偏微分方程求解等)。TensorFlow 此前不支持 symbolic loop,需要使用 Python 循環(huán)而無法進行圖編譯優(yōu)化,但最近新加入的 XLA 已經(jīng)開始支持 JIT 和 AOT,另外它使用 bucketing trick 也可以比較高效地實現(xiàn)循環(huán)神經(jīng)網(wǎng)絡(luò)。TensorFlow 的一個薄弱地方可能在于計算圖必須構(gòu)建為靜態(tài)圖,這讓很多計算變得難以實現(xiàn),尤其是序列預(yù)測中經(jīng)常使用的 beam search。
TensorFlow 的用戶能夠?qū)⒂?xùn)練好的模型方便地部署到多種硬件、操作系統(tǒng)平臺上,支持 Intel 和 AMD 的 CPU,通過 CUDA 支持 NVIDIA 的 GPU (最近也開始通過 OpenCL 支持 AMD 的 GPU,但沒有 CUDA 成熟),支持 Linux 和 Mac,最近在 0.12 版本中也開始嘗試支持 Windows。在工業(yè)生產(chǎn)環(huán)境中,硬件設(shè)備有些是最新款的,有些是用了幾年的老機型,來源可能比較復(fù)雜,TensorFlow 的異構(gòu)性讓它能夠全面地支持各種硬件和操作系統(tǒng)。同時,其在 CPU 上的矩陣運算庫使用了 Eigen 而不是 BLAS 庫,能夠基于 ARM 架構(gòu)編譯和優(yōu)化,因此在移動設(shè)備(Android 和 iOS)上表現(xiàn)得很好。
TensorFlow 在最開始發(fā)布時只支持單機,而且只支持 CUDA 6.5 和 cuDNN v2,并且沒有官方和其他深度學(xué)習(xí)框架的對比結(jié)果。在 2015 年年底,許多其他框架做了各種性能對比評測,每次 TensorFlow 都會作為較差的對照組出現(xiàn)。那個時期的 TensorFlow 真的不快,性能上僅和普遍認(rèn)為很慢的 Theano 比肩,在各個框架中可以算是墊底。但是憑借 Google 強大的開發(fā)實力,很快支持了新版的 cuDNN (目前支持cuDNN v5.1),在單 GPU 上的性能追上了其他框架。
各深度學(xué)習(xí)框架在 AlexNet 上的性能對比
目前在單 GPU 的條件下,絕大多數(shù)深度學(xué)習(xí)框架都依賴于 cuDNN,因此只要硬件計算能力或者內(nèi)存分配差異不大,最終訓(xùn)練速度不會相差太大。但是對于大規(guī)模深度學(xué)習(xí)來說,巨大的數(shù)據(jù)量使得單機很難在有限的時間完成訓(xùn)練。這時需要分布式計算使 GPU 集群乃至 TPU 集群并行計算,共同訓(xùn)練出一個模型,所以框架的分布式性能是至關(guān)重要的。TensorFlow 在 2016 年 4 月開源了分布式版本,使用 16 塊 GPU 可達單 GPU 的 15 倍提速,在 50 塊 GPU 時可達到 40 倍提速,分布式的效率很高。目前原生支持的分布式深度學(xué)習(xí)框架不多,只有 TensorFlow、CNTK、DeepLearning4J、MXNet 等。不過目前 TensorFlow 的設(shè)計對不同設(shè)備間的通信優(yōu)化得不是很好,其單機的 reduction 只能用 CPU 處理,分布式的通信使用基于 socket 的 RPC,而不是速度更快的 RDMA,所以其分布式性能可能還沒有達到最優(yōu)。
Google 在 2016 年 2 月開源了 TensorFlow Serving,這個組件可以將 TensorFlow 訓(xùn)練好的模型導(dǎo)出,并部署成可以對外提供預(yù)測服務(wù)的 RESTful 接口,如圖 2-2 所示。有了這個組件,TensorFlow 就可以實現(xiàn)應(yīng)用機器學(xué)習(xí)的全流程:從訓(xùn)練模型、調(diào)試參數(shù),到打包模型,最后部署服務(wù),名副其實是一個從研究到生產(chǎn)整條流水線都齊備的框架。這里引用 TensorFlow 內(nèi)部開發(fā)人員的描述:“ TensorFlow Serving 是一個為生產(chǎn)環(huán)境而設(shè)計的高性能的機器學(xué)習(xí)服務(wù)系統(tǒng)。它可以同時運行多個大規(guī)模深度學(xué)習(xí)模型,支持模型生命周期管理、算法實驗,并可以高效地利用 GPU 資源,讓 TensorFlow 訓(xùn)練好的模型更快捷方便地投入到實際生產(chǎn)環(huán)境”。除了 TensorFlow 以外的其他框架都缺少為生產(chǎn)環(huán)境部署的考慮,而 Google 作為廣泛在實際產(chǎn)品中應(yīng)用深度學(xué)習(xí)的巨頭可能也意識到了這個機會,因此開發(fā)了這個部署服務(wù)的平臺。TensorFlow Serving 可以說是一副王牌,將會幫 TensorFlow 成為行業(yè)標(biāo)準(zhǔn)做出巨大貢獻。
TensorFlow Serving 架構(gòu)
TensorBoard 是 TensorFlow 的一組 Web 應(yīng)用,用來監(jiān)控 TensorFlow 運行過程,或可視化 Computation Graph。TensorBoard 目前支持五種可視化:標(biāo)量(scalars)、圖片(images)、音頻(audio)、直方圖(histograms)和計算圖(Computation Graph)。TensorBoard 的 Events Dashboard 可以用來持續(xù)地監(jiān)控運行時的關(guān)鍵指標(biāo),比如 loss、學(xué)習(xí)速率(learning rate)或是驗證集上的準(zhǔn)確率(accuracy);Image Dashboard 則可以展示訓(xùn)練過程中用戶設(shè)定保存的圖片,比如某個訓(xùn)練中間結(jié)果用 Matplotlib 等繪制(plot)出來的圖片;Graph Explorer 則可以完全展示一個 TensorFlow 的計算圖,并且支持縮放拖曳和查看節(jié)點屬性。TensorBoard 的可視化效果如圖所示
TensorBoard 的 loss 標(biāo)量的可視化
TensorBoard 的模型結(jié)構(gòu)可視化
TensorFlow 擁有產(chǎn)品級的高質(zhì)量代碼,有 Google 強大的開發(fā)、維護能力的加持,整體架構(gòu)設(shè)計也非常優(yōu)秀。相比于同樣基于 Python 的老牌對手 Theano,TensorFlow 更成熟、更完善,同時 Theano 的很多主要開發(fā)者都去了 Google 開發(fā) TensorFlow(例如書籍 Deep Learning 的作者 Ian Goodfellow,他后來去了 OpenAI)。Google 作為巨頭公司有比高校或者個人開發(fā)者多得多的資源投入到 TensorFlow 的研發(fā),可以預(yù)見,TensorFlow 未來的發(fā)展將會是飛速的,可能會把大學(xué)或者個人維護的深度學(xué)習(xí)框架遠(yuǎn)遠(yuǎn)甩在身后。
更多行業(yè)資訊,更新鮮的技術(shù)動態(tài),盡在。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn