由于 Anaconda 以前的环境乱搞+臃肿, 打算卸载它并重新安装 miniconda
, 并基于此安装全新的新版 Tensorflow-gpu
环境. 本教程基于 Windows 10
, 只安装了 Nvidia 的显卡驱动(512.15) 打游戏要用, 未安装 CUDA, CuDNN
. 可能是目前最推荐的安装方式.
PS: 主动装完
CUDA, CuDNN
可能会少一两个报错, 但是会有额外的安装和配置且不能便捷切换版本.
Linux 用户情况不一样, 如果想解决版本冲突可以参考第一步.
由于 Anaconda 太庞大且实际上我们只用得上 conda
而已, 不需要那么多额外的东西, 所以此处只需要下载 100MB 都没有的 miniconda
即可. 最新版本的下载链接可以到:
安装时基本全默认, 除了最好不在默认安装目录下, 因为以后修改, 安装和升级包都需要超级管理员权限, 挺麻烦的要一直点确定.
由于为了防止冲突, 安装时默认 conda
并不加入到系统环境变量里面, 所以现在你的 Terminal 中是识别不到 conda
命令的. 此时点开 电脑左下角 Win 徽标 --> 所有应用 --> Anaconda Prompt (miniconda)
(差不多名字的都有效) 会出来一个黑框框 Terminal, 输入命令
conda init
就完成了 miniconda
的安装, 这一步会在你系统中已有的 Terminal 的配置文件中加入一些配置.
为了下载包快一点, 此处还需要进行换源操作, 参见: 清华镜像站说明, 去修改 .condarc
文件即可.
Terminal 推荐使用 Windows Terminal, 会好看一点
由于 conda
检查依赖比较严格, 一个接一个安装核心组件可能会冲突:
Collecting package metadata (current_repodata.json): done
Solving environment: failed with repodata from current_repodata.json, will retry with next repodata source.
Collecting package metadata (repodata.json): done
Solving environment: -
Found conflicts!
Looking for incompatible packages.
This can take several minutes. Press CTRL-C to abort.
failed
UnsatisfiableError: The following specifications were found to be incompatible with each other:
几个核心组件(少量)的版本最好一起考虑. 你可以在创建完环境后直接一次性 install 多个包, 此处直接在新建环境时如此做:
conda create -n tf2 python tensorflow-gpu=2.6.0 cudatoolkit cudnn
其中 tf2
为自定义的环境名字, 后面跟着的就是你要安装的包, 有要优先满足的版本就在后面加 =2.6.0
这样的限制, 其余组件的版本会自动计算得到: python=3.9.12, cudatoolkit=11.3.1, cudnn=8.2.1
.
PS: 去掉 =2.6.0 时, 默认会安装 2.3.0, 也是可以的.
另外, 2.6.0 下matplotlib
是装不上的, 冲突太多, 需要用宽松的pip
安装
如果已经额外装过 CUDA 或在 Linux 下很可能执行上一步就没啥问题了, 但我们其实现在还有 2 个组件缺失要解决. 如果装过了还有以下问, 应该是环境变量1没添加完毕, 添加路径至环境变量或者直复制相关 dll
到 CUDA 主要组件库目录下即可.
现在其实 GPU 的训练已经可以进行了, 但 tensorboard, savemodel 等写入文件的组件还调用不了, 这个问题在 2.3.0 及以下版本可能不会发生. 此时需要以下命令:
conda install -c nvidia cuda-cupti
其中 -c nvidia
表示从英伟达官方源中查找, 这个东西在官方源和清华源中都没有的. 这里有2 个坑, 一是 cupti
安装路径不正常, 不能被 CUDA 组件找到, 二是其默认名字不对, 训练时会有以下报错:
2022-07-03 16:47:32.007494:
E
tensorflow/core/profiler/internal/gpu/cupti_tracer.cc:1666] function cupti_interface_->Subscribe( &subscriber_, (CUpti_CallbackFunc)ApiCallback, this)failed with errorCUPTI
could not be loaded or symbol could not be found.
2022-07-03 16:46:49.847834:E
tensorflow/core/profiler/internal/gpu/cupti_tracer.cc:1757] function cupti_interface_->Finalize()failed with errorCUPTI
could not be loaded or symbol could not be found.
安装完毕后, 去路径 miniconda安装文件夹\envs\tf2\Lib
下找到 cupti64_2022xxxx.dll
, 改名为 cupti64_113.dll
, 这里 113
表示 cudatoolkit
的版本为 11.3.x
. 并且把它和文件 cupti.lib
(顺手) 移动到路径 miniconda安装路径\envs\tf2\Library\bin
内(NVidia 真不靠谱). 可以看到, 上一步安装的 cudnn_xxx.dll, cudart64_110.dll
等都在这儿.
此时还剩最后一个报错.
由于我不进行 CUDA 的自行安装, 所以上一步之后, 有可能还会有如下报错:
2022-07-03 16:53:31.419884:
W
tensorflow/stream_executor/gpu/asm_compiler.cc:77] Couldn’t get ptxas version string: Internal: Couldn’t invoke ptxas.exe --version
2022-07-03 16:53:31.423271:E
tensorflow/core/platform/windows/subprocess.cc:287] Call to CreateProcess failed. Error code: 2
2022-07-03 16:53:31.423934:W
tensorflow/stream_executor/gpu/redzone_allocator.cc:314] Internal: Failed to launchptxas
Relying on driver to perform ptx compilation.
Modify $PATH to customize ptxas location.
也是环境变量问题找不到组件, 这个解决方案和上一步一样2:
conda install -c nvidia cuda-nvcc
它安装了 nvcc.exe
之外, 还会安装 ptxas.exe
, 他们的路径在这里: miniconda安装文件夹\envs\tf2\bin
.
上述操作之后, 一切正常工作.
如果一开始只为了装 Tensorflow-gpu=2.3.0 可能会少一些报错, 我在 Linux 下只进行了第 1 步就OK了; 因为额外装 CUDA 似乎也有奇怪的报错, 所以总体来说还是利用 conda 安装比较方便, 还能安装不同的 CUDA 版本. 此外, 可以再代码中加入
import os
os.environ["TF_CPP_MIN_LOG_LEVEL"] = '2' # Errors ONLY
https://stackoverflow.com/questions/56860180/tensorflow-cuda-cupti-error-cupti-could-not-be-loaded-or-symbol-could-not-be ↩︎
https://github.com/google/jax/discussions/6843#discussioncomment-2721688 ↩︎