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にはDPUチューニングを行うための手順を示した。を示した。今回の手順は、Qiitaの記事 "KV260向けにVitisプラットフォームを作成してDPUを動かす その1 (Vitis 2022.1 + Vitis-AI v2.5)"とほぼ同じである。
STEP1: Vivadoを使
プロジェクトを作成する。
platformを選択する。今回はclockが5系統のkv260_platform_clk5
Project名を入力する。今回はdpuprjとする。
Sysroot pathに/opt/petalinux/2022.1/sysroots/cortexa72-cortexa53-xilinx-linuxディレクトリを設定する。
TemplatesからDPU Kernelを選択して、プロジェクトを作成する。
Explorerウインドウのdpu_trd_kernelsからsrc->prj->Vitis->dpu_conf.vhを開いてDPUのコンフィグレーションを変更する。ここではB1024を設定している。
Explorerからdpuprj_system_hw_link.prjを開いてカーネルの個数の設定を変更します。
今回はsoftmaxコアは不要なのでsfm_xrt_topは削除した。
最初はdpu-link.cfgがうまく生成されないためErrorで終わる。viかVS codeを用いてdpuprj_system_hw_link/Hardware/dpu_link.cfgを以下のように編集する。
同じディレクトリで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コアが使用される環境となっている。
ここで、xmutil unloadappで一旦全てのslotをnon-activeにする。
次にxmutil loadapp dpu_512x2でdpu_512x2の環境をaciveにする。
この状態でdpuがloadされているかを見るにはshow_dpuコマンドを使う。
show_dpu
確かにDPUが2つloadされているのがわかる。fingerprintはDPUのコアやversionの情報が埋め込まれた識別番号である。さらに詳しい情報を見るにはxdputil queryを使う。
xdputil query
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