Vitis AIをKV260に組み込む
KV260は、AI ビジョンスターターキットと言われているくらい、AIにを動かすたの機能を十分満たしています。
ザイリンクス社から、リファレンスデザインは作られているのですが、カスタマイズがやりにくい状態になっています。
ここでは、FPGAボードにAIの機能を取り付けて、実際に動くまでの段取りを述べてみます。
事前準備
KV260で、AIを動かす上で、準備が必要になります。
Docker 仮想環境になります。Winodwsの方もWSL2で動かすことが出来ます。Dockerは参考記事が多いので、それらをみて、インストールしてください。
KV260用にVitis プラットフォームが必要です。次のブログで記述していますので、参考にしてください。
SDカードイメージが必要になります。AIで動かすためのライブラリーの設定も行っています。
Vitis AI 本体のダウンロード
cd ~/AIEDGE
git clone --recursive https://github.com/Xilinx/Vitis-AI.git
作業手順
- AIのハードウェアブロック(DPU)を組み込みます。
- Vitis AIで学習済みデータを変換します。
- Vitisでソフトウェアを作ります。
- KV260で実機動作します。
- 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を選択します。
1.5 Library Repositonを選択後、Addボタンを押します。
1.6 DPUの設置項目を入力します。Locationは解凍した場所になります。よろしければ、Apply and Closeをクリックします。
1.7 新しいアプリケーションを作成します。メニューからFIle → New → Application Project..を選択します。
1.8 新しいアプリケーションの説明が出てきます。そのまま NEXT を押します。
1.9 プラットフォームを選択します。ここでは、kv260_pfmを選択して、NEXTをクリックします。
1.10 アプリケーションプロジェクト名を入力します。今回はaiedgeにしました。
1.11 sysrootを設定します。共通イメージのsysrootの場所を指定します。NEXTをクリックします。
/home/******/AIEDGE/xilinx-zynqmp-common-v2022.1/sysroots/cortexa72-cortexa53-xilinx-linux
1.12 DPUを選択します。これでカスタマイズできる IP コアを登録することができます。
1.13 ハードウェア設定を行います。右上の Active build Configration を Hardwarenに変更します。
1.14 (RISCV追加オプション)AIEDGE参加の方は、RISCVを組み込む必要があると思います。ここで、RISCVを組み込んでしまいます。すでにブログ記事 KV260プラットフォームにRISC-Vを組み込む(AI EDGEコンテスト対応版)で、5のところまで行っていると、RISCVのIPが出来ています。これを組み込みます。まずは、Exploererのaiedge_kernels のSrcを右クリックして、メニューを出し、import Sources をクリックします。
1.15 (RISCV追加オプション)From Directoryで、riscvのフォルダーを選択します。その後出てきた、選択のうちriscv.xoを選択します。入力しましたら、Finishです。
1.16 (RISCV追加オプション)RISCVをハードウェアアクセラレータとして、登録します。ペンのアイコンをクリック後、ハードウェアファンクションにriscvを追加します。
1.17 IPのカスタマイズをします。デバイスの大きさに合わせて適切な対応をするためです。他のIPの設定もできます。Explorerで、aiedge_system_hw_linkをクリックします。名前を使いやすくすため、aiedgeに変更しました。デバイスの大きさの関係から、DPUCZDX8Gの数を1にします。
1.18 DPUのカスタマイズをします。dpu_conf.vhを編集します。AIの性能に左右します。必要に応じて、値を変更します。今回は、次のような設定にしました。コメントを除いて、記述しています。
`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..をクリックします。
1.20 コンフィグレーションのセッティングを行います。V++ configuration settings の ...のアイコンをクリックします。
1.21 DPUのIPは一つしかないので、一個分の設定を行います。なお、ここも性能を左右するところで、他のIPの接続情報も入力することが出来ます。OKを押して、その後Apply and closeをクリックします。
[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
1.23 結果を確認します。AssistantのなかにLink Summaryが出てきますので、そこをダブルクリックをします。
1.24 Vitis Analyzerが立ち上がり、各種結果を見ることが出来ます。使用率、バスの接続方法、タイミングなどが見れます。次回改善の情報に割り当てください。
1.25 AIエッジコンテストの方は、ここで、結果をエクスポートして、参加の意思を表示することが出来ます。aiedge_system を右クリック後、メニューを出して、Export as Archiveを選択してください。
1.26 アーカイブファイルが作成されます。これをVitisのプロジェクトとして、利用可能です。
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を追加するために、ターゲットを作成するファイルを変更します。
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を使うためです。
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のに合わせておいてください。
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を使用します。ザイリンクス社では、すでに学習済みのモデルを用意していますので、それを利用して、実装することも可能です。
参考資料