ディープラーニング用ライブラリの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」のインストール
以下のページからダウンロードし、インストールします。
「cuDNN」の配置
以下のページからダウンロードできますが、NVIDIA開発者登録が必要です。
無料で登録できますが、英語ですので少し頑張りましょう。
(「何に使いますか」といったアンケートがされるだけですが)
対象となるCUDA ToolKitのバージョンに気をつけて、ダウンロードしましょう。
cuDNN provides researchers and developers with high-performa…
Zipファイルでの取得となります。(exeインストーラではありません)
Zip展開後、Cドライブの任意の場所に配置し、環境変数pathを通しましょう。
※以降の手順に記載があります
2. Anacondaのインストール
以下よりダウンロードし、インストールしましょう。
Download Anaconda's open-source Distribution today. Discover…
3. 各種ライブラリのインストール
仮想環境の構築
Anacondaにて、仮想環境を構築します。
と言っても何も難しくはなく、Environments -> Create するだけです。
以降の手順は、作成した仮想環境の横にある「スタートボタン(アイコン)」->「Open Terminal」で表示したコマンドプロンプトを使っていきます。
TensorFlow、Keras等のインストール
公式手順が一番正しいかと思いますので、そちらを見ながら実施しましょう。
結果的に、以下を実行すれば環境構築できると思います。
# 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』新プロジェクト。 まだまだ案件立ち上げにも満たない状況であり、この先どうなるかも分かりません。 しかし、いざ実現性・実効性が見えてきた時に、多くの方のご協力が必要になることは間違いありません[…]
絶賛配信中!
メルマガ詳細はこちら >>>
広告を含むご案内のメールをお送りする場合があります。
以下も、ぜひご活用ください^^