LoginSignup
2
2

More than 1 year has passed since last update.

KV260にVitis AIを組み込む(AIEDGEコンテスト対応版)

Last updated at Posted at 2022-09-27

Vitis AIをKV260に組み込む

KV260は、AI ビジョンスターターキットと言われているくらい、AIにを動かすたの機能を十分満たしています。
ザイリンクス社から、リファレンスデザインは作られているのですが、カスタマイズがやりにくい状態になっています。
ここでは、FPGAボードにAIの機能を取り付けて、実際に動くまでの段取りを述べてみます。

事前準備

KV260で、AIを動かす上で、準備が必要になります。

Docker 仮想環境になります。Winodwsの方もWSL2で動かすことが出来ます。Dockerは参考記事が多いので、それらをみて、インストールしてください。

KV260用にVitis プラットフォームが必要です。次のブログで記述していますので、参考にしてください。

SDカードイメージが必要になります。AIで動かすためのライブラリーの設定も行っています。

Vitis AI 本体のダウンロード

gti.sh
cd ~/AIEDGE
git clone --recursive https://github.com/Xilinx/Vitis-AI.git

作業手順

  1. AIのハードウェアブロック(DPU)を組み込みます。
  2. Vitis AIで学習済みデータを変換します。
  3. Vitisでソフトウェアを作ります。
  4. KV260で実機動作します。
  5. PaintPointingでの実装の仕方
AIのハードウェアブロックを組み込む

Vitis プラットフォームにハードウェアブロックを組み込みます。今回はRISCVとともに組み込むことを目指しています。手順としては、まず、コンパイラーにAIのライブラリーを組み込みます。そして、DPUのライブラリーをダウンロードして、Vitisのプラットフォームに組み込みます。

1.1 SYSROOT にAI用のライブラリーを追加します。すでにAIEDGEのフォルダーの下に共通イメージがあるという設定です。インストール場所によって、export install_pathのディレクトリを変更してください。

export install_path=~/AIEDGE/xilinx-zynqmp-common-v2022.1
wget https://www.xilinx.com/bin/public/openDownload?filename=vitis_ai_2022.1-r2.5.0.tar.gz -O vitis_ai_2022.1-r2.5.0.tar.gz
rm -r $install_path/sysroots/cortexa72-cortexa53-xilinx-linux/usr/share/cmake/XRT/
tar -xzvf vitis_ai_2022.1-r2.5.0.tar.gz -C $install_path/sysroots/cortexa72-cortexa53-xilinx-linux/

1.2 DPUの本体をダウンロードし、解凍します。これはVitisのライブラリーに組み込むことが出来ます。

wget https://www.xilinx.com/bin/public/openDownload?filename=DPUCZDX8G.tar.gz -O DPUCZDX8G.tar.gz
tar -xzvf DPUCZDX8G.tar.gz

1.3 Vitisを立ち上げます。適当なワークスペースを用意してください。

source /tools/Xilinx/Vitis/2022.1/settings64.sh
vitis

1.4 DPUのライブラリーを登録します。VitisのメニューからWindow→Preferencesを選択します。

image.png

1.5 Library Repositonを選択後、Addボタンを押します。

image.png

1.6 DPUの設置項目を入力します。Locationは解凍した場所になります。よろしければ、Apply and Closeをクリックします。

image.png

1.7 新しいアプリケーションを作成します。メニューからFIle → New → Application Project..を選択します。
image.png

1.8 新しいアプリケーションの説明が出てきます。そのまま NEXT を押します。

1.9 プラットフォームを選択します。ここでは、kv260_pfmを選択して、NEXTをクリックします。

image.png

1.10 アプリケーションプロジェクト名を入力します。今回はaiedgeにしました。
image.png

1.11 sysrootを設定します。共通イメージのsysrootの場所を指定します。NEXTをクリックします。
/home/******/AIEDGE/xilinx-zynqmp-common-v2022.1/sysroots/cortexa72-cortexa53-xilinx-linux
image.png

1.12 DPUを選択します。これでカスタマイズできる IP コアを登録することができます。
image.png

1.13 ハードウェア設定を行います。右上の Active build Configration を Hardwarenに変更します。

image.png

1.14 (RISCV追加オプション)AIEDGE参加の方は、RISCVを組み込む必要があると思います。ここで、RISCVを組み込んでしまいます。すでにブログ記事 KV260プラットフォームにRISC-Vを組み込む(AI EDGEコンテスト対応版)で、5のところまで行っていると、RISCVのIPが出来ています。これを組み込みます。まずは、Exploererのaiedge_kernels のSrcを右クリックして、メニューを出し、import Sources をクリックします。

