Google Colaboratory에서 MXNet 백엔드 고속 Keras를 경험해 보세요.
Keras+MXNet은 빠른
Keras의 MXNet 백엔드는 Amazon이 개발을 진행하고 있습니다.
AWSLabs가 공개하고 있는 벤치마크에 의하면, ResNet50을 사용한 CIFAR10의 분류로, TensorFlow의 백엔드보다 MXNet의 백엔드 쪽이 1.5배~4배 정도 빠르다고 하는 결과가 나와 있습니다.
인스턴스 유형
GPUs
Batch Size
Keras-MXNet (img/sec)
Keras-TensorFlow (img/sec)
C5.18X Large
0
32
87
59
P3.8X Large
1
32
831
509
P3.8X Large
4
128
1783년
699
P3.16X Large
8
256
1680년
435
출처 : htps : // 기주 b. 코 m / 아 ws ぁ bs / 케라 s 아파치 ぇ m t / t re / ms r / ben ch 마 rk
사실인가라고 느끼기 시작하지만, 특히 GPU의 수가 늘어나면 효과가 절대군요. 꼭 이것을 체험해 봅시다.
설치
2018년 8월 현재, Keras 공식에서는 MXNet의 백엔드는 대응하고 있지 않기 때문에, 포크 된 Keras(keras-mxnet)를 도입합니다.
Google Colab의 GPU 가속기를 켜면 먼저 GPU 지원 MXNet을 설치합니다.
!pip install mxnet-cu80
CUDA9.0대응의 MXNet를 인스톨하면 「import keras」했을 때에 「libcudart.so.9.0: cannot open shared object file: No such file or directory」라고 분노해 버렸습니다. CUDA8.0의 MXNet을 설치하는 것은 특별한 문제가 없었습니다 1 편한 해결 방법 있으면 모집중입니다.
그런 다음 keras-mxnet도 마찬가지로 설치합니다.
!pip install keras-mxnet
Channels_first로 전환
CNN에서 사용하는 경우 여기에만주의가 필요합니다. MXNet은 channels_first이므로, 예를 들어 CIFAR이라면 (50000, 32, 32, 3)가 아니라 (50000, 3, 32, 32)가 됩니다. 텐서플로우가 백엔드처럼 channel_last로 쓰면 화가 난다고 생각합니다.
keras.json 편집
기본값을 channels_last에서 channels_first로 전환합니다. Jupyter Notebook에서도 가능합니다. 다음 코드를 실행합니다.
import os
keras_json='{\n "floatx": "float32",\n "epsilon": 1e-07,\n "backend": "mxnet",\n "image_data_format": "channels_first"\n}'
keras_json_dir=os.environ['HOME']+"/.keras"
if not os.path.exists(keras_json_dir): os.mkdir(keras_json_dir)
with open(keras_json_dir+"/keras.json", "w") as fp:
fp.write(keras_json)
정말로 편집할 수 있는지는 「!cat ~/.keras/keras.json」을 실행하면 확인할 수 있습니다.
MXNet이 백엔드인지 확인
「import keras」를 실행해 「Using MXNet Backend」라고 표시되면 OK입니다.
모델을 만들 때의 주의점
channels_first이므로 Conv2d나 Pooling 등의 레이어를 추가할 때는, 「data_format="channels_first"」라고 명시적으로 선언해 줄 필요가 있습니다. 또, BatchNormalization이나 Merge(Add, Concatenate등)를 실시할 때는, 「axis=1」라고 채널의 축을 가르쳐 줄 필요가 있습니다.
에러문에서도 나옵니다만, channels_last로 만들면 격중해지므로 주의가 필요합니다.
MNIST 샘플
간단한 샘플 코드로서 AlexNet 돌아가기를 만들어 보았습니다. 데이터는 MNIST입니다.
from keras.layers import Conv2D, Activation, MaxPooling2D, BatchNormalization, Input, Flatten, Dense
from keras.models import Model
from keras.optimizers import Adam
from keras.datasets import mnist
from keras.utils import to_categorical
import numpy as np
# Data
(X_train, y_train), (X_test, y_test) = mnist.load_data()
X_train = np.expand_dims(X_train, axis=1)
X_test = np.expand_dims(X_test, axis=1)
X_train = X_train / 255.0
X_test = X_test / 255.0
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)
def create_conv_layers(input, nb_filters, kernel_size):
x = Conv2D(nb_filters, kernel_size=kernel_size, padding="same", data_format="channels_first")(input)
x = BatchNormalization(axis=1)(x)
x = Activation("relu")(x)
return x
# Model
input = Input(shape=(1, 28, 28))
x = create_conv_layers(input, 256, 5)
x = create_conv_layers(x, 256, 5)
x = MaxPooling2D((2,2), data_format="channels_first")(x)
x = create_conv_layers(x, 384, 3)
x = create_conv_layers(x, 384, 3)
x = create_conv_layers(x, 384, 3)
x = Flatten()(x)
x = Dense(10, activation="softmax")(x)
model = Model(input, x)
model.compile(Adam(lr=0.0001), loss="categorical_crossentropy", metrics=["acc"])
model.fit(X_train, y_train, batch_size=128, epochs=20, validation_data=(X_test, y_test))
결과는 다음과 같습니다.
Train on 60000 samples, validate on 10000 samples
Epoch 1/10
/usr/local/lib/python3.6/dist-packages/mxnet/module/bucketing_module.py:408: UserWarning: Optimizer created manually outside Module but rescale_grad is not normalized to 1.0/batch_size/num_workers (1.0 vs. 0.0078125). Is this intended?
force_init=force_init)
60000/60000 [==============================] - 138s 2ms/step - loss: 0.1339 - acc: 0.9615 - val_loss: 0.1315 - val_acc: 0.9663
Epoch 2/10
60000/60000 [==============================] - 138s 2ms/step - loss: 0.0500 - acc: 0.9850 - val_loss: 0.0981 - val_acc: 0.9710
Epoch 3/10
60000/60000 [==============================] - 138s 2ms/step - loss: 0.0400 - acc: 0.9885 - val_loss: 0.0460 - val_acc: 0.9874
Epoch 4/10
60000/60000 [==============================] - 138s 2ms/step - loss: 0.0353 - acc: 0.9899 - val_loss: 0.0811 - val_acc: 0.9776
Epoch 5/10
60000/60000 [==============================] - 138s 2ms/step - loss: 0.0310 - acc: 0.9911 - val_loss: 0.0599 - val_acc: 0.9872
Epoch 6/10
60000/60000 [==============================] - 138s 2ms/step - loss: 0.0251 - acc: 0.9926 - val_loss: 0.0598 - val_acc: 0.9864
Epoch 7/10
60000/60000 [==============================] - 138s 2ms/step - loss: 0.0309 - acc: 0.9915 - val_loss: 0.0698 - val_acc: 0.9851
Epoch 8/10
60000/60000 [==============================] - 138s 2ms/step - loss: 0.0252 - acc: 0.9931 - val_loss: 0.0451 - val_acc: 0.9895
Epoch 9/10
60000/60000 [==============================] - 138s 2ms/step - loss: 0.0242 - acc: 0.9941 - val_loss: 0.0554 - val_acc: 0.9894
Epoch 10/10
60000/60000 [==============================] - 138s 2ms/step - loss: 0.0223 - acc: 0.9944 - val_loss: 0.0524 - val_acc: 0.9900
덧붙여서 이것을 평소의 TensorFlow의 백엔드로 하면 이렇게 됩니다.
Epoch 1/20
60000/60000 [==============================] - 153s 3ms/step - loss: 0.1154 - acc: 0.9648 - val_loss: 0.0774 - val_acc: 0.9795
MXNet 쪽이 1할 정도 빨라지고 있네요. 하지만 폭속이라고 할수록 폭속도 아닌 것 같은 다른 모델도 시험해 보면 빠른 예가 나올지도 모르겠네요.
이상입니다. Amazon이 개발 중인 MXNet 기반 Keras, 꼭 체험해 보세요.
Google Colab의 GPU는 Tesla K80이며, 이 Compute Capability는 3.7으로 적당히 오래되었습니다. 예를 들어, GTX 1080Ti라면 CC6.1, 750Ti에서도 CC5.0이 있습니다. Google Colab 환경에서 CUDA9.0을 사용하면 별로 혜택을 받지 못할 수 있습니다. ↩
Reference
이 문제에 관하여(Google Colaboratory에서 MXNet 백엔드 고속 Keras를 경험해 보세요.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/koshian2/items/b688bb8ac05e1c956e9f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)