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 件のコメント:
コメントを投稿