Vitis AI DPU代码分析

本文转载自: 硬码农二毛哥微信公众号

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 APIs
  • VART(Vitis AI Runtime),high-level

  • Advanced APIs
  • advanced low-level APIs源于DNNDK(Deep Neural Network Development Kit )

    Programming Model

    理解DPU programming model,需要先明白DPU Kernel,DPU Task,DPU Node和DPU Tensor。

  • DPU Kernel
  • 通过Vitis AI compiler编译生成的ELF文件就是DPU Kernel,使用dpuLoadKernel() 导入DPU Kernel。

  • DPU Task
  • 通过dpuCreateTask() 为DPU Kerne创建任务。

  • DPU Node
  • 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
  • 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输出。

  • 判断path是否是有效的目录
  • 打开目录
  • 读取每一条目录
  • 判断文件类型是否为图片
  • 将图片名存入vector
  • 关闭目录
  • 对图片进行排序
  • LoadWords()

  • 打开指定路径文件words.txt
  • 读取文档中每行数据,将数据写入vector
  • 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个预测结果。

    最新文章

    最新文章