image.png

1.15 (RISCV追加オプション)From Directoryで、riscvのフォルダーを選択します。その後出てきた、選択のうちriscv.xoを選択します。入力しましたら、Finishです。
image.png

1.16 (RISCV追加オプション)RISCVをハードウェアアクセラレータとして、登録します。ペンのアイコンをクリック後、ハードウェアファンクションにriscvを追加します。

image.png
image.png

1.17 IPのカスタマイズをします。デバイスの大きさに合わせて適切な対応をするためです。他のIPの設定もできます。Explorerで、aiedge_system_hw_linkをクリックします。名前を使いやすくすため、aiedgeに変更しました。デバイスの大きさの関係から、DPUCZDX8Gの数を1にします。
image.png

1.18 DPUのカスタマイズをします。dpu_conf.vhを編集します。AIの性能に左右します。必要に応じて、値を変更します。今回は、次のような設定にしました。コメントを除いて、記述しています。

image.png

dpu_conf.vh
`define B3136 
`define URAM_ENABLE 
//config URAM
`ifdef URAM_ENABLE
    `define def_UBANK_IMG_N          6
    `define def_UBANK_WGT_N          17
    `define def_UBANK_BIAS           1
`elsif URAM_DISABLE
    `define def_UBANK_IMG_N          0
    `define def_UBANK_WGT_N          0
    `define def_UBANK_BIAS           0
`endif
`define DRAM_DISABLE 
//config DRAM
`ifdef DRAM_ENABLE
    `define def_DBANK_IMG_N          1 
    `define def_DBANK_WGT_N          1
    `define def_DBANK_BIAS           1
`elsif DRAM_DISABLE
    `define def_DBANK_IMG_N          0
    `define def_DBANK_WGT_N          0
    `define def_DBANK_BIAS           0
`endif
`define RAM_USAGE_LOW
`define CHANNEL_AUGMENTATION_ENABLE
`define DWCV_ENABLE
`define ALU_PARALLEL_DEFAULT 
`define CONV_RELU_LEAKYRELU_RELU6
`define ALU_RELU_RELU6
`define DSP48_USAGE_HIGH 
`define LOWPOWER_DISABLE
`define MPSOC

1.19 接続部の設定を行います。画面左下の Assitantのなかから、 aiedge_system → aiedge_system_hw_link → Hardware → aiedge を右クリックします。出てきたメニューから Settings..をクリックします。

image.png

1.20 コンフィグレーションのセッティングを行います。V++ configuration settings の ...のアイコンをクリックします。
image.png

1.21 DPUのIPは一つしかないので、一個分の設定を行います。なお、ここも性能を左右するところで、他のIPの接続情報も入力することが出来ます。OKを押して、その後Apply and closeをクリックします。

V++congigurathon.setting
[clock]
freqHz=300000000:DPUCZDX8G_1.aclk
freqHz=600000000:DPUCZDX8G_1.ap_clk_2
[connectivity]
sp=DPUCZDX8G_1.M_AXI_GP0:HPC0
sp=DPUCZDX8G_1.M_AXI_HP0:HP0
sp=DPUCZDX8G_1.M_AXI_HP2:HP1

1.22 ビルドを行います。現段階ではハードウェアだけビルドをします。aiedge_system_linkを選択して、上のハンバーアイコンをクリックして、ビルドをします。数十分かかります。なお、パソコンのメモリーが少ない方はエラーになりやすいので、1.20で行った、setting で、V++ command line optionsでCPUの動作数を少なくしたほうが望ましいです。メモリーが16ギガバイトで、CPU2個くらいです(WSL2の場合)

--vivado.synth.jobs 2

image.png

image.png

1.23 結果を確認します。AssistantのなかにLink Summaryが出てきますので、そこをダブルクリックをします。

image.png

1.24 Vitis Analyzerが立ち上がり、各種結果を見ることが出来ます。使用率、バスの接続方法、タイミングなどが見れます。次回改善の情報に割り当てください。

image.png

image.png

1.25 AIエッジコンテストの方は、ここで、結果をエクスポートして、参加の意思を表示することが出来ます。aiedge_system を右クリック後、メニューを出して、Export as Archiveを選択してください。

image.png

1.26 アーカイブファイルが作成されます。これをVitisのプロジェクトとして、利用可能です。
image.png

Vitis AIでMNISTをコンパイルする。

DPUが動いているかどうかは、簡単なプログラムを使用することで、実行することが出来ます。AIのハローワールドと言われるMNIST(手書き数字の認識)を使って、実際に学習から、KV260で動くAIモデル作成を行っていきます。

