WindowsでTensorFlow(GPU)の環境を構築する [初心者向け]
今回はWindows10の本体にPython、TensorFlowをインストールします。
WindowsのWSL2(Windows Subsystem for Linux)の中のUbuntuを利用する方法もありますが、それだと「Windows 10 Insider Preview」に登録してOSを開発版(ベータ版/実験版)にする必要があります。メインで使用しているマシンが不安定だと困るので却下しました。
目次
1. Tensorflowについて
2. Python3.6のインストール
3. NVIDIAドライバのインストール
4. コンパイラのインストール
5. CUDA Toolkitのインストール
6. cuDNNのダウンロード
7. 環境変数の確認
8. cuDNNのコピー
9. TensorFlowのインストール
10. Jupyter Notebook
11. TensorFlowのテスト
12. Matplotlib
13. mnist.py
14. GPUの温度
15. NVIDIAコントロールパネル
Windowsでやる背景
2018年6月頃からUbuntu16.04とDocker、nvidia-docker2でTensorFlow(GPU)をやってましたが、2018年10月から放送大学へ入学とともにAI学習をSTOP。その時にUbuntu環境を壊してWindowsマシンにしてしまいました。
2021年3月には大学の卒業要件の124単位中残り8単位のみになりましたので、今度はWindowsでAI学習を再開することになりました。
1. Tensorflowについて
「Tensorflow 1.x系」と「Tensorflow 2.x系」の2つあります。
TensorFlow 1.x系ではCPU パッケージとGPUパッケージは別のものとなります。今回はTensorFlow 1.x系の最終バージョン(2021年1月7日版)の「tensorflow-gpu==1.15.5」のGPU版をインストールします。
※2.x系でも同様な作業となります。
Tensorflow(GPU)に必要なもの
・Python ※プログラミング言語 |
・TensorFlow(GPU) ※Pythonパッケージ。pipコマンドでインストール |
・Visual Studio ※必要なのはコンパイラ(ビルドツール) |
・CUDA Toolkit ※GPUを扱う開発環境 |
・cuDNN ※ディープラーニング用ライブラリ |
各々、必要バージョンは公式に明記されています。
https://www.tensorflow.org/install/source_windows#gpu
Pythonに関しては「tensorflow_gpu-1.x系」と「tensorflow_gpu-2.x系」で動作するバージョンが多い3.6系にします。
Visual Studioに関しては総合開発環境ではなくビルドツールのみとします。
2. Python3.6のインストール
Stable Releases(安定版)のPython3.6.8の「Windows x86-64 executable installer」をダウンロードする。
https://www.python.org/downloads/windows/
ダウンロード後、右クリックメニューで「管理者として実行」から実行する。
インストール後、「コマンドプロンプト」(Winキー + Rでcmdを実行する)で次のコマンドを実行して確認する。
python -V pip -V
3. NVIDIAドライバのインストール
最初から入っていると思いますので、やるとしたら最後の調整でやります。
4. コンパイラのインストール
「Build Tools for Visual Studio 2019」(MSVC 2017も含む)のコンパイラのみをインストールします。[すべてのダウンロード][Visual Studio 2019のツール][Build Tools for Visual Studio 2019]をダウンロードします。
https://visualstudio.microsoft.com/ja/downloads/
「C++ Build Tools」を選択する。右側にある「MSVC v141 VS2017 C++ x64/x86ビルドツール」もオンにする。そして、インストールボタン。
5. CUDA Toolkitのインストール
CUDA Toolkit 10.0
https://developer.nvidia.com/cuda-toolkit-archive
ダウンロード後、インストールします。
「カスタム」にして「CUDA」だけを選ぶようにする。
このままインストールするのですが、次のように失敗した場合。
Visual Studio Integrationのチェックをオフにしてインストールします。
6. cuDNNのダウンロード
tensorflow_gpu-1.15.0の場合はcuDNNは「7.4」と公表されていますが、その環境でTensorFlowを実行すると次のエラーが発生します。
ロードされたランタイムCuDNNライブラリ:7.4.1ですが、ソースは7.6.0でコンパイルされました。 CuDNN 7.0以降のバージョンの場合、CuDNNライブラリのメジャーバージョンとマイナーバージョンは、一致するか、より高いマイナーバージョンである必要があります。 バイナリインストールを使用している場合は、CuDNNライブラリをアップグレードしてください。 ソースからビルドする場合は、実行時にロードされるライブラリが、コンパイル構成中に指定されたバージョンと互換性があることを確認してください。
なので、[Download cuDNN][cuDNN Download][Archived cuDNN Releases][Download cuDNN v7.6.0 (May 20, 2019), for CUDA 10.0] [cuDNN Library for Windows 10]の「7.6.0」をダウンロードします。
https://developer.nvidia.com/cudnn
7. 環境変数の確認
Windowsの「環境変数」(システム環境変数)を確認する。
// Path C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\bin C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\libnvvp // CUDA_PATH C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0 // CUDA_PATH_V10_0 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0
8. cuDNNのコピー
ダウンロードしたcuDNNの圧縮ファイルを展開します。
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0
に展開した次のファイルを移動(コピー)するだけです。
・bin\cudnn64_7.dll ・include\cudnn.h ・lib\x64\cudnn.lib ・NVIDIA_SLA_cuDNN_Support.txt
9. TensorFlowのインストール
コマンドプロンプトを管理者として実行します。
pip install tensorflow-gpu==1.15.5 pip freeze
NumPyが新しすぎるのでダウングレードします。
pip uninstall numpy pip install numpy==1.16.4
9-1. GPUの確認
コマンドプロンプトで次のコマンドを実行する。
python from tensorflow.python.client import device_lib device_lib.list_local_devices()
2021-03-28 23:19:31.922346: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cudart64_100.dll >>> device_lib.list_local_devices() 2021-03-28 23:19:34.326462: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 2021-03-28 23:19:34.338584: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library nvcuda.dll 2021-03-28 23:19:34.4a04959: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1618] Found device 0 with properties: name: GeForce GTX 1080 Ti major: 6 minor: 1 memoryClockRate(GHz): 1.6705 pciBusID: 0000:01:00.0 2021-03-28 23:19:34.405140: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cudart64_100.dll 2021-03-28 23:19:34.409500: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cublas64_100.dll 2021-03-28 23:19:34.413287: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cufft64_100.dll 2021-03-28 23:19:34.414921: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library curand64_100.dll 2021-03-28 23:19:34.419925: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cusolver64_100.dll 2021-03-28 23:19:34.423048: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cusparse64_100.dll 2021-03-28 23:19:34.434567: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cudnn64_7.dll 2021-03-28 23:19:34.434801: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1746] Adding visible gpu devices: 0 2021-03-28 23:19:35.002616: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1159] Device interconnect StreamExecutor with strength 1 edge matrix: 2021-03-28 23:19:35.002798: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1165] 0 2021-03-28 23:19:35.003651: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1178] 0: N 2021-03-28 23:19:35.004071: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1304] Created TensorFlow device (/device:GPU:0 with 9640 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1080 Ti, pci bus id: 0000:01:00.0, compute capability: 6.1) [name: "/device:CPU:0" device_type: "CPU" memory_limit: 268435456 locality { } incarnation: 14911962606196949283 , name: "/device:GPU:0" device_type: "GPU" memory_limit: 10108528231 locality { bus_id: 1 links { } } incarnation: 7057132613506236887 physical_device_desc: "device: 0, name: GeForce GTX 1080 Ti, pci bus id: 0000:01:00.0, compute capability: 6.1" ]
GPUが表示されていればOK。私の場合は「メインメモリ32GB」で「GeForce GTX 1080 Ti」(11GB)を使用しています。
9-2. CUDAのバージョン確認
nvcc -V
9-3. cuDNNのバージョン確認
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\include\cudnn.h --- #define CUDNN_MAJOR 7 #define CUDNN_MINOR 6 #define CUDNN_PATCHLEVEL 0 --- ※上記だと7.6.0
10. Jupyter Notebook
コマンドプロンプトを管理者として実行します。
[Jupyter Notebookのインストール]
pip install jupyter
[Jupyter Notebookの起動]
cd C:\Users\ユーザー名\Desktop jupyter notebook
http://localhost:8888/treeがブラウザで自動的に表示されます。
ブラウザの右側にある[New]「Python3」で新しい「Untitled.ipynb」を作成します。
1+1を入力して▶Runを押すと実行できます。
確認したら、[Edit][Delete Cells]で全てを削除します。(一つのセルは残ります) 次に[File][Close and Halt]で終了します。
Jupyter Notebookを閉じるときはログアウトしてからコマンドプロンプトでCtrl+Cです。次からTensorFlowのテストを行います。
11. TensorFlowのテスト
Jupyter Notebookで行いますがpythonコマンドからでも実行可能です。
※コードはTensorFlow1.x系です。
11-1. Hello World
import tensorflow as tf hello = tf.constant('Hello, TensorFlow!') sess = tf.Session() print(sess.run(hello)) sess.close()
結果は11-3へ。
11-2. 行列演算(加算)
次の行列演算をTensorFlowで実行します。
import tensorflow as tf import numpy as np with tf.Session(): input1 = tf.constant(1.0, shape=[2, 3]) input2 = tf.constant(np.reshape(np.arange(1.0, 7.0, dtype=np.float32), (2, 3))) output = tf.add(input1, input2) result = output.eval() print(result)
結果は11-3へ。
11-3. 結果
12. Matplotlib
ついでにMatplotlibもインストールします。
pip install matplotlib
%matplotlib inline import numpy as np import matplotlib.pyplot as plt plt.plot([1, 3, 2, 4]) plt.title('Untitled') plt.ylabel('Y label') plt.xlabel('X label')
13. mnist.py
MNISTはAIのアルゴリズムや開発手法などを学ぶ際に使用されます。最初に学ぶものなのでプログラム言語の「Hello World」的な存在です。
[mnist.py]
from tensorflow.examples.tutorials.mnist import input_data import tensorflow as tf #mnistデータを格納したオブジェクトを呼び出す mnist = input_data.read_data_sets("data/", one_hot=True) """モデル構築開始""" #入力データを定義 x = tf.placeholder(tf.float32, [None, 784]) #整形 img = tf.reshape(x,[-1,28,28,1]) #畳み込み層1 f1 = tf.Variable(tf.truncated_normal([5,5,1,32], stddev=0.1)) conv1 = tf.nn.conv2d(img, f1, strides=[1,1,1,1], padding='SAME') b1 = tf.Variable(tf.constant(0.1, shape=[32])) h_conv1 = tf.nn.relu(conv1+b1) #プーリング層1 h_pool1 = tf.nn.max_pool(h_conv1, ksize=[1,2,2,1], strides=[1,2,2,1], padding='SAME') #畳み込み層2 f2 = tf.Variable(tf.truncated_normal([5,5,32,64], stddev=0.1)) conv2 = tf.nn.conv2d(h_pool1, f2, strides=[1,1,1,1], padding='SAME') b2 = tf.Variable(tf.constant(0.1, shape=[64])) h_conv2 = tf.nn.relu(conv2+b2) #プーリング層2 h_pool2 = tf.nn.max_pool(h_conv2, ksize=[1,2,2,1], strides=[1,2,2,1], padding='SAME') #畳み込まれているものをフラットな形に変換 h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64]) #全結合層 w_fc1 = tf.Variable(tf.truncated_normal([7*7*64, 1024], stddev=0.1)) b_fc1 = tf.Variable(tf.constant(0.1, shape=[1024])) h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, w_fc1) + b_fc1) #出力層 w_fc2 = tf.Variable(tf.truncated_normal([1024, 10], stddev=0.1)) b_fc2 = tf.Variable(tf.constant(0.1, shape=[10])) out = tf.nn.softmax(tf.matmul(h_fc1, w_fc2) + b_fc2) #正解データの型を定義 y = tf.placeholder(tf.float32, [None, 10]) #誤差関数(クロスエントロピー) loss = tf.reduce_mean(-tf.reduce_sum(y * tf.log(out + 1e-5), axis=[1])) #訓練 train_step = tf.train.GradientDescentOptimizer(0.01).minimize(loss) #評価 correct = tf.equal(tf.argmax(out,1), tf.argmax(y,1)) accuracy = tf.reduce_mean(tf.cast(correct, tf.float32)) init =tf.global_variables_initializer() """実行部分""" with tf.Session() as sess: sess.run(init) #テストデータをロード test_images = mnist.test.images test_labels = mnist.test.labels for step in range(1000): train_images, train_labels = mnist.train.next_batch(50) sess.run(train_step, feed_dict={x:train_images ,y:train_labels}) #100ステップごとに精度を検証 if step % 100 == 0: acc_val = sess.run( accuracy, feed_dict={x:test_images, y:test_labels}) print('Step %d: accuracy = %.2f' % (step, acc_val))
これは「TensorFlowではじめるDeepLearning実践入門」の参考書のコードです。著作権は参考書の著者にあります。
原本(MITライセンス):https://github.com/thinkitcojp/TensorFlowDL-samples/blob/master/conv/mnist.py
※2018年発行の書籍なのでWARNINGがでますが実行可能です。
エラーが発生した場合
「ModuleNotFoundError: No module named 'tensorflow.examples.tutorials'」というエラーが発生した場合は「tutorials」がインストールされていません。https://github.com/tensorflow/tensorflow/tree/r1.15の[Code][Download ZIP]からダウンロードします。
tensorflow-r1.15\tensorflow\examples の中にあるtutorialsのフォルダを C:\Program Files\Python36\Lib\site-packages\tensorflow_core\examples の中にコピーすればOKです!
14. GPUの温度
Ubuntu16.04の時は「NVIDIA X Server Setting」でGPUの温度が表示されていたのですが、Windowsの「NVIDIAコントロールパネル」では表示されないようです。
その代わりに「タスクマネージャー」の[パフォーマンス][GPU]の下部に表示されるようです。
15. NVIDIAコントロールパネル
環境によってはこの時点で「NVIDIAコントロールパネル」が開けなくなっている場合があります。そのままでも良い方はスキップしてください。
ドライバをダウンロードします。
https://www.nvidia.co.jp/Download/index.aspx?lang=jp#
[GeForce GTX 1080 Tiの場合]
※全て初期設定のままでインストールします。
以上となります。長時間、お疲れさまでした。
おもちゃのAI研究室
https://www.petitmonte.com/ai/