前言
本文写于 2021 年 7 月 15 日。若按本文的方法配置出现了错误,请留意是否距离写作时间过远。
请确保你的电脑显卡是 NVIDIA 显卡。本文不适用于 AMD 显卡和 Intel 集成显卡。
一、更新系统软件包
在终端中执行如下命令,将系统内核和基础组件升级至最新版本,否则后续编译会因为组件版本问题遇到不可预料的错误。
# 更新软件仓库缓存
sudo apt-get update
# 更新所有软件包至最新版本
sudo apt-get upgrade -y
# 更新的过程中可能会升级 Linux 内核,执行下述命令删除不再使用的旧内核
sudo apt-get autoremove --purge -y
# 重启
reboot
二、安装 NVIDIA 显卡驱动
这里使用 ubuntu-drivers 命令安装软件仓库里的 NVIDIA 驱动。这种方法不但简单,而且安装上的驱动也很稳定,不会导致系统崩溃。
# 自动安装推荐的驱动
sudo ubuntu-drivers autoinstall
# 重启
reboot
重启后,输入 nvidia-smi 命令,检查 NVIDIA 驱动和 CUDA 驱动是否被正确安装。如果有类似下面这样的输出,则说明安装成功。
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 460.84 Driver Version: 460.84 CUDA Version: 11.2 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 GeForce GT 720 Off | 00000000:01:00.0 N/A | N/A |
| 40% 41C P0 N/A / N/A | 146MiB / 974MiB | N/A Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
三、安装 CUDA 工具包
用浏览器打开 NVIDIA 开发者官网 NVIDIA 开发者 | NVIDIA Developer,点击网页最下方【常用 SDK】里的【CUDA 开发工具包/SDK】,进入 CUDA 专区。点击【立即下载】后,按下述顺序配置下载选项:
Operating System: Linux
Architecture: x86_64
Distribution: Ubuntu
Version: 20.04
Installer Type: runfile (local)
此时网页显示如下图所示:
我们按照网页上的指示,在终端里键入下述命令,下载 CUDA 工具包:
# 切换到用户目录
cd ~
# 下载 CUDA 工具包的安装程序
wget https://developer.download.nvidia.com/compute/cuda\
/11.4.0/local_installers/cuda_11.4.0_470.42.01_linux.run
# 运行安装程序
sudo sh cuda_11.4.0_470.42.01_linux.run
# 如果上述命令报错说 /tmp 目录空间不足
# 则需要在一个至少有 5GB 空间的分区里创建 CUDA 安装程序的临时目录
# 假设创建在自己的用户目录下 (~/cuda_temp)
rm -rf /tmp/*
mkdir cuda_temp
sudo sh cuda_11.4.0_470.42.01_linux.run --tmpdir=~/cuda_temp
进入安装程序以后,首先输入 accept 同意协议,然后进入选择要安装的组件的部分。这里安装程序默认会安装 CUDA 驱动,但因为 CUDA 驱动我们已经在第二步安装 NVIDIA 驱动时同步安装过了,所以不需要再安装一遍。
将光标定位到 CUDA Driver 处,然后按 Enter,取消其勾选,然后再将光标移动到最下方,输入 i 开始安装。
安装完毕后,根据安装程序的指示配置环境变量。
需要在 PATH 变量里追加 /usr/local/cuda-11.4/bin 目录。
需要在 LD_LIBRARY_PATH 变量里追加 /usr/local/cuda-11.4/lib64 目录。
# 用文本编辑器打开 /etc/profile 文件,用于编辑环境变量
# 我用的是 Ubuntu Kylin,20.04 版本里自带的文本编辑器已经变成 pluma 了
# 不知道原生的 Ubuntu 是不是这样的,如果不是,那就把下面的 pluma 换成 gedit
sudo pluma /etc/profile
# 在文件的末尾,新增如下三行,然后保存
export PATH=/usr/local/cuda-11.4/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-11.4/lib64\
${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
# 回到终端,重启计算机,使得环境变量配置生效
reboot
重启计算机后,我们来验证 CUDA 工具包是否安装成功。
# 切换到 CUDA Sample 目录
cd ~/NVIDIA_CUDA-11.4_Samples
# 将演示项目的源代码编译成可执行文件
make -j8
# 尝试运行演示项目
cd bin/x86_64/linux/release
./deviceQuery
如果终端里有类似如下的输出,说明 CUDA 工具包安装成功。
./deviceQuery Starting...
CUDA Device Query (Runtime API) version (CUDART static linking)
Detected 1 CUDA Capable device(s)
Device 0: "GeForce GT 720"
CUDA Driver Version / Runtime Version 11.2 / 11.4
CUDA Capability Major/Minor version number: 3.5
Total amount of global memory: 974 MBytes (1021575168 bytes)
(001) Multiprocessors, (192) CUDA Cores/MP: 192 CUDA Cores
GPU Max Clock rate: 797 MHz (0.80 GHz)
Memory Clock rate: 900 Mhz
Memory Bus Width: 64-bit
L2 Cache Size: 524288 bytes
Maximum Texture Dimension Size (x,y,z) 1D=(65536), 2D=(65536, 65536), 3D=(4096, 4096, 4096)
Maximum Layered 1D Texture Size, (num) layers 1D=(16384), 2048 layers
Maximum Layered 2D Texture Size, (num) layers 2D=(16384, 16384), 2048 layers
Total amount of constant memory: 65536 bytes
Total amount of shared memory per block: 49152 bytes
Total shared memory per multiprocessor: 49152 bytes
Total number of registers available per block: 65536
Warp size: 32
Maximum number of threads per multiprocessor: 2048
Maximum number of threads per block: 1024
Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
Max dimension size of a grid size (x,y,z): (2147483647, 65535, 65535)
Maximum memory pitch: 2147483647 bytes
Texture alignment: 512 bytes
Concurrent copy and kernel execution: Yes with 1 copy engine(s)
Run time limit on kernels: Yes
Integrated GPU sharing Host Memory: No
Support host page-locked memory mapping: Yes
Alignment requirement for Surfaces: Yes
Device has ECC support: Disabled
Device supports Unified Addressing (UVA): Yes
Device supports Managed Memory: Yes
Device supports Compute Preemption: No
Supports Cooperative Kernel Launch: No
Supports MultiDevice Co-op Kernel Launch: No
Device PCI Domain ID / Bus ID / location ID: 0 / 1 / 0
Compute Mode:
< Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 11.2, CUDA Runtime Version = 11.4, NumDevs = 1
Result = PASS
四、安装 Caffe 框架所必需的第三方库
根据 Caffe 官网 Caffe | Deep Learning Framework (berkeleyvision.org) 的指示,执行如下命令安装依赖:
# 常规依赖
sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev
sudo apt-get install libopencv-dev libboost-all-dev libhdf5-serial-dev
sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev
sudo apt-get install protobuf-compiler
# BLAS(线性代数库)依赖
sudo apt-get install libatlas-base-dev libopenblas-dev
# 注:以上依赖项可以写在一条命令里,不必分开写
# 这里分开写只是为了提高阅读体验
五、【非常重要】安装 OpenCV 3
上述依赖项里已经安装了 libopencv-dev,但是安装的是 OpenCV 4。Caffe 框架的 1.0 版本是 2017 年发布的,距离现在已有四年之久,在此期间也没有发布过任何新版本。1.0 版本有部分代码调用的是仅存在于 OpenCV 3 里的 API,无法适用于 OpenCV 4。强行使用 4 的话,在后续的编译过程中会报错,而且这样的错误不能简单通过修改 Makefile.config 配置文件来修正。所以这里我们需要下载 OpenCV 3 的源码,然后在 /usr/local 里再编译一份 OpenCV 3 的库。这个错误折腾了我好几天,重新编译低版本的 OpenCV 是我能想到的最后的解决方案了,没想到成功了。
我们现在根据 OpenCV 官网的教程指示 OpenCV: Installation in Linux 来配置 OpenCV。
# 安装 OpenCV 3.4.14 的依赖项
sudo apt-get install cmake libgtk2.0-dev pkg-config
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev
sudo apt-get install libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev
# 下载 OpenCV 3.4.14 的源码到临时目录里
cd /tmp
wget https://github.com/opencv/opencv/archive/3.4.14.zip
# 解压缩
unzip 3.4.14.zip
cd opencv-3.4.14
# 在临时目录里编译,这样下次启动时只会在
# /usr/local 里留下编译好的库和头文件,/tmp 里的源码则会被清除
# 注意第二条命令最后有两个点,是用于指示上层目录的,不能省略
mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
make -j8 && sudo make install
因为和 CUDA 一样是源码编译,不是从软件仓库直接安装的,所以同样的,编译完成后我们需要配置环境变量,动态库的搜索目录(LD_LIBRARY_PATH)需要加上刚安装的 OpenCV 3 的库存放目录。
# 用文本编辑器打开 /etc/profile 文件,用于编辑环境变量
# 我用的是 Ubuntu Kylin,20.04 版本里自带的文本编辑器已经变成 pluma 了
# 不知道原生的 Ubuntu 是不是这样的,如果不是,那就把下面的 pluma 换成 gedit
sudo pluma /etc/profile
# 修改 LD_LIBRARY_PATH 变量,加上 /usr/local/lib 目录
export LD_LIBRARY_PATH=/usr/local/lib:/usr/local/cuda-11.4/lib64\
${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
# 回到终端,重启计算机,使得环境变量配置生效
reboot
彩蛋:之前写的在 CentOS 7 上配置 Caffe 的文章里,没有说明要源码安装 OpenCV 3。这是因为 CentOS 7 的软件仓库里,opencv-devel 是 2.4.5 版本,并不是 4 系列。Caffe 框架同时兼容 2 系列和 3 系列的 OpenCV,不兼容 4 系列的。
六、安装 Caffe 框架
首先从 GitHub 下载 Caffe 稳定版的源码:
# 切换到用户目录
cd ~
# 从 GitHub 下载 Caffe 1.0 的源码
wget https://github.com/BVLC/caffe/archive/refs/tags/1.0.zip
# 解压缩
unzip 1.0.zip
此时你的用户目录下会多出一个叫 caffe-1.0 的目录。这就是我们的 Caffe 框架所在目录。
在安装 Caffe 框架之前,我们需要做一些配置。1.0 版本的框架是 2017 年发布的,距离现在已有四年,其所依赖的各种第三方库的代码架构也产生了较大的改变。原先的默认配置文件已无法正确编译并安装 Caffe 框架,我们需要对配置文件做较大的改动。
# 进入 Caffe 框架目录
cd caffe-1.0
# 重命名 example 后缀的配置文件
mv Makefile.config.example Makefile.config
# 打开配置文件进行编辑
# 如果提示没有找到命令 pluma,则将 pluma 改为 gedit
pluma Makefile.config
我们需要对配置文件做如下几处改动:
- OpenCV 版本使用 3,而不是默认的 2
# Uncomment if you're using OpenCV 3 OPENCV_VERSION := 3 #去掉这一行左边的 # 号
- CUDA 架构部分,只保留 3.5 以上的算力。CUDA 11.4 版本不再支持低于 3.5 的算力。保留低算力会导致编译时报出找不到低算力 API 的错误。
# 原始配置: # CUDA_ARCH := -gencode arch=compute_20,code=sm_20 \ # -gencode arch=compute_20,code=sm_21 \ # -gencode arch=compute_30,code=sm_30 \ # -gencode arch=compute_35,code=sm_35 \ # -gencode arch=compute_50,code=sm_50 \ # -gencode arch=compute_52,code=sm_52 \ # -gencode arch=compute_60,code=sm_60 \ # -gencode arch=compute_61,code=sm_61 \ # -gencode arch=compute_61,code=compute_61 # # 去掉前三行 20、21、30,变为下面的样子 CUDA_ARCH := -gencode arch=compute_35,code=sm_35 \ -gencode arch=compute_50,code=sm_50 \ -gencode arch=compute_52,code=sm_52 \ -gencode arch=compute_60,code=sm_60 \ -gencode arch=compute_61,code=sm_61 \ -gencode arch=compute_61,code=compute_61
-
线性代数库部分,默认使用的是是 ATLAS,我们需要将其改为 OpenBLAS。为什么要改,因为之前在 CentOS 7 里配的时候,保持 ATLAS 会报出找不到 -lcblas 和 -latlas 的错误。改成 OpenBLAS 以后编译通过了,所以我也懒得再尝试 Ubuntu 下强行用 ATLAS 库会发生什么了。有心的小伙伴也可以尝试下坚持用 ATLAS 会发生什么。
# BLAS := atlas # 找到上面这一行,将 atlas 改为 open BLAS := open
-
头文件目录和库目录要增加一些目录。主要是针对 hdf5 这项依赖。Ubuntu 20.04 里,用 apt-get 安装的 hdf5 依赖,头文件并不是放在 /usr/include 里,而是放在 /usr/include/hdf5/serial 里。库文件也挪了位置,不在 /usr/lib 里,而在 /usr/lib/x86_64-linux-gnu/hdf5/serial 里。这些子目录并不会被默认包含,我们需要明确指定。
# 找到下面三行 # # Whatever else you find you need goes here. # INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include # LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib # # 做如下修改: # INCLUDE_DIRS 在末尾添加 /usr/include/hdf5/serial 目录 # LIBRARY_DIRS 在末尾添加 /usr/lib/x86_64-linux-gnu 和 # /usr/lib/x86_64-linux-gnu/hdf5/serial 两个目录 INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib \ /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/hdf5/serial
完成以上配置后,我们保存该配置文件,然后在终端里完成如下一键三连,中途若无任何报错信息出现,则 Caffe 框架安装成功!
make all -j8 && make test -j8 && make runtest -j8
七、用 Caffe 训练 MNIST(手写体数字)训练集
请跳转至这里继续阅读:2021 年最新版 CentOS 7 配置 Caffe 深度学习环境_s.M.i.L.e-CSDN博客