アプリとサービスのすすめ

アプリやIT系のサービスを中心に書いていきます。たまに副業やビジネス関係の情報なども気ままにつづります

自作DPUをultra96v2で動かすまでの備忘録【Vitis-AI, hardware】

FPGA上でディープラーニングを動かすとき背後でDPUというものが動いていて、DPUないとFPGA上でディープラーニングが動かせない。

今回はDPU IPコアから自作DPUを作って、ultra96v2上で動かすまでの備忘録をまとめた。




目次
1.DPUのデザインblockをvivadoで作成
2.Petalinuxでbuildしてimageを作成するまで
3.image.ubとBOOT.binのコピーで動作させる




1.DPUのデザインblockをvivadoで作成

作業環境


Mac OS

VirtualBox

ubuntu 14.02.03LTS

・Vivado、Vitis 2020.1






メモリの増設



VirtualBoxで作業してるので、DPUは死ぬほどメモリを食うので


プロセッサーでCPUを6枚

・メインメモリを11800くらいに変更

して計算リソースを増やした。

f:id:trafalbad:20200808225619p:plain

f:id:trafalbad:20200808225623p:plain


計算リソースが足りないとBitStream時に「強制終了エラー」が出る。





DPUのversion


xilinxgithubで公開してるDPU IP(DPU-TRDフォルダ)はブランチとマスターでDPUのversionが違うので注意。

・branch v1.0 =>target version 1.4.0(3.1)

・branch v1.1 => target version 1.4.1(3.2)

・master => target version 1.4.1 (3.3)


masterのDPU IPはv1.0とv1.1とかなり違うし、vivado2019.2だと使えない気がした。(2020.1なら使える)。




DPU IPからXSAファイルの作成



このサイトを参考に作成して、DPUはこの変わった変わったDPUドライバを使った。



まず DPU IPを IP catalogにadd。
f:id:trafalbad:20200829123421p:plain


設計するときは、パラメータに加えて、

・Clock wizardでdspはdpuの2倍の周波数がないとダメ
・各Processor system resetと各DPUピンはシンクロしないとタイミングエラーになる

などなど、制約が多いのでXilinxのDPUの英語の最新文献を読み込まないとできなかった。


f:id:trafalbad:20200808230806p:plain



無事BitStreamが完了したので、XSAファイルを生成。

最後に右のダッシュボードからパラメータsummaryを載っけてみる。



f:id:trafalbad:20200808225704p:plain

f:id:trafalbad:20200808225700p:plain


XSAファイルからUltra96で使われているハードウェア情報ファイル(hwh)の作成


ultra96v2のハードウェア情報ファイルhwhを作成。コンパイルのときdcfに変換して使うので作っとく。

xsaファイルはzipなのでunzip

$ unzip ultra96v2dpu.xsa

>>>>
design_1.hwh            psu_init.html   sysdef.xml        xsa.json
design_1_axi_smc_0.hwh  psu_init.tcl    ultra96v2.jpg     xsa.xml
psu_init.c              psu_init_gpl.c  ultra96v2dpu.bit
psu_init.h              psu_init_gpl.h  ultra96v2dpu.xsa

2.Petalinuxでbuildするまで



1.必要ファイルのdownloadと環境設定


Ultra96v2用のbspファイル
Ultra96-v2のサイトからdownload。これはPetalinuxでUltra96v2用のproject作成に必要。

# wget -P <path> <URL>
$ wget -P ultra96_oob_2019.2.bsp.zip http://downloads.element14.com/downloads/zedboard/ultra96-v2/ultra96v2_oob_2019_2.bsp.zip?ICID=ultra96v2-datasheet-widget
$ unzip ultra96_oob_2019.2.bsp.zip

一応ultra96v2のplartform用ファイルもdownload

$ wget -P ULTRA96V2_1029_2.tar.xz http://avnet.me/ultra96v2-vitis-2019.2
$ tar -xf ULTRA96V2_1029_2.tar.xz
$ export SDX_PLATFORM=/home/user/ULTRA96V2/ULTRA96V2.xpfm


・DNNDKとかのファイルに必要

$ git clone https://github.com/xelalin/Ultra96v2-DPU


2.前準備



petalinux2019.2のarduino-toolchain_1.0.bbの書き換え。


petalinux2019.2のarduino-toolchain_1.0.bbを10、 29、30行目のhacksterの記事を参考に書き換え。

