広告

tensorflow-gpu と tensorflow の速度差

1 ケースのみ、備忘として、です。

ノート PC の Intel Core i7 と NVIDIA GeForce GTX 1050 (2GB) との比較です。GeForce は MSI の GTX 1050 2GT LP です。

比較したハードウェアは下記の通りです。

  1. MacBook Pro (15-inch, 2016) / macOS High Sierra 10.13.6 / Intel Core i7 2.6GHz / 16GB Memory
  2. Linux PC / Ubuntu 18.04.1 / Intel Core i3-4170 3.70GHz / 16GB Memory / NVIDIA GeForce GTX 1050 (2GB)

MacBook Pro には、下記の手順で tensorflow をインストールしました。

Ubuntu には、下記の手順で tensorflow-gpu をインストールしました。

比較に使用した Python のコードは下記の通りです。書籍「現場で使える! TensorFlow開発入門 Kerasによる深層学習モデル構築手法」の Chapter 8 の「CAE を使ったノイズ除去」です。Keras を使用します。

import os
import glob
import math
import random
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.python import keras
from tensorflow.python.keras import backend as K
from tensorflow.python.keras.models import Model, Sequential
from tensorflow.python.keras.layers import Conv2D, Dense, Input, MaxPooling2D, UpSampling2D, Lambda
from tensorflow.python.keras.preprocessing.image import load_img, img_to_array, array_to_img, ImageDataGenerator
from tensorflow.python.keras.datasets import mnist

(x_train, _), (x_test, _) = mnist.load_data()
x_train = x_train.reshape(-1, 28, 28, 1)
x_test = x_test.reshape(-1, 28, 28, 1)
x_train = x_train / 255.
x_test = x_test / 255.

def make_masking_noise_data(data_x, percent = 0.1):
    size = data_x.shape
    masking = np.random.binomial(n = 1, p = percent, size = size)
    return data_x * masking

x_train_masked = make_masking_noise_data(x_train)
x_test_masked = make_masking_noise_data(x_test)

def make_gaussian_noise_data(data_x, scale = 0.8):
    gaussian_data_x = data_x + np.random.normal(loc = 0, scale = scale, size = data_x.shape)
    gaussian_data_x = np.clip(gaussian_data_x, 0, 1)
    return gaussian_data_x

x_train_gauss = make_gaussian_noise_data(x_train)
x_test_gauss = make_gaussian_noise_data(x_test)

autoencoder = Sequential()

# Encoder
autoencoder.add(
    Conv2D(
        16,
        (3, 3),
        1,
        activation = 'relu',
        padding = 'same',
        input_shape = (28, 28, 1)
    )
)
autoencoder.add(
    MaxPooling2D(
        (2, 2),
        padding = 'same'
    )
)
autoencoder.add(
    Conv2D(
        8,
        (3, 3),
        1,
        activation = 'relu',
        padding = 'same'
    )
)
autoencoder.add(
    MaxPooling2D(
        (2, 2),
        padding = 'same'
    )
)

# Decoder
autoencoder.add(
    Conv2D(
        8,
        (3, 3),
        1,
        activation = 'relu',
        padding = 'same'
    )
)
autoencoder.add(UpSampling2D((2, 2)))
autoencoder.add(
    Conv2D(
        16,
        (3, 3),
        1,
        activation = 'relu',
        padding = 'same'
    )
)
autoencoder.add(UpSampling2D((2, 2)))
autoencoder.add(
    Conv2D(
        1,
        (3, 3),
        1,
        activation = 'sigmoid',
        padding = 'same'
    )
)
autoencoder.compile(
    optimizer = 'adam',
    loss = 'binary_crossentropy'
)
initial_weights = autoencoder.get_weights()

autoencoder.summary()

autoencoder.fit(
    x_train_gauss,
    x_train,
    epochs = 10,
    batch_size = 20,
    shuffle = True
)

結果は下記の通りでした。

  1. tensorflow (1.10.0) … 10 分 11 秒 (611 秒)
  2. tensorflow-gpu (1.10.0) … 2 分 24 秒 (144 秒)

単純に割ると 4.2 倍でした。

1050 は、GeForce GTX 10 シリーズの中でもローエンドですし。

広告

TensorFlow

Posted by admin