![TensorFlow从零开始学](https://wfqqreader-1252317822.image.myqcloud.com/cover/344/31186344/b_31186344.jpg)
2.4 使用GPU 加速
2.4.1 安装配置GPU环境
1.安装GPU版TensorFlow
在2.2节中我们已经介绍了如何安装CPU版TensorFlow,为了使用GPU来加速计算,我们必须安装GPU版TensorFlow。TensorFlow官网对于Docker的安装方法有较为详细的介绍,感兴趣的读者可以参考官网的教程。本节里我们将介绍如何自己手工来安装和配置相关环境。首先使用pip命令:
![](https://epubservercos.yuewen.com/C60F01/16896237405619506/epubprivate/OEBPS/Images/txt002_62.jpg?sign=1738881560-XXvwRUxKpX5SgqlfNh0cABUYzMtOO3Wf-0-90a0f86b27894007b0c0bb1badf0049e)
安装完成后,我们可以查看一下当前可用的GPU:
![](https://epubservercos.yuewen.com/C60F01/16896237405619506/epubprivate/OEBPS/Images/txt002_63.jpg?sign=1738881560-wyN6xAWJAgFsvDv01jLS9oZNzqpcBZnP-0-e78aa7264af51ece7275c8c591bf7995)
由于作者的机器上有两块GPU,所以输出两块GPU的编号:“[‘/device:GPU:0’,‘/device:GPU:1’]”。
2.安装显卡驱动
根据你的显卡型号到官网下载对应驱动。图2-23所示的是作者机器Tesla P100的显卡对应的驱动程序。这里一定要注意选择正确的版本,要和你的显卡版本、操作系统版本及想要安装的CUDA版本一一对应(关于TensorFlow与CUDA的版本对应关系,在后面CUDA的安装部分有说明)。
![](https://epubservercos.yuewen.com/C60F01/16896237405619506/epubprivate/OEBPS/Images/txt002_64.jpg?sign=1738881560-uXspmNvbQscHBv858RDaEmcamidg48Ru-0-a05541a79af51365623c828f7e86a7bb)
图2-23 NVIDA驱动下载列表
在图2-23所示的界面中单击“搜索”按钮,弹出如图2-24所示的界面,单击“下载”按钮即可。
![](https://epubservercos.yuewen.com/C60F01/16896237405619506/epubprivate/OEBPS/Images/txt002_65.jpg?sign=1738881560-2PPbXiUmEvJUjA6s7ATLl4hCUlzvkv6V-0-e42f349c8150b38822027ba1ca5ba178)
图2-24 NVIDA驱动下载提示
安装完成之后可以使用“nvidia-smi”命令查看显卡,图2-25所示的是作者机器上的两块显卡的信息。
![](https://epubservercos.yuewen.com/C60F01/16896237405619506/epubprivate/OEBPS/Images/txt002_66.jpg?sign=1738881560-qljIZbuuT2fecFMoAWjJXzP2BNuyO8XP-0-61b9030960926aa6196ce7f8bdc1a9e3)
图2-25 作者机器上的两块显卡的信息
3.安装CUDA
在安装CUDA之前,我们一定要先搞清楚TensorFlow各个版本与CUDA版本的对应关系。在TensorFlow官网有说明,其中Linux系统环境下TensorFlow GPU与CUDA的版本对应关系如图2-26所示。
![](https://epubservercos.yuewen.com/C60F01/16896237405619506/epubprivate/OEBPS/Images/txt002_67.jpg?sign=1738881560-zzWS3XPfO2h8HjutqVr7n2bi3jbKUWa8-0-71ffe47a5fdd43567893dfa0c4c00594)
图2-26 TensorFlow与CUDA的版本对应关系
TensorFlow2.0GPU依赖的NVIDA软件包的官网说明,如图2-27所示。
![](https://epubservercos.yuewen.com/C60F01/16896237405619506/epubprivate/OEBPS/Images/txt002_68.jpg?sign=1738881560-47HkMOl6SggEyCnCjhJaQ9v445bdnldf-0-721a2644266571d4cae023b1083daedc)
图2-27 TensorFlow2.0GPU依赖的NVIDA软件包
(1)下载CUDA
首先到NVIDIA官网下载CUDA。作者在撰写本节内容时,CUDA的最新版本是10.1版本,这里提醒读者,一定要按照TensorFlow官网的说明下载10.0版本,否则TensorFlow即使安装好后也是不能正常运行的。后续新的版本可能会支持更高版本的CUDA,读者请根据实际情况下载。
如图2-28所示,选择对应系统环境的CUDA版本。
![](https://epubservercos.yuewen.com/C60F01/16896237405619506/epubprivate/OEBPS/Images/txt002_69.jpg?sign=1738881560-W2v86OFBEiw4KqVRI0KNJ6hyfblOSpnW-0-0ccbeb090e098e901b2c7e4853af1b8f)
图2-28 选择对应的CUDA版本
(2)安装CUDA
CUDA下载页面有安装指引,如图2-29所示。
![](https://epubservercos.yuewen.com/C60F01/16896237405619506/epubprivate/OEBPS/Images/txt002_70.jpg?sign=1738881560-oNAnFZS21nLFYrIQwYmygMUyCGqUGxkm-0-4cb835f36d583ab8b7080508fe338d53)
图2-29 CUDA的安装步骤
第一步:执行安装命令。
![](https://epubservercos.yuewen.com/C60F01/16896237405619506/epubprivate/OEBPS/Images/txt002_71.jpg?sign=1738881560-0bTj6SmEk20qISYdJe5DlGN4HeBoKTPD-0-c455a5389f5b1fdb32a6afb647e69f65)
第二步:添加key。
![](https://epubservercos.yuewen.com/C60F01/16896237405619506/epubprivate/OEBPS/Images/txt002_72.jpg?sign=1738881560-xIsPuTn3kCGf4tlpW14EpqaTcP9eYkAX-0-9b884b01c0f0c30e6820f38150477e53)
第三步:依次执行。
![](https://epubservercos.yuewen.com/C60F01/16896237405619506/epubprivate/OEBPS/Images/txt002_73.jpg?sign=1738881560-9QtEE9Jb1RzLYTBh8OlqpB4IsfAQR7EZ-0-0b8e2c1ae313820d5d445befc01a5004)
注意不要使用“sudo apt-get install cuda”,这样默认安装的是最新版,所以一定要指定版本。安装过程中如果有报“libkmod:ERROR”相关错误,那么安装完成后重启一下即可。
安装完成后,在“/usr/local”目录下会生成“cuda”和“cuda-10.0”两个文件夹,如图2-30所示,我们可以使用命令“cat /usr/local/cuda/version.txt”查看CUDA版本。
![](https://epubservercos.yuewen.com/C60F01/16896237405619506/epubprivate/OEBPS/Images/txt002_74.jpg?sign=1738881560-3C5aEQhuL7GrEwm6LkNM29yfG9crCm0E-0-d3ba306f5b6fcdb15bd63101c8587706)
图2-30 查看CUDA版本
第四步:设置环境变量。
打开“~/.bashrc”文件,在文件的最后添加如下内容:
![](https://epubservercos.yuewen.com/C60F01/16896237405619506/epubprivate/OEBPS/Images/txt002_75.jpg?sign=1738881560-cjDZVQaEbpdeMHY2uaLjf8RKJ6gVBRLQ-0-48a7d8e1845613bd1f4413f0999b6130)
在终端执行命令“source~/.bashrc”让环境变量生效。
第五步:验证安装是否成功。
① 进入目录“/usr/local/cuda-10.0/samples/1_Utilities/deviceQuery”中打开终端。
② 终端下执行编译命令“sudo make”。
③ 然后执行命令“./deviceQuery”,可以看到两块GPU的信息。
如图2-31所示,检测到作者的两块显卡,图2-31中所示的是其中一块显卡的信息。到这里CUDA已经安装完成了。
![](https://epubservercos.yuewen.com/C60F01/16896237405619506/epubprivate/OEBPS/Images/txt002_76.jpg?sign=1738881560-fz2cTftX6Y217nD0JnD4Y81VaNaTiJVz-0-42b262a545901b2f09c4107b8fefb999)
图2-31 显卡的信息
4.安装cuDNN
(1)下载
这里一定要下载与CUDA10.0对应的版本,如图2-32所示。下载cuDNN需要登录NVIDIA账号,没有的话,可以按照提示创建一个账号。
![](https://epubservercos.yuewen.com/C60F01/16896237405619506/epubprivate/OEBPS/Images/txt002_77.jpg?sign=1738881560-Cb7kMxh2XjtV5gtK9aIA7AuuNmJVM6GV-0-6a4d608904a574c001e7edd898c59927)
图2-32 cuDNN与CUDA的版本对应关系
选择好cuDNN版本后,单击下载“cuDNN Library for Linux”,如图2-33所示。
![](https://epubservercos.yuewen.com/C60F01/16896237405619506/epubprivate/OEBPS/Images/txt002_78.jpg?sign=1738881560-GAWSNjamkmBZdw78KKlVrhTrCvyg74nx-0-3aa2d947f629548f8bd736f92541f940)
图2-33 cuDNN下载列表
(2)安装
第一步:使用“tar”命令解压文件。
![](https://epubservercos.yuewen.com/C60F01/16896237405619506/epubprivate/OEBPS/Images/txt002_79.jpg?sign=1738881560-ccEQsWu97l6DjrbsNazHZeWTqRxDJJyy-0-7379362dab201211b719d2484e995cda)
第二步:拷贝文件,并修改文件权限。
![](https://epubservercos.yuewen.com/C60F01/16896237405619506/epubprivate/OEBPS/Images/txt002_80.jpg?sign=1738881560-ZXrxFKqNuBG08mIYb9RzDPA2P2acYjZG-0-756b91b8e6ea6d8e43d658fcb48e5b0b)
到这里TensorFlow2.0的GPU版就安装配置完成了。
2.4.2 使用TensorFlow-GPU
如果我们的机器上安装配置好了GPU版的TensorFlow,那么运行的时候TensorFlow会自行去选择可用的GPU,也可以通过“os.environ["CUDA_VISIBLE_DEVICES"]”来选择我们要使用的GPU:
![](https://epubservercos.yuewen.com/C60F01/16896237405619506/epubprivate/OEBPS/Images/txt002_81.jpg?sign=1738881560-YAFrbkq0tlT0u8emk5HBz8l638f9HSBB-0-d29d3ff6d0a5a9f7d4e4993fd5065398)
在第4行代码中,我们选择了编号为“0”的GPU,执行完上面的这段代码后使用“nvidia-smi”命令来查看一下GPU的占用情况,如图2-34所示,编号为“0”的GPU正在被占用。我们可以将第4行代码中的“0”改为“1”来使用另一个GPU。
![](https://epubservercos.yuewen.com/C60F01/16896237405619506/epubprivate/OEBPS/Images/txt002_82.jpg?sign=1738881560-0BmVe2To1QuwBq8DQo9O8x8lkdEpEQmS-0-5e66cd9ce956d922e0d1f6282ebfe6dc)
图2-34 查看GPU占用情况
如果我们希望使用多个GPU,例如同时使用“0”“1”两个GPU,可以设置“os.environ ["CUDA_VISIBLE_DEVICES"] = "0,1"”,除此之外还可以使用TensorFlow为“tf.keras”提供的分布式训练策略“tf.distribute.MirroredStrategy”来实现单机环境下的多GPU训练:
![](https://epubservercos.yuewen.com/C60F01/16896237405619506/epubprivate/OEBPS/Images/txt002_83.jpg?sign=1738881560-j5fVFZkAMK83cBXXAGYNj43DalcIBEv2-0-da041d2b07c7d1c4a0b7c5f6cde8bcec)