【手順】Keras(->TensorFlow)でGPU利用環境を構築する手順(Windows)

ディープラーニング用ライブラリの1つである、Googleの「TensorFlow」。
機械学習は処理が重く、何度も実施するのであれば「GPU」が欠かせません。

しかし、「TensorFlow」実行時に勝手に「GPU」を使ってくれるわけではなく、それなりの環境準備が必要となります。

備忘録も兼ねて、構築手順を残しておきます。

やりたいこと

TensorFlow処理にてGPUを使えるようにする。(Windows端末)

確認環境

  • DELL Alienware X17 R2
  • 12th Gen Intel Core i7-12700H / NVIDIA GeForce RTX 3070 Ti Laptop GPU
  • Windows11 Pro(21H2)
  • Python 3.9.12
  • TensorFlow 2.9.1
  • Keras 2.9.0
  • Anaconda 3(2022.05 (Python 3.9.12 64-bit)
  • Anaconda Navigator 2.2.0
  • CUDA ToolKit 11.7.0
  • cuDNN 11.6

構築概要

GPUの利用準備

NVIDIA GPUを使用するために、「CUDA」と「cuDNN」をWindowsマシンにインストールする必要があります。
ならびに「Visual C++ 2015、2017、2019  再頒布可能パッケージ」のインストールも必要です。

できるだけ手軽にディープラーニングを実施

ディープラーニングライブラリは、メジャーな「TensorFlow」を利用。

コーディングや設定をより楽にするため、「Keras」を活用。

これらは、「Python」にてコーディングします。

仮想環境の構築

今後、様々な実験に使う予定ですので、仮想環境で構築します。

Pythonの仮想環境が簡単に構築・管理できる「Anaconda」を利用します。

ただし、当手順上は、Anaconda配下で管理する「conda」でのインストールではなく、Pythonライブラリ管理の「pip」で実行しています。
(公式手順に従ってやってみよう、としたため。)

そのため、Anacondaは無視していただいても問題ないかと思います。

手順

1. GPU関連のモジュールセットアップ

「Visual C++ 2015、2017、2019  再頒布可能パッケージ」のインストール

以下ページから、該当するCPUアーキテクチャのexeをダウンロードし、インストールします。
(今回の場合ですと、X64)

This article lists the download links for the latest version…

「CUDA Toolkit」のインストール

以下のページからダウンロードし、インストールします。

NVIDIA Developer

「cuDNN」の配置

以下のページからダウンロードできますが、NVIDIA開発者登録が必要です。

無料で登録できますが、英語ですので少し頑張りましょう。
(「何に使いますか」といったアンケートがされるだけですが)

対象となるCUDA ToolKitのバージョンに気をつけて、ダウンロードしましょう。

NVIDIA Developer

cuDNN provides researchers and developers with high-performa…

Zipファイルでの取得となります。(exeインストーラではありません)

Zip展開後、Cドライブの任意の場所に配置し、環境変数pathを通しましょう。
※以降の手順に記載があります

2. Anacondaのインストール

以下よりダウンロードし、インストールしましょう。

Anaconda

Anaconda's open-source Distribution is the easiest way to pe…

3. 各種ライブラリのインストール

仮想環境の構築

Anacondaにて、仮想環境を構築します。

と言っても何も難しくはなく、Environments -> Create するだけです。

以降の手順は、作成した仮想環境の横にある「スタートボタン(アイコン)」->「Open Terminal」で表示したコマンドプロンプトを使っていきます。

TensorFlow、Keras等のインストール

公式手順が一番正しいかと思いますので、そちらを見ながら実施しましょう。

TensorFlow

Learn how to install TensorFlow on your system. Download a p…

結果的に、以下を実行すれば環境構築できると思います。

# pipを最新化
pip install --upgrade pip

# tensorflowをインストール
# 関連する様々なライブラリもインストールされます
pip install tensorflow

# CUDA関連へのPATHを通す
# Windows端末にインストールしたPATHを指定してください(以下は例)
SET PATH=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7\bin;%PATH%
SET PATH=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7\extras\CUPTI\lib64;%PATH%
SET PATH=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include;%PATH%
# cuDNNのZipを配置した場所
SET PATH=C:\Program Files\NVIDIA GPU Computing Toolkit\cuDNN\bin;%PATH%

# Kerasのインストール
pip install keras

4. 稼働確認

インストール確認

コマンドプロンプトにて、以下を実行すると詳細が確認できます。

python -c "import tensorflow as tf;print(tf.reduce_sum(tf.random.normal([1000, 1000])))"

# 実行結果例
2022-07-XX 16:33:07.214452: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX AVX2
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2022-07-XX 16:33:07.554546: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1616] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 5467 MB memory: -> device: 0, name: NVIDIA GeForce RTX 3070 Ti Laptop GPU, pci bus id: 0000:01:00.0, compute capability: 8.6
tf.Tensor(1319.1656, shape=(), dtype=float32)

