【DL】Keras框架调用多个GPU并行训练,并保存模型

多GPU训练可以在一定程度上提高训练的效率,Keras在以TensorFlow为底层的时候,可以方便的调用多GPU进行训练。其训练的原理是将一个神经网络在多块GPU中进行初始化,并且将一个batch的数据分配到不同的GPU中反向传播结束后,再使用CPU进行合并更新参数

举个例子:
同时使用两块GPU,batch_size=32的话,Keras会将16个给0号GPU,另外16个给1号GPU,训练结束后将二者拼接为一个32的batch并进行反向传播更新参数。

多GPU其实分为两种使用情况:数据并行和设备并行。

数据并行将目标模型在多个设备上各复制一份,并使用每个设备上的复制品处理整个数据集的不同部分数据。

Keras在 keras.utils.multi_gpu_model 中提供有内置函数,该函数可以产生任意模型的数据并行版本,最高支持在8片GPU上并行。

数据并行利用多块GPU同时训练多个batch数据,运行在每块GPU上的模型为同一个神经网络,网络结构完全一样,并且共享模型参数

设备并行是在不同设备上运行同一个模型的不同部分,当模型含有多个并行结构,例如含有两个分支时,这种方式很适合。

我们大多数时候要用到的都是数据并行

这里就给出数据并行的多GPU训练示例:

from keras.utils.training_utils import multi_gpu_model   #导入keras多GPU函数

model = get_model()
parallel_model = multi_gpu_model(model, gpus=2) # 设置使用2个gpu,该句放在模型compile之前
parallel_model.compile(loss='categorical_crossentropy', optimizer=Adam(), metrics=['accuracy'])
hist = parallel_model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs_num, validation_data=(x_test, y_test), verbose=1, callbacks=callbacks)

使用多 gpu 并行训练并使用 ModelCheckpoint() 可能遇到的问题:

  1. 报错(楼主尚未遇到)
  2. 可以正常训练,保存模型,但是,进行测试时,权重混乱,预测失败。(目前遇到过)

当需要使用Keras的checkpoint的功能的时候,使用如下函数。注意:初始化的参数model,就是单个的model,而不是用于多GPU训练的parallel_model。

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(model, save_path, monitor='val_auc', verbose=1, save_best_only=True, save_weights_only=False, mode='max')
 
callbacks = [check_point, early_stopping, tbCallBack]
 
model.fit(x_train, y_train,
          batch_size=config.batch_size,
          epochs=config.nb_epoch, 
          verbose=config.verbose, 
          shuffle=True,
          validation_data=(x_valid, y_valid),
          callbacks=callbacks)

总体上本篇博客的思想就是:楼主遇到一个bug,keras框架下,单卡训练模型,保存模型,加载测试模型,正常;但是,双卡训练模型,保存模型正常,在最后测试的时候出现问题,主要是因为使用Keras的checkpoint的功能的时候需要写一个class,上述代码已给出,当然还有其他的解决方案,请看这里,here或者这里点我!!!

参考

keras中文文档
https://keras.io/zh/models/model/

https://www.jianshu.com/p/4203a6435ab5

https://blog.csdn.net/u012862372/article/details/80367607

https://blog.csdn.net/ywcpig/article/details/105659637

https://blog.csdn.net/qq_34564612/article/details/79209965

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机器不学习我学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值