本文转载自: 硬码农二毛哥微信公众号
Vitis AI 设计流程
Vitis AI 和Vitis IDE需要下面三个基本步骤:
Vitis AI Runtime:使用C++或Python写应用程序
导入Vitis AI Library,运行编译好的模型文件。
Runtime Overview
Vitis AI开发套件提供high-leve C++/Python APIs(VART)进行从云到边器件开发。对于边缘DPU,除了VART,还可以使用advanced low-level C++/Python APIs。
VART(Vitis AI Runtime),high-level
advanced low-level APIs源于DNNDK(Deep Neural Network Development Kit )
Programming Model
理解DPU programming model,需要先明白DPU Kernel,DPU Task,DPU Node和DPU Tensor。
通过Vitis AI compiler编译生成的ELF文件就是DPU Kernel,使用dpuLoadKernel() 导入DPU Kernel。
通过dpuCreateTask() 为DPU Kerne创建任务。
DPU Node是网络模型中的基本单元,包含三种类型,boundary input node, boundary output node, and internal node。
boundary input node:the first node in a kernel
boundary output node:the last node in a kernel
internal node:other nodes
通过VAI_C编译后,可获取Input node和output node名字。
DPU Tensor是用来存储信息的多维数据集合,Tensor弹性包含height, width, channel等。
通常图片存储格式CHW(ChannelHeightWidth )。
DPU存储输入输出Tensor格式HWC(HeightWidthChannel )。
VAI_C
Once the compilaton is successful, VAI_C will generate ELF object fles and kernel informaton for deployment
运行docker
./docker_un.sh xilinx/vitis-ai:1.2.82
activate TensorFlow tool conda environment
conda activate vitis-ai-tensorflow
运行dlet,从HWH中解析DPU配置参数
$ dlet -f ./system.hwh [DLet]Generate DPU DCF file dpu-06-18-2020-12-00.dcf successfully.
打开arch.json,确保dcf参数与生成DCF文件名一致
下载resnet-50
./download_model.sh
tf_resnetv1_50_imagenet_224_224_6.97G:
tf:Tensorflow
resnetv1_50:神经网络
imagenet:数据集
224_224:输入数据大小
6.97G:处理器计算能力
使用VAI_C编译网络模型
./custom_platform_compile.sh
DPU Nodes name
将生成的.elf文件拷贝到vitis工程中
deactivate TensorFlow tool conda environment
conda deactivate
退出docker
exit
Advanced APIs开发步骤
1. dpuOpen() 打开DPU
2. kernelResnet50 = dpuLoadKernel(KRENEL_RESNET50) 导入DPU kernel Resnet50
3. taskResnet50 = dpuCreateTask(kernelResnet50, 0) 创建任务
4. runResnet50(taskResnet50) 运行任务
5. dpuDestroyTask(taskResnet50) 销毁任务
6. dpuDestroyKernel(kernelResnet50) 销毁DPU kernel,释放资源
7. dpuClose() 关闭DPU
第4步runResnet50为自定义函数,函数中调用API dpuRunTask() 运行DPU任务。
runResnet50
ListImages()
该函数输入为待预测图片路径path,将path路径内图片文件名存储到vector输出。
LoadWords()
dpuGetOutputTensorAddress():获取输出Tensor地址
dpuGetOutputTensorSize():获取输出Tensor size(Byte)
dpuGetOutputTensorChannel():获取输出Tensor channel,分类的种类
dpuGetOutputTensorScale():获取输出Tensor scale value
dpuSetInputImage2():将图片送到DPU,caffe 模块使用
dpuRunTask():运行DPU任务
dpuGetTaskProfile():获取DPU任务执行时间
dpuRunSoftmax():输入包括进入softmax数据地址、分类种类、scale,输出分类结果。
TopK():
输入d为softmax的结果,输出顺序与标签顺序一致。size为分类的种类,k指定输出分类结果个数,vkinds为标签数据。该函数显示概率最高的前k个预测结果。