# GPU名(今回だと NVIDIA GeForce RTX 3070 Ti Laptop GPU)がcreateされていれば、成功していると思われます

利用確認

念のため、本当にGPUが利用されるのかを、実際に処理を実行してみて確認します。

「test.py」などで、以下内容のファイルを作成します。

import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, InputLayer
from keras.optimizers import RMSprop

# MNISTデータを読込む
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# MNISTデータを加工する
x_train = x_train.reshape(60000, 784)
x_test = x_test.reshape(10000, 784)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)

# モデルの構築
model = Sequential()
model.add(InputLayer(input_shape=(784,)))
model.add(Dense(10, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])

# 学習
epochs = 20
batch_size = 128
history = model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=(x_test, y_test))

# 検証
score = model.evaluate(x_test, y_test, verbose=1)
print()
print('Test loss:', score[0])
print('Test accuracy:', score[1])

さきほどの仮想環境にて、実行します。

学習用のデータは「MNIST(エムニスト)」という学習用データを提供しているデータベースより取得しますので、特段準備は不要です。

python test.py

# 実行結果
2022-07-XX 16:41:22.545993: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX AVX2
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2022-07-XX 16:41:22.951374: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1616] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 5467 MB memory: -> device: 0, name: NVIDIA GeForce RTX 3070 Ti Laptop GPU, pci bus id: 0000:01:00.0, compute capability: 8.6
Epoch 1/20
2022-07-XX 16:41:27.001439: I tensorflow/stream_executor/cuda/cuda_blas.cc:1614] TensorFloat-32 will be used for the matrix multiplication. This will only be logged once.
469/469 [==============================] - 5s 2ms/step - loss: 0.5986 - accuracy: 0.8501 - val_loss: 0.3401 - val_accuracy: 0.9074
Epoch 2/20
469/469 [==============================] - 1s 2ms/step - loss: 0.3310 - accuracy: 0.9087 - val_loss: 0.2996 - val_accuracy: 0.9166
Epoch 3/20
469/469 [==============================] - 1s 1ms/step - loss: 0.3016 - accuracy: 0.9159 - val_loss: 0.2852 - val_accuracy: 0.9192
Epoch 4/20
469/469 [==============================] - 1s 2ms/step - loss: 0.2881 - accuracy: 0.9196 - val_loss: 0.2788 - val_accuracy: 0.9243
Epoch 5/20
469/469 [==============================] - 1s 2ms/step - loss: 0.2802 - accuracy: 0.9219 - val_loss: 0.2730 - val_accuracy: 0.9244
Epoch 6/20
469/469 [==============================] - 1s 2ms/step - loss: 0.2747 - accuracy: 0.9237 - val_loss: 0.2730 - val_accuracy: 0.9254
Epoch 7/20
469/469 [==============================] - 1s 2ms/step - loss: 0.2705 - accuracy: 0.9249 - val_loss: 0.2691 - val_accuracy: 0.9239
Epoch 8/20
469/469 [==============================] - 1s 2ms/step - loss: 0.2675 - accuracy: 0.9260 - val_loss: 0.2700 - val_accuracy: 0.9268
Epoch 9/20
469/469 [==============================] - 1s 2ms/step - loss: 0.2650 - accuracy: 0.9269 - val_loss: 0.2707 - val_accuracy: 0.9259
Epoch 10/20
469/469 [==============================] - 1s 2ms/step - loss: 0.2627 - accuracy: 0.9272 - val_loss: 0.2682 - val_accuracy: 0.9255
Epoch 11/20
469/469 [==============================] - 1s 2ms/step - loss: 0.2610 - accuracy: 0.9283 - val_loss: 0.2683 - val_accuracy: 0.9264
Epoch 12/20
469/469 [==============================] - 1s 2ms/step - loss: 0.2598 - accuracy: 0.9286 - val_loss: 0.2673 - val_accuracy: 0.9280
Epoch 13/20
469/469 [==============================] - 1s 2ms/step - loss: 0.2583 - accuracy: 0.9295 - val_loss: 0.2664 - val_accuracy: 0.9275
Epoch 14/20
469/469 [==============================] - 1s 2ms/step - loss: 0.2572 - accuracy: 0.9296 - val_loss: 0.2691 - val_accuracy: 0.9264
Epoch 15/20
469/469 [==============================] - 1s 2ms/step - loss: 0.2564 - accuracy: 0.9304 - val_loss: 0.2698 - val_accuracy: 0.9257
Epoch 16/20
469/469 [==============================] - 1s 2ms/step - loss: 0.2550 - accuracy: 0.9307 - val_loss: 0.2687 - val_accuracy: 0.9278
Epoch 17/20
469/469 [==============================] - 1s 2ms/step - loss: 0.2545 - accuracy: 0.9313 - val_loss: 0.2707 - val_accuracy: 0.9265
Epoch 18/20
469/469 [==============================] - 1s 2ms/step - loss: 0.2537 - accuracy: 0.9321 - val_loss: 0.2693 - val_accuracy: 0.9274
Epoch 19/20
469/469 [==============================] - 1s 2ms/step - loss: 0.2531 - accuracy: 0.9321 - val_loss: 0.2680 - val_accuracy: 0.9266
Epoch 20/20
469/469 [==============================] - 1s 2ms/step - loss: 0.2526 - accuracy: 0.9318 - val_loss: 0.2685 - val_accuracy: 0.9264
313/313 [==============================] - 0s 1ms/step - loss: 0.2685 - accuracy: 0.9264

