2020年12月9日水曜日

ultra96v2でVitis_AIを試してみた(2020.2)

ultra96v2でVitis_AIを試してみた話。

参考ページ

sdイメージの作成はここ

MNISTの実行はここ

日本語ならここ

環境

Ubuntu 20.04
Vitis 2020.2
Vivado 2020.2
Petalinux 2020.2

準備

ここに書いてあるplatformを準備する。 petalinuxのイメージは記事から変更している。(Vitis-AI関連とparted関連) vitis-ai-devパッケージは念の為入れといたけど動かす分には不要そう。(試して無いのでリポジトリはそのまま)

Platformの作成

VItis-AIにあるDPU-TRDをultra96v2向けに設定する。

cd <path-to-work-dir>
git clone https://github.com/Xilinx/Vitis-AI.git -b v1.2.1
cd DPU-TRD/prj/Vitis

そのままだと合成できなかったので以下3つのファイルを変更した。

  • DPU-TRD/prj/Vitis/Makefile そのままの設定だとultra96v2に乗らないので、Configを変更する。 また、pre-builtの環境を使用しないので指定できるように変更する。

hwhファイルのパスが変更となっているのか、取得できなかったので合わせて修正している。

-XOCC_OPTS = -t ${TARGET} --platform ${SDX_PLATFORM} --save-temps --config ${DIR_PRJ}/config_file/prj_config_102_3dpu_LPD --xp param:compiler.userPostSysLinkOverlayTcl=${DIR_PRJ}/syslink/strip_interconnects.tcl 
+XOCC_OPTS = -t ${TARGET} --platform ${SDX_PLATFORM} --save-temps --config ${DIR_PRJ}/config_file/prj_config --xp param:compiler.userPostSysLinkOverlayTcl=${DIR_PRJ}/syslink/strip_interconnects.tcl

-   v++ -t ${TARGET} --platform ${SDX_PLATFORM} -p binary_container_1/dpu.xclbin --package.out_dir binary_container_1 --package.rootfs $(EDGE_COMMON_SW)/rootfs.ext4 --package.sd_file $(EDGE_COMMON_SW)/Image 
-   cp ./binary_*/link/vivado/vpl/prj/prj.srcs/sources_1/bd/*/hw_handoff/*.hwh ./binary_*/sd_card
+   v++ -t ${TARGET} --platform ${SDX_PLATFORM} -p binary_container_1/dpu.xclbin --package.out_dir binary_container_1 --package.rootfs $(ROOTFS) --package.sd_file $(IMAGE)
+   cp ./binary_*/link/vivado/vpl/prj/*/sources_1/bd/*/hw_handoff/*.hwh ./binary_*/sd_card
  • DPU-TRD/prj/Vitis/config_file/prj_config DPUを1個に設定する。
-freqHz=300000000:DPUCZDX8G_2.aclk
-freqHz=600000000:DPUCZDX8G_2.ap_clk_2
+#freqHz=300000000:DPUCZDX8G_2.aclk
+#freqHz=600000000:DPUCZDX8G_2.ap_clk_2

-sp=DPUCZDX8G_2.M_AXI_GP0:HPC0
-sp=DPUCZDX8G_2.M_AXI_HP0:HP2
-sp=DPUCZDX8G_2.M_AXI_HP2:HP3
+#sp=DPUCZDX8G_2.M_AXI_GP0:HPC0
+#sp=DPUCZDX8G_2.M_AXI_HP0:HP2
+#sp=DPUCZDX8G_2.M_AXI_HP2:HP3

-nk=DPUCZDX8G:2
+nk=DPUCZDX8G:1
  • DPU-TRD/prj/Vitis/dpu_conf.vh b/DPU-TRD/prj/Vitis/dpu_conf.vh DPUの型式を変更する。
-`define B4096 
+`define B512

修正したらmakeする。

source <vitis_install_path>/2020.2/settings.sh
make KERNEL=DPU_SM DEVICE=ultra96v2 SDX_PLATFORM=<path-to-platform>/ultra96v2-platform.xpfm ROOTFS=<path-to-rootfs>/petalinux-image-minimal-ultra96v2ros2-ultra96v2-zynqmp.ext4 IMAGE=<path-to-image>/Image

ビルドが終了したらsdカードを作成する。

