DEVELOPER’s BLOG
技術ブログ
TensorFlowのAVX2, FMAの有無で性能の比較をする
2019.05.16
中村 昴
TensorFlow
機械学習
概要
ビルド済みのTensorFlowをpipでインストールすると、CPUの命令セットのAVX2やFMAが有効にならない。 AVX2やFMAを用いると、演算速度や精度の向上が期待できる。
参考 MMX, SSE, AVX, FMA命令とは何かを明らかにしたい会
そこで今回は、ソースコードからビルドしてAVX2とFMAを有効にしたTensorFlowを用意し、ビルド済みのパッケージをインストールしたものと、速度や精度の比較を行った。
環境
- プロセッサ Intel Core i7-5557U 3.1 GHz
- メモリ 16GB 1867 MHz DDR3
- macOS Sierra 10.12.6
- Python 3.6.8
- TensorFlow 1.13.1
方法
学習は以下のようなCNNで行った。 データセットはMNIST、Fashion MNIST、CIFAR-10を用いた。
import tensorflow as tf
# データセットの選択
dataset = tf.keras.datasets.mnist
# dataset = tf.keras.datasets.fashion_mnist
# dataset = tf.keras.datasets.cifar10
(x_train, y_train), (x_test, y_test) = dataset.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
# shapeをモデルの入力に合わせる
if len(x_train.shape) == 3:
x_train = x_train.reshape(x_train.shape + (1,));
x_test = x_test.reshape(x_test.shape + (1,));
# CNNモデルの作成
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(32,
kernel_size=(3, 3),
activation=tf.nn.relu,
input_shape=x_train.shape[1:]),
tf.keras.layers.Conv2D(64, (3, 3), activation=tf.nn.relu),
tf.keras.layers.MaxPooling2D(pool_size=(2, 2)),
tf.keras.layers.Dropout(0.25),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation=tf.nn.relu),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 訓練
model.fit(x_train, y_train, epochs=12)
# 評価
model.evaluate(x_test, y_test)
計測は以下のコマンドで行った。
$ time python cnn.py
結果
MNIST
| AVX2, FMA 有 | AVX2, FMA 無 | 差 | |
|---|---|---|---|
| 学習時間 | 26m37s | 28m32s | 6.7% |
| 精度 | 0.9939 | 0.9928 | +0.0011 |
Fashion MNIST
| AVX2, FMA 有 | AVX2, FMA 無 | 差 | |
|---|---|---|---|
| 学習時間 | 25m30s | 27m59s | 8.9% |
| 精度 | 0.9218 | 0.9241 | -0.0023 |
CIFAR-10
| AVX2, FMA 有 | AVX2, FMA 無 | 差 | |
|---|---|---|---|
| 学習時間 | 32m00s | 37m04s | 13.7% |
| 精度 | 0.7049 | 0.7034 | +0.0015 |
まとめ
AVX2, FMAが有効であると実行時間が短くなった。一方、精度はあまり変わらなかった。