如何使用GPU運行TensorFlow
如何使用GPU運行TensorFlow
這里主要考慮如何讓tensorflow和keras運行在GPU上:
1. 檢查顯卡類型和計算能力**
查看筆記本顯卡型號,以及計算能力
下載個 GPU 查看器,名字為TechPowerUp GPU-Z
下載地址是:
https://www.techpowerup.com/download/gpu-z/
我的電腦顯示是這樣的:

我筆記本獨立顯卡產品型號是NVIDA GeForce MX250,但是核心型號是GP108。

確定對應顯卡 GPU 的計算能力
去 NVIDIA 官網查看 https://developer.nvidia.com/cuda-gpus
不過我沒有查到計算能力,只看到了相關產品參數https://www.geforce.com/hardware/notebook-gpus/geforce-mx250/features
2. 安裝CUDA
下載地址:https://developer.nvidia.com/cuda-downloads
安裝包有點大,下載慢,需要耐心等待。安裝 cuda 的時候,會詢問是否安裝顯卡驅動,說明 cuda 安裝程序里包含了的顯卡驅動;
建議先不要安裝 cuda 里的顯卡驅動,待安裝完 cuda 后,執行例子程序,如果報錯再檢查顯卡驅動是否正確,避免覆蓋原來的顯卡驅動。
安裝完后執行 nvcc -V 檢查

然后運行例子:
例子在C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\extras\demo_suite/deviceQuery.exe

至此已經安裝 cuda 成功
3. 安裝cuDNN
cuDNN 是一個為了優化深度學習計算的類庫,它能將模型訓練的計算優化之后,再通過 CUDA 調用 GPU 進行運算,當然你也可直接使用 GUDA,而不通過 cuDNN ,但運算效率會低好多
cuDNN 下載地址:https://developer.nvidia.com/cudnn
下載過程會有一堆調查問卷,友好度不好!選擇跟CUDA對應的版本 cuDNN
將文件解壓,例如解壓到D:\software\cuda
解壓后有三個子目錄:bin,include,lib。將bin目錄(例如 D:\software\cuda\bin)添加到環境變量 PATH 中。或者將三個文件夾的內容拷貝到CUDA對應的目錄即可。

4. 重新安裝tensorflow
之前安裝的tensorflow這樣安裝的pip install tensorflow==1.13.0,現在我換成了pip install tensorflow-gpu==1.15.0.
5. 測試代碼
最后對GPU進行一下測試,使用如下代碼:
#導入相關的庫 import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data import os import time from tensorflow.contrib.tensorboard.plugins import projector import matplotlib.pyplot as plt import numpy as np #這里用slim這個API來進行卷積網絡構建 slim = tf.contrib.slim #定義卷積神經網絡模型 #網絡架構是卷積網絡--最大池化--卷積網絡--最大池化---flatten---MLP-softmax的全連接MLP def model(inputs, is_training, dropout_rate, num_classes, scope='Net'): inputs = tf.reshape(inputs, [-1, 28, 28, 1]) with tf.variable_scope(scope): with slim.arg_scope([slim.conv2d, slim.fully_connected], normalizer_fn=slim.batch_norm): net = slim.conv2d(inputs, 32, [5, 5], padding='SAME', scope='conv1') net = slim.max_pool2d(net, 2, stride=2, scope='maxpool1') tf.summary.histogram("conv1", net) net = slim.conv2d(net, 64, [5, 5], padding='SAME', scope='conv2') net = slim.max_pool2d(net, 2, stride=2, scope='maxpool2') tf.summary.histogram("conv2", net) net = slim.flatten(net, scope='flatten') fc1 = slim.fully_connected(net, 1024, scope='fc1') tf.summary.histogram("fc1", fc1) net = slim.dropout(fc1, dropout_rate, is_training=is_training, scope='fc1-dropout') net = slim.fully_connected(net, num_classes, scope='fc2') return net, fc1 def create_sprite_image(images): """更改圖片的shape""" if isinstance(images, list): images = np.array(images) img_h = images.shape[1] img_w = images.shape[2] n_plots = int(np.ceil(np.sqrt(images.shape[0]))) sprite_image = np.ones((img_h * n_plots, img_w * n_plots)) for i in range(n_plots): for j in range(n_plots): this_filter