1. 从一次深夜环境搭建说起为什么TensorFlow 2.0的安装总让人抓狂如果你问一个搞深度学习的人整个项目周期里最让人血压升高的环节是什么大概率不是调参、不是改网络结构而是最开始那一步——把TensorFlow 2.0跑起来。我见过太多人在这一步卡住包括我自己第一次配环境的时候从晚上八点折腾到凌晨两点最后发现只是cuDNN的版本号差了一位。TensorFlow 2.0的安装之所以让人头疼核心原因在于它不是一个孤立的Python包。它背后牵扯到三层依赖Python生态的包管理、NVIDIA显卡驱动、以及CUDA和cuDNN这两个计算加速库。这三层任何一层版本对不上你看到的就不是Hello TensorFlow而是一堆红色报错。更麻烦的是TensorFlow 2.0对CUDA和cuDNN的版本要求非常严格不是差不多就行而是必须精确匹配。这篇内容适合谁看如果你手里有一张NVIDIA显卡想在本地跑深度学习不管是做图像分类、目标检测还是自然语言处理只要涉及TensorFlow 2.0的GPU加速这篇都能帮你少走弯路。如果你只用CPU版本那安装会简单很多我也会在文中说明CPU版本的快速路径。接下来我会把整个安装过程拆成几个关键环节每个环节讲清楚为什么这么做和容易在哪里翻车。2. 安装前的关键决策版本矩阵与硬件兼容性核查2.1 先搞清楚你的显卡到底支不支持在动手装任何东西之前第一件事是确认你的显卡型号和计算能力。TensorFlow 2.0的GPU版本要求NVIDIA显卡的计算能力Compute Capability不低于3.5。这个数字怎么查打开终端输入nvidia-smi如果能看到显卡型号和驱动版本说明驱动已经装好了。然后去NVIDIA官网查你的显卡对应的计算能力。我遇到过有人拿着很老的笔记本显卡来问我为什么装不上一查计算能力只有2.1那确实没办法硬件层面就不支持。另外要注意AMD显卡和集成显卡是不支持CUDA的只能用CPU版本。这一点在买机器或者选云服务器的时候就要确认好别等装了半天才发现方向错了。2.2 TensorFlow 2.0与CUDA、cuDNN的版本对应关系这是整个安装过程中最关键的一张表。TensorFlow 2.0官方要求的版本组合是CUDA 10.0配cuDNN 7.4或者CUDA 10.1配cuDNN 7.6。注意TensorFlow 2.0对CUDA 10.2及以上版本是不支持的你装了也白装。TensorFlow版本Python版本要求CUDA版本cuDNN版本2.0.x3.5-3.710.07.42.0.x3.5-3.710.17.62.1.x3.5-3.710.17.62.2.x3.5-3.810.17.6我个人的建议是选CUDA 10.1加cuDNN 7.6这个组合因为它的兼容性最好后续升级到TensorFlow 2.1或2.2也不用换CUDA。Python版本建议用3.73.8在TensorFlow 2.0上偶尔会有一些包兼容性问题。注意不要盲目追求最新版本的CUDA。很多人觉得版本越新越好结果装了CUDA 11TensorFlow 2.0直接找不到GPU。版本匹配比版本新更重要。2.3 驱动版本的前置要求CUDA 10.1要求NVIDIA驱动版本不低于418.39。用nvidia-smi命令可以看到当前驱动版本。如果驱动太老需要先更新驱动。在Linux上更新驱动相对麻烦一些可能需要先禁用nouveau驱动再安装。在Windows上就简单很多去NVIDIA官网下载对应显卡的最新驱动一路下一步就行。这里有个经验如果你是在Linux服务器上操作而且没有root权限那基本没法装CUDA和cuDNN只能找管理员帮忙或者用CPU版本。所以在开始之前先确认自己有没有管理员权限。3. CUDA与cuDNN的安装实操每一步都有讲究3.1 CUDA 10.1的下载与安装细节CUDA的安装包在NVIDIA官网可以找到历史版本。进入CUDA Toolkit Archive页面找到10.1版本根据你的操作系统选择对应的安装包。Linux用户建议选runfile格式Windows用户选exe格式。Linux下的安装命令大致是这样的# 下载runfile wget https://developer.download.nvidia.com/compute/cuda/10.1/Prod/local_installers/cuda_10.1.243_418.87.00_linux.run # 赋予执行权限 chmod x cuda_10.1.243_418.87.00_linux.run # 执行安装 sudo sh cuda_10.1.243_418.87.00_linux.run安装过程中会问你几个问题。第一个是是否安装显卡驱动如果你已经装好了驱动这里一定要选No否则可能把现有驱动覆盖掉导致显示异常。第二个是安装路径默认是/usr/local/cuda-10.1建议保持默认。第三个是是否创建符号链接选Yes这样/usr/local/cuda会指向/usr/local/cuda-10.1。安装完成后需要配置环境变量。打开~/.bashrc文件在末尾添加export PATH/usr/local/cuda-10.1/bin:$PATH export LD_LIBRARY_PATH/usr/local/cuda-10.1/lib64:$LD_LIBRARY_PATH然后执行source ~/.bashrc让配置生效。验证安装是否成功输入nvcc -V如果能看到CUDA 10.1的版本信息说明安装成功了。Windows下的安装就更直观了双击exe文件选择自定义安装取消勾选显卡驱动如果已经装过其他默认下一步。安装完成后需要手动添加环境变量把C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin和libnvvp目录加到Path里。3.2 cuDNN 7.6的配置复制粘贴也有门道cuDNN的下载需要注册NVIDIA开发者账号这个流程稍微有点繁琐但没办法官方就是这么要求的。登录之后找到cuDNN Archive选择对应CUDA 10.1的版本也就是cuDNN 7.6.5。下载下来是一个压缩包Linux下是tgz格式Windows下是zip格式。解压之后你会看到三个文件夹bin、include、lib。需要把这三个文件夹里的内容分别复制到CUDA的对应目录下。Linux下的操作tar -xzvf cudnn-10.1-linux-x64-v7.6.5.32.tgz sudo cp cuda/include/cudnn.h /usr/local/cuda-10.1/include/ sudo cp cuda/lib64/libcudnn* /usr/local/cuda-10.1/lib64/ sudo chmod ar /usr/local/cuda-10.1/include/cudnn.h sudo chmod ar /usr/local/cuda-10.1/lib64/libcudnn*Windows下就是把bin里的dll文件复制到C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bininclude里的h文件复制到对应的include目录lib里的lib文件复制到lib目录。提示复制完之后建议验证一下cuDNN是否配置成功。在Linux下可以用cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2来查看版本号。如果能看到7.6.5说明配置正确。3.3 环境变量配置中容易忽略的坑环境变量这块有几个细节容易被忽略。第一LD_LIBRARY_PATH必须包含CUDA的lib64目录否则TensorFlow运行时找不到cuDNN的动态库。第二如果你之前装过其他版本的CUDA环境变量里可能残留了旧版本的路径需要清理干净。第三在Windows上环境变量的顺序很重要CUDA的路径要放在前面。还有一个常见问题有些人装完CUDA之后nvcc -V能看到版本但TensorFlow就是检测不到GPU。这种情况多半是cuDNN没配好或者环境变量没生效。可以尝试重启终端或者检查LD_LIBRARY_PATH是否真的包含了正确的路径。4. TensorFlow 2.0的安装与GPU验证从pip命令到实际跑通4.1 用pip安装TensorFlow 2.0的正确姿势CUDA和cuDNN搞定之后TensorFlow本身的安装反而简单了。强烈建议用虚拟环境不要直接装在系统Python里。用conda或者venv都行我个人习惯用conda。# 创建虚拟环境 conda create -n tf2 python3.7 # 激活环境 conda activate tf2 # 安装TensorFlow 2.0 GPU版本 pip install tensorflow-gpu2.0.0注意包名是tensorflow-gpu而不是tensorflow。虽然从TensorFlow 2.1开始两者合并了但2.0版本还是分开的。如果你装的是tensorflow那装的是CPU版本不会用到GPU。安装过程中pip会自动下载一堆依赖包包括numpy、protobuf、h5py等等。如果下载速度慢可以换国内镜像源pip install tensorflow-gpu2.0.0 -i https://pypi.tuna.tsinghua.edu.cn/simple4.2 验证GPU是否真正被调用的三种方法装完之后别急着跑模型先验证GPU是否真的可用。第一种方法最简单import tensorflow as tf print(tf.test.is_gpu_available())如果输出True说明GPU可用。如果输出False那就要排查了。第二种方法更详细from tensorflow.python.client import device_lib print(device_lib.list_local_devices())这会列出所有可用的设备你能看到GPU的型号和显存信息。第三种方法是实际跑一个矩阵运算看时间消耗import tensorflow as tf import time with tf.device(/GPU:0): a tf.random.normal([1000, 1000]) b tf.random.normal([1000, 1000]) start time.time() for _ in range(100): c tf.matmul(a, b) print(GPU time:, time.time() - start)如果GPU时间明显比CPU短说明GPU确实在工作。4.3 常见报错与排查思路即使按照步骤来也难免遇到报错。我整理了几个最常见的报错信息原因解决方案Could not load dynamic library libcudart.so.10.1CUDA路径没配好检查LD_LIBRARY_PATHFailed to get convolution algorithmcuDNN版本不匹配确认cuDNN版本为7.6CUDA_ERROR_OUT_OF_MEMORY显存不足减小batch size或设置显存按需分配No module named tensorflow虚拟环境没激活重新激活环境显存按需分配的设置方法gpus tf.config.experimental.list_physical_devices(GPU) if gpus: for gpu in gpus: tf.config.experimental.set_memory_growth(gpu, True)这段代码放在所有TensorFlow操作之前可以避免TensorFlow一次性占满所有显存。5. 资源获取与离线安装没有网络时怎么办5.1 安装包的离线下载与迁移很多实验室的服务器是不联网的或者网络环境很差。这种情况下就需要提前在有网络的机器上下载好所有安装包然后拷贝过去。需要下载的东西包括CUDA安装包、cuDNN压缩包、TensorFlow的whl文件以及所有依赖包。TensorFlow的whl文件可以从PyPI官网下载注意选择对应Python版本和操作系统的版本。依赖包可以用pip download命令批量下载pip download tensorflow-gpu2.0.0 -d ./packages这会把所有依赖包下载到packages目录。然后在离线机器上用pip install --no-index --find-links./packages tensorflow-gpu2.0.0来安装。5.2 网盘资源的合理使用与注意事项网上确实有很多人分享整理好的安装包资源通过网盘传播。使用这些资源的时候有几点要注意第一确认资源来源可靠避免下载到被篡改的安装包。第二核对文件大小和MD5值确保下载完整。第三网盘下载速度可能很慢如果文件很大可以考虑分时段下载或者用其他方式获取。我个人更推荐从官方渠道下载虽然注册账号麻烦一点但安全性有保障。如果实在需要网盘资源建议只用来获取那些官方下载特别慢的文件比如CUDA安装包。5.3 版本锁定与可复现环境的构建做深度学习项目环境可复现非常重要。今天装好的环境过两个月可能因为某个依赖包更新就跑不起来了。所以建议在环境配好之后立刻导出依赖列表pip freeze requirements.txt这样以后重建环境的时候直接pip install -r requirements.txt就能装回一模一样的版本。对于CUDA和cuDNN建议把安装包也备份一份免得以后官网找不到历史版本了。6. 踩坑实录那些让我熬夜的安装问题6.1 驱动、CUDA、cuDNN三者版本冲突的排查过程有一次我在一台新服务器上装环境nvidia-smi显示驱动版本是450我装了CUDA 10.1和cuDNN 7.6结果TensorFlow死活检测不到GPU。排查了半天最后发现是驱动版本太新了450版本的驱动和CUDA 10.1之间存在兼容性问题。解决办法是降级驱动到418版本或者升级CUDA到11.0配合TensorFlow 2.4。但TensorFlow 2.0不支持CUDA 11所以只能降驱动。这个问题的排查思路是先确认nvidia-smi能正常输出再确认nvcc -V版本正确然后确认cuDNN文件复制到位最后检查TensorFlow的报错信息。一层一层往下查总能找到问题所在。6.2 虚拟环境与系统环境的路径冲突另一个常见问题是虚拟环境和系统环境的路径冲突。比如系统里已经装了CUDA 9.0虚拟环境里需要CUDA 10.1但环境变量指向了系统里的旧版本。这种情况下可以在虚拟环境的激活脚本里单独设置环境变量或者用conda安装cudatoolkit和cudnnconda install cudatoolkit10.1 cudnn7.6conda会自动处理路径问题把CUDA装在虚拟环境内部不会和系统环境冲突。这也是我后来最推荐的方式省去了手动配置环境变量的麻烦。6.3 显存不足与batch size的权衡装好环境跑通之后下一个坑就是显存不足。特别是用消费级显卡的时候显存往往只有6GB或8GB跑大模型很容易OOM。这时候需要权衡batch size和模型复杂度。我的经验是先用一个很小的batch size跑通流程然后逐步增大直到接近显存上限。同时开启显存按需增长避免TensorFlow一上来就占满显存。如果显存实在不够可以考虑用混合精度训练或者把部分计算放到CPU上。但这些都属于优化层面的问题了前提是环境先装好。7. 装完之后的一些个人体会环境搭建这件事说难不难说简单也不简单。核心就是版本匹配四个字。我现在的习惯是拿到一台新机器先查显卡型号和驱动版本然后去TensorFlow官网查对应的CUDA和cuDNN版本严格按照官方文档来。不追求最新只追求最稳。另外强烈建议把安装过程记录下来包括下载的版本号、安装路径、环境变量配置。下次再装的时候直接照着笔记来能省很多时间。我现在还保留着第一次成功安装TensorFlow 2.0时的笔记虽然现在已经用不上CUDA 10.1了但那份笔记里的排查思路依然有用。最后分享一个小技巧如果实在搞不定本地环境可以考虑用云端的Notebook环境很多平台都预装了TensorFlow和CUDA开箱即用。对于初学者来说先把模型跑起来比在环境上死磕更有价值。等以后需要深度定制环境了再回来折腾本地安装也不迟。