keras 多gpu并行运行案例
一、多张gpu的卡上使用keras
有多张gpu卡时,推荐使用tensorflow作为后端。使用多张gpu运行model,可以分为两种情况,一是数据并行,二是设备并行。
二、数据并行
数据并行将目标模型在多个设备上各复制一份,并使用每个设备上的复制品处理整个数据集的不同部分数据。
利用multi_gpu_model实现
keras.utils.multi_gpu_model(model,gpus=None,cpu_merge=True,cpu_relocation=False)
具体来说,该功能实现了单机多GPU数据并行性。它的工作原理如下:
将模型的输入分成多个子批次。
在每个子批次上应用模型副本。每个模型副本都在专用GPU上执行。
将结果(在CPU上)连接成一个大批量。
例如,如果你的batch_size是64,且你使用gpus=2,那么我们将把输入分为两个32个样本的子批次,在1个GPU上处理1个子批次,然后返回完整批次的64个处理过的样本。
参数
model:一个Keras模型实例。为了避免OOM错误,该模型可以建立在CPU上,详见下面的使用样例。
gpus:整数>=2或整数列表,创建模型副本的GPU数量,或GPUID的列表。
cpu_merge:一个布尔值,用于标识是否强制合并CPU范围内的模型权重。
cpu_relocation:一个布尔值,用来确定是否在CPU的范围内创建模型的权重。如果模型没有在任何一个设备范围内定义,您仍然可以通过激活这个选项来拯救它。
返回
一个KerasModel实例,它可以像初始model参数一样使用,但它将工作负载分布在多个GPU上。
例子
importtensorflowastf fromkeras.applicationsimportXception fromkeras.utilsimportmulti_gpu_model importnumpyasnp num_samples=1000 height=224 width=224 num_classes=1000 #实例化基础模型(或者「模版」模型)。 #我们推荐在CPU设备范围内做此操作, #这样模型的权重就会存储在CPU内存中。 #否则它们会存储在GPU上,而完全被共享。 withtf.device('/cpu:0'): model=Xception(weights=None, input_shape=(height,width,3), classes=num_classes) #复制模型到8个GPU上。 #这假设你的机器有8个可用GPU。 parallel_model=multi_gpu_model(model,gpus=8) parallel_model.compile(loss='categorical_crossentropy', optimizer='rmsprop') #生成虚拟数据 x=np.random.random((num_samples,height,width,3)) y=np.random.random((num_samples,num_classes)) #这个`fit`调用将分布在8个GPU上。 #由于batchsize是256,每个GPU将处理32个样本。 parallel_model.fit(x,y,epochs=20,batch_size=256) #通过模版模型存储模型(共享相同权重): model.save('my_model.h5')
注意:
要保存多GPU模型,请通过模板模型(传递给multi_gpu_model的参数)调用.save(fname)或.save_weights(fname)以进行存储,而不是通过multi_gpu_model返回的模型。
即要用model来保存,而不是parallel_model来保存。
使用ModelCheckpoint()遇到的问题
使用ModelCheckpoint()会遇到下面的问题:
TypeError:can'tpickle...(differenttextatdifferentsituation)objects
这个问题和保存问题类似,ModelCheckpoint()会自动调用parallel_model.save()来保存,而不是model.save(),因此我们要自己写一个召回函数,使得ModelCheckpoint()用model.save()。
修改方法:
classParallelModelCheckpoint(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) defset_model(self,model): super(ParallelModelCheckpoint,self).set_model(self.single_model) checkpoint=ParallelModelCheckpoint(original_model)
ParallelModelCheckpoint调用的时候,model应该为原来的model而不是parallel_model。
EarlyStopping没有此类问题
二、设备并行
设备并行适用于多分支结构,一个分支用一个gpu。
这种并行方法可以通过使用TensorFlowdevicescopes实现,下面是一个例子:
#ModelwhereasharedLSTMisusedtoencodetwodifferentsequencesinparallel input_a=keras.Input(shape=(140,256)) input_b=keras.Input(shape=(140,256)) shared_lstm=keras.layers.LSTM(64) #ProcessthefirstsequenceononeGPU withtf.device_scope('/gpu:0'): encoded_a=shared_lstm(tweet_a) #ProcessthenextsequenceonanotherGPU withtf.device_scope('/gpu:1'): encoded_b=shared_lstm(tweet_b) #ConcatenateresultsonCPU withtf.device_scope('/cpu:0'): merged_vector=keras.layers.concatenate([encoded_a,encoded_b], axis=-1)
三、分布式运行
keras的分布式是利用TensorFlow实现的,要想完成分布式的训练,你需要将Keras注册在连接一个集群的TensorFlow会话上:
server=tf.train.Server.create_local_server() sess=tf.Session(server.target) fromkerasimportbackendasK K.set_session(sess)
以上这篇keras多gpu并行运行案例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。