Tensorflow「2.16」: WSL2環境下でGPUを使う方法(その2)

しょくぶつ(^ ^)です。
前回では、CUDA, cuDNN, Miniconda(Python仮想環境), Python, Tensorflowを一気にインストールしました。
そこで、TensorflowでGPUがちゃんと使えてるか確認します。

なお、この時点ではまだSpyderを入れていないです。
必要な方( しょくぶつ(^ ^)なんかは特にそう )は先に次回
Tensorflow「2.16」: WSL2環境下でGPUを使う方法(その3)
を実行してください。

動作確認

方法(1) TensorflowからGPUが見えているか確認

次のコマンドでTensorflowが機能するか確認します。ネットでもよく見かける方法です。

from tensorflow.python.client import device_lib
device_lib.list_local_devices()

方法(2) TensorflowでGPUがちゃんと使えているか確認

次のサイト様のコードを使用します。
Kerasでまた複数のバックエンドが使えるようになるらしい #機械学習 - Qiita

ただし、次のように修正して下さい。

修正(1)

- os.environ["KERAS_BACKEND"] = "tensorflow"
+ os.environ["KERAS_BACKEND"] = "torch"
  • 修正
    os.environ["KERAS_BACKEND"] = "tensorflow"

修正(2)

  • import keras_core as keras
    from keras_core.layers import Conv2D, Input, MaxPooling2D, Flatten, Dense
  • 修正
    import keras
    from keras.layers import Conv2D, Input, MaxPooling2D, Flatten, Dense

修正した後のコード

import os

os.environ["KERAS_BACKEND"] = "tensorflow"
#os.environ["KERAS_BACKEND"] = "torch"

#import keras_core as keras
#from keras_core.layers import Conv2D, Input, MaxPooling2D, Flatten, Dense
import keras
from keras.layers import Conv2D, Input, MaxPooling2D, Flatten, Dense

# MNISTデータを分割
(train_images, train_labels), (test_images,test_labels) = keras.datasets.mnist.load_data()

# パラメータ
classes = 10
batch_size = len(train_images) // 16
epochs = 20

# 簡単なモデルを作成
model = keras.Sequential(
    [
        Input(shape=(28, 28, 1)),
        Conv2D(32, (3, 3), activation="relu"),
        MaxPooling2D((2, 2)),
        Conv2D(64, (3, 3), activation="relu"),
        MaxPooling2D((2, 2)),
        Conv2D(64, (3, 3), activation="relu"),
        Flatten(),
        Dense(64, activation="relu"),
        Dense(classes, activation="softmax"),
    ]
)

# 前処理
train_images = train_images / 255.0
test_images = test_images / 255.0
train_labels = keras.utils.to_categorical(train_labels, classes)
test_labels = keras.utils.to_categorical(test_labels, classes)

model.compile(
    optimizer="adam", loss="categorical_crossentropy", metrics=["accuracy"]
)

# 学習開始
model.fit(train_images, train_labels, epochs=epochs, batch_size=batch_size)

# 結果をもとに評価
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
print("Test accuracy:", test_acc)

実行するとタスクマネージャーを見るとGPU使用率がガッと跳ね上がっているはずです。

なんとなくGPUが動いて晴れ晴れしたイメージ

うまくいったでしょうか?

正直に言うと、何度やっても未だに自信ないです。

CUDA, cuDNNをインストールを再確認してください。
cuDNNの入れ忘れとかありませんか?

また、前回で、
「Tensorflow, python,.cuda, cuDNNはきちっとバージョンを合わせる必要があるのです。(ただしそうじゃないこともあります)」
などと書いたのですが、なんと、CUDAのバージョンを (12.3ではなく12.1に) わざとずらすと動いた、なんてこともあります。
複数のCUDAのインストール、その切り替えなどは次のサイト様の記事を参考にして下さい。
WSL2 Ubuntu 22.04 LTS の CUDA をバージョンアップする | hiroの長い長い冒険日記 (hiro20180901.com)
WSL2でCUDA11とCUDA12を共存させる|noguchi-shoji (note.com)
PyTorchとGPU/CUDA周りの環境構築のバージョン解決 #Ubuntu - Qiita

あと、WSL上で他のアプリを使うために別バージョンのCUDA, cuDNNをインストールしたりしてませんか?
そんなときも上記のサイト様を参考にして下さい。

次回の「GPUを使う方法(その3)」では、WSL2上のSpyderを使って、Tensorflow 2.16でのGPU機械学習が大成功しているときの画面をご覧頂きます。

プロフィール
この記事を書いた人
しょくぶつ (^ ^)

機械系の技術者です。学会発表13、論文掲載6(和・英)。プログラミング歴40年(つまり8bit世代ですね)。ゲーム歴40年(ファミコン世代ですね)。
お問い合わせは下記のメールアドレスにお寄せください。
plantsmilehatena@gmail.com

しょくぶつ (^ ^)をフォローする
python
しょくぶつ (^ ^)をフォローする
タイトルとURLをコピーしました