DPUのチューニング方法 - takgto/utokyo-chipathon2023 GitHub Wiki

1. DPUチューニングの概略
 KV260にはDPUCZDX8GというアーキテクチャのDPUが搭載されている。DPUCZDX8Gでは、8種類の規模の違うDPUコア(B512, B800, B1024, B1152, B1600, B2304, B3236, B4096)を1つまたは複数構築することが可能である。授業で使うKV260ではB4096を1つのみ搭載しており、kv260-benchmark-b4096とういアプリケーションで動作する。kv260はそのリソースの制限からB4096コアを1つのみ組み込むことができる。一方、コアをもっと規模の小さいものにし複数コアで並列化により処理速度を上げるという手も考えられる。例えば、B512x3~4, B1600x2, B1024x3と複数コアにするなど、但し、リソースが足りるかどうかは実際に細かいconfigの設定を調整してみないとわかりません(調整方法については後述する)。また、さらにクロック周波数を高くする方法も考えられる。

2. DPUチューニングの方法
 ここで説明する方法は、VivadoとVitisの両方の開発ツールを使う。vivadoでベースの回路図を作成し、VitisでDPUを組み込み、コアの種類・個数及びRAMなどのリソースの設定を行う。 画像1

 図1にはDPUチューニングを行うための手順を示した。を示した。今回の手順は、Qiitaの記事 "KV260向けにVitisプラットフォームを作成してDPUを動かす その1 (Vitis 2022.1 + Vitis-AI v2.5)"とほぼ同じである。

STEP1: Vivadoを使
image

プロジェクトを作成する。
image
platformを選択する。今回はclockが5系統のkv260_platform_clk5 image
Project名を入力する。今回はdpuprjとする。 image
Sysroot pathに/opt/petalinux/2022.1/sysroots/cortexa72-cortexa53-xilinx-linuxディレクトリを設定する。 image
TemplatesからDPU Kernelを選択して、プロジェクトを作成する。 image
Explorerウインドウのdpu_trd_kernelsからsrc->prj->Vitis->dpu_conf.vhを開いてDPUのコンフィグレーションを変更する。ここではB1024を設定している。 image
Explorerからdpuprj_system_hw_link.prjを開いてカーネルの個数の設定を変更します。 今回はsoftmaxコアは不要なのでsfm_xrt_topは削除した。 image

image

最初はdpu-link.cfgがうまく生成されないためErrorで終わる。viかVS codeを用いてdpuprj_system_hw_link/Hardware/dpu_link.cfgを以下のように編集する。

image

同じディレクトリでmakeを実行するとコンパイルが始まる。2~3時間でdpu.xclbinというファイルができる。

3. KV260へのファイル転送
KV260には次の3つのファイルを転送する必要がある。
dpu.bit.bin : dpu.xclbinの拡張子の名前を変更してできる。
dpu.dtbo : $HOME/workspace/vivado/kv260_platform_clk5/dtg_output/pl.dtboのplをdpuに変える。
shell.json : viかVS codeで{"shell_type" : "XRT_FLAT", "num_slots": "1"}を書き込んだファイルを用意する。

転送先は、KV260の/lib/firmware/xilinx/の下に、dpuという名前のディレクトリを作って、そこに転送する。

4. KV260上でのプラットフォームの切り替え
xmutil listappsで現在のプラットフォームや使えるプラットフォームをリストアップすることができる(図2)。この場合、Active_slot(右端の列)0がkv260-benchmark-b4096なので、DPU B4096コアが使用される環境となっている。 image
ここで、xmutil unloadappで一旦全てのslotをnon-activeにする。
image
次にxmutil loadapp dpu_512x2でdpu_512x2の環境をaciveにする。
image
この状態でdpuがloadされているかを見るにはshow_dpuコマンドを使う。

show_dpu

image
確かにDPUが2つloadされているのがわかる。fingerprintはDPUのコアやversionの情報が埋め込まれた識別番号である。さらに詳しい情報を見るにはxdputil queryを使う。

xdputil query

image
Vitis-AIでネットワークモデルを量子化する際に最後にcompileを行うが、この時使うarch.jsonにもfingerprintの情報が含まれている。このarch.jsonのfingerprintとshow_dpuつまりプラットフォームのfingerprintが一致していないとネットワークモデルはこのプラットフォームでは実行できない。よって、プラットフォームを作った時のarch.json ( /dpu_512x2_system_hw_link/Hardware/dpu.build/link/vivado/vpl/prj/prj.gen/sources_1/bd/design_1/ip/design_1_DPUCZDX8G_1_0/arch.json )を使ってVitis-AIで量子化モデルを再compileする必要がある。なお、arch.jsonはDPUコアの並列数には依存しない。
DPUにより変更されたarch.jsonを使いコンパイルされた*.xmodelを使えば、今までどおりVARTを使ったyolov3-tinyは次のコマンドで実行できる。

./yolov3-tiny dpu_yolov3_tiny-512.xmodel ./video/adas.webm
⚠️ **GitHub.com Fallback** ⚠️