ARM64+ubuntu18.04深度学习环境安装小结

版权声明:本文为博主原创文章,转载请标明原始博文地址。 https://blog.csdn.net/yuanlulu/article/details/81607252

概述

本人断断续续花费了两周时间,在某国产ARM64+linux环境的服务器上,使用docker容器安装成功了公司深度学习项目所需的环境。中间过程坎坷,在此结文以记,希望能对他人有所帮助,少踩坑。

目前成功搭建的环境如下:aarch64 docker容器,ubuntu18.04, python2, opencv3.3, dlib19.15, tensorflow1.5, sklearn。

上述组件均是python绑定的版本。

环境描述

硬件环境为国产ARM64多核处理器,内存及磁盘均是x84服务器的水平,所以不像树莓派一样需要担心内存或磁盘。操作系统为类linux 64位,可以安装docker,所以我的环境安装均在docker容器内进行,没有在物理机上安装,也是怕来回安装搞坏host系统。

我需要的是python的运行环境,由于arm服务器不普及,所以网上很多安装c++版本的方法,并不适用我的环境,中间费了我很多时间。由于配置给力,编译时间上和x86服务器差别不大,最终使用cpu前向推理的时间,与x86的cpu在同一数量级,完全可以作为生产环境使用。

docker镜像

提前有人在物理机上安装好了docker环境,所以我没有涉及安装docker本身的过程,只是涉及选取docker镜像的问题。

由于ARM和x86指令集的差异,x86的docker镜像不能直接运行在ARM服务器上,部门之前用于生产的x86 docker镜像没法使用。我自己不是docker专家,没有从0搭建docker镜像的经验,所以从网上下载现成的基础镜像。

在命令行上搜索arm64镜像的方法为:

docker search arm64

也可以把arm64换成其他字符,搜索想要的镜像。可以从搜索结果中看到已经有很多ARM64的docker镜像可选了,完全可以选择下来然后再安装自己的东西。

命令行显示的结果比较少,也可以到这个网站上去搜索:https://hub.docker.com/

搜索结果和命令行基本一致,但是可以翻页,可以用空格隔开多个关键字搜索,还看到每个镜像更详细的信息,比如tag等信息。

我最终选择的版本是arm64v8/ubuntu:18.04。拉取的方法如下:

docker pull arm64v8/ubuntu:18.04

然后用docker images就可以看到拉到本地的镜像啦。刚拉下来的镜像大小只有几百兆,可以run起来以后在里面安装自己的环境了,剩下的就是在ubuntu下的操作。

我刚开始用的并不是ubuntu18.04,还试过debian和ubuntu16.04, 但是有环境不兼容等各种坑,全部组件安装成功的就是18.04版本。

使用国内软件源

ubuntu系统下安装软件需要配置好软件源。由于众所周知的原因,国内访问一些境外网站往往连接失败或者速度很慢,所以需要配置国内的镜像源地址。国内中科大和清华的软件源镜像都很快。我使用的是中科大的。

更换源的方式是编辑/etc/apt/sources.list,把里面的url地址替换为:http://mirrors.ustc.edu.cn/ubuntu-ports/

然后更新本地软件目录:

apt-get update

各个组件的安装过程

本节内容记录最终走通的方法和对应版本,中间无数次失败的经验按下不表。

使用apt-get 安装python、python-dev、python-pip都是小菜一碟,不费口舌了。我选择的python2.7,其它版本应该与之类似。

dlib

dlib是从源码编译安装的,在ubuntu16.04和debian上总有问题,最终在ubunut18.04上成功。

准备工作:

apt-get update
apt-get install python
apt-get install python-pip
apt-get install pkg-config
apt-get install libopenblas-dev liblapack-dev
apt-get install cmake
apt-get install libboost-all-dev

在dlib19.15源码目录下,执行python setup.py install

打开python2, import dlib成功

opencv

opencv选择的是3.3版本。从源码编译安装。
编译技巧是,把’源码目录/modules’下的dnn、highgui和videoio删掉。这几个模块总是会找不到头文件和一些链接符号。videoio负责读取视频,删掉后无法从视频抽帧,刚好项目上用不到,所以对我没影响。

编译过程可参考这里:https://www.pyimagesearch.com/2018/05/28/ubuntu-18-04-how-to-install-opencv/

当然,完全照搬别人的方法可能会失败。要灵活变通。
我看了好几个方法,把相关软件包都安装上了。我安装软件包的命令包括下面这些:

pip install pkg-config
apt-get install libsm6
apt-get install libxrender1
apt-get install libxext-dev

apt-get install build-essential
apt-get install python-dev
apt-get install libgtk2.0-dev
apt-get install libx11-dev
apt-get install libavcodec-dev libavformat-dev libswscale-dev
apt-get install libtbb2 libtbb-dev
apt-get install libjpeg-dev libpng-dev
apt-get install libtiff-dev
apt-get install libdc1394-22-dev

apt install gphoto2 libgphoto2*
apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good

apt-get install libv4l-dev
apt-get install libxvidcore-dev libx264-dev
apt-get install libgtk-3-dev
apt-get install libatlas-base-dev gfortran
apt-get install libxvidcore-dev libx264-dev

pip install -i  http://mirrors.aliyun.com/pypi/simple/ numpy --trusted-host  mirrors.aliyun.com

上面是准备工作,下面才是正式开始编译:

mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local  -D INSTALL_C_EXAMPLES=OFF  -D INSTALL_PYTHON_EXAMPLES=ON   -D BUILD_EXAMPLES=ON  -D PYTHON_EXECUTABLE=/usr/bin/python  -D PYTHON_NUMPY_INCLUDE_DIRS=/usr/local/lib/python2.7/dist-packages/numpy/core/include/  ..

(去掉videoio和dnn、highgui)
make -j8
make install

启动python, import cv2 成功。

当然,如果需要完整版本的python-opencv又不想自己折腾,可以去https://hub.docker.com/搜索arm64版本的python-opencv镜像,那里有一个别人构建好的完整的版本。

tensorflow

github上已经有人把arm64版本的tensorflow编译好了,下载地址在:https://github.com/lhelontra/tensorflow-on-arm/releases 。除了arm64,那里还有其它arm版本的安装包。

在ubuntu18.04上,1.3版本的有些问题,最终使用1.5版本的运行模型成功。

下载完whl文件后,安装命令是:

pip install -i  http://mirrors.aliyun.com/pypi/simple/  tensorflow-1.5.0-cp27-none-linux_aarch64.whl --trusted-host  mirrors.aliyun.com

这里之所以把阿里的python源url加进去,是因为安装过程还需要下载一些依赖包,从国外下载太慢。

其它

为了加速下载,pip安装时我一般手动指定阿里的python源:

pip install -i  http://mirrors.aliyun.com/pypi/simple/  软件包名 --trusted-host  mirrors.aliyun.com

像sklearn等其它python组件就可以这么安装。如果下载的python包包含二进制文件不适合arm架构,pip会自动失败。能成功pip安装的运行起来就没问题。

那些年,那些坑

这一小节记录一下自己采坑的过程。

tensorflow的坑

  • 成功结果:ubuntu18.04 + tf1.5
  • 失败的尝试:ubuntu18.04 + tf1.3, ubuntu16.04 + tf1.5/1.7

我试着编译tensorflow,结果半途而费,没走下去。最终还是选择从:https://github.com/lhelontra/tensorflow-on-arm/releases 下载预先构建好的安装包。

刚开始在ubuntu16.04上安装,tf1.7和tf1.5都依赖于比较新的c++标准库,现象就是在安装时没有报错,import的时候找不到依赖的库版本。

可是在16.04上死活升不上去,后来换成tf1.3才终于不再报错。

坑爹的是在ubuntu16.04上dlib总是出错,不得已换成ubuntu18.04。这会dlib不出错了,import tensorflow的时候也没错误,但是运行程序时出错了,错误为:

2018-08-09 11:57:54,234 [ERROR] [MainThread] [tf_model_pkg2.py:180] tfSession_exception:No OpKernel was registered to support Op 'Switch' with these attrs.  Registered devices: [CPU], Registered kernels:
  device='GPU'; T in [DT_STRING]
  device='GPU'; T in [DT_BOOL]
  device='GPU'; T in [DT_INT32]
  device='GPU'; T in [DT_FLOAT]
  device='CPU'; T in [DT_FLOAT]
  device='CPU'; T in [DT_INT32]

     [[Node: Bottleneck/BatchNorm/cond/Switch = Switch[T=DT_BOOL](phase_train, phase_train)]]

国外某个论坛上有类似的问题,需要改源码重新编译,由于重新编译也很曲折,我在ubuntu18.04上卸载tf1.3, 重装了tf1.5,才终于解决了问题。

delib的坑

  • 成功的结果:ubuntu18.04 + dlib19.15
  • 失败的尝试:ubuntu16.04 + dlib19.15

一开始在ubuntu16.04上使用pip安装dlib,安装可以成功,但是import的时候会报错:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: /usr/local/lib/python2.7/dist-packages/dlib.so: undefined symbol: cblas_ddot

找不到符号,我以为代码编译就好了,结果还是同样的问题。怀疑过dlib版本是不是太新了,也怀疑过python版本,一一尝试都照样失败。

后来试着分析报错信息,在网上找到一个类似的:https://github.com/davisking/dlib/issues/154

我注意到人家运行以下命令是有输出的:

pkg-config --libs cblas

在我的系统上就报错找不到cbals.pc。结合cmake时生成的信息:

-- Searching for BLAS and LAPACK
-- Searching for BLAS and LAPACK
-- Found PkgConfig: /usr/local/bin/pkg-config
-- Checking for module 'cblas'
--   Found cblas, version
-- Checking for module 'lapack'
--   Found lapack, version
-- Found BLAS and LAPACK via pkg-config
.......
-- Looking for cblas_ddot
-- Looking for cblas_ddot - found
-- A library with BLAS API not found. Please specify library location.
-- LAPACK requires BLAS
To compile Boost.Python yourself download boost from boost.org and then go into the boost root folder
--  and run these commands:
--     ./bootstrap.sh --with-libraries=python
--     ./b2
--     sudo ./b2 install

结合上述信息,我推断pkg-config在我下载的那个ubuntu16.04上不能正常工作,无法为cmake脚本找到blas的依赖信息。个人对pkg-config机制也不熟,只能想办法绕过去。

因此,放弃ubuntu16.04,换为ubuntu18.04。果然,在ubuntu18.04上只要安装了openblas,就可以用‘pkg-config –libs cblas’得到相关信息。

最终,ubuntu18.04 + dlib19.15代码编译安装成功,import无错误,简单程序测试没有问题。我想在18.04上应该可以pip安装dlib,应该也不会出错,只是我后来没试。

opencv的坑

  • 成功的结果:opencv3.3去掉dnn、highgui和videoio以后编译安装成功
  • 失败的结果: opencv全代码安装

为了opencv,从操作系统版本、python版本、opencv版本各个组合都试了,都解决不了问题。

首先,pip能安装的opencv版本有python3.4的。但是为了使用找到的预编译的tenorflow,我只能选择python2.7或者python3.5。

opencv的问题首先变现在编译时找不到头文件:

fatal error: gst/gst.h: No such file 

其实这个头文件在系统下是有的,就是找不着。这个错误属于videoio模块。如果手动把头文件目录加到CPATH里面然后export,后面highgui也会报几个类似的错误。若都手动把头文件目录加到CPATH里编译通过,安装后import v2会报以下错误:

undefined symbol: _gst_fraction_type

暂时没有性子去分析opencv的cmake规则,就只能先删掉highgui和videoio模块编译,果然没有错误。dnn之所以被删掉,是因为cmake的时候会下载一个很大的caffe模型文件,耽误时间。

其实是可以找到一个python3.4的arm64 opencv安装包的,在这里https://pypi.org/project/opencv-python-aarch64/ 下载

对于ARM64生态的感受

对于Linux+ARM64这个组合来说,已经越来越接近x86了,虽然还有不少的距离。起码在ARM64+ubuntu之下,apt-get可安装的东西非常多,arm64的docker镜像也很多,github上越来越多的人提供arm 版本的pip安装包,对于开发者来说,ARM生态从未这么友好过。

当然差距也很明显,如果在x86上,上面的事估计半天就搞完了,不用把各个变量的版本换来换去,也不会遇到一个问题找不到几个帖子分析。

性能

ARM的CPU性能是个要考虑的问题,特别对于深度学习项目来说。简单测试,同样的代码和模型,在ARM服务器上单次调用时间是x86 cpu的2~3倍。还行吧。

本次环境安装的不足

第一次在ARM生态上安装这么多东西,没有充分挖掘各个软件在ARM上的编译优化选项,目前做的环境版本应该不是最完美的状态,相信还有很多可优化的空间。起码ARM的neon优化、opencl加速等课题我还没探索到,希望后面有机会摸索一下。

猜你喜欢

转载自blog.csdn.net/yuanlulu/article/details/81607252