一、多张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 数量, 或 GPU ID 的列表。
cpu_merge: 一个布尔值,用于标识是否强制合并 CPU 范围内的模型权重。
cpu_relocation: 一个布尔值,用来确定是否在 CPU 的范围内创建模型的权重。如果模型没有在任何一个设备范围内定义,您仍然可以通过激活这个选项来拯救它。
返回
一个 Keras Model 实例,它可以像初始 model 参数一样使用,但它将工作负载分布在多个 GPU 上。
例子
?
注意:
要保存多 GPU 模型,请通过模板模型(传递给 multi_gpu_model 的参数)调用 .save(fname) 或 .save_weights(fname) 以进行存储,而不是通过 multi_gpu_model 返回的模型。
即要用model来保存,而不是parallel_model来保存。
使用ModelCheckpoint() 遇到的问题
使用ModelCheckpoint()会遇到下面的问题:
TypeError: can't pickle ...(different text at different situation) objects
这个问题和保存问题类似,ModelCheckpoint() 会自动调用parallel_model.save()来保存,而不是model.save(),因此我们要自己写一个召回函数,使得ModelCheckpoint()用model.save()。
修改方法:
?
ParallelModelCheckpoint调用的时候,model应该为原来的model而不是parallel_model。
EarlyStopping 没有此类问题
二、设备并行
设备并行适用于多分支结构,一个分支用一个gpu。
这种并行方法可以通过使用TensorFlow device scopes实现,下面是一个例子:
?
三、分布式运行
keras的分布式是利用TensorFlow实现的,要想完成分布式的训练,你需要将Keras注册在连接一个集群的TensorFlow会话上:
?
以上这篇keras 多gpu并行运行案例就是小编分享给大家的全部内容了,希望能给大家一个参考。