最近开始学机器学习,折腾了下 Tensorflow 的安装方式,发现安装的时候还是有许多坑的,不同的方法也有许多优劣,在此做个笔记给大家分享一下。
首先,Tensorflow 官方提供了安装文档:https://www.tensorflow.org/install,不过里面只讲了 pip 安装和 Docker,本文会提到更多安装方法,可以看具体情况选择。
安装方式与对比
方法一:纯 pip 安装
简介
- 上手难度:低
- 维护难度:高
- 推荐程度:低
Tensorflow 官方提供的方法之一就是直接 pip 安装,但我非常不建议这样安装。把不同项目需要的软件包全堆到一个环境里面,这样有非常大的概率会产生各种冲突报错,非常难以维护。
安装步骤
1. 确保有 Python 和 pip 环境
(截至 2023/5/32) Tensorflow 支持:
- Python 3.6–3.9
- Ubuntu 16.04 或更高版本
- Windows 7 或更高版本
2. 使用 pip 安装 tensorflow 软件包
pip install tensorflow
3. 安装完成
方法二:virtualenv + pip 安装
简介
- 上手难度:中
- 维护难度:低
- 推荐程度:中
virtualenv 是一个比较经典的 Python 环境管理器,它通过创建虚拟环境,将每个环境隔离起来,防止软件包互相干扰。所以我们可以把它应用到 Tensorflow 的安装当中,将它的环境隔离开来。
但是它相对于 Conda 这个 Python 环境管理器来说,还是有许多局限:
- 不能切 Python 版本(只能用本机版本)
- 每次都要运行脚本启动环境
- 不能随便移动文件夹
- 管理功能欠缺
安装步骤
1. 确保有 Python 和 pip 环境
Python 3.6–3.9
2. 安装 virtualenv
pip install virtualenv
(由于 virtualenv 是一个工具,建议装到全局 Python 环境中)
3. 新建虚拟环境
在虚拟环境需要放置的目录打开 Terminal,执行:
virtualenv <虚拟环境名>
(一般虚拟环境名起名为 venv 就行)
4. 启用虚拟环境
根据不同平台的不同 Terminal,选择不同的指令执行:
- Windows 平台 CMD:
.\venv\Script\activate.bat
- Windows 平台 Powershell:
.\venv\Script\activate.ps1
- Windows 平台 Gitbash:
source ./venv/Script/activate
- Linux/macOS 平台 bash:
source ./venv/bin/activate
启用后,命令行前面会多出一个括号,括号内为环境名,如:(venv)
4. 在虚拟环境内使用 pip 安装 tensorflow 软件包
启用虚拟环境后,该环境的软件包就是与外界隔离的了,直接 pip:
pip install tensorflow
5. 退出虚拟环境
如果使用完毕需要退出的话,使用:
deactivate
方法三:Conda 安装
简介
- 上手难度:中
- 维护难度:低
- 推荐程度:高
Conda 是目前非常流行也非常强大的一个 Python 环境管理器,它的基本功能和上文的 virtualenv 一致,但是它有很多好用的额外特性。
安装步骤
1. 下载 Anaconda
前往 Anaconda 官网下载安装包:https://www.anaconda.com/download/
2. 安装 Anaconda
运行安装包,前面的设置都默认就行,最后一步需要注意,需要勾选将 Anaconda3 加入到 PATH 环境变量中(虽然上面注明了不建议,但是如果不加入环境变量,后续的使用会麻烦很多)
如果安装的时候忘记勾选环境变量,也可以手动添加以下五条:
3. 初始化 Conda
首先要初始化 conda,如果不初始化的话,虚拟环境启用了没反应:
conda init <shell>
shell 类型需要根据自己的运行的 shell 选择:[‘bash’, ‘cmd.exe’, ‘fish’, ‘powershell’, ‘tcsh’, ‘xonsh’, ‘zsh’]
4. 配置 Conda 下载源
由于 Conda 默认下载源在国外,如果不调整的话下载速度会非常缓慢(当然可以用魔法)
conda 配置文件储存在用户目录中:C:\Users\ChrisKim\<用户名>
,使用文本编辑器中打开,添加下载镜像,这里选用的是清华大学开源镜像站:
channels: - defaults show_channel_urls: true default_channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2 custom_channels: conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud pytorch-lts: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
5. 创建新环境
使用以下命令创建名为 tf 的 Python 版本 3.8 的新环境:
conda create -n tf python=3.8
6. 启用 tf 环境
conda activate tf
启用后,命令行前面会多出一个括号,括号内为环境名,如:(tf)
7. 安装 tensorflow
在 conda 内,我们一般不直接用 pip 安装软件包,而是使用 conda 来安装:
conda install -c anaconda tensorflow
8. 退出虚拟环境
如果使用完毕需要退出的话,使用:
conda deactivate
方法四:Docker 安装
简介
- 上手难度:高
- 维护难度:低
- 推荐程度:中
Tensorflow 官方推荐的第二个安装方法就是 Docker 容器了,使用 Docker 容器,你不需要配置任何东西,容器镜像已经配置好了。另外容器天然能够将环境隔离开来,因此也能防止软件包互相干扰。
不过容器作为一个新手接触较少的概念,并且涉及到很多指令操作,对于新手来说比较困难。各位视自己情况选择要不要用它。
本文的使用 docker 环境基于 Windows + WSL2 平台(会熟练用 Linux 的估计也不需要看这教程装 Docker)
安装步骤
1. 安装 WSL2 (Windows Subsystem for Linux 2)
另外,要使用 WSL2,需要满足 Windows 10 版本大于 2004 或 Windows 11.
安装 wsl 的方法可以参考微软官方文档:https://learn.microsoft.com/zh-cn/windows/wsl/install
2. 安装 Docker Desktop
安装 Docker Desktop 并使用 WSL2 作为后端可以参考微软官方文档:https://learn.microsoft.com/zh-cn/windows/wsl/tutorials/wsl-containers
其实最新版的 Docker Desktop 在装好 wsl2 后已经可以直接安装并识别到 wsl2 了,因此直接去下载安装包安装就行了:https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe
3. 拉取 tensorflow 镜像
tensorflow 官方镜像位于:tensorflow/tensorflow,有如下 tag 可以选择(来源)
标记 | 说明 |
---|---|
latest | TensorFlow CPU 二进制映像的最新版本。(默认版本) |
nightly | TensorFlow 映像的每夜版。(不稳定) |
version | 指定 TensorFlow 二进制映像的版本,例如:2.1.0 |
devel | TensorFlow master 开发环境的每夜版。包含 TensorFlow 源代码。 |
custom-op | 用于开发 TF 自定义操作的特殊实验性映像。详见此处。 |
每个基本标记都有会添加或更改功能的变体:
标记变体 | 说明 |
---|---|
tag-gpu | 支持 GPU 的指定标记版本。(详见下文) |
tag-jupyter | 针对 Jupyter 的指定标记版本(包含 TensorFlow 教程笔记本) |
对于我们来说,拉取 tensorflow/tensorflow:latest
就行了,如果需要支持 GPU 加速,可以拉取 tensorflow/tensorflow:latest-gpu
,如果还需要内置 jupyter 笔记本,可以拉取 tensorflow/tensorflow:latest-gpu-jupyter
.
具体的命令为:
docker pull tensorflow/tensorflow:latest
4. 创建新容器
如果是 CPU 版本,在 Terminal 中执行命令:
docker run -d -v tensorflow/tensorflow:latest --name tf
如果是 GPU 版本,需要给容器添加 GPU:
docker run --gpus all -d -v tensorflow/tensorflow-gpu:latest --name tf-gpu
如果有 jupyter,还需要映射笔记本目录和对应端口:
docker run --gpus all -d -v <宿主目录>:/tf/notebooks -p <宿主端口>:8888 tensorflow/tensorflow:latest-gpu-jupyter --name tf-gpu
宿主目录选取一个主机存储笔记本的地方,这样容器删除后数据不会丢失。
宿主端口选取一个空闲的端口,可以直接选择一样的 8888.
5. 进入容器
创建容器后,可以先使用 docker ps
查看一下容器列表,然后执行以下命令进入容器内的 shell:
docker exec -it <容器名/容器ID> bash
如果选择的镜像带有 jupyter,在宿主机浏览器访问 127.0.0.1:8888 即可进入笔记本(没错,WSL2 Docker 的端口是直接映射到宿主机的)
6. 容器操作
- 启动容器:
docker start <容器名/容器ID>
- 关闭容器:
docker stop <容器名/容器ID>
- 删除容器:
docker remove <容器名/容器ID>
GPU 支持
如果你的电脑有 Nvidia 显卡,那么可以通过 CUDA 加速 Tensorflow 的训练过程,我的 GTX1650 相比 i7-9750H 可以加速大概 5 倍,用显卡跑的话 CPU 也不会满载 100% 了,电脑也不会因为跑训练而卡顿。
不过要支持 GPU 加速的话,需要有额外配置,该部分主要讲的就是 GPU 的额外配置。
注:使用容器安装的话不需要这一步,官方镜像已经给你配置好了环境,但是你还是需要安装显卡驱动。
第一步:安装依赖驱动
根据 Tensorflow 官方文档:https://www.tensorflow.org/install/gpu,我们需要安装的依赖有:
- NVIDIA 显卡驱动
- NVIDIA CUDA 工具包
- NVIDIA cuDNN 库
- (可选) TensorRT
我们下面依次安装:
NVIDIA 显卡驱动
这个应该所有人都装过了,在此略去。不过附上官网下载页面:
https://www.nvidia.com/download/index.aspx
NVIDIA CUDA 工具包
首先进入官网下载页面:
https://developer.nvidia.com/cuda-downloads
根据自己的操作系统选择对应版本,对于 Windows,选择 exe(local) 下载安装包。
(如果使用的是 WSL2,需要在 Linux 栏目下找到 WSL-Ubuntu 版本)
下载后,执行安装器即可完成安装。
安装后,进入命令行输入以下编译器指令检查安装:
nvcc -V
如果有正确输出则成功安装,如:
nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2020 NVIDIA Corporation Built on Mon_Oct_12_20:54:10_Pacific_Daylight_Time_2020 Cuda compilation tools, release 11.1, V11.1.105 Build cuda_11.1.relgpu_drvr455TC455_06.29190527_0
如果有问题的话,可以去检查一下自己的环境变量是否有问题:
NVIDIA cuDNN 库
首先查看自己显卡的 CUDA 版本,在命令行中执行:nvidia-smi
在右上角即可找到版本号,例如:CUDA Version: 11.8
然后进入官网下载页面:
https://developer.nvidia.com/rdp/cudnn-archive
选择对应 CUDA 版本的 cuDNN 库,我选择的是最新的 v8.9.0. 展开列表后会有各个版本的,我们选择第一个 Windows 版本下载。
下载后得到一个 .zip 压缩包,将其解压得到以下文件结构:
cudnn-windows-x86_64-8.9.0.131_cuda11-archive ├─bin ├─include └─lib └─x64
然后我们找到 CUDA 工具包的目录:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\<版本号>\
,它的文件结构是:
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8 ├─bin ├─compute-sanitizer ├─extras ├─include ├─lib │ ├─Win32 │ └─x64 ├─libnvvp ├─nvml ├─nvvm ├─src └─tools
将 cuDNN 库根据文件结构一一对应地拷贝到 CUDA 工具包的目录里面即可。
这一步做完之后,记得重启一遍电脑。
第二步:安装 tensorflow
首先,对于现在使用的 Tensorflow 2,pip 的 tensorflow
软件包已经同时包含了 CPU 和 GPU 支持,不存在 Tensorflow 1.x 的 tensorflow-gpu
软件包了。因此,如果使用 pip 的话,直接安装 tensorflow
软件包。
但是这里面还是有坑,conda 的 tensorflow
软件包只包含了 CPU 版本的,而支持 GPU 版本的软件包为 tensorflow-gpu
,因此如果使用 conda 的话,需要安装 tensorflow-gpu
软件包。
所以,正确的安装方式如下:
- 对于使用纯 pip 或用 virtualenv + pip 的:
pip install tensorflow
- 对于使用 conda 的:启用虚拟环境后用
conda install tensorflow-gpu
安装
另外,tensorflow 2 支持的 Python 版本为 3.6~3.9,因此在创建 conda 环境时记得指定对应的版本。如果要使用最新的 tensorflow,就创建最新的 Python 版本:conda create -n tf python=3.9
第三步:测试 GPU 支持
使用 Python 运行以下代码检查 Tensorflow 是否正确识别到了 GPU:
from tensorflow.python.client import device_lib if __name__ == "__main__": print(device_lib.list_local_devices())
如果输出的列表中有一个 device_type 为 CPU,有一个 device_type 为 GPU,则同时识别到了 CPU 和 GPU。一个正确的输出如下:
[name: "/device:CPU:0" device_type: "CPU" memory_limit: 268435456 locality { } incarnation: 5106970275042967080 , name: "/device:GPU:0" device_type: "GPU" memory_limit: 9906946048 locality { bus_id: 1 links { } } incarnation: 6050521277282801748 physical_device_desc: "device: 0, name: NVIDIA GeForce RTX 4070, pci bus id: 0000:01:00.0, compute capability: 8.9" ]
可能出现的问题:AttributeError: module ‘numpy’ has no attribute ‘object’.
这个的原因是,自从 numpy 1.14 后,np.object 被废弃了,被改为了 object。而 tensorflow 还没有更新,导致与 numpy 的兼容问题。这个可以通过降级 numpy 解决:
conda install numpy==1.23.4
可能出现的问题:Could not locate zlibwapi.dll
有时候经过上面的检查没问题,但是训练的时候崩溃报错 Could not locate zlibwapi.dll,这个是因为没有装 zlib 库。
前往 zlib 官网下载对应的 dll 库:http://www.winimage.com/zLibDll/
选择 AMD64/Intel EM64T 版本的 zlib123dll.zip 下载,解压后找到 zlibwapi.dll 这个文件,放置到 CUDA 工具包的 bin 目录下即可。
(也可以解压后将整个文件夹目录添加到环境变量)
发表回复