win10下基于anaconda利用keras开展16系显卡GTX1650的GPU神经网络计算
虽然安装了双系统,但ubantu的确是不太常用,所以还是尝试一下win10下的GPU神经网络计算。从实践看,大体步骤与ubantu下一致,下面进行详细介绍。
系统:win10 家庭版
GPU: N卡 GTX1650 (注意GPU计算只能用NVIDIA)
PYTHON: Anaconda
neural networks 框架: keras
backend:tensorflow 或 theano
anaconda目前国内已经没有镜像源了,所以直接去官网下载。
https://repo.anaconda.com/archive/Anaconda3-2019.07-Windows-x86_64.exe
下载完毕后安装即可,这样我们就有了python环境。
注意windows下,不像ubantu下有2.x,3.x版共存,所以python3安装常用pip3。window下anaconda如果用pipy,那么用pip命令。
更新nvidia显卡驱动(自己去官网下载,然后更新,不用太多说)
cuda kit下载
从tensorflow的安装测试看,tensorflow 1.13.1 适配cuda kit 10.0(https://tensorflow.google.cn/install/source#linux),所以我们下一个cuda kit 10.0。
下载地址:https://developer.nvidia.com/cuda-toolkit ,完毕后安装即可。
cudnn 下载需要注册开发者账户(自行注册)
下载地址:https://developer.nvidia.com/cudnn
或者 https://developer.nvidia.com/rdp/cudnn-download
下载完毕后安装方法,主要是将其解压放到cuda安装目录中。
具体介绍见 https://docs.nvidia.com/deeplearning/sdk/cudnn-install/index.html#install-windows
因为如果利用pip从国外源下载安装python模块实在太慢,所以我们首先把pip源更换为国内的,比如阿里云镜像。
在我的用户目录下(比如:C:\Users\yourusername)创建一个pip目录
在pip目录下创建一个 pip.ini
文件
在该文件的内容中填入:
[global]
index-url = http://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com
因为theano需要g++编译器,所以下一个mingw利用其中的g++作为编译器
从 https://sourceforge.net/projects/mingw-w64/ 下的toolchains中下载
解压,然后把bin目录加入到环境变量的path中。
conda install git
pip install tensorflow
pip install tensorflow-gpu
pip install theano
theano后端无论是cpu还是GPU计算用同一个,差别在于设置,要使用GPU计算时,那么做如下设置:
在用户目录(比如:C:\Users\yourusername)下新建一个文件.theanorc.txt
,写入内容:
[global]
device = cuda10.0
floatX = float32
[nvcc]
fastmath = True
注意:新的theano不再像以前一样device用gpu0这样表示,而是用cuda的版本号,比如cuda10.0。
由于theano可能需要最新的pygpu和libgpuarray,因此需要安装pygpu
conda install -c conda-forge pygpu
遗憾的是,由于下载的cuda为10.0对于theano来说还是版本太新了,所以基于theano的GPU计算没有成功,最后是用CPU计算的。
还在tensorflow可以做GPU计算。
pip install keras
或者
git clone https://github.com/fchollet/keras
cd keras
python setup.py install
用后一种方法可以测试一些示例。
keras进行计算是的时候可以选择后端是tensorflow或者theano,找到用户主目录下的.keras
目录,打开keras.json
文件,修改其中的
"backend": "tensorflow",
或者
"backend": "theano",
可以选择之前安装的两个后端。
git 安装的keras有一个目录example,是其自带的示例,我们可以用它来运行。
但有一个问题是,训练和测试所需的数据(比如:数字识别数据集 mnist.npz),需要从keras自己设置的亚马逊地址下载,当然是被墙了的,所以需要自己去找下载。
这里是从Houchaoqun_XMU(https://blog.csdn.net/houchaoqun_xmu/article/details/78492718)处下载得到,测试修改的python示例代码也参考了该文。
我们进入keras中example目录,打开一个数字识别的神经网络示例,做如下两处修改:
#修改1,训练的世代从12改为2,因为测试,我们没必要计算那么多,算2个就够了,特别是用cpu计算时,是相当耗时的。
epochs = 2 #12
# the data, split between train and test sets
#修改2,注释掉从网络下载mnist.npz方式,转而使用下载的文件
#(x_train, y_train), (x_test, y_test) = mnist.load_data()
path='./mnist.npz'
f = np.load(path)
x_train, y_train = f['x_train'], f['y_train']
x_test, y_test = f['x_test'], f['y_test']
f.close()
修改完毕后,可以对其进行计算,结果为(去掉了一堆警告):
(base) D:\work-ai\keras-master\examples>python mnist_cnn.py
Using TensorFlow backend.
x_train shape: (60000, 28, 28, 1)
60000 train samples
10000 test samples
WARNING: Logging before flag parsing goes to stderr.
Instructions for updating:
Use tf.where in 2.0, which has the same broadcast rule as np.where
Train on 60000 samples, validate on 10000 samples
Epoch 1/2
2019-09-02 22:04:15.736650: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2
2019-09-02 22:04:15.750412: I tensorflow/stream_executor/platform/default/dso_loader.cc:42] Successfully opened dynamic library nvcuda.dll
2019-09-02 22:04:16.900282: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1640] Found device 0 with properties:
name: GeForce GTX 1650 major: 7 minor: 5 memoryClockRate(GHz): 1.56
pciBusID: 0000:01:00.0
2019-09-02 22:04:16.914188: I tensorflow/stream_executor/platform/default/dlopen_checker_stub.cc:25] GPU libraries are statically linked, skip dlopen check.
2019-09-02 22:04:16.925078: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1763] Adding visible gpu devices: 0
2019-09-02 22:04:20.965491: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1181] Device interconnect StreamExecutor with strength 1 edge matrix:
2019-09-02 22:04:20.978889: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1187] 0
2019-09-02 22:04:20.983601: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1200] 0: N
2019-09-02 22:04:20.990832: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1326] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 2927 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1650, pci bus id: 0000:01:00.0, compute capability: 7.5)
60000/60000 [==============================] - 23s 385us/step - loss: 0.2743 - acc: 0.9160 - val_loss: 0.0632 - val_acc: 0.9809
Epoch 2/2
60000/60000 [==============================] - 10s 169us/step - loss: 0.0919 - acc: 0.9728 - val_loss: 0.0433 - val_acc: 0.9864
Test loss: 0.04328459591245046
Test accuracy: 0.9864
可以看到计算中的耗时总共33s,相比于非GPU计算至少有几倍的速度提升。
ps:
1.本文所有的命令行操作都是在anaconda的命令行下做的,这样不需要用户自己去设置环境。
2.GPu计算最新的方式是使用docker,本文没有实践,有需要的用户可以自己尝试。
3.安装gpu支撑环境后后tensorflow自动用GPU计算,还没尝试如何设置让其只进行cpu计算。