NVDLA简单来说就是英伟达公司开源的AI处理器框架。NVDLA处理器主要包括Convolution Core,SDP,CDP,PDP等几个部分,分别进行卷积,线性运算,池化运算等等。可以单个模块工作,也可以多个模块协同工作。比如说Convlotion卷积得到的结果可以作为SDP的输入进行relu计算。
为了让NVDLA的硬件可以更高效的配置,官方还开源了配套的软件工具链。
其中compiler就是本文要介绍的重点,笔者是研0进入实验室接触的编译器项目。苦于开发经验不足,在大型项目的开发和源码阅读调试上走了很多的弯路,本文主要记录了compiler源码阅读的一些心得和实践经验!
参考链接:基于Tengine的开源加速器工具链
扩展思路:
优势与问题:
如何使用docker请参考笔者的另一篇博客https://mp.csdn.net/mp_blog/creation/editor/121117430
你可以直接从官方提供的docker源下载docker镜像:
docker pull nvdla/vp
根据笔者实践在官方的docker容器中compiler可以正常运行,但是runtime会出现一些未知的错误,若要调试runtime程序请下载另外一个docker镜像具体操作步骤参考如下链接。
https://github.com/cahz/nvdla-vp-docker
第一步启动镜像:
docker run -it esatu/nvdla-vp
第二部从网络上获取测试文件运行nvdla compiler
cd /usr/local/nvdla-compiler/
wget https://www.esp.cs.columbia.edu/docs/thirdparty_acc/lenet_mnist.prototxt
wget https://www.esp.cs.columbia.edu/docs/thirdparty_acc/lenet_mnist.caffemodel
wget https://www.esp.cs.columbia.edu/docs/thirdparty_acc/lenet_mnist.json
wget https://github.com/nvdla/sw/raw/master/regression/images/digits/seven.pgm
./nvdla_compiler --prototxt lenet_mnist.prototxt --caffemodel lenet_mnist.caffemodel --profile fast-math --cprecision int8 --configtarget nv_small --calibtable lenet_mnist.json --quantizationMode per-filter --informat nchw
mv fast-math.nvdla seven.pgm /usr/local/vp/sw
这是运行nvdla compiler最简单的方法,如果你想在自己的主机或者是开发板上编译运行编译器请参考下面这种方法。
git clone https://github.com/LeiWang1999/ZYNQ-NVDLA
cd ~/ZYNQ-NVDLA/umd/external/protobuf-2.6/
apt-get install -y autoconf automake libtool
autoscan & aclocal & autoconf
automake --add-missing
./configure --prefix /usr/local #否则可能会找不到编译的libprotobuf.a
make -j `nproc`
make install
cp /usr/local/lib/libprotobuf.a ~/ZYNQ-NVDLA/umd/apps/compiler/
cd ~/ZYNQ-NVDLA/umd/
make -j `nproc` TOP=${PWD} TOOLCHAIN_PREFIX=/usr/bin/ compiler #PWD为项目所在路径
编译的可执行文件在目录的out文件夹下,直接运行可能会找不到动态库。可以定义库文件搜索路径。也可以将把libnvdla_compiler.so拷贝到nvdla_compiler的目录下即可。
export LD_LIBRARY_PATH=/$PWD$/umd/out/core/src/compiler/libnvdla_compiler/
./nvdla_compiler -h
出现如下命令,则编译器可以正常运行。
Usage: ./nvdla_compiler [-options] --prototxt <prototxt_file> --caffemodel <caffemodel_file>
where options include:
-h print this help message
-o <outputpath> outputs wisdom files in 'outputpath' directory
--profile <basic|default|performance|fast-math> computation profile (default: fast-math)
--cprecision <fp16|int8> compute precision (default: fp16)
--configtarget <opendla-full|opendla-large|opendla-small> target platform (default: nv_full)
--calibtable <int8 calib file> calibration table for INT8 networks (default: 0.00787)
--quantizationMode <per-kernel|per-filter> quantization mode for INT8 (default: per-kernel)
--batch batch size (default: 1)
--informat <ncxhwx|nchw|nhwc> input data format (default: nhwc)
在阅读一个陌生的代码的时候,在代码中的关键部位打断点,观察变量的输入和输出无疑是很好的一个办法。
因为nvdla代码是运行在linux环境下的,如果运行在嵌入式板卡上可能连图形界面都没有。所以我们要放弃对IDE的依赖打造一个轻量级的代码调试环境。很显然,GDB在某种特殊条件下唯一选择。本节将介绍如何配置GDB,让GDB拥有和IDE一样炫酷的效果。
参考开源配置:https://github.com/cyrus-and/gdb-dashboard
配置方法也很简单,只需要,将配置写入.gdbinit文件
wget -P ~ https://git.io/.gdbinit
gdb ./nvdla_compiler
set args --prototxt ~/lenet-mnist-caffe/lenet/lenet.prototxt --caffemodel ~/lenet-mnist-caffe/lenet/lenet.caffemodel --cprecision int8 --calibtable ~/lenet-mnist-caffe/lenet.int8.json --configtarget nv_small #根据个人参数修改
b 源代码文件名:行数
或者
b 函数名
tips:因为源代码在动态库里,需要先使用r命令运行一次加载动态库,然后gdb软件能识别动态库中的源文件。
vscode是一个集大成的IDE,你可以在其中配置任意功能。作为一个嵌入式开发者,我们的工作环境一般是在linux上完成的。下面我将介绍一下在linux下配置vscode的方法。
x86架构linux版本:
链接:https://pan.baidu.com/s/1c2b3QG2yUSywUZj8GOjaTA
提取码:1999
dpkg -i 安装包路径
因为篇幅有限,源码分析就不在这篇文章阐述了。基于上述方法,相信你已经掌握了compiler的调试技巧,或者说是任意大型项目的调试方法。源码解析和fpga验证方法将在不久后更新,记得关注博主噢!