1.1 TensorFlow概要
TensorFlow是Google公司開(kāi)源的分布式機(jī)器學(xué)習(xí)框架氢妈。它的前身是DistBelief,在Google大規(guī)模內(nèi)部使用现恼。TensorFlow最早由Google Brain研究組發(fā)起。
官網(wǎng):http://www.tersorflow.org
Github網(wǎng)址:https://github.com/tensorflow/tensorflow
模型倉(cāng)庫(kù)網(wǎng)址:https://github.com/tensorflow/models
TensorFlow關(guān)鍵版本發(fā)布?xì)v史
- 2015.11.09 在Github上開(kāi)源(Ver0.5.0)
- 2015.12.10 支持Python3.3+,GPU性能提升...(Ver0.6.0)
- 2016.02.17 支持GPU使用Cuda7.0+捆愁、cuDNN R2+、cuDNN R4等運(yùn)算加速庫(kù)...(Ver0.7.0)
- 2016.04.30 通過(guò)gRPC實(shí)現(xiàn)分布式計(jì)算...(Ver0.8.0)
- 2016.06.28 支持Python3.5窟却,支持iOS昼丑,支持Mac電腦上的GPU計(jì)算...(Ver0.9.0)
- 2016.09.13 添加C++ shape inference,添加graph-construction C/C++(大部分) Api...(Ver0.10.0)
- 2016.11.11 支持cuDNN 5夸赫、Cuda8.0菩帝,HDFS...(Ver0.11.0)
- 2016.12.21 支持Windows環(huán)境運(yùn)行,cuDNN 5.1...(Ver0.12.0)
- 2017.02.16 發(fā)布正式版(Ver1.0.0)
- 2017.04.27 支持Windows下的Java Api...(Ver1.1.0)
- 2017.06.15 支持Windows下的Python 3.6...(Ver1.2.0)
前端API支持語(yǔ)言
- Python (推薦使用茬腿,API最全面)
- C++
- Go
- Java
- Rust
- Haskell
- 非官方(Julia呼奢、Javascript、R)
運(yùn)算操作硬件
- CPU: Linux, Mac, Windows, Android, iOS
- GPU: Linux, Mac, Windows
- TPU: Tensor Processing Unit(Google專(zhuān)門(mén)為大規(guī)模深度學(xué)習(xí)計(jì)算定制的芯片切平,內(nèi)部使用握础,AlphaGo采用)
應(yīng)用場(chǎng)景
- 語(yǔ)音識(shí)別
- 自然語(yǔ)言處理
- 計(jì)算機(jī)視覺(jué)
- 機(jī)器人控制
- 信息抽取
- 藥物研發(fā)
- 分子活動(dòng)預(yù)測(cè)
- ...
其他
- 編程模型:Dataflow-like model(數(shù)據(jù)流模型)
- 部署:一套代碼,全平臺(tái)運(yùn)行
- 運(yùn)行模式:?jiǎn)螜C(jī)悴品、分布式
- 數(shù)學(xué)表達(dá):Math Graph Expression(數(shù)學(xué)計(jì)算圖表達(dá))禀综、Auto Differentiation(自動(dòng)微分)
- 平臺(tái)支持:Google Cloud Platform、Hadoop File System
1.2 TensorFlow編程模型簡(jiǎn)介
TensorFlow的計(jì)算可以表示為一種有向圖(directed graph)苔严,或者稱(chēng)計(jì)算圖(computation graph)定枷。圖中每一個(gè)運(yùn)算操作(operation)是一個(gè)節(jié)點(diǎn)(node),節(jié)點(diǎn)之間的連接線稱(chēng)為邊(edge)届氢。計(jì)算圖中的節(jié)點(diǎn)可以有任意多個(gè)輸入和任意多個(gè)輸出欠窒,每個(gè)節(jié)點(diǎn)都只有一個(gè)運(yùn)算操作。在計(jì)算圖中流動(dòng)(flow)的數(shù)據(jù)被稱(chēng)為張量(tensor)退子,故得名TensorFlow贱迟。
計(jì)算圖示例
import tensorflow as tf
b=tf.Variable(tf.zeros([100])) # 生成100維的向量姐扮,初始化為0
W=tf.Variable(tf.random_uniform([784,100],-1,1)) # 生成784x100的隨機(jī)矩陣W
x=tf.placeholder(name="x") # 輸入的Placeholder
relu=tf.nn.relu(tf.matmul(W, x)+b) # ReLU(Wx+b)
C=[...] # 根據(jù)ReLU函數(shù)的結(jié)果計(jì)算Cost
s=tf.Session()
for step in range(0, 10):
input=...construct 100-D input array... # 為輸入創(chuàng)建一個(gè)100維的向量
result=s.run(C, feed_dict={x: input}) # 獲取Cost,供給輸入x
print(step, result)
Session是用戶使用TensorFlow時(shí)交互的接口衣吠。Session可以通過(guò)Extend方法添加節(jié)點(diǎn)(node)和邊(edge)茶敏。Variable是一類(lèi)特殊的運(yùn)算操作,可以將tensor存儲(chǔ)在內(nèi)存或顯存中缚俏。
內(nèi)建運(yùn)算操作
- 標(biāo)量運(yùn)算:Add惊搏、Sub、Mul忧换、Div恬惯、Exp、Log亚茬、Greater酪耳、Less、Equal
- 向量運(yùn)算:Concat刹缝、Slice碗暗、Split、Constant梢夯、Rank言疗、Shape、Shuffle
- 矩陣運(yùn)算:MatMul颂砸、MatrixInverse噪奄、MatrixDeterminant
- 帶狀態(tài)的運(yùn)算:Variable、Assign人乓、AssignAdd
- 神經(jīng)網(wǎng)絡(luò)組件:SoftMax勤篮、Sigmoid、ReLU色罚、Convolution2D碰缔、MaxPooling
- 存儲(chǔ)、恢復(fù):Save保屯、Restore
- 隊(duì)列及同步運(yùn)算:Enqueue手负、Dequeue、MutexAcquire姑尺、MutexRelease
- 控制流:Merge竟终、Switch、Enter切蟋、Leave统捶、NextIteration
工作組件
- client:客戶端執(zhí)行session run與master相連
- master:指導(dǎo)所有worker按流程執(zhí)行計(jì)算圖
- worker:與多個(gè)硬件設(shè)備(device)相連,并管理他們
每一個(gè)worker管理多個(gè)設(shè)備,設(shè)備的name包含硬件類(lèi)別喘鸟、編號(hào)匆绣、任務(wù)號(hào)(單機(jī)版沒(méi)有),例如:
單機(jī)模式:/job:localhost/device:cpu:0
分布式模式: /job:worker/task:17/device:gpu:3
運(yùn)行模式
- 單機(jī)模式:計(jì)算圖會(huì)按依賴關(guān)系被順序執(zhí)行什黑。當(dāng)一個(gè)節(jié)點(diǎn)的所有前置節(jié)點(diǎn)執(zhí)行完時(shí)(依賴數(shù)為0)崎淳,這個(gè)節(jié)點(diǎn)就會(huì)被加入ready queue以等待執(zhí)行;同時(shí)愕把,它后置的所有節(jié)點(diǎn)依賴數(shù)減1拣凹,這就是標(biāo)準(zhǔn)的計(jì)算拓?fù)浞绞健?/strong>
- 分布式模式:設(shè)計(jì)了一套節(jié)點(diǎn)(node)分配設(shè)備策略。 通過(guò)計(jì)算一個(gè)代價(jià)模型恨豁,估算每一個(gè)節(jié)點(diǎn)的輸入嚣镜、輸出tensor的大小和所需的時(shí)間。代價(jià)模型由人工經(jīng)驗(yàn)制定也可由實(shí)際運(yùn)算測(cè)量得到橘蜜。策略確定后菊匿,計(jì)算圖會(huì)被劃分成許多子圖,使用同一設(shè)備且相鄰的節(jié)點(diǎn)會(huì)被劃分到同一個(gè)子圖计福。子圖劃分的圖例如下:
單機(jī)單設(shè)備(device)改造成單機(jī)多設(shè)備(device)
for i in range(8):
for d in range(4):
with tf.device("/gpu:%d" % d):
input = x[i] if d is 0 else m[d-1]
m[d], c[d] = LSTMCell(input, mprev[d], cpev[d])
mprev[d] = m[d]
cprev[d] = c[d]
分布式容錯(cuò)性
- 信息從發(fā)送節(jié)點(diǎn)傳輸?shù)浇邮展?jié)點(diǎn)失敗時(shí)
- 周期性的worker心跳檢測(cè)失敗時(shí)
當(dāng)一個(gè)故障被檢測(cè)到跌捆,整個(gè)計(jì)算圖會(huì)終止并重啟。
擴(kuò)展功能
- 原生支持自動(dòng)求導(dǎo)(以后學(xué)習(xí))
- 支持單獨(dú)執(zhí)行子圖:bar:0表示名為bar的節(jié)點(diǎn)的第1個(gè)輸出棒搜,輸入數(shù)據(jù)的節(jié)點(diǎn)會(huì)連接一個(gè)feed node疹蛉,輸出的節(jié)點(diǎn)會(huì)連接一個(gè)fetch node
- 支持計(jì)算圖的控制流:if-condition活箕、while-loop力麸、Switch、Merge育韩、Enter克蚂、Leave、NextIteration
- 數(shù)據(jù)輸入除了feed node筋讨,還有特殊的input node直接輸入文件系統(tǒng)的路徑埃叭,從client讀取
- 隊(duì)列(queue):用于任務(wù)調(diào)度,讓計(jì)算圖的不同節(jié)點(diǎn)異步執(zhí)行
- 容器(container):管理長(zhǎng)期變量悉罕,比如Variable等
性能優(yōu)化
高度優(yōu)化的三方計(jì)算庫(kù)
- 線性代數(shù)計(jì)算庫(kù):Eigen
- 矩陣乘法計(jì)算庫(kù):BLAS赤屋、cuBLAS(CUDA BLAS)
- 深度學(xué)習(xí)計(jì)算庫(kù):cuda-convnet、cuDNN
加速神經(jīng)網(wǎng)絡(luò)訓(xùn)練的并行計(jì)算模式
- 數(shù)據(jù)并行:通過(guò)將一個(gè)mini-batch數(shù)據(jù)放在不同的設(shè)備上計(jì)算壁袄,實(shí)現(xiàn)梯度計(jì)算的并行化类早。計(jì)算還可以分同步、異步和混合三種方式嗜逻。同步的優(yōu)點(diǎn)是沒(méi)有梯度干擾涩僻,缺點(diǎn)是容錯(cuò)性差,一臺(tái)機(jī)器出現(xiàn)問(wèn)題后要重跑;異步的優(yōu)點(diǎn)是有一定容錯(cuò)性逆日,但是受梯度影響問(wèn)題嵌巷,導(dǎo)致每組梯度利用效率下降。
- 模型并行:將計(jì)算圖的不同部分放在不同的設(shè)備上運(yùn)算室抽,可以實(shí)現(xiàn)簡(jiǎn)單模型的并行搪哪。
- 流水線并行:和異步的數(shù)據(jù)并行很像,只不過(guò)是在同一個(gè)硬件設(shè)備上實(shí)現(xiàn)并行坪圾,提高設(shè)備利用率噩死。