2021 年最新版 Ubuntu 20.04 配置 Caffe 深度学习环境

前言

本文写于 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)

此时网页显示如下图所示:

2021 年最新版 Ubuntu 20.04 配置 Caffe 深度学习环境

我们按照网页上的指示,在终端里键入下述命令,下载 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博客

上一篇:海思AI芯片(HI35xx):tensorflow转caffemodel之两种框架下模型中变量名与层名之间的对应关系(映射关系)


下一篇:Logtail从入门到精通(一):日志采集杂谈