您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了keras如何用多gpu并行運(yùn)行,內(nèi)容簡(jiǎn)而易懂,希望大家可以學(xué)習(xí)一下,學(xué)習(xí)完之后肯定會(huì)有收獲的,下面讓小編帶大家一起來(lái)看看吧。
一、多張gpu的卡上使用keras
有多張gpu卡時(shí),推薦使用tensorflow 作為后端。使用多張gpu運(yùn)行model,可以分為兩種情況,一是數(shù)據(jù)并行,二是設(shè)備并行。
二、數(shù)據(jù)并行
數(shù)據(jù)并行將目標(biāo)模型在多個(gè)設(shè)備上各復(fù)制一份,并使用每個(gè)設(shè)備上的復(fù)制品處理整個(gè)數(shù)據(jù)集的不同部分?jǐn)?shù)據(jù)。
利用multi_gpu_model實(shí)現(xiàn)
keras.utils.multi_gpu_model(model, gpus=None, cpu_merge=True, cpu_relocation=False)
具體來(lái)說(shuō),該功能實(shí)現(xiàn)了單機(jī)多 GPU 數(shù)據(jù)并行性。 它的工作原理如下:
將模型的輸入分成多個(gè)子批次。
在每個(gè)子批次上應(yīng)用模型副本。 每個(gè)模型副本都在專(zhuān)用 GPU 上執(zhí)行。
將結(jié)果(在 CPU 上)連接成一個(gè)大批量。
例如, 如果你的 batch_size 是 64,且你使用 gpus=2, 那么我們將把輸入分為兩個(gè) 32 個(gè)樣本的子批次, 在 1 個(gè) GPU 上處理 1 個(gè)子批次,然后返回完整批次的 64 個(gè)處理過(guò)的樣本。
參數(shù)
model: 一個(gè) Keras 模型實(shí)例。為了避免OOM錯(cuò)誤,該模型可以建立在 CPU 上, 詳見(jiàn)下面的使用樣例。
gpus: 整數(shù) >= 2 或整數(shù)列表,創(chuàng)建模型副本的 GPU 數(shù)量, 或 GPU ID 的列表。
cpu_merge: 一個(gè)布爾值,用于標(biāo)識(shí)是否強(qiáng)制合并 CPU 范圍內(nèi)的模型權(quán)重。
cpu_relocation: 一個(gè)布爾值,用來(lái)確定是否在 CPU 的范圍內(nèi)創(chuàng)建模型的權(quán)重。如果模型沒(méi)有在任何一個(gè)設(shè)備范圍內(nèi)定義,您仍然可以通過(guò)激活這個(gè)選項(xiàng)來(lái)拯救它。
返回
一個(gè) Keras Model 實(shí)例,它可以像初始 model 參數(shù)一樣使用,但它將工作負(fù)載分布在多個(gè) GPU 上。
例子
import tensorflow as tf from keras.applications import Xception from keras.utils import multi_gpu_model import numpy as np num_samples = 1000 height = 224 width = 224 num_classes = 1000 # 實(shí)例化基礎(chǔ)模型(或者「模版」模型)。 # 我們推薦在 CPU 設(shè)備范圍內(nèi)做此操作, # 這樣模型的權(quán)重就會(huì)存儲(chǔ)在 CPU 內(nèi)存中。 # 否則它們會(huì)存儲(chǔ)在 GPU 上,而完全被共享。 with tf.device('/cpu:0'): model = Xception(weights=None, input_shape=(height, width, 3), classes=num_classes) # 復(fù)制模型到 8 個(gè) GPU 上。 # 這假設(shè)你的機(jī)器有 8 個(gè)可用 GPU。 parallel_model = multi_gpu_model(model, gpus=8) parallel_model.compile(loss='categorical_crossentropy', optimizer='rmsprop') # 生成虛擬數(shù)據(jù) x = np.random.random((num_samples, height, width, 3)) y = np.random.random((num_samples, num_classes)) # 這個(gè) `fit` 調(diào)用將分布在 8 個(gè) GPU 上。 # 由于 batch size 是 256, 每個(gè) GPU 將處理 32 個(gè)樣本。 parallel_model.fit(x, y, epochs=20, batch_size=256) # 通過(guò)模版模型存儲(chǔ)模型(共享相同權(quán)重): model.save('my_model.h6')
注意:
要保存多 GPU 模型,請(qǐng)通過(guò)模板模型(傳遞給 multi_gpu_model 的參數(shù))調(diào)用 .save(fname) 或 .save_weights(fname) 以進(jìn)行存儲(chǔ),而不是通過(guò) multi_gpu_model 返回的模型。
即要用model來(lái)保存,而不是parallel_model來(lái)保存。
使用ModelCheckpoint() 遇到的問(wèn)題
使用ModelCheckpoint()會(huì)遇到下面的問(wèn)題:
TypeError: can't pickle ...(different text at different situation) objects
這個(gè)問(wèn)題和保存問(wèn)題類(lèi)似,ModelCheckpoint() 會(huì)自動(dòng)調(diào)用parallel_model.save()來(lái)保存,而不是model.save(),因此我們要自己寫(xiě)一個(gè)召回函數(shù),使得ModelCheckpoint()用model.save()。
修改方法:
class ParallelModelCheckpoint(ModelCheckpoint): def __init__(self,model,filepath, monitor='val_loss', verbose=0, save_best_only=False, save_weights_only=False, mode='auto', period=1): self.single_model = model super(ParallelModelCheckpoint,self).__init__(filepath, monitor, verbose,save_best_only, save_weights_only,mode, period) def set_model(self, model): super(ParallelModelCheckpoint,self).set_model(self.single_model) checkpoint = ParallelModelCheckpoint(original_model)
ParallelModelCheckpoint調(diào)用的時(shí)候,model應(yīng)該為原來(lái)的model而不是parallel_model。
EarlyStopping 沒(méi)有此類(lèi)問(wèn)題
二、設(shè)備并行
設(shè)備并行適用于多分支結(jié)構(gòu),一個(gè)分支用一個(gè)gpu。
這種并行方法可以通過(guò)使用TensorFlow device scopes實(shí)現(xiàn),下面是一個(gè)例子:
# Model where a shared LSTM is used to encode two different sequences in parallel input_a = keras.Input(shape=(140, 256)) input_b = keras.Input(shape=(140, 256)) shared_lstm = keras.layers.LSTM(64) # Process the first sequence on one GPU with tf.device_scope('/gpu:0'): encoded_a = shared_lstm(tweet_a) # Process the next sequence on another GPU with tf.device_scope('/gpu:1'): encoded_b = shared_lstm(tweet_b) # Concatenate results on CPU with tf.device_scope('/cpu:0'): merged_vector = keras.layers.concatenate([encoded_a, encoded_b], axis=-1)
三、分布式運(yùn)行
keras的分布式是利用TensorFlow實(shí)現(xiàn)的,要想完成分布式的訓(xùn)練,你需要將Keras注冊(cè)在連接一個(gè)集群的TensorFlow會(huì)話上:
server = tf.train.Server.create_local_server() sess = tf.Session(server.target) from keras import backend as K K.set_session(sess)
以上就是關(guān)于keras如何用多gpu并行運(yùn)行的內(nèi)容,如果你們有學(xué)習(xí)到知識(shí)或者技能,可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。