$ sudo vi /opt/petalinux/components/yocto/source/aarch64/layers/meta-petalinux/recipes-utils/arduino-toolchain/arduino-toolchain_1.0.bb
>>>>>
# 10行目
http://http.us.debian.org/debian/pool/main/e/elfutils/libelf1_0.176-1.1_arm64.deb;subdir=avrgcc;unpack=false;name=libelf1 \
# 29, 30行目

SRC_URI[libelf1.md5sum] = "a9244703eec4735e54108001cee4c408" 
SRC_URI[libelf1.sha256sum] = "7c550a5eb057ec5c38f37e79eba476785e3a84097f7b740866db39012b99470f"



3.projectの作成



#!/bin/sh
$ petalinux-create -t project -s ultra96v2_oob_2019_2.bsp --name dpuprj
$ cd dpuprj
# DNNDK用のファイルをコピー
cp -rp ../Ultra96v2-DPU/files/recipes-apps/dnndk/ project-spec/meta-user/recipes-apps/
cp -rp ../Ultra96v2-DPU/files/recipes-modules/ project-spec/meta-user/
cp -rp ../Ultra96v2-DPU/files/recipes-apps/autostart/ project-spec/meta-user/recipes-apps/
cp -rp ../Ultra96v2-DPU/files/recipes-core/base-files/ project-spec/meta-user/recipes-core/
# project-spec/meta-user/conf/user-rootfsconfigに書き足す
echo 'CONFIG_dpu' >> project-spec/meta-user/conf/user-rootfsconfig
echo 'CONFIG_autostart' >> project-spec/meta-user/conf/user-rootfsconfig
echo 'CONFIG_dnndk' >> project-spec/meta-user/conf/user-rootfsconfig


・Projectの初期化
「XSA」ファルダにxsaファイルを入れておく。

$ petalinux-config --get-hw-description=../XSA

=> 「Image Packaging Configuration」>「RootFilesystem formats」に「ext4」を追加=> save&exit






4.rootfsの設定



$ cd dpuprj
$ petalinux-config -c rootfs


=> 以下の項目にチェックを入れてファイルシステムに含める

<Filesystem Packages>
libs=>libmali-xlnx
<Petalinux Package Groups>
-> matchbox
-> opencv
-> python-modules
-> v4lutils
-> x11
<apps>
-> autostart
<modules>
-> dpu
<user packages>
-> dnndk

チェックを入れたらsave&exit







5.カーネルの設定


$ petalinux-config -c kernel

=> 「Device Drivers」>「Generic Driver Options」>「Size in MegaBytes(DMA)で256を1024に変更



・デバイスツリーにDPUを追記
DPUのドライバーから回路を扱えるように回路側の情報を登録

$ sudo vi project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi
# 追記
&amba {
        dpu{
               compatible = "xilinx,dpu";
               base-addr = <0x8F000000>;
               dpucore {
                        compatible = "xilinx,dpucore";
                        interrupt-parent = <&gic>;
                        interrupts = <0x0 89 0x4>;
                        core-num = <0x1>;
               };
        };
};
	




6.ビルド(1時間くらいかかる)


$ petalinux-build


>>>>
[INFO] building project
[INFO] sourcing bitbake
[INFO] generating user layers
[INFO] generating workspace directory
INFO: bitbake petalinux-user-image
Loading cache: 100% |############################################| Time: 0:00:00
Loaded 3988 entries from dependency cache.
Parsing recipes: 100% |##########################################| Time: 0:00:04
Parsing of 2903 .bb files complete (2900 cached, 3 parsed). 3990 targets, 148 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies
Initialising tasks: 100% |#######################################| Time: 0:00:16
Checking sstate mirror object availability: 100% |###############| Time: 0:01:04
Sstate summary: Wanted 3628 Found 2635 Missed 1986 Current 36 (72% match, 72% complete)
NOTE: Executing SetScene Tasks
NOTE: Executing RunQueue Tasks
NOTE: linux-xlnx: compiling from external source tree /home/user/ascprj/components/plnx_workspace/sources/linux-xlnx
WARNING: dnndk-1.0-r0 do_package_qa: QA Issue: dnndk: found library in wrong location: /usr/local/lib/libn2cube.so [libdir]
NOTE: Tasks Summary: Attempted 11029 tasks of which 7646 didn't need to be rerun and all succeeded.

