在Windows下安装Tensorflow

一、背景

Tensorflow可以在Windows下安装运行,有GPU版本和CPU版本。自行安装Tensorflow的一个主要问题就是版本不匹配。CUDA和Tensorflow的搭配是有特定版本要求的,并非越高越好。因此如果完全去Nvidia官网下载公开驱动,在运行Tensorflow过程中很可能报告找不到xxx.dll等错误,就是因为版本不匹配造成的。网上可以搜索到相关文章。相对于自行安装Python、自行下载CUDA、CUDNN、Tensor等组件并匹配版本,还要配置环境变量,复杂和麻烦。因此,本文推荐使用Anaconda一步到位。

本文是在AWS中国区域 G4实例,选择Windows Server 2019英文版系统安装测试通过,主要版本如下。

  • AWS G4 instance – T4 GPU Tesla 442.50
  • Anaconda3-2020.02(自带Python3.7.6)
  • Python 3.7.7(新建Env自动被Anaconda通过依存性版本安装)
  • CUDA 10.1.241(对应官网的Update1)
  • CUDNN 10.1-7.6.5
  • Tensorflow-gpu 2.1.0

以上组件除Tesla驱动外,均使用Anaconda一键自动安装。

二、安装GPU驱动

1、装GPU驱动

由于只使用GPU做训练,而不是3D图形渲染,因此只需要安装Tesla驱动即可,无需安装Grid图形驱动。而且在这种模式下,可使用Windows默认的RDP终端服务即可用于远程管理,无需安装NICE DCV/VNC等远程管理协议。

从这里下载:

https://s3.cn-north-1.amazonaws.com.cn/lxy-sa-software/EC2-G4-Instance/02_Tesla_Driver/442.50-tesla-desktop-winserver-2019-2016-international.exe

安装完毕后重启。

2、验证安装成功

进入cmd(非Powershell),执行如下命令:

cd "C:\Program Files\NVIDIA Corporation\NVSMI\"
nvidia-smi.exe

查看运行模式正常,返回结果如下。

C:\Program Files\NVIDIA Corporation\NVSMI>nvidia-smi.exe
Sat Jun 20 13:21:01 2020
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 451.22       Driver Version: 451.22       CUDA Version: 11.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name            TCC/WDDM | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla T4            TCC  | 00000000:00:1E.0 Off |                    0 |
| N/A   31C    P8    10W /  70W |      0MiB / 15205MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

C:\Program Files\NVIDIA Corporation\NVSMI>

在以上结果中,需要注意Tesla T4这一行显示的信息是TCC模式,即表示安装正常。TCC模式即GPU计算模式,只用于训练和推理,不需要3D图形渲染的状态。

三、安装Anaconda环境

1、下载

从这里下载并安装。

https://s3.cn-north-1.amazonaws.com.cn/lxy-sa-software/Tensorflow/Anaconda3-2020.02-Windows-x86_64.exe

2、安装Tensorflow

进入开始菜单,找到Anacoda3(64bit),点击展开菜单,点击 “Anaconda Prompt(Anaconda3)”,点击进入命令行。

随着Anaconda自动安装好的是一个Python 3.7.6的环境。我们可以通过创建配置文件,在系统上安装多个Python 3.x版本,并可进行版本切换。

查询Anaconda支持的Python版本清单,执行如下命令。

conda search tensorflow-gpu

本文测试了2.1.0通过,因此下边的手册描写为用户创建一个独立环境一个环境。

conda create --name tensorflow1 tensorflow-gpu=2.1.0

此时系统将提示所有依存性版本,可以看到CUDA和CUDNN的对应版本也列在其中。在确认过程中输入yes完成操作。

四、测试运行

1、命令行下运行

进入开始菜单,找到Anacoda3(64bit),点击展开菜单,点击 “Anaconda Prompt(Anaconda3)”,点击进入命令行。

查询上一个步骤配置的环境模式,执行如下命令:

conda info --envs

返回结果如下:

(base) C:\Users\Administrator>conda info --envs
# conda environments:
#
base                  *  C:\ProgramData\Anaconda3
tensorflow1              C:\ProgramData\Anaconda3\envs\tensorflow1

(base) C:\Users\Administrator>

上文已经解释过,Anaconda 自带的 Python 版本是3.7.6,配置文件对应base这个版本。本文另外安装 Tenserflow-gpu 2.1.0 搭配 Python 3.7.7,对应的配置文件是tensorflow1这个名字。

启动 tensorflow1 环境,执行如下命令。

activate tensorflow1
python