dd if=binary_container_1/sd_card.img of=/dev/sdX

MNIST実行ファイルの作成

Vitis-AI-Tutorialを利用する。 dockerのsetupは必要。 理由は不明だが、vitis-ai-cpu:latestはdletがうまく動作しなかったので、 xilinx/vitis-ai:latestを使用。2020.2を使用しているからか?

cd <path-to-work-dir>
git clone https://github.com/Xilinx/Vitis-AI-Tutorials.git -b MNIST=Classification-TensorFlow
    cd Vitis-AI-Tutorials/files
cp <path-to-work-dir>/Vitis-AI/DPU-TRD/prj/Vitis/binary_container_1/sd_card/ultra96v2_4z.hwh .
wget https://www.fpga.co.jp/u96v2_vitisai_2020.1/u96v2.json
./docker_run xilinx/vitis-ai:latest

vitis-aiが起動したらTutorialに従い以下の通り実行する。 6_compileと7_make_targetはultra96v2向けに変更が必要。

source 0_setenv.sh
dlet -f ultra96v2_4z.hwh
export COMPILE_u96v2=${BUILD}/compile_u96v2
export TARGET_u96v2=${BUILD}/target_u96v2
source 1_train.sh
source 2_freeze.sh
source 3_eval_frozen_graph.sh
source 4_quant.sh
source 5_eval_quant_graph.sh

#source 6_compile_u96v2.sh
rm -rf ${COMPILE_u96v2}
mkdir -p ${COMPILE_u96v2}
vai_c_tensorflow --frozen_pb  ${QUANT}/deploy_model.pb --arch ./u96v2.json --output_dir ${COMPILE_u96v2} --net_name ${NET_NAME}

#source 7_make_target_u96v2.sh
# remove previous results
rm -rf ${TARGET_u96v2}
mkdir -p ${TARGET_u96v2}/model_dir

# copy application to target folder
cp ${APP}/*.py ${TARGET_u96v2}
echo "  Copied application to target folder"

# copy elf to target folder
cp ${COMPILE_u96v2}/*.elf ${TARGET_u96v2}/model_dir/.
echo "  Copied elf file(s) to target folder"

# create image files and copy to target folder
mkdir -p ${TARGET_u96v2}/images

python generate_images.py  \
    --dataset=mnist \
    --image_dir=${TARGET_u96v2}/images \
    --image_format=jpg \
    --max_images=10000

ultra96v2の電源を投入し、ログインしてSDのパーティションを広げる。 wifiを有効にしているので、wifi経由でアクセスする場合にはネットワーク接続したあと以下の通り実行する。

ssh 192.168.2.1 -l root
parted
resizepart
2
Yes
100%
quit
resize2fs /dev/mmcblk0p2

このあと、ホストから必要なファイルを転送してチュートリアルを実行する。

cd <path-to-work-dir>/Vitis-AI-Tutorials/files
tar cvfz target_u96v2.tar.gz build/target_u96v2
scp target_u96v2.tar.gz root@192.168.2.1:~/

ターゲット側で以下の通り実行して動作確認する。 2スレッド実行時は-t 2を指定する。

tar xzvf target_u96v2.tar.gz
cd build/target_u96v2
python3 app_mt.py -m model_dir/dpu_customcnn.elf

実行結果

root@ultra96v2-zynqmp:~/build/target_u96v2# python3 app_mt.py -m model_dir/dpu_customcnn.elf 
Command line options:
 --image_dir :  images
 --threads   :  1
 --model     :  model_dir/dpu_customcnn.elf
Pre-processing 10000 images...
Starting 1 threads...
FPS=2679.56, total frames = 10000 , time=3.7320 seconds
Correct: 980 Wrong: 9020 Accuracy: 0.098

root@ultra96v2-zynqmp:~/build/target_u96v2# python3 app_mt.py -m model_dir/dpu_customcnn.elf -t 2
Command line options:
 --image_dir :  images
 --threads   :  2
 --model     :  model_dir/dpu_customcnn.elf
Pre-processing 10000 images...
Starting 2 threads...
FPS=3346.35, total frames = 10000 , time=2.9883 seconds
Correct: 980 Wrong: 9020 Accuracy: 0.098

0 件のコメント:

コメントを投稿