Summary: There was 1 WARNING message shown.
INFO: Copying Images from deploy to images
INFO: Creating /home/user/ascprj/images/linux directory
NOTE: Failed to copy built images to tftp dir: /tftpboot 
[INFO] successfully built project



4.image.ubとBOOT.binを作成してイメージを書き込む

1.BOOT.BINとimages.ubの作成



$ cd images/linux
$ petalinux-package --boot --force --u-boot

>>>
INFO: File in BOOT BIN: "/home/user/dpuprj/images/linux/zynqmp_fsbl.elf"
INFO: File in BOOT BIN: "/home/user/dpuprj/images/linux/pmufw.elf"
INFO: File in BOOT BIN: "/home/user/dpuprj/images/linux/bl31.elf"
INFO: File in BOOT BIN: "/home/user/dpuprj/images/linux/u-boot.elf"
INFO: Generating zynqmp binary package BOOT.BIN...


****** Xilinx Bootgen v2019.2
  **** Build date : Oct 23 2019-22:59:42
    ** Copyright 1986-2019 Xilinx, Inc. All Rights Reserved.

INFO: Binary is ready.
WARNING: Unable to access the TFTPBOOT folder /tftpboot!!!
WARNING: Skip file copy to TFTPBOOT folder!!!

BOOT.BIN、image.ubができた。




2.SDKの作成



$ cd images/linux
$ petalinux-build --sdk

>>>>
NOTE: Tasks Summary: Attempted 8179 tasks of which 8140 didn't need to be rerun and all succeeded.
[INFO] Copying SDK Installer…

[INFO] successfully built project
# 保存するディレクトリを作成
$ mkdir SDCARD

# 保存先を聞いてくるので指定
$ ./sdk.sh

>>>
PetaLinux SDK installer version 2019.2
======================================
Enter target directory for SDK (default: /opt/petalinux/2019.2): /home/hagis/dpuprj/SDCARD
You are about to install the SDK to "/home/user/dpuprj/SDCARD". Proceed[Y/n]? Y
Extracting SDK…………………..
〜
Setting it up...done
SDK has been successfully set up and is ready to be used.
Each time you wish to use the SDK in a new shell session, you need to source the environment setup script e.g.
 $ . /home/hagis/dpuprj/SDCARD/environment-setup-aarch64-xilinx-linux



3.イメージの書き込み



このサイトからinstallしたイメージをEtcherでSD CARDにコピーすれば、rootとbootは勝手に作られてる。
だからfdiskコマンドでパーティションを作ってやる必要ないのでそのままコピー。

コピーするsd_cardの中身は下のファイル構成

$ tree sd_card
>>>
sd_card
├── boot
│   ├── BOOT.BIN
│   ├── boot.scr
│   ├── image.ub
│   └── system.dtb
└── root
    └── rootfs.tar.gz


ubuntuを入れたPCでコピーを実行

# boot(FAT32)にコピー
cd sd_card/boot
cp image.ub BOOT.BIN system.dtb boot.scr /media/user/boot/

# root(EXT4)にコピー
cd sd_card/root
sudo tar -C /media/user/root -xzvf rootfs.tar.gz

gpartedをインストールすればGUIで、パーティションを分割できる。

$ sudo apt-get install gparted


4.gtktermでultra96v2にログイン


VirtualBoxにUSBを認識させた。teratermubuntu版「gtkterm」を使った

Ultra96v2ボードは1をoffに2をOnにしてSDカードのモード(JTAGではなく)にしておく。

# gtktermのインストール
$ sudo apt-get install gtkterm

# USBが認識されてるか確認
$ ls -l /dev/ttyUSB*
>>>
crw-rw---- 1 root dialout 188, 0  828 17:11 /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 1  828 17:11 /dev/ttyUSB1

# ultra96v2ボードにアクセス(terminalで実行)
$ gtkterm -p /dev/ttyUSB1 -s 115200


参考サイト



Vitis-AIのgithub

Zynq DPU v3.2 Product Guide PG338 (v3.2) July 7, 2020

DNNDK on Vitis AI on Ultra96v2(qiita)

Vitis-AI 1.1 Flow for Avnet VITIS Platforms - Part1(hackster)

ultara96v2用DPU用ファイル

Ultra96-v2でCNN推論エンジン(DPU)を動かすまで