【亲测】Centos7系统非管理(root)权限编译NCNN

前言

由于使用的是集群,自己不具有管理员权限,所以以下所有的情况均在非管理员权限下进行安装,即该安装策略仅适用于普通用户构建自己的环境。

加更内容

这里必须强调,在进行下面的编译安装过程中,一定要使用同样版本的 GCC/G++编译环境,由于目前使用的是非管理员(root)用户情况下进行编译,这需要另外一些设置。不然会出现各种各样想不到的错误,尤其是在进行 NCNN编译安装过程中,会出现一些 “reference undefined to“的问题,这个会导致NCNN在编译或安装时候出错,导致编译安装不完全,这里记录下我这两天成功安装的过程,现上下NCNN成功编译的例子。

【亲测】Centos7系统非管理(root)权限编译NCNN_第1张图片
【亲测】Centos7系统非管理(root)权限编译NCNN_第2张图片

什么是NCNN

ncnn是一款非常高效易用的深度学习推理框架,支持各种神经网络模型,如pytorch、tensorflow、onnx等,以及多种硬件后端,如x86、arm、riscv、mips、vulkan等。按照其官网的说明:该框架是一个为手机端极致优化的高性能神经网络前向计算框架,从设计之初深刻考虑手机端的部属和使用。无第三方依赖,跨平台,手机端 cpu 的速度快于目前所有已知的开源框架。基于 ncnn,开发者能够将深度学习算法轻松移植到手机端高效执行,开发出人工智能 APP,将 AI 带到你的指尖。

如何编译安装NCNN

Liunx情况下编译安装文档 点击进入

首先明确由于NCNN为C++实现,所以在编译安装前,需要一些依赖,在官网推荐的编译安装文档中,这样写道:
【亲测】Centos7系统非管理(root)权限编译NCNN_第3张图片
明显在Linux系统中需要 g++ cmake protobuf opencv (macOS 需要glslang)
一般来讲,Liunx系统一般会内置 g++ 和 cmake,但是版本一般是比较低的版本,主要为了系统的稳定,所以在编译安装NCNN过程中,我们需要对其进行升级操作,以下所有环境的配置和安装均在普通用户环境中进行。

依赖环境配置和安装

1 g++环境

一般来讲,Centos 7 内置的 g++版本为4.8.5,这个版本一般比较旧,现在很多编译都需要在g++ 5.0及以上环境进行,这里给大家推荐我之前的一篇博文,在非root权限下进行 gcc g++的升级,点击进入,这里需要注意,如果您也是集群系统,在编译GCC或者 G++过程中,需要注意下面的细节,这时我踩过的坑,原则上可以装更高的版本现在貌似 G++发展到 9.xxx的版本了。
【亲测】Centos7系统非管理(root)权限编译NCNN_第4张图片

2 cmake

Centos7内置的Cmake版本一般为2.8.12,这个版本需要升级到 3.*版本,您可以访问 该链接 进行下载对应版本的Cmake,这里以我安装的 cmake 3.17.2为例,推荐大家直接根据系统,然后下载已经编译好的版本,这样子可以省去源码安装,直接配置即可。当然您也可以下载源码版本,自行进行编译安装。这里我简要介绍下两种不同方法的配置安装过程。然后再介绍一种非常简单的基于 yum install 的方法

【亲测】Centos7系统非管理(root)权限编译NCNN_第5张图片
【亲测】Centos7系统非管理(root)权限编译NCNN_第6张图片

2.1 Cmake 编译好的版本

即上面的 cmake-3.17.2-Linux-x86_64.tar.gz,这种是最简单的策略,只需要解压后,在用户的环境下进行配置即可使用,比较推荐这个方法。
2.1.1 您可以使用命令下载,也可以直接下载好,传到自己的服务器
如果您直接下载,下载命令:

wget https://cmake.org/files/v3.17/cmake-3.17.2-Linux-x86_64.tar.gz

2.1.2 解压,关键的执行文件在 bin 目录

tar xzvf cmake-3.17.2-Linux-x86_64.tar.gz

在这里插入图片描述
2.1.3 配置环境变量
这里我们需要知道,在Linux系统中环境变量有多种,
【亲测】Centos7系统非管理(root)权限编译NCNN_第7张图片
其中系统环境变量的设置(需要管理员权限)主要有下面的三种方式:

1 /etc/profile :用户登录时执行/etc/profile文件中设置系统的环境变量。但是,Linux不建议在/etc/profile文件中设置系统环境变量。
2 在/etc/profile.d目录中增加环境变量脚本文件,这是Linux推荐的方法,/etc/profile在每次启动时会执行/etc/profile.d下全部的脚本文件。/etc/profile.d比/etc/profile好维护,不想要什么变量直接删除/etc/profile.d下对应的 shell 脚本即可。/etc/profile.d目录下有很多脚本文件,例如:
在这里插入图片描述
/etc/profile.d目录中的oracle.sh是Oracle数据库的环境变量配置文件,
【亲测】Centos7系统非管理(root)权限编译NCNN_第8张图片
3 在/etc/bashrc文件中设置环境变量。该文件配置的环境变量将会影响全部用户使用的bash shell。但是,Linux也不建议在/etc/bashrc文件中设置系统环境变量。

由于我们没有系统管理员权限,所以需要进行用户环境设置,用户环境变量只对当前用户生效,设置用户环境变量也有多种方法。

在用户的主目录,有几个特别的文件,用ls是看不见的,用 ls .bash_* 可以看见。
【亲测】Centos7系统非管理(root)权限编译NCNN_第9张图片
1).bash_profile(推荐首选)
当用户登录时执行,每个用户都可以使用该文件来配置专属于自己的环境变量。
2).bashrc
当用户登录时以及每次打开新的Shell时该文件都将被读取,不推荐在里面配置用户专用的环境变量,因为每开一个Shell,该文件都会被读取一次,效率肯定受影响。
3).bash_logout
当每次退出系统(退出bash shell)时执行该文件。
4).bash_history
保存了当前用户使用过的历史命令。

综合上面的内容,可以看出 环境变量脚本文件的执行顺序

/etc/profile->/etc/profile.d->/etc/bashrc->用户的.bash_profile->用户的.bashrc

这里我们选用对系统影响最低的 环境变量配置方式 :用户的.bashrc,这样比较保险,也比较稳妥。

vi ~/.bashrc

添加下面的内容
这里需要注意 : 这个符号在 Liunx 系统中为 中文分号或者 append的意思,指的是将我们的 cmake/bin文件夹路径添加至系统路径 $PATH 中,我这里将 : $PATH 置后,即将cmke/bin路径加到了原来的系统PATH之前,即优先加载,您也可以像第二种方式那样书写,在原PATH后加上 cmake/bin路径。

export PATH=/home/y192353/butterfly/extension/cmake_3_17_2/bin:$PATHexport PATH=$PATH:/home/y192353/butterfly/extension/cmake_3_17_2/bin

以上配置好后,直接运行环境变量生效命令

source ~/.bashrc

然后查看 cmake 是否配置成功

cmake --version

在这里插入图片描述
即安装成功!

2.2 Cmake 源码编译

这需要您下载Cmake的源码,下面箭头指代的地方
【亲测】Centos7系统非管理(root)权限编译NCNN_第10张图片
下载解压后,文件夹如下,包含各种源码文件
【亲测】Centos7系统非管理(root)权限编译NCNN_第11张图片
编译运行命令:
如果您尚未解压,先进行解压

tar -zxvf cmake-3.17.2.tar.gz

然后进行逐步编译

#在解压后的cmake-3.17.2文件夹下 创建 build 文件夹
mkdir build
cd build
#这一步很关键,即确定安装路径, 安装至用户对应的文件夹,不然会报权限异常,因为一般默认安装在 (/usr/local/..中)
#这是通过 配置文件进行指定安装目录的
../configure --prefix=/yourPath/cmake-3.17.2
#开启编译安装 这个需要等待一会儿
gmake && gmake install

上述编译安装完成后,即可以进行路径配置了,具体和上面 【2.1.3 配置环境变量】小节一样,不再赘述,只不过这个时候,您的路径需要是上面 --prefix 指定的路径。

2.3 Yum install 直接安装 cmake3(该方法需要后续如果有cmake的操作,要调用 cmake3 才可以)

不想按照上面的方法一步步配置,您可以直接使用下面的命令

yum install cmake3

直接进行安装,然后编译过程中使用 cmake3 进行就行了

3 OpenCv编译安装

先检测自己的系统内是否已经安装过了 OpenCv

pkg-config --modversion opencv

如果已经安装了opencv,会有打印输出,如果没有安装,则需要安装了。

