引言
本篇主要想记录一下最近使用寒武纪卡的一些情况,主要是基于cnstream的搭建笔记,另外就是关于自己遇到的一些bug,以及相应的python解决方案。
宿主机环境准备
环境依赖
CNStream 有以下环境依赖。
• OpenCV 2.4.9+
• FFmpeg 2.83.44.2
• SDL 2.0.4+
• GFlags
• GLog
• Librdkafka
前两个的安装可以用依赖,同时也能源码安装,那么依赖的安装方式如下:
sudo apt-get install libopencv-dev libgflags-dev libgoogle-glog-dev cmake librdkafka-dev
sudo apt-get install libfreetype6 ttf-wqy-zenhei libsdl2-dev curl libcurl4-openssl-dev
"""或者直接使用git官方脚本,tools/pre_required_helper.sh"""
git clone https://github.com/Cambricon/CNStream.git
cd ${CNSTREAM_DIR}/tools && ./pre_required_helper.sh
如果是python环境的话,最好建议源码编译ffm和opencv,因为就跟python一样,大部分人安装python不会用全量编译,而是选择部分编译,即./configure --prefix=/usr/local --enable-shared
,不然安装一个py,可能一下午都编译不完。但源码编译的好处在于,可以根据自己需要,加入各种额外的函数,比如这里的opencv,就能重新利用ffmpeg的编译方式,加入一些新的编码器,而ffmpeg,在nvidia下也能加入nvcc,编译成GPU版本,寒武纪也出了ffmpeg-mlu,不过目前我还没有尝试。nvidia加速具体的可以看我之前写的流媒体专栏。而寒武纪的ffm加速,见如下链接:
https://github.com/Cambricon/ffmpeg-mlu
之后会考虑进行尝试,如果项目需要之后补充。
CNToolkit安装
CNStream的使用依赖于寒武纪CNToolkit安装包中CNRT库和CNCodec库。CNToolkit安装包是寒武纪公司发布的基于寒武纪硬件产品的神经网络开发工具包。发送邮件到 barret.bi@wpi-group.com,联系工程师获得CNToolkit安装包和安装指南。我是基于16.04的宿主机,也有一些相应的表:
名称 | 版本/文件 | 备注 |
---|---|---|
Linux OS | Ubuntu16.04/Ubuntu18.04/CentOS7 | 宿主机操作系统 |
Driver_MLU270 | neuware-mlu270-driver-aarch64-4.9.8.tar.gz | 依操作系统选择 |
CNToolkit_MLU270 | cntoolkit_1.7.5-1.ubuntu16.04_amd64.deb | 依操作系统选择 |
CNML_MLU270 | cnml_7.10.3-1.ubuntu16.04_amd64.deb | 依操作系统选择 |
CNPlugin_MLU270 | cnplugin_1.12.4-1.ubuntu16.04_amd64.deb | 依操作系统选择 |
CNNL_MLU270 | cnnl_1.3.0-1.ubuntu16.04_amd64.deb | 依操作系统选择 |
CNCL_MLU270 | cncl_0.8.0-1.ubuntu16.04_amd64.deb | 依操作系统选择 |
具体的可以看GitHub中,寒武纪官方主页。
docker环境准备
在确保宿主机上docker环境没有问题后,直接拉取GitHub仓库下的cnstream的源码:
git clone https://github.com/Cambricon/CNStream.git
这里还需要将CNToolkit拷贝进环境里,可以跟相关技术人员沟通,它们内部其实有已经预安装好cntoolkit的docker环境,那么就不需要cntoolkit了。如果确认docker内部没有安装cntoolkit的话,根据官方文档,还需要多走几步:
# 拷⻉寒武纪 CNToolkit 安装包到 CNStream 源码⽬录下
cp ${toolkit_package} CNStream
# 将寒武纪 CNToolkit 安装包安装到镜像中,其中 ${cntoolkit_package_name}为寒武纪 CNToolkit 安装包及其存放路径。
docker build -f Dockerfile.18.04 --build-arg toolkit_package=${cntoolkit_package_name}
,→ -t ubuntu1804_cnstream:v1 .
没有toolkit包的话,直接运行build命令:
docker build -f Dockerfile.18.04 -t ubuntu1804_cnstream:v1 .
然后看见docker images有了cnstream的镜像后,那么就可以启动了,这里我的启动命令是:
docker run -v /home/program/folder:/home/program/folder -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY -e GDK_SCALE -e GDK_DPI_SCALE --privileged --net=host --ipc=host --pid=host -dit --name hanwuji -v $PWD:/workspace submarineas/hanwuji:v1.0
因为我有自己做一版适合我环境的镜像,最后只要将images的名字把我的镜像名替换就行了。(PS:当时寒武纪的英文忘了,直接用拼音了,emmm,还别说,中文拼音进docker容器里的效率比较高。。)
另外,如果上面一句命令都不想敲,只需要拉下cnstream.git后,源码里同样准备好了脚本可供直接拉取与使用:
cnstream环境安装
上述两种环境安装,这里建议还是以docker进行,因为涉及国内芯片显卡了,那项目服务器基本两台以上,那镜像随导随用,关键犯下一次的bug,下一次就看不见了。之后就以docker镜像进行说明:
打包好的镜像,按照上述启动命令,没有问题,就可以进入环境编译cnstream,然后一般默认编译好的cnstream位于root根目录下,但官方编译的只是什么参数都不加的版本,所以我们需要删除相关文件,或者说重新另起个目录重新编,我是做了后者:
git clone https://github.com/Cambricon/CNStream.git
git submodule update --init
创建build目录保存输出结果并进行编译,这里有很多参数可供选择:
mkdir build && cd build
cmake ${CNSTREAM_DIR} -D{cmake option}={ON/OFF} ..
![](https://i-blog.csdnimg.cn/blog_migrate/106cded5297ce8ee356acce273796700.png)
这里因为需要的是基于python的动态库,我的编译命令为:
cmake -D build_python_api=ON -D PYTHON_EXECUTABLE=/usr/local/python3.6/bin/python3.6 ..
基本不会有太大问题,因为cnstream需要的依赖不多,不会出现跟opencv、caffe那些比较大或者比较老的依赖以及冲突等问题,过程如下:
上面如果不加build_python_api开关,就跟官方的编译方式一样不加任何参数,是直接cmake …的,而这种方式有什么问题,下面会罗列,另一个PYTHON_EXECUTABLE是希望找到python3的环境,如果不加,默认会去找python2,那py2和py3的字符集是不兼容的,之后的问题汇总也会展示问题。
上图是到了最后阶段,编译完成后,退出build目录,进入python目录,会存在一个setup.py文件,很早之前我有写过一篇python包的三大安装方式,其中一种就是基于setup.py的,链接如下:
然后我们需要安装python能用的cnstream包加载进pip里,就需要用python3的环境直接运行setup.py:
python3 setup.py install
这个过程会比较慢,因为可能又会重新编译一遍,大概要等半个多小时左右,直到看到如下提示,证明已经安装成功:
Processing cnstream-6.2.0-py3.6-linux-x86_64.egg
creating /usr/local/python3.6/lib/python3.6/site-packages/cnstream-6.2.0-py3.6-linux-x86_64.egg
Extracting cnstream-6.2.0-py3.6-linux-x86_64.egg to /usr/local/python3.6/lib/python3.6/site-packages
Removing cnstream 6.1.0 from easy-install.pth file
Adding cnstream 6.2.0 to easy-install.pth file
Installed /usr/local/python3.6/lib/python3.6/site-packages/cnstream-6.2.0-py3.6-linux-x86_64.egg
Processing dependencies for cnstream==6.2.0
Finished processing dependencies for cnstream==6.2.0
然后我们通过pip list就可以看见cnstream已经加载进来了:
至此,cnstream的python环境已经安装完成。下面是一些过程错误总结。
安装过程出现错误
subprocess.CalledProcessError: Command '['cmake', '--build', '.']' returned non-zero exit status 2.
上述错误出现在python3 setup.py install
的时候,一般直接会报make错误,因为这是基于源码安装,即编译途中报错:
最后会回调出编译命令,即使用的是cmake …,没有加python的参数。
ImportError: /usr/Local/python3.6/ lib/python3.6/site - packages /cnstream-6.2.0-py3.6-linux- x86 64.egg/ cnstream. cpython-36m x86_64- linux-gnu.so: undefined symbol: PyThread tss_ get
这个错误,是在import cnstream
包的时候,出现报错defined symbol,大概率是cmake时,PYTHON_EXECUTABLE环境给得有问题,跟上面问题一样,需要重新编译。
另外,如果还出现其它的大问题,会在这里补充说明。建议直接跟官方技术对接,拿到装好的cnstream的python镜像环境,那样会省去很多bug,此博客是为记录之前编译的一些问题,如果之后再遇到,会有所准备。
reference
Cambricon-CNStream-User-Guide-CN-v6.1.0.pdf