执行Hello World测试。

import tensorflow as tf
tf.compat.v1.disable_eager_execution()
hello = tf.constant('hello,tensorflow')
sess= tf.compat.v1.Session()
print(sess.run(hello))

这里需要注意的是,由于本文使用的Tensorflow版本是2.1,原来1.1版本中的Session方法已经过期,因此在2.x上调用Session的方法需要修改为compat.v1.Session。否则会报告方法不可用。

返回如下信息,且最后打出了hello表示配置成功。

(tensorflow1) C:\Users\Administrator>python
Python 3.7.7 (default, May  6 2020, 11:45:54) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
2020-06-21 04:02:23.205171: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cudart64_101.dll
>>> tf.compat.v1.disable_eager_execution()
>>> hello = tf.constant('hello,tensorflow')
>>> sess= tf.compat.v1.Session()
2020-06-21 04:02:25.472006: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library nvcuda.dll
2020-06-21 04:02:25.580727: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1555] Found device 0 with properties:
pciBusID: 0000:00:1e.0 name: Tesla T4 computeCapability: 7.5
coreClock: 1.59GHz coreCount: 40 deviceMemorySize: 14.85GiB deviceMemoryBandwidth: 298.08GiB/s
2020-06-21 04:02:25.589145: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cudart64_101.dll
2020-06-21 04:02:25.600717: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cublas64_10.dll
2020-06-21 04:02:25.614987: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cufft64_10.dll
2020-06-21 04:02:25.622689: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library curand64_10.dll
2020-06-21 04:02:25.637295: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cusolver64_10.dll
2020-06-21 04:02:25.645685: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cusparse64_10.dll
2020-06-21 04:02:25.673263: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cudnn64_7.dll
2020-06-21 04:02:25.678463: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1697] Adding visible gpu devices: 0
2020-06-21 04:02:25.683543: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX AVX2
2020-06-21 04:02:25.690563: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1555] Found device 0 with properties:
pciBusID: 0000:00:1e.0 name: Tesla T4 computeCapability: 7.5
coreClock: 1.59GHz coreCount: 40 deviceMemorySize: 14.85GiB deviceMemoryBandwidth: 298.08GiB/s
2020-06-21 04:02:25.701724: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cudart64_101.dll
2020-06-21 04:02:25.705676: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cublas64_10.dll
2020-06-21 04:02:25.711700: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cufft64_10.dll
2020-06-21 04:02:25.716021: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library curand64_10.dll
2020-06-21 04:02:25.720220: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cusolver64_10.dll
2020-06-21 04:02:25.724584: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cusparse64_10.dll
2020-06-21 04:02:25.732739: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cudnn64_7.dll
2020-06-21 04:02:25.738786: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1697] Adding visible gpu devices: 0
2020-06-21 04:02:26.578678: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1096] Device interconnect StreamExecutor with strength 1 edge matrix:
2020-06-21 04:02:26.583080: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1102]      0
2020-06-21 04:02:26.586153: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1115] 0:   N
2020-06-21 04:02:26.591704: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1241] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 14239 MB memory) -> physical GPU (device: 0, name: Tesla T4, pci bus id: 0000:00:1e.0, compute capability: 7.5)
>>> print(sess.run(hello))
b'hello,tensorflow'
>>>

2、图形界面运行

首先按上一步在字符界面下命令,切换配置文件,进入Tensorflow1。

然后为本环境安装sypeder支持,命令如下。

conda install spyder-kernels

进入开始菜单,找到Anacoda3(64bit),点击展开菜单,点击 “Spyder(Anaconda3)”,点击进入图形界面。

在图形界面的右下角,可以看到当前Spyder检测到的是base环境的Python 3.7.6,不是前文环境Tensorflow-gpu 2.1.0的Python 3.7.7。因此这里必须修改版本才可以运行。方法如下:

  • 启动Spyder;
  • 点击窗口的菜单栏,点击Tools;
  • 点击第一项Preferences;
  • 点击左侧的“Python interpreter”;
  • 在右侧上半部分,默认选择是“Default”,修改为“Use the following Python interpreter”
  • 在下方目录内,填写上前文配置的profile对应的路径 C:\ProgramData\Anaconda3\envs\tensorflow1\python.exe ,这个版本就是前文的tensorflow1环境对应的的版本;
  • 点击OK,完成配置;
  • 退出Spyder,重新进入。

现在可以看到右下角的Python版本检测正常。

接下来按照上一步的Hello World脚本,粘贴上,点击运行按钮,即可正常执行。

全文完。