在學習如何使用tensorflow平行計算之前,我們必須要明白一些相關概念。這將有助於我們更好的學習和理解tensorflow的並行運算機制。
這句話的意思是一台計算機有多個物理cpu
物理cpu數:主機板上實際插入的cpu數量,可以數不重複的 physical id 有幾個(physical id)
單塊cpu上面能處理資料的晶元組的數量,如雙核、四核等 (cpu cores)
一般情況下,邏輯cpu=物理cpu個數×每顆核數,如果不相等的話,則表示伺服器的cpu支援超執行緒技術(ht:簡單來說,它可使處理器中的1 顆核心如2 顆核心那樣在作業系統中發揮作用。這樣一來,作業系統可使用的執行資源擴大了一倍,大幅提高了系統的整體效能,此時邏輯cpu=物理cpu個數×每顆核數x2)
我們知道執行緒是作業系統最小的排程單位,單個執行緒同時只能在單個cpu執行緒(cpu執行緒相當於邏輯cpu數)中執行,對於多核的cpu系統中,開啟多執行緒有助於加速程式的執行。
平行計算(英語:parallel computing)一般是指許多指令得以同時進行的計算模式。在同時進行的前提下,可以將計算的過程分解成小部分,之後以併發方式來加以解決。多執行緒也算做並行運算。一般用以加速程式的運算。
在tensorflow中使用並行運算有很多方式,比如增加執行緒、使用多塊gpu、使用多塊cpu等,因為我使用的伺服器上只有兩塊cpu,所以下面我們以使用cpu為例,gpu也是一樣的。
值得注意的
tensorflow官方文件寫到,對於以上兩種配置,如果都沒有設定或設定為 0,則會預設使用邏輯 cpu 核心的數目。對於許多系統,包括 4 核的 cpu,以及包含
70 多個邏輯核心的多 cpu 系統,測試都顯示預設設定已經非常高效。
關於tensorflow使用並行運算,解釋起來比較抽象,我們還是用乙個例子更好的來說明一下吧!
配置設定如下:
config = tf.configproto(device_count=
, inter_op_parallelism_threads =2,
intra_op_parallelism_threads =4,
log_device_placement=
true
)
執行結果:
配置執行過程使用的核心數和所開執行緒數的方式加速:
extracting ./data/mnist/train-images-idx3-ubyte.gz
extracting ./data/mnist/train-labels-idx1-ubyte.gz
extracting ./data/mnist/t10k-images-idx3-ubyte.gz
extracting ./data/mnist/t10k-labels-idx1-ubyte.gz
0.0761
0.8259
0.893
0.9184
0.9262
0.9391
0.945
0.9497
0.9544
0.955
0.9575
0.959
0.9616
0.9652
0.9669
0.9697
0.9684
0.9705
0.9717
0.9709
batch_time: 0.20636706495285034
peak memory: 6262.14 mib, increment: 6042.41 mib
cpu times: user 16min 14s, sys: 2min 7s, total: 18min 22s
wall time: 5min 7s
可見,每訓練乙個batch耗時batch_time=0.20636706495285034s; 總耗時5min7s
配置設定如下:
with tf.device(
'/cpu:0'):
資料載入
卷積層with tf.device(
'/cpu:0'):
全連線層
梯度計算
config = tf.configproto(device_count=
, inter_op_parallelism_threads =2,
intra_op_parallelism_threads =4,
log_device_placement=
true
)
執行結果:
extracting ./data/mnist/train-images-idx3-ubyte.gz
extracting ./data/mnist/train-labels-idx1-ubyte.gz
extracting ./data/mnist/t10k-images-idx3-ubyte.gz
extracting ./data/mnist/t10k-labels-idx1-ubyte.gz
0.1135
0.7231
0.8665
0.9071
0.9238
0.9322
0.9389
0.9442
0.9501
0.9519
0.9537
0.957
0.958
0.962
0.965
0.9658
0.964
0.9683
0.9693
0.9698
batch_time: 0.19959420514106752
peak memory: 6239.59 mib, increment: 6020.55 mib
cpu times: user 15min 48s, sys: 2min, total: 17min 49s
wall time: 4min 58s
可見,每訓練乙個batch耗時batch_time=0.19959420514106752; 總耗時4min 58s,比第一種方式快。
配置設定如下:
config = tf.configproto(device_count=
, inter_op_parallelism_threads =2,
intra_op_parallelism_threads =40,
log_device_placement=
true
)
執行結果:
配置執行過程使用的核心數和所開執行緒數的方式加速:
extracting ./data/mnist/train-images-idx3-ubyte.gz
extracting ./data/mnist/train-labels-idx1-ubyte.gz
extracting ./data/mnist/t10k-images-idx3-ubyte.gz
extracting ./data/mnist/t10k-labels-idx1-ubyte.gz
0.124
0.8032
0.8919
0.9134
0.9293
0.9391
0.9461
0.95
0.9521
0.9556
0.9581
0.9609
0.9646
0.964
0.9652
0.9656
0.9675
0.9694
0.9707
0.9702
batch_time: 0.053559075355529784
peak memory: 6271.99 mib, increment: 6052.40 mib
cpu times: user 27min 6s, sys: 6min 47s, total: 33min 53s
wall time: 1min 22s
可見,每訓練乙個batch耗時batch_time=0.053559075355529784; 總耗時1min 22s,比第第乙個配置方式快了近4倍。
通過上面的實驗,我們可以看出通過配置網路使用不同的硬體,增加對運算的執行緒和使用到的cpu核心數等,可以大大提高神經網路的執行效率,節約訓練時間。
Tensorflow的平行計算
每個gpu上的模型相同,喂以相同模型不同的訓練樣本。資料並行根據引數更新方式的不同又可以分為同步資料並行和非同步資料並行。每個gpu根據loss計算各自的gradient,彙總所有gpu的gradient,求平均梯度,根據平均梯度更新模型引數,具體過程見下圖。所以同步資料並行的速度取決於最慢的gpu...
關於Tensorflow分布式並行策略
tensorflow中主要包括了三種不同的並行策略,其分別是資料並行 模型並行 模型計算流水線並行,具體參考tenssorflow 在接下來分別簡單介紹三種並行策略的原理 資料並行 乙個簡單的加速訓練的技術是並行地計算梯度,然後更新相應的引數。資料並行又可以根據其更新引數的方式分為同步資料並行和非同...
Tensorflow基本使用
使用 tensorflow,你必須明白 tensorflow tensorflow 是乙個程式設計系統,使用圖來表示計算任務.圖中的節點被稱之為 op operation 的縮寫 乙個 op 獲得 0 個或多個tensor,執行計算,產生 0 個或多個tensor.每個 tensor 是乙個型別化的...