3.1 OpenCv的安装(这里以Opencv3.4.16为例,当然OpenCv4.*也类似),这里建议大家使用 OpenCv4,根据官网的说明OpenCv3会逐渐停止更新,然后推出 OpenCv5 ,注意我们这里的 OpenCv3.4.16这个版本需要GCC/G++5.0以上的版本,这个需要您设置好。

OpenCv的编译源码可以在 点击这里 找到
【亲测】Centos7系统非管理(root)权限编译NCNN_第12张图片
下载源码后,使用命令解压
在这里插入图片描述

unzip opencv-3.4.16.zip

解压后的文件夹
【亲测】Centos7系统非管理(root)权限编译NCNN_第13张图片
编译安装

cd opencv-3.14.6
#创建编译文件夹
mkdir build
cd build
#在编译和安装过程中,从这步开始,最好放在 计算节点(GPU)节点进行编译安装
#使用cmake 进行编译 最后面的两个点也要加上,即默认的安装路径设置为 CMAKE_INSTALL_PREFIX=/YourPath/opencv_3_4_16
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/YourPath/opencv_3_4_16 -D WITH_TBB=ON -D WITH_V4L=ON -D BUILD_TIFF=ON -D BUILD_EXAMPLES=ON -D WITH_OPENGL=ON -D WITH_EIGEN=ON -D WITH_CUDA=ON -D WITH_CUBLAS=ON ..
#这里 可以使用 -j16 -j32 原则上都可以,旨在加速编译,需要较长时间
make -j8
#安装,安装的内容放在了 /YourPath/opencv_3_4_16
make install

cmake 步骤成功后
在这里插入图片描述

CMAKE_INSTALL_PREFIX=/YourPath/opencv_3_4_16用来控制安装的路径,否则会产生安装路径权限不够的问题
如果您安装的是 OpenCv4需要在 cmake 命令中再加入:

OPENCV_GENERATE_PKGCONFIG=ON
用来控制是否生成pkg_config文件。这里是opencv3不同的地方,opencv4中如果不加该命令将不会生成pkgconfig,安装完成后找不到opencv.pv文件一般都是因为没加这句控制命令导致的。

3.2 环境变量配置

打开 ~/.bashrc

 vi ~/.bashrc

添加内容

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/YourPath/opencv_3_4_16/lib64/pkgconfig
export PKG_CONFIG_PATH
export LD_LIBRARY_PATH=/YourPath/opencv_3_4_16/lib64/:$LD_LIBRARY_PATH

下面是我的环境变量配置文件,具体路径信息已经隐藏了,整体上就是这个样子
在这里插入图片描述
将环境变量生效

source ~/.bashrc

然后检查 opencv 的安装情况即可

pkg-config --modversion opencv

4 安装 protobuf

protobuf (Google Protocol Buffer)是一种平台无关、语言无关、可扩展且轻便高效的序列化数据结构的协议,可以用于网络通信和数据存储。由于我们最终转化的是模型,所以需要这样一个序列化工具。NCNN中需要使用到 protobuf 进行序列化。

protobuf 可进入 点击进入 下载,这里我选择的是 21.11-all 版本,貌似最新的版本中(第二张图),是对所对应的平台有源码 和 已编译版本,这个有点像 Cmake的安装过程,这里,我使用源码进行安装 21.11-all版本 ,
【亲测】Centos7系统非管理(root)权限编译NCNN_第14张图片

【亲测】Centos7系统非管理(root)权限编译NCNN_第15张图片

4.1 编译安装

1 解压

tar xzvf protobuf-all-21.11.tar.gz

【亲测】Centos7系统非管理(root)权限编译NCNN_第16张图片
2 编译安装

#切换到解压后的 protobuf 文件夹
#这个会自动生成一些文件
./autogen.sh
#配置后期的编译安装过程
./configure --prefix=/YourPath/protobuf_21_11
#编译和安装 
make -j8
make install

make -j* 命令后:
【亲测】Centos7系统非管理(root)权限编译NCNN_第17张图片
make install 之后
在这里插入图片描述

编译安装后在 /YourPath/protobuf_21_11 路径下,会看到
【亲测】Centos7系统非管理(root)权限编译NCNN_第18张图片

3 环境变量配置(还是在 ~/.bashrc 中),不要忘了 source 一下
即如图,将编译后的 bin 路径配置在 $PATH 路径中即可。
在这里插入图片描述
4 验证安装成功

protoc --version

在这里插入图片描述