2.1 Dockerは、OSごとに使用が異なりますので、必要に応じて利用してください。Dockerが入っているかはコマンドで確認できます。GPUを使える方はGPUのドライバーを入れたあと、Dockerを入れると、GPUが使えるようになります。なお、比較的新しいGPUをお使いの方は、Dockerのホームページにかかれている方法より、GPUメーカなどの提供しているDockerの方が安定して動作します。nvidia-docker2などがそれにあたります。
docker --version

2.2 Vitis AI をGithubからダウンロードします。2022年9月で、バージョンは2.5になります。

 git clone --recursive https://github.com/Xilinx/Vitis-AI.git

2.3 Vitis-AIのDockerイメージを用意します。用意する方法は2種類あります。
  まずCPUで動作させる方は次のコマンドで、ダウンロードします。量が多いので時間がかかります。
  GPUで動かす方は事前にビルドをする必要があります。スクリプトファイルが用意されています。
  

CPUの方

docker pull xilinx/vitis-ai-cpu:latest  

GPUの方

cd Vitis-AI
cd docker
./docker_build_gpu.sh

2.3 演習データを用意します。メーカーの方で用意されているのを使います。以前のバージョンのデータを使うので、ダウンロードするときにバージョン指定を行います。

cd ~/AIEDGE
git clone -b 1.4 https://github.com/Xilinx/Vitis-AI-Tutorials.git

2.4 今回はAIの部分をカスタマイズしたので、その情報が必要になります。すでにVitisで作られています。Dockerでも使えるようにコピーをしておきます。

cd ~/AIEDGE
cp ./vitis/aiedge_system_hw_link/Hardware/aiedge.build/link/vivado/vpl/prj/prj.gen/sources_1/bd/system/ip/system_DPUCZDX8G_1_0/arch.json .

2.5 Vitis AIを起動します。動作できるディレクトリーの影響を考えて、起動するディレクトリーを変更しています。起動したら、エンターキーを6回押して、最後にyとエンターキーを押せば、Vitis-AIが起動します。GPUの方はvitis-ai-cpuのところをvitis-ai-gpuに変更してください。

cd ~/AIEDGE
Vitis-AI/docker_run.sh xilinx/vitis-ai-cpu:latest

2.6 今回はAIEDGEコンテストの課題で、PointPainingを使うので、Pytorchで演習を行います。pytorchの演習に移動します。

cd Vitis-AI-Tutorials/Design_Tutorials/09-mnist_pyt/files

2.7 演習のデータは用意されているので、run_all.shを実行すれば、通常は動作するのですが、今回はAIをカスタマイズしていますので、ひとつひとつコマンドを入力していきます。まずはpytorchの環境に移動します。

conda activate vitis-ai-pytorch

2.8 環境の設定を行います。

export BUILD=./build
export LOG=${BUILD}/logs
mkdir -p ${LOG}

2.9 ダウンロード後1回だけですが、次の学習を行う前にトレーニングデータのバグの修正を行います。MNISTデータをダウンロードするのですが、アドレスにミスがあるので、それを取り除きます。また、kv260を追加するために、ターゲットを作成するファイルを変更します。

edit.sh
sed -i 40,45d train.py
sed -i "s/'vck190'/'vck190','kv260'/g" target.py

2.10 学習を行います。画像データもダウンロードされます。

python -u train.py -d ${BUILD} 2>&1 | tee ${LOG}/train.log

2.11 FPGAでの計算量を少なくするために量子化を行います。また、続けて、そのテストを行います。

python -u quantize.py -d ${BUILD} --quant_mode calib 2>&1 | tee ${LOG}/quant_calib.log
python -u quantize.py -d ${BUILD} --quant_mode test  2>&1 | tee ${LOG}/quant_test.log

2.12 KV260で動くモデルを作成します。ここは、カスタマイズした情報が必要なので、arch.jsonを指定して実行します。

export ARCH=/workspace/arch.json
export TARGET=kv260
vai_c_xir --xmodel ${BUILD}/quant_model/CNN_int.xmodel --arch $ARCH --net_name CNN_${TARGET} --output_dir  ${BUILD}/compiled_model

2.13 kv260で動かすための、ファイルを揃えます。スクリプトが出来ていますので、それを実行します。build/target_kv260に生成されたファイルが出来上がります。後ほど、kv260にコピーして使用します。

python -u target.py --target kv260 -d ${BUILD} 2>&1 | tee ${LOG}/target_kv260.log

2.14 VItis-AI 終了させます。作成したファイルは残っています。

exit
Vitisでソフトウェアを作ります。

