通过qemu-riscv64实现Tengine

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

请参考:嵌入式AI框架Tengine在树莓派安装指南

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

2.5 结果

通过qemu-riscv64实现Tengine

参考文章

1.Tengine 支持 RISC-V 模型部署-C910
2.Tengine快速上手指南(中文版)
3.嵌入式AI框架Tengine在树莓派安装指南

上一篇:最新版本Tengine编译安装【v2.3.3】


下一篇:Tengine AIFramework框架