当前位置:   article > 正文

Keras使用多GPU训练模型、保存、加载_train model with 8 gpus 这是什么意思

train model with 8 gpus 这是什么意思

多GPU训练可以在一定程度上提高训练的效率,Keras在以TensorFlow为底层的时候,可以方便的调用多GPU进行训练。其训练的原理是将一个神经网络在多块GPU中进行初始化,并且将一个batch的数据分配到不同的GPU中,反向传播结束后,再使用CPU进行合并更新参数。举个例子,同时使用两块GPU,batchsize是16的话,Keras会将8个给1号GPU,另外8个给2号GPU,训练结束后将二者拼接为一个16的batch并进行反向传播更新参数。

1. 可用的GPU资源

通过环境变量来设置可用的GPU资源,有以下两种办法:

1)在代码里面设置

  1. import os
  2. os.environ["CUDA_VISIBLE_DEVICES"] = "0,1"

2)通过命令行设置

CUDA_VISIBLE_DEVICES=0,1 python -W ignore LIDC-IDRI_train.py

没有指定的话,Keras默认会占用所有的GPU,但如果没有配置多GPU训练,Keras占实际上只在一个GPU上训练。

2. 使用多GPU训练

下面这个例子来自于官方文档,https://keras-cn.readthedocs.io/en/latest/utils/#multi_gpu_model

  1. import tensorflow as tf
  2. from keras.applications import Xception
  3. from keras.utils import multi_gpu_model
  4. import numpy as np
  5. num_samples = 1000
  6. height = 224
  7. width = 224
  8. num_classes = 1000
  9. # Instantiate the base model
  10. # (here, we do it on CPU, which is optional).
  11. with tf.device('/cpu:0'):
  12. model = Xception(weights=None,
  13. input_shape=(height, width, 3),
  14. classes=num_classes)
  15. # Replicates the model on 8 GPUs.
  16. # This assumes that your machine has 8 available GPUs.
  17. parallel_model = multi_gpu_model(model, gpus=8)
  18. parallel_model.compile(loss='categorical_crossentropy',
  19. optimizer='rmsprop')
  20. # Generate dummy data.
  21. x = np.random.random((num_samples, height, width, 3))
  22. y = np.random.random((num_samples, num_classes))
  23. # This `fit` call will be distributed on 8 GPUs.
  24. # Since the batch size is 256, each GPU will process 32 samples.
  25. parallel_model.fit(x, y, epochs=20, batch_size=256)

3. 模型保存

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

  1. class ParallelModelCheckpoint(ModelCheckpoint):
  2. def __init__(self,model,filepath, monitor='val_loss', verbose=0,
  3. save_best_only=False, save_weights_only=False,
  4. mode='auto', period=1):
  5. self.single_model = model
  6. super(ParallelModelCheckpoint,self).__init__(filepath, monitor, verbose,save_best_only, save_weights_only,mode, period)
  7. def set_model(self, model):
  8. super(ParallelModelCheckpoint,self).set_model(self.single_model)

调用如下:

  1. checkpoint = ParallelModelCheckpoint(model, save5_path, monitor='val_auc', verbose=1, save_best_only=True, save_weights_only=False, mode='max')
  2. callbacks = [check_point, early_stopping, tbCallBack]
  3. model.fit(x_train, y_train,
  4. batch_size=config.batch_size,
  5. epochs=config.nb_epoch,
  6. verbose=config.verbose,
  7. shuffle=True,
  8. validation_data=(x_valid, y_valid),
  9. callbacks=callbacks)

4. 模型加载与测试

如果模型保存时,save_weights_only=False,则可以直接使用load_model来加载模型。

  1. from keras.models import load_model
  2. model = load_model(model_path, custom_objects={'bce_dice_loss': bce_dice_loss, 'dice_coef_loss': dice_coef_loss,'dice_coef': dice_coef, 'mean_iou': mean_iou})
  3. p_test = model.predict(x_test, batch_size=config.batch_size, verbose=config.verbose)
  4. eva = model.evaluate(x_test, y_test, batch_size=config.batch_size, verbose=config.verbose)

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/53756
推荐阅读
相关标签
  

闽ICP备14008679号