5 编译安装 NCNN

点击 下载 官方源码,然后进行解压安装
【亲测】Centos7系统非管理(root)权限编译NCNN_第19张图片

也可以使用下面的命令进行一站下载编译,这里需要注意的是下载编译过程中由于需要访问github 则可能比较慢,当然git clone https://github.com/Tencent/ncnn.git 可以使用 git clone https://gitee.com/Tencent/ncnn.git 来代替,这样速度快点。但是 git submodule update --init 这个命令,则直接访问的 github 链接,需要您耐心等待了。

编译安装前的配置,这个一定要细心看!!!!

由于我们使用的非管理员权限,这个需要我们在 NCNN模块中 CMakeLists.txt 中的设置。这个很关键,不然会有编译问题。

  1. 项目文件夹下的 CMakeLists.txt
    【亲测】Centos7系统非管理(root)权限编译NCNN_第20张图片
    打开后:
    【亲测】Centos7系统非管理(root)权限编译NCNN_第21张图片
# protobuf path
list(APPEND CMAKE_SYSTEM_PREFIX_PATH "/yourpath_编译好的protobuf/protobuf_21_11/include;/yourpath_编译好的protobuf/protobuf_21_11/lib")
message(STATUS "==== CMAKE_SYSTEM_PREFIX_PATH: ${CMAKE_SYSTEM_PREFIX_PATH}")

以上这句话主要是为了和NCNN项目中 tools/onnx 下面的 CMakeLists.txt 的 Protobuf
在这里插入图片描述
在这里插入图片描述
【亲测】Centos7系统非管理(root)权限编译NCNN_第22张图片
2. 在环境变量中配置 OpenCV,注意我在 系统路径中 ~/.bashrc 新增了 opencv_3_4_16/lib64/ 然后才可以编译,这个主要是为了和 ncnn/examples/CMakeLIsts.txt 下面对应
在这里插入图片描述
【亲测】Centos7系统非管理(root)权限编译NCNN_第23张图片
下面才可以进行编译:

git clone https://github.com/Tencent/ncnn.git
cd ncnn
#这个是为了下载一些未下载的子包
git submodule update --init
#在文件夹中创建的新文件夹
mkdir build
cd build
#此步之后 , 推荐在 计算节点 含 GPU的节点操作
#注意 cmake 后面有两个点 即 使用 ../CMakeLists.txt 文件作为起始点在当前目录中生成
#这里需要注意,cmake 如果按照默认设置,会加载系统默认的 GCC/G++环境,即Centos7中默认的 4.8.5,这可能与上述其他包 protobuf opencv所使用的编译版本不同,这会导致在编译过程中出错。由于上述安装的 OpenCv版本支持 Gcc/G++ 5.0以上版本,所以这里需要让NCNN在与之对应的版本上进行编译,即gcc/g++ 5.0以上的版本
#我们使用 cmake -D CMAKE_C_COMPILER=/YourPath/gcc53/bin/gcc -D CMAKE_CXX_COMPILER=/YourPath/gcc53/bin/g++ ..
cmake .. (本步如果您 yum install cmake3,可以使用 cmake3 .. )
或下面的命令适用于特制定某个版本的 GCC/G++进行 camke ,直接影响后续的编译安装,具体原因看上面的注释
cmake -D CMAKE_C_COMPILER=/YourPath/gcc53/bin/gcc -D CMAKE_CXX_COMPILER=/YourPath/gcc53/bin/g++ ..
#也可以是 -j16 -j32等 加速编译
make -j8
make install

【亲测】Centos7系统非管理(root)权限编译NCNN_第24张图片
以上即全部过程,后续如果有问题,还会再次补充!

一些异常

如果编译过程中出现 ”undefined reference to std::__cxx11 const@GLIBCXX_3.4.21“ 或者 undefined reference' to google:
:caffe.pb.cc:(:protobuf::RepeatedPtrField.text<+0x47e3std::__cxx11)::basic_string, std:google:::protobuf:allocator: > >::GetRepeatedPtrField 类似这种异常,说明您的编译使用的gcc、g++版本出了问题,请仔细阅读上方的过程,让每个过程编译使用的 GCC/G++版本相同即可。这是我亲测过的,当然如果您直接是自己的计算节点,其实没必要这么复杂,直接按照我的这篇文章安装即可

你可能感兴趣的:(目标检测,计算机软件,Python,计算机视觉,人工智能,深度学习)