仕事の関係で、機械学習の物体検知を行うプロジェクトがあり、少しばかりお手伝いをすることになりそうなので、少し環境設定など、備忘録的に残しておきます。
機械学習やAIについて勉強したいけれども環境構築の段階で躓いてしまい、本来はやりたかった&時間をかけるべきプログラミングなどまで到達できない!という方のお役に立てるようであればと思います。
実際にやりたいこと
まずはとっかかりとしてこんな感じです。
YouTubeではこちら。
Object Detection(物体検出)でいろいろ機械学習させるのが短期的な目標です。長期ではARグラスに表示させたりして、いろいろあるのですが、それは、また今度。。
事前準備・環境
今回は自宅のCPUのみのPCと、GPUのあるPC、それとGoogle ColabのCPUとGPUで比較を行いました。自宅PCの環境は以下の通りです。

同じコードでハードウェアだけ違うという環境になります。
GPUなし
Windows10 Pro 64ビット

以前の記事では古いNVIDIAのグラフィックスカードが刺さっていたのですが、今回の実験のために抜いて、CPUのみバージョンの環境を新規に作りました。
GPUあり
Windows10 Pro 64ビット

Tensorflowは2.6になり、以下のコードを使ってハードウェアCPU,GPUの認識の確認をします。
import tensorflow as tf
from tensorflow.python.client import device_lib
print(tf.__version__)
#2021_10_29 : 2.6.0
device_lib.list_local_devices()
GPUなし

GPUあり
Google Colab CPU

Google Colab GPU

環境構築手順
ノートPCのDell XPS 15 の NVIDIA GeoForce GTX 1650をWindows10のPython3.7から使えるようにするためにいろいろ手順を踏む必要があります。
・NVIDIA GPUドライバのインストール
・CUDA Toolkitのインストール
・cuDNNのインストール
・pip にてTensorflowの2.6をインストール
する必要があります。
詳細については

を参考にさせていただきました。
私の2021/10/29時点では
NVIDIA GPUドライバ :496
CUDA:11.5.0_496.13
cuDNN:11.4
を利用させていただきました。
CUDAとはCUDA(Compute Unified Device Architecture)の事で、グラフィックス表示用途以外にその高い処理性能を活用できるようにNVIDIA社が開発した技術です。
cuDNNはcuDNN(CUDA Deep Neural Network library )でニューラルネットワーク計算用のライブラリーとなります。CUDA での処理を高速化するためにインストールします。
NVIDIAとCUDAはインストールキットで配布されて、cuDNNはzipを展開したものを
C:\tools\cuda
において、Windowsのパスを通すという手順を踏みました。
また、Google Colab GPUについては、Edit>Notebook setting でGPUを選択しました。


実際に行ったこと
以下のサイトにあったように小さいプログラムと、もう少し時間のかかるものと二つ行いました。

小さいほうのプログラムは以下のものになります。
%%time
import tensorflow as tf
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10)
])
predictions = model(x_train[:1]).numpy()
predictions
tf.nn.softmax(predictions).numpy()
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
loss_fn(y_train[:1], predictions).numpy()
model.compile(optimizer='adam',
loss=loss_fn,
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test, verbose=2)
probability_model = tf.keras.Sequential([
model,
tf.keras.layers.Softmax()
])
probability_model(x_test[:5])
この処理にかかった時間は以下の通りです。
CPU:9.58 s

GPU: 1min 4s
Google Colab CPU: 42.9 s

Google Colab GPU: 23.9 s

なんと、自宅デスクトップのCPUが一番早いです、、もしかして、すごい!・・・ではないです、
いわゆる「近所のコンビニ行くのにジェット機つかっていくようなもの」状態です。
コンビニ行くには自転車が便利、長距離移動にはジェット機、、と目的に応じて使い分けが必要です。
もう少し時間のかかるコードは以下になります。
#参考:https://github.com/tensorflow/tensorflow/issues/34888
import tensorflow as tf
#UnknownError回避用
gpu_devices = tf.config.experimental.list_physical_devices('GPU')
for device in gpu_devices: tf.config.experimental.set_memory_growth(device, True)
import numpy as np
print("Num GPUs Available: ", len(tf.config.experimental.list_physical_devices('GPU')))
from tensorflow import keras
fashion_mnist = keras.datasets.fashion_mnist
#ダウンロード終了後からの実行時間計測のために追加します。
import time
start_time = time.time()
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
train_images = train_images / 255.0
test_images = test_images / 255.0
train_images = np.expand_dims(train_images, axis=3)
test_images = np.expand_dims(test_images, axis=3)
model = tf.keras.Sequential()
model.add(tf.keras.layers.Conv2D(filters=64, kernel_size=2, padding='same', activation='relu', input_shape=(28,28,1)))
model.add(tf.keras.layers.MaxPooling2D(pool_size=2))
model.add(tf.keras.layers.Dropout(0.3))
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(256, activation='relu'))
model.add(tf.keras.layers.Dropout(0.5))
model.add(tf.keras.layers.Dense(10, activation='softmax'))
model.summary()
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(train_images, train_labels, batch_size=64, epochs=10, validation_data=(test_images, test_labels))
# 計測した結果を出力
tat_time = time.time() - start_time
print ("実行時間:{0}".format(tat_time) + "[秒]")
この処理にかかった時間は以下の通りです。
CPU:360 s

GPU:174 s

Google Colab CPU: 864 s

Google Colab GPU: 110 s

Google Colab GPUはやはり早いですね。Google Colab CPUについてはログインセッションでのあたりはずれもあるとの話も聞きます。時間のかかる単純にGPUやCPUパワー勝負のジョブだと、結構な差が出てくるようです。
まとめ
環境 | 小規模 | 中規模 |
CPU HP Prodesk Intel(R) Core(TM) i5-7500 CPU @ 3.40GHz | 約 9秒 | 約 360秒 |
GPU XPS v15 GTX1650 | 約 64秒 | 約 174秒 |
Google Colab CPU | 約 42秒 | 約 864秒 |
Google Colab GPU | 約 24秒 | 約 110秒 |
分かったこと
Google ColabのGPUを無料で、かつ手軽に使えるのは素晴らしいことですね。
簡単な設定ですぐに使えるというのはコード作成に集中できるので、ありがたいことです。
12時間を超えると切断という部分もありますが、ほとんどのユーザーにはこれ以上ない環境なのではないでしょうか。
参考にしたサイト
今回確認を行うにあたり、以下のサイトを参考にさせていただきました。
ありがとうございました。



—
Pythonに関する記事をご紹介します。
コメント