kv260で動かすために、アプリケーションを作成します。
pythonで作成するか、Vitis等を使って、C言語で作成するのですが、今回はすでにPython作られています。
内容を確認したい方は、次のファイルを確認してください。

gedit ~/AIEDGE/Vitis-AI-Tutorials/Design_Tutorials/09-mnist_pyt/files/build/target_kv260/app_mt.py &
KV260で実機動作します。

作成したファイルをkv260にコピーして、実機で動作させます。作成したのは、DPUを動かすためのハードウェアの部分と、Vitis-AIで動作させた部分になります。

3.1 kv260を動作させます。イーサーネットをパソコンとつながるようにしておきます。
IPアドレスをifcofng 等で確認しておいてください。もしIPアドレスが設定されてない場合はkv260上で、IPアドレスを設定してください。

IPアドレスの確認

ifconfig

IPアドレスを設定する場合

sudo ifconfig eth0 192.168.0.11

3.2 次はパソコン上での作業です。まずはVitisで作成したファイルをひとまとめにします。
sd_aiedgeというフォルダーを作成して、その中に必要なファイルを集めます。必要なファイルは3つです。
aiedge.xclbin pl.dtbo shell.jsonです。
aiedge.xclbinは、ここの1番で作成しました。pl.dtboはプラットフォーム作りのときに作成しています。
shell.jsonは自分で作る必要があります。今回はechoコマンドを使って作成しました。また、同じ内容なのですが、aiedge.xclbinはaiedge.binにコピーして、2重にします。
kv260のOS側では、binファイルを、AIエンジンではXCLBINを使うためです。

make_sd_aiedge.sh
mkdir sd_aiedge
cp ./vitis/aiedge_system_hw_link/Hardware/aiedge.xclbin sd_aiedge
cp ./dt/pl.dtbo sd_aiedge
echo '{' > sd_aiedge/shell.json
echo '  "shell_type" : "XRT_FLAT",' >>  sd_aiedge/shell.json
echo '  "num_slots": "1"' >>  sd_aiedge/shell.json
echo '}' >> sd_aiedge/shell.json
cp sd_aiedge/aiedge.xclbin sd_aiedge/aiedge.bin

3.3 kv260 にファイルをコピーします。scpコマンドが使えます。IPアドレスはkv260のに合わせておいてください。

scp.sh
cd ~/AIEDGE
 scp -r sd_aiedge Vitis-AI-Tutorials/Design_Tutorials/09-mnist_pyt/files/build/target_kv260 petalinux@192.168.0.11:~

3.4 kv260上での作業に移ります。まずはハードウェアを動かせるようにkv260に登録をします。
登録はファイルのコピーをすればいいので、それを実行してください。
kv260上での作業です。

cd ~/sd_aiedge
sudo mkdir /lib/firmware/xilinx/aiedge
sudo cp * /lib/firmware/xilinx/aiedge

3.5 kv260でAIを使えるように、ファイルの書き換えを行います。/etc/vart.conf にその内容が書いてありますので、それを変更します。

echo 'firmware: /lib/firmware/xilinx/aiedge/aiedge.xclbin' > vart.conf
sudo cp -f vart.conf /etc/

3.6 aiedge のDPUが動くように、FPGA部分を切り替えます。

sudo xmutil listapps
sudo xmutil unloadapp
sudo xmutil loadapp aiedge

3.7 MNISTを動かします。Pythonですでにアプリは用意されていますので、

cd ~/target_kv260
python3 app_mt.py --model=CNN_kv260.xmodel

実行結果です。

xilinx-k26-starterkit-20221:~/target_kv260$ python3 app_mt.py --model=CNN_kv260.xmodel
Command line options:
 --image_dir :  images
 --threads   :  1
 --model     :  CNN_kv260.xmodel
-------------------------------
Pre-processing 10000 images...
-------------------------------
Starting 1 threads...
Sep 25 05:23:54 xilinx-k26-starterkit-20221 kernel: [drm] ERT_EXEC_WRITE is obsoleted, use ERT_START_KEY_VAL
-------------------------------
Throughput=4022.37 fps, total frames = 10000, time=2.4861 seconds
Correct:9882, Wrong:118, Accuracy:0.9882
-------------------------------

ここまで動作すれば、FPGA部分には問題がありません。あとは学習モデルとアプリケーション次第で、どのようなAIも動作することが出来ます。

PaintPointingでの実装の仕方

今回のAIEDGEコンテストでは、PaintPointgを使用します。ザイリンクス社では、すでに学習済みのモデルを用意していますので、それを利用して、実装することも可能です。

参考資料

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2