Keras 멀티 GPU 이용하기
keras 2.0.9 버전부터 멀티 GPU를 손쉽게 활용할 수 있게 업데이트되었습니다. 이번 포스팅은 기존 모델을 멀티 GPU를 사용하여 트레이닝하는 예제입니다.
1. keras 2.0.9 이상에서 지원하므로 2.0.9 이상으로 업데이트
pip install --upgrade keras
2. keras 모델 생성
일반적인 keras CNN을 예로 들어 설명하겠습니다. 대략 이런 cnn model이 있다고 합시다. (패키지 임포트문 생략)
def cnn_model(): # create model model = Sequential() model.add(Convolution2D(16, 3, 3, border_mode='same', activation='relu', input_shape=(256,256,1))) model.add(BatchNormalization()) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Convolution2D(32, 3, 3, border_mode='same', activation='relu')) model.add(BatchNormalization()) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Convolution2D(32, 3, 3, border_mode='same', activation='relu')) model.add(BatchNormalization()) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Convolution2D(64, 3, 3, border_mode='same', activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Convolution2D(64, 3, 3, border_mode='same', activation='relu')) model.add(BatchNormalization()) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Flatten()) model.add(Dense(64, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(64, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(3, activation='softmax')) return model
2.0.9 버전 이후부터 제공하는 multi_gpu_model을 임포트
from keras.utils.training_utils import multi_gpu_model
모델을 만들고 multi_gpu_model을 통해서 multi gpu를 활용한다는 선언을 합니다. gpus 파라미터에 사용하고 싶은 gpu 수를 설정합니다. 모델을 compile하고 fit하면 트레이닝이 됩니다.
model = cnn_model() model = multi_gpu_model(model, gpus=4) model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) model.fit(train_x, train_y, validation_data=(test_x, test_y), nb_epoch=20, batch_size=32, verbose=1)
트레이닝이 잘됩니다.
Train on 215 samples, validate on 107 samples Epoch 1/20 215/215 [==============================] - 1s - loss: 2.0448 - acc: 0.4465 - val_loss: 1.0884 - val_acc: 0.2710 Epoch 2/20 215/215 [==============================] - 0s - loss: 1.5974 - acc: 0.4791 - val_loss: 1.1431 - val_acc: 0.1963 Epoch 3/20 215/215 [==============================] - 0s - loss: 1.2704 - acc: 0.5302 - val_loss: 1.2524 - val_acc: 0.4486 Epoch 4/20 215/215 [==============================] - 0s - loss: 1.1777 - acc: 0.4512 - val_loss: 1.3994 - val_acc: 0.5327 Epoch 5/20 215/215 [==============================] - 0s - loss: 1.0600 - acc: 0.5953 - val_loss: 1.4960 - val_acc: 0.5888 Epoch 6/20 215/215 [==============================] - 0s - loss: 1.0486 - acc: 0.6512 - val_loss: 1.5189 - val_acc: 0.5888 Epoch 7/20 215/215 [==============================] - 0s - loss: 0.9968 - acc: 0.6186 - val_loss: 1.5151 - val_acc: 0.5888 Epoch 8/20 215/215 [==============================] - 0s - loss: 1.0375 - acc: 0.6000 - val_loss: 1.4286 - val_acc: 0.5888 Epoch 9/20 215/215 [==============================] - 0s - loss: 0.9987 - acc: 0.6093 - val_loss: 1.3102 - val_acc: 0.5701 Epoch 10/20
서버에서 nvidia-smi를 쳐보면 이렇게 모든 gpu가 모두 활용되는 것을 볼 수 있습니다.
참고
'Tools > Keras' 카테고리의 다른 글
Early Stopping 의 개념과 Keras 를 통한 구현 (3) | 2019.06.28 |
---|---|
Keras- Tensorflow Backend에서 특정 디바이스 사용법 (1) | 2017.11.01 |
Keras - CNN ImageDataGenerator 활용하기 (11) | 2017.10.28 |
Keras - Keras를 통한 LSTM의 구현 (24) | 2017.08.29 |
Keras - 모델 저장하고 불러오기 (3) | 2017.07.19 |