![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=1739246317-tEszHjEL2jbfV3qIkYTPzM27lbApPYBV-0-4b87c1006e7641e878a215d9e6a9cc1c)
安装完成后,我们可以查看一下当前可用的GPU:
![](https://epubservercos.yuewen.com/C60F01/16896237405619506/epubprivate/OEBPS/Images/txt002_63.jpg?sign=1739246317-aeLLYrxHmCr8iXhcgdZcbiyRTWsmz1fN-0-5c4e61593b51d19d7fd54b03d3d5af41)
由于作者的机器上有两块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=1739246317-Tohy6YRilRg6hxZgeJF61sEb2fUhhVUh-0-55f4a822f173d388020526cfe67c306c)
图2-23 NVIDA驱动下载列表
在图2-23所示的界面中单击“搜索”按钮,弹出如图2-24所示的界面,单击“下载”按钮即可。
![](https://epubservercos.yuewen.com/C60F01/16896237405619506/epubprivate/OEBPS/Images/txt002_65.jpg?sign=1739246317-w74mvKny11BAdsD9id1IiekxW75xpJLn-0-df3c9834007b3ecd7e869cd6e54fe530)
图2-24 NVIDA驱动下载提示
安装完成之后可以使用“nvidia-smi”命令查看显卡,图2-25所示的是作者机器上的两块显卡的信息。
![](https://epubservercos.yuewen.com/C60F01/16896237405619506/epubprivate/OEBPS/Images/txt002_66.jpg?sign=1739246317-BLGtx77qQ59XHzMCkskcichPRpc6AN1a-0-c9c2effb5134d0a8b7e32fd957378b63)
图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=1739246317-PX9HeOCFCfRG2eLg9HHYa6NKnpL1AzKM-0-4c0a18522eda4142a2e5e934127890d1)
图2-26 TensorFlow与CUDA的版本对应关系
TensorFlow2.0GPU依赖的NVIDA软件包的官网说明,如图2-27所示。
![](https://epubservercos.yuewen.com/C60F01/16896237405619506/epubprivate/OEBPS/Images/txt002_68.jpg?sign=1739246317-ibgHwo4QEORARN7jEpeEvLOxOGKteVKg-0-8054741e52db7c392d436a614c35f251)
图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=1739246317-2xHKtKCt3LEXMtKF3jmReAIOrQanRFEw-0-6dd286953f00c6cb29628dd3542c753f)
图2-28 选择对应的CUDA版本
(2)安装CUDA
CUDA下载页面有安装指引,如图2-29所示。
![](https://epubservercos.yuewen.com/C60F01/16896237405619506/epubprivate/OEBPS/Images/txt002_70.jpg?sign=1739246317-havjlhYyLtpSVFKcGNjuE55aTXqn39CX-0-d3ca98adb9ad4a8a74665f4cf8fa7286)
图2-29 CUDA的安装步骤
第一步:执行安装命令。
![](https://epubservercos.yuewen.com/C60F01/16896237405619506/epubprivate/OEBPS/Images/txt002_71.jpg?sign=1739246317-e22mWfoVpsfmaFvPcetQuvvHYk8pf2Dm-0-be175e08308444e99620a83a612173dd)
第二步:添加key。
![](https://epubservercos.yuewen.com/C60F01/16896237405619506/epubprivate/OEBPS/Images/txt002_72.jpg?sign=1739246317-4Om4u5htnMyAslBrL1r5HbjY9D03zZ2H-0-cb5b45ce839e939b369799a6c81ec127)
第三步:依次执行。
![](https://epubservercos.yuewen.com/C60F01/16896237405619506/epubprivate/OEBPS/Images/txt002_73.jpg?sign=1739246317-H2Xn4b6LJWPingXK4nrmp2gqttu1DCbC-0-52d852bef5a696e0b569b532840da0ba)
注意不要使用“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=1739246317-YcpQ3p1Xy7YJDiKgnrxdcEA4MVz6N3Ok-0-79769014007b1a0cc40e0d36aa5996d9)
图2-30 查看CUDA版本
第四步:设置环境变量。
打开“~/.bashrc”文件,在文件的最后添加如下内容:
![](https://epubservercos.yuewen.com/C60F01/16896237405619506/epubprivate/OEBPS/Images/txt002_75.jpg?sign=1739246317-5BxX9PyVb0ZFZlqyq2afKgQTsDopEzvL-0-01d55a5bae45f4227dee474771479512)
在终端执行命令“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=1739246317-8cOrlPslEfFiI6n6q6XixdcbLqxaENRN-0-912b1dd14ecf6d3744fe6c04085962e7)
图2-31 显卡的信息
4.安装cuDNN
(1)下载
这里一定要下载与CUDA10.0对应的版本,如图2-32所示。下载cuDNN需要登录NVIDIA账号,没有的话,可以按照提示创建一个账号。
![](https://epubservercos.yuewen.com/C60F01/16896237405619506/epubprivate/OEBPS/Images/txt002_77.jpg?sign=1739246317-2t0E7kFD6MHGXYyOHK22x7yKDvDwWIk7-0-fa091f1904853f9c8cffd2bc668cd588)
图2-32 cuDNN与CUDA的版本对应关系
选择好cuDNN版本后,单击下载“cuDNN Library for Linux”,如图2-33所示。
![](https://epubservercos.yuewen.com/C60F01/16896237405619506/epubprivate/OEBPS/Images/txt002_78.jpg?sign=1739246317-1rNwSDRQdFfnCtcrMLfr5YMfldpl79Ei-0-389bfd8a11034c6d8d93cc512c07e868)
图2-33 cuDNN下载列表
(2)安装
第一步:使用“tar”命令解压文件。
![](https://epubservercos.yuewen.com/C60F01/16896237405619506/epubprivate/OEBPS/Images/txt002_79.jpg?sign=1739246317-HyX99RZGNutKVa7RgUIx7CX2UpUz1k1E-0-f6ae54d5fb0b26b4e9218e6eb28c8983)
第二步:拷贝文件,并修改文件权限。
![](https://epubservercos.yuewen.com/C60F01/16896237405619506/epubprivate/OEBPS/Images/txt002_80.jpg?sign=1739246317-uerH7iR4LrDQs3dmGGwM7WDHkRpkjn66-0-e9bdf9b4c6eb3e640319dfaaa2d6cc6c)
到这里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=1739246317-v9vRRTljzJ2iA3uMpPArduULz60AwQim-0-18755204cfb70c1c3608ce4ab6386daa)
在第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=1739246317-MNkPy8gA7ZyBzjr4Ss0zahOvZ8Gq6Y25-0-0891925bd16b4a3d0b04a9162f0512a9)
图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=1739246317-ujV2fnvH2XLrIWLg6TxCyAnBTm50pPUD-0-635823b020f775b910eaf1f8c1b7decd)