/* ====== Getting Started with Vitis AI (Under Construction) ====== == Under Construction == Sources used in this guide are not currently public. == For now it only covers legacy DNNDK examples as the full Vitis AI library requires deploying the DPU as a Vitis acceleration kernel and is only compatible with Zynq UltraScale == ===== Introduction ===== Vitis AI is Xilinx's development stack for implementing accelerated AI inference on their hardware platforms such as the Zynq 7000 and Zynq UltraScale. It consists of the DPU IP core, a software library for developing applications, software tools for training, quantization and deployment of AI models and a large set of prebuilt AI models and example projects. This guide walks through the process of installing the development stack, building and deploying an accelerated application on a Digilent board. ---- ===== Prerequisites ===== * Ubuntu 18.04 LTS or another Linux distribution supported by Petalinux 2020.1 * Petalinux 2020.1 * Docker (Installation steps are located here: https://docs.docker.com/engine/install/) * 50+ GB of free hard drive space. ---- ===== Guide ===== ==== Downloading the support project and building the Petalinux SDK === //In order to build the DNNDK library and the applications, the Petalinux SDK is required to be built and installed.// Clone the umbrella git repository for your chosen board and checkout the branch for the AI support project: git clone https://github.com/Digilent/Zybo-Z7.git cd Zybo-Z7 git checkout 20/AI/master **NOTE**: The given commands are for the Zybo Z7-20 AI project without Pcam 5C support. ---- Source the Petalinux Tools and build the SDK source /settings.sh cd os petalinux-build --sdk ---- Navigate to the images/linux folder and install the SDK cd images/linux ./sdk.sh -d ---- ==== Downloading Vitis-AI and building the DNNDK library === Clone the Vitis-AI repository and checkout version 1.2.1 git clone https://github.com/Xilinx/Vitis-AI.git cd Vitis-AI git checkout v1.2.1 ---- //In order to configure the library to use the Linux driver instead of the XRT runtime, changes are required to be made to the Makefile.cfg and build the library// Navigate to the DNNDK source folder and open Makefile.cfg in a text editor. cd mpsoc/vitis_ai_dnndk_src/ gedit Makefile.cfg Comment out line 11 by placing # at the begining of the line and uncomment line 12 by removing it, the file should look like the image and save the file. {{:reference:programmable-logic:guides:vitis-ai_makefilecfg.png?400|}} ---- Now enable the Petalinux SDK built earlier and build the library source /environment-setup-cortexa9t2hf-neon-xilinx-linux-gnueabi OR source /environment-setup-aarch64-xilinx-linux make make python # build the python support files make package You should have a new file called vitis-ai_v1.2_dnndk.tar.gz ---- ==== Preparing the AI model for building the application === Download Xilinx's AI Model Zoo cd /AI-Model-Zoo/ sh get_model.sh You should have a new folder called models ---- Build the Docker container for Vitis AI cd /docker ./docker_build_cpu.sh -OR- ./docker_build_gpu.sh #if you have NVIDIA CUDA support ---- //Before entering the Docker container there are 2 files needed to be placed inside the Vitis-AI repository as there will be no easy access to files outside the container// One of them is a .hwh, usually called system.hwh, which contains information about the DPU and can be found in : * In the AI board project repository * In the Vivado project : /.srcs/sources_1/bd//hw_handoff/.hwh If the DPU IP settings have been modified then it is required to get the file from the Vivado project as it will invalidate the one in the repository. The other one is called arch.json and will be created with the following content { "target" : "DPUCZDX8G", "dcf" : "./dpu-08-07-2020-10-30.dcf", "cpu_arch" : "arm32" } Replace arm32 with arm64 if you're using Zynq Ultrascale ---- Activate the docker container using the command: /docker_run.sh xilinx/vitis-ai-cpu:latest OR /docker_run.sh xilinx/vitis-ai-gpu:latest Accept the terms and conditions and you should be presented with a bash prompt from inside the container ---- Navigate to the model folder you need, in this case I need the model resnet50 for the demo with the same name, and copy the 2 files mentioned earlier: cd AI-Model-Zoo/models/all_models_1.2/caffe/cf_resnet50_imagenet_224_224_7.7G_1.2 cp /workspace/ ./ cp /workspace/arch.json ./ ---- Now we need to generate the DPU metadata and compile the model for the application. If the model is made in Tensorflow(the model folder starts with tf_): conda activate vitis-ai-tensorflow dlet -f #Open the arch.json file and make sure that the dcf parameter matches the newly created .dcf file vai_c_tensorflow -f quantized/deploy_model.pb -a ./arch.json -n -o output If the model is made in Caffe(the model folder starts with cf_): conda activate vitis-ai-caffe dlet -f #Open the arch.json file and make sure that the dcf parameter matches the newly created .dcf file vai_c_caffe -p quantized/Edge/deploy.prototxt -c quantized/Edge/deploy.caffemodel -a ./arch.json -n -o output If it successfully compiled there should be a new folder called output and the .elf file is the compiled model. Now exit from Vitis-AI environment with exit ---- ==== Building an DNNDK example === Now that the AI model is prepared to be added into an application, we need to install the DNNDK library inside the Petalinux SDK sysroot. Go to the DNNDK library sources, extract the created archive and run the installation script: cd /mpsoc/vitis_ai_dnndk_src/ tar -xvzf vitis-ai_v1.2_dnndk.tar.gz cd vitis-ai_v1.2_dnndk ./install.sh /sysroots/cortexa9t2hf-neon-xilinx-linux-gnueabi -OR- ./install.sh /sysroots/aarch64-xilinx-linux ---- To build the application there are two ways, using the command line or the Vitis development environment Reactivate the Petalinux SDK in case you've closed the terminal window and navigate to the DNNDK sample you want to compile source /environment-setup-cortexa9t2hf-neon-xilinx-linux-gnueabi OR source /environment-setup-aarch64-xilinx-linux cd /mpsoc/vitis_ai_dnndk_samples/ ---- --> C/C++ application # To compile the model we have to copy the compiled model and tweak the Makefile if you use a Zynq 7000 based board mkdir model cp /output/ ./model/ gedit Makefile If you need to modify the Makefile, change this line CFLAGS += -mcpu=cortex-a53 To: CFLAGS += -mcpu=cortex-a9 And save the changes ---- Now build the application: make You should have a new file called as your application ---- <-- --> Python application # To run Python based application you only need to copy the model and compile it as a shared library: cp /output/ ./ gcc -fPIC -shared your_model.elf -o libdpumodel.so <-- ---- ==== Deploying the DNNDK example === === Uploading the files to the board === 1. Plug in the Ethernet cable from a router into the board, and start the board. 2. Start the serial console using a terminal program like TeraTerm or Putty 3. Get the ip address using "ip addr" or ifconfig 4. Upload the vitis-ai_v1.2_dnndk.tar.gz to the board: scp /mpsoc/vitis_ai_dnndk_src/vitis-ai_v1.2_dnndk.tar.gz root@:~/ 5. Upload your application executable or the python script and the .so file using scp root@:~/ 6. Download the sample data provided by Xilinx [[https://www.xilinx.com/bin/public/openDownload?filename=vitis-ai_v1.2_dnndk_sample_img.tar.gz|vitis-ai_v1.2_dnndk_sample_img.tar.gz]] and upload the archive to the board 7. Connect to the board using ssh with X11 forwarding: ssh -X root@ ---- === Installing DNNDK and running the application === //The following steps are done on the board in an ssh session with X11 forwarding.// 1. Extract the DNNDK library and the sample data using tar -xvzf 2. Go to the DNNDK library folder and run the install script: cd vitis-ai_v1.2_dnndk ./install.sh 3. Create a new folder in the sample data and copy your application there mkdir ~/vitis-ai_v1.2_dnndk/test cp ~/vitis-ai_v1.2_dnndk/test 4. Load the dpu driver using modprobe dpu Then you run the application. The resnet50 demo should look like the image {{:reference:programmable-logic:guides:vitis-ai_resnet50.png?400|}} ---- ===== References ===== * https://github.com/Xilinx/Vitis-AI/blob/master/mpsoc/vitis_ai_dnndk_src/README.md (DNNDK Compilation) * https://github.com/Xilinx/Vitis-AI/blob/master/mpsoc/README.md (Compilation flow for DNNDK Examples for zcu102,104) * https://www.xilinx.com/html_docs/vitis_ai/1_2/runningexamples.html#vdj1571812778281 (Information about all the DNNDK examples)* * https://www.xilinx.com/html_docs/vitis_ai/1_2/fsb1576131639266.html (VAI_C compiler usage)* * https://www.xilinx.com/html_docs/vitis_ai/1_2/knk1571811540439.html (Usage for DNNDK utilities such as DLet)* * https://github.com/Xilinx/Vitis-AI/tree/master/AI-Model-Zoo/README.md (Vitis AI Model Zoo folder structure) * https://www.xilinx.com/html_docs/vitis_ai/1_2/zkj1576857115470.html */