Test loss: 0.26852142810821533
Test accuracy: 0.9264000058174133

無事に稼働しましたら、アクティビティモニタなどでGPUの使用率を確認しましょう。

見事に、処理中はGPUの使用率が100%近くに跳ね上がっています。

余談

ちなみに、こちらの件でディープラーニングなどを実行しようとしています^^

関連記事

弊社にて活動を開始した『農業 × IoT』新プロジェクト。 まだまだ案件立ち上げにも満たない状況であり、この先どうなるかも分かりません。 しかし、いざ実現性・実効性が見えてきた時に、多くの方のご協力が必要になることは間違いありません[…]

※ご回答希望の場合は、ご連絡先も記入ください
"意見が持てる" デジタルコラム
絶賛配信中!

メルマガ詳細はこちら >>>

送信時点で「Privacy Policy」に同意したものとみなします。
広告を含むご案内のメールをお送りする場合があります。
   
         
最後までお読みいただき、ありがとうございました。
以下も、ぜひご活用ください^^
出版物
ITmedia
メルマガ
Site Access Log by HTTP Header
>情報システムの

情報システムの"教科書"本を発売中!


■ 情シス、システムコンサルタント、システムエンジニアの方へ
情シスの定石(技術評論社)

■ システムエンジニア、情シスの方へ
2023年10月7日(土)発売
システム設計の教科書(技術評論社)

CTR IMG

■ 著者 石黒直樹による書籍説明動画