1. 前言
最近做项目想要实现一下tengine,无奈手头没有板子,通过搜集资料,选择先通过qume模拟器查看一下在riscv64上实现的效果,本文主要参考虫叔的这篇文章:Tengine 支持 RISC-V 模型部署-C910。因为虫叔写的比较早,代码更新了一部分,所以我只是在原文基础上进行一些补充。
2. 实现过程
2.1 环境
2.1.1 工具下载
Ubuntu Linux16.04
csky-qemu-x86_64-Ubuntu-16.04-20210202-1445
riscv64-linux-x86_64-20210618
具体工具链下载和QEMU下载请参考虫叔的文章,写的很详细了。下载完成后要记得添加到环境变量,一定要添加,添加完成后可以通过:echo $PATH来查看临时变量是否添加成功,如果出现command not found的问题,一般是没添加成功的缘故。
2.1.2 安装所需工具
apt install cmake g++ git
- cmake 是编译工具,具体请参考:cmake学习
- g++是C++编译器
- git是版本管理工具,下载完成后请登录
git config --global user.name "your name"
git config --global user.email "your eamil"
安装依赖库
sudo apt-get install libprotobuf-dev protobuf-compiler libboost-all-dev libgoogle-glog-dev libopencv-dev libopenblas-dev
- protobuf 是一种轻便高效的数据存储格式,这是caffe各种配置文件所使用的数据格式
- boost 是一个c++的扩展程序库,稍后Tengine的编译依赖于该库
- google-glog 是一个google提供的日志系统的程序库
- opencv 是一个开源的计算机视觉库
- openblas 是一个开源的基础线性代数子程序库
2.1.3 需要重新安装protobuf 3.0.0
2.2 下载Tengine
git clone https://github.com/OAID/Tengine.git tengine-lite
这样子下载可能有些用户会出现:fatal: unable to access https://github.com/OAID/Tengine.git/: gnutls_handshake() failed: Error in the pull function.
临时解决方案:把https改成http就行,想永久解决,自行百度一下,我搜了还挺麻烦的。git clone http://github.com/OAID/Tengine.git tengine-lite
2.3 编译
别看这里就四行代码,问题可太多了:
$ cd tengine-lite
$ mkdir build-rv64 && cd build-rv64
$ cmake -DCMAKE_TOOLCHAIN_FILE=../toolchains/rv64-c906.toolchain.cmake ..
$ make -j4 & make install
- 工具链要使用:rv64-c906.toolchain.cmake
- install后,生成的.so文件在install/lib下,一些模型参考文件在install/bin下
- 如果cmake出现错误:
Building inplace are not allowed. You should create a separate directory for Building.
的话,则rm -rf CMakeCache.txt
然后重新执行cmake即可 - 还有些问题想不起来了
2.4 运行
这里我们参考 Tengine 中的 classification demo 进行功能演示,使用 squeezenet.tmfile。
文件下载:Tengine Model zoo(Password : hhgc),打开直接在“others\Tengine_tmfiles”下载squeezenet.tmfile,在“赏金任务模型\优化类任务”下载cat.jpg就行。
运行时需要指定 CSKY QEMU 中有多种 riscv 平台:
$ ls csky-qemu/bin/
cpf qemu-cskyv1eb qemu-keymap qemu-system-cskyv2
cpf64 qemu-cskyv2 qemu-nbd qemu-system-cskyv2eb
cskysim qemu-cskyv2eb qemu-pr-helper qemu-system-riscv32
elf2dmp qemu-edid qemu-riscv32 qemu-system-riscv64
ivshmem-client qemu-ga qemu-riscv64 virtfs-proxy-helper
ivshmem-server qemu-img qemu-system-cskyv1
qemu-cskyv1 qemu-io qemu-system-cskyv1eb
这里我们使用 qemu-riscv64,同时需显式指明程序运行所依赖的 riscv64 系统库路径:$ qemu-riscv64 -L riscv64/sysroot/ tm_classification -m squeezenet.tmfile -i cat.jpg
- 这里的riscv64/sysroot/在你下载的riscv64工具链里面,比如我的路径是:riscv64-linux-x86_64/sysroot/。
-
tm_classification: error while loading shared libraries: libtengine-lite.so: cannot open shared object file: No such file or directory
出现这种问题时需要:- 把 刚 下 载 下 来 的 项 目 内 cat.jpg 和 squeezent_caffe.tmfile 放 入
tengine-lite/build-rv64/install/bin - 然后将install/lib 中的libtengine-lite.so放入install/bin中
- 添加 Linux 环境变量:
export LD_LIBRARY_PATH=/tengine-lite/build-rv64/install/bin:$LD_LIBRARY_PATH sudo ldconfig
- cd 到 bin 目录下,运行代码
qemu-riscv64 -L ../../../../riscv64-linux-x86_64/sysroot/ tm_classification -m squeezenet.tmfile -i cat.jpg
- 把 刚 下 载 下 来 的 项 目 内 cat.jpg 和 squeezent_caffe.tmfile 放 入
2.5 结果
参考文章
1.Tengine 支持 RISC-V 模型部署-C910
2.Tengine快速上手指南(中文版)
3.嵌入式AI框架Tengine在树莓派安装指南