FC2カウンター FPGAの部屋 2022年06月
fc2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

TVM/VTA チュートリアルをやってみる4

TVM/VTA チュートリアルをやってみる3”の続き。

前回は、PYNQ-Z1 とホスト・パソコンの tvm/3rdparty/vta-hw/config/vta_config.json の "LOG_BATCH" を 0 にして、もう一度、test_benchmark_topi_conv2d.py をやって見たが、やはりコアダンプしてしまった。しかし、 "LOG_BATCH" が 2 のときよりもだいぶ先まで実行できた。今回は、PYNQ-Z1 とホスト・パソコンの tvm/3rdparty/vta-hw/config/vta_config.json の "LOG_BATCH" を 0 にして、もう一度、test_benchmark_topi_conv2d_transpose.py をやってみた。今度は、完走できて、最大 GPOS 値は 49.0348 GOPS だった。

ホスト・パソコンの tvm/3rdparty/vta-hw/build/hardware/xilinx/vivado/pynq_2x16_i8w8a32_15_15_18_17/export/pynq/0_0_2 ディレクトリ に tvm/3rdparty/vta-hw/build/hardware/xilinx/vivado/pynq_1x16_i8w8a32_15_15_18_17/export/vta.bit をコピーして、1x16_i8w8a32_15_15_18_17.bit に名前を変更済みだ。

ホスト・パソコンで、VTA_CACHE_PATH はすでに設定してある。
export VTA_CACHE_PATH=/media/masaaki/Ubuntu_Disk/DNN/tvm/3rdparty/vta-hw/build/hardware/xilinx/vivado/pynq_2x16_i8w8a32_15_15_18_17/export

ホスト・パソコンで環境変数を設定するのだが、すでに設定されているので、やっていない。(ディレクトリは tvm)
export PYTHONPATH=$PYTHONPATH:/media/masaaki/Ubuntu_Disk/DNN/tvm/python:/media/masaaki/Ubuntu_Disk/DNN/tvm/vta/python
export VTA_RPC_HOST=192.168.3.31
export VTA_RPC_PORT=9091

PYNQ-Z1 の ~/tvm ディレクトリで RPC サーバーを起動する。
sudo ./apps/vta_rpc/start_rpc_server.sh

ホスト・パソコン(Ubuntu 18.04 LTS)で test_program_rpc.py を起動した。
python3 vta/tests/python/pynq/test_program_rpc.py

ホスト・パソコンで test_benchmark_topi_conv2d_transpose.py を実行した。
python3 vta/tests/python/integration/test_benchmark_topi_conv2d_transpose.py
TVM_VTA_118_220629.png
TVM_VTA_119_220629.png

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/DNN/tvm$ python3 vta/tests/python/integration/test_benchmark_topi_conv2d_transpose.py
Conv2DTransposeWorkload(batch=1, height=4, width=4, in_filter=1024, out_filter=512, hkernel=4, wkernel=4, hpad=1, wpad=1, hstride=2, wstride=2, o_hpad=0, o_wpad=0)
/media/masaaki/Ubuntu_Disk/DNN/tvm/python/tvm/driver/build_module.py:263: UserWarning: target_host parameter is going to be deprecated. Please pass in tvm.target.Target(target, host=target_host) instead.
  warnings.warn(
CPU CONV2D TEST PASSED: Time cost = 1.28334 sec/op, 0.836676 GOPS
Conv2DTransposeWorkload(batch=1, height=8, width=8, in_filter=512, out_filter=256, hkernel=4, wkernel=4, hpad=1, wpad=1, hstride=2, wstride=2, o_hpad=0, o_wpad=0)
CPU CONV2D TEST PASSED: Time cost = 0.689575 sec/op, 1.55711 GOPS
Conv2DTransposeWorkload(batch=1, height=16, width=16, in_filter=256, out_filter=128, hkernel=4, wkernel=4, hpad=1, wpad=1, hstride=2, wstride=2, o_hpad=0, o_wpad=0)
CPU CONV2D TEST PASSED: Time cost = 0.667555 sec/op, 1.60847 GOPS
Conv2DTransposeWorkload(batch=1, height=4, width=4, in_filter=1024, out_filter=512, hkernel=4, wkernel=4, hpad=1, wpad=1, hstride=2, wstride=2, o_hpad=0, o_wpad=0)
[03:50:00] /media/masaaki/Ubuntu_Disk/DNN/tvm/src/tir/transforms/arg_binder.cc:95: Warning: Trying to bind buffer to another one with lower alignment requirement  required_alignment=256, provided_alignment=128
VTA CONV2D TEST PASSED: Time cost = 0.0243217 sec/op, 44.1474 GOPS
Conv2DTransposeWorkload(batch=1, height=8, width=8, in_filter=512, out_filter=256, hkernel=4, wkernel=4, hpad=1, wpad=1, hstride=2, wstride=2, o_hpad=0, o_wpad=0)
[03:50:05] /media/masaaki/Ubuntu_Disk/DNN/tvm/src/tir/transforms/arg_binder.cc:95: Warning: Trying to bind buffer to another one with lower alignment requirement  required_alignment=256, provided_alignment=128
VTA CONV2D TEST PASSED: Time cost = 0.0218975 sec/op, 49.0348 GOPS
Conv2DTransposeWorkload(batch=1, height=16, width=16, in_filter=256, out_filter=128, hkernel=4, wkernel=4, hpad=1, wpad=1, hstride=2, wstride=2, o_hpad=0, o_wpad=0)
[03:50:09] /media/masaaki/Ubuntu_Disk/DNN/tvm/src/tir/transforms/arg_binder.cc:95: Warning: Trying to bind buffer to another one with lower alignment requirement  required_alignment=256, provided_alignment=128
VTA CONV2D TEST PASSED: Time cost = 0.0224395 sec/op, 47.8505 GOPS


最大 49.0348 GOPS でていた。
何を評価しているかと言うと、DCGAN を 3 種類評価しているようだ。
test_benchmark_topi_conv2d_transpose.py の一部を引用する。

# DCGAN workloads
dcgan_wklds = [
    # dcgan
    ("DCGAN.CT1", Workload(env.BATCH, 4, 4, 1024, 512, 4, 4, 1, 1, 2, 2, 0, 0)),
    ("DCGAN.CT2", Workload(env.BATCH, 8, 8, 512, 256, 4, 4, 1, 1, 2, 2, 0, 0)),
    ("DCGAN.CT3", Workload(env.BATCH, 16, 16, 256, 128, 4, 4, 1, 1, 2, 2, 0, 0)),
]


PYNQ-Z1 のターミナルの表示を示す。
TVM_VTA_120_220629.png

xilinx@pynq:~/tvm$ sudo ./apps/vta_rpc/start_rpc_server.sh
[sudo] password for xilinx: 
INFO:RPCServer:bind to 0.0.0.0:9091
INFO:RPCServer:connection from ('192.168.3.10', 40230)
INFO:root:Program FPGA with 1x16_i8w8a32_15_15_18_17.bit 
INFO:RPCServer:Finish serving ('192.168.3.10', 40230)
INFO:RPCServer:connection from ('192.168.3.10', 40232)
INFO:root:Skip reconfig_runtime due to same config.
INFO:RPCServer:Finish serving ('192.168.3.10', 40232)
INFO:RPCServer:connection from ('192.168.3.10', 40234)
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmpqnxin9lm/conv2d_transpose.o
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmpqnxin9lm/conv2d_transpose.o
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmpqnxin9lm/conv2d_transpose.o
INFO:RPCServer:Finish serving ('192.168.3.10', 40234)
INFO:RPCServer:connection from ('192.168.3.10', 40248)
INFO:root:Program FPGA with 1x16_i8w8a32_15_15_18_17.bit 
INFO:root:Skip reconfig_runtime due to same config.
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmpf9xaj93n/conv2d_transpose.o
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmpf9xaj93n/conv2d_transpose.o
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmpf9xaj93n/conv2d_transpose.o
INFO:RPCServer:Finish serving ('192.168.3.10', 40248)

  1. 2022年06月30日 04:16 |
  2. TVM_VTA
  3. | トラックバック:0
  4. | コメント:0

TVM/VTA チュートリアルをやってみる3

TVM/VTA チュートリアルをやってみる2”の続き。

前回は、test_benchmark_topi_conv2d_transpose.py を実行したが、”TVMError: Socket SockChannel::Send Error:No route to host”で終了した。今回は、PYNQ-Z1 とホスト・パソコンの tvm/3rdparty/vta-hw/config/vta_config.json の "LOG_BATCH" を 0 にして、もう一度、test_benchmark_topi_conv2d.py をやって見たが、やはりコアダンプしてしまった。しかし、 "LOG_BATCH" が 2 のときよりもだいぶ先まで実行できた。

PYNQ-Z1 とホスト・パソコンの tvm/3rdparty/vta-hw/config/vta_config.json の "LOG_BATCH" を 0 にする。

PYNQ-Z1 の tvm/3rdparty/vta-hw/config/vta_config.json の "LOG_BATCH" を 0 に変更した。
TVM_VTA_109_220628.png

~/tvm/build ディレクトリで cmake を行った。
cmake ..
TVM_VTA_110_220628.png

make を行った。
make runtime vta -j2
TVM_VTA_111_220628.png

ホスト・パソコンの tvm/3rdparty/vta-hw/config/vta_config.json の "LOG_BATCH" を 0 に変更した。
TVM_VTA_112_220628.png

ホスト・パソコンの tvm/3rdparty/vta-hw/build/hardware/xilinx/vivado/pynq_2x16_i8w8a32_15_15_18_17/export/pynq/0_0_2 ディレクトリ に tvm/3rdparty/vta-hw/build/hardware/xilinx/vivado/pynq_1x16_i8w8a32_15_15_18_17/export/vta.bit をコピーして、1x16_i8w8a32_15_15_18_17.bit に名前を変更した。
TVM_VTA_113_220628.png

ホスト・パソコンで、VTA_CACHE_PATH はすでに設定してある。
export VTA_CACHE_PATH=/media/masaaki/Ubuntu_Disk/DNN/tvm/3rdparty/vta-hw/build/hardware/xilinx/vivado/pynq_2x16_i8w8a32_15_15_18_17/export

ホスト・パソコンで環境変数を設定するのだが、すでに設定されているので、やっていない。(ディレクトリは tvm)
export PYTHONPATH=$PYTHONPATH:/media/masaaki/Ubuntu_Disk/DNN/tvm/python:/media/masaaki/Ubuntu_Disk/DNN/tvm/vta/python
export VTA_RPC_HOST=192.168.3.31
export VTA_RPC_PORT=9091

PYNQ-Z1 の ~/tvm ディレクトリで RPC サーバーを起動する。
sudo ./apps/vta_rpc/start_rpc_server.sh

ホスト・パソコン(Ubuntu 18.04 LTS)で test_program_rpc.py を起動した。
python3 vta/tests/python/pynq/test_program_rpc.py

ホスト・パソコンで test_benchmark_topi_conv2d.py を実行した。
python3 vta/tests/python/integration/test_benchmark_topi_conv2d.py
TVM_VTA_114_220628.png
TVM_VTA_115_220628.png

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/DNN/tvm$ python3 vta/tests/python/integration/test_benchmark_topi_conv2d.py
Conv2DWorkload(batch=1, height=56, width=56, in_filter=64, out_filter=64, hkernel=3, wkernel=3, hpad=1, wpad=1, hstride=1, wstride=1)
/media/masaaki/Ubuntu_Disk/DNN/tvm/python/tvm/driver/build_module.py:263: UserWarning: target_host parameter is going to be deprecated. Please pass in tvm.target.Target(target, host=target_host) instead.
  warnings.warn(
CPU CONV2D TEST PASSED: Time cost = 0.14728 sec/op, 1.56987 GOPS
Conv2DWorkload(batch=1, height=56, width=56, in_filter=64, out_filter=128, hkernel=3, wkernel=3, hpad=1, wpad=1, hstride=2, wstride=2)
CPU CONV2D TEST PASSED: Time cost = 0.075877 sec/op, 1.52359 GOPS
Conv2DWorkload(batch=1, height=56, width=56, in_filter=64, out_filter=128, hkernel=1, wkernel=1, hpad=0, wpad=0, hstride=2, wstride=2)
CPU CONV2D TEST PASSED: Time cost = 0.00990135 sec/op, 1.2973 GOPS
Conv2DWorkload(batch=1, height=28, width=28, in_filter=128, out_filter=128, hkernel=3, wkernel=3, hpad=1, wpad=1, hstride=1, wstride=1)
CPU CONV2D TEST PASSED: Time cost = 0.163193 sec/op, 1.41679 GOPS
Conv2DWorkload(batch=1, height=28, width=28, in_filter=128, out_filter=256, hkernel=3, wkernel=3, hpad=1, wpad=1, hstride=2, wstride=2)
CPU CONV2D TEST PASSED: Time cost = 0.0765482 sec/op, 1.51023 GOPS
Conv2DWorkload(batch=1, height=28, width=28, in_filter=128, out_filter=256, hkernel=1, wkernel=1, hpad=0, wpad=0, hstride=2, wstride=2)
CPU CONV2D TEST PASSED: Time cost = 0.0111157 sec/op, 1.15558 GOPS
Conv2DWorkload(batch=1, height=14, width=14, in_filter=256, out_filter=256, hkernel=3, wkernel=3, hpad=1, wpad=1, hstride=1, wstride=1)
CPU CONV2D TEST PASSED: Time cost = 0.149718 sec/op, 1.54431 GOPS
Conv2DWorkload(batch=1, height=14, width=14, in_filter=256, out_filter=512, hkernel=3, wkernel=3, hpad=1, wpad=1, hstride=2, wstride=2)
CPU CONV2D TEST PASSED: Time cost = 0.100589 sec/op, 1.14928 GOPS
Conv2DWorkload(batch=1, height=14, width=14, in_filter=256, out_filter=512, hkernel=1, wkernel=1, hpad=0, wpad=0, hstride=2, wstride=2)
CPU CONV2D TEST PASSED: Time cost = 0.00949825 sec/op, 1.35236 GOPS
Conv2DWorkload(batch=1, height=7, width=7, in_filter=512, out_filter=512, hkernel=3, wkernel=3, hpad=1, wpad=1, hstride=1, wstride=1)
CPU CONV2D TEST PASSED: Time cost = 0.19252 sec/op, 1.20097 GOPS
Conv2DWorkload(batch=1, height=56, width=56, in_filter=64, out_filter=64, hkernel=3, wkernel=3, hpad=1, wpad=1, hstride=1, wstride=1)
[03:30:53] /media/masaaki/Ubuntu_Disk/DNN/tvm/src/tir/transforms/arg_binder.cc:95: Warning: Trying to bind buffer to another one with lower alignment requirement  required_alignment=256, provided_alignment=128
VTA CONV2D TEST PASSED: Time cost = 0.00601877 sec/op, 38.415 GOPS
Conv2DWorkload(batch=1, height=56, width=56, in_filter=64, out_filter=128, hkernel=3, wkernel=3, hpad=1, wpad=1, hstride=2, wstride=2)
[03:30:54] /media/masaaki/Ubuntu_Disk/DNN/tvm/src/tir/transforms/arg_binder.cc:95: Warning: Trying to bind buffer to another one with lower alignment requirement  required_alignment=256, provided_alignment=128
VTA CONV2D TEST PASSED: Time cost = 0.00315548 sec/op, 36.6364 GOPS
Conv2DWorkload(batch=1, height=56, width=56, in_filter=64, out_filter=128, hkernel=1, wkernel=1, hpad=0, wpad=0, hstride=2, wstride=2)
[03:30:55] /media/masaaki/Ubuntu_Disk/DNN/tvm/src/tir/transforms/arg_binder.cc:95: Warning: Trying to bind buffer to another one with lower alignment requirement  required_alignment=256, provided_alignment=128
VTA CONV2D TEST PASSED: Time cost = 0.00156176 sec/op, 8.22471 GOPS
Conv2DWorkload(batch=1, height=28, width=28, in_filter=128, out_filter=128, hkernel=3, wkernel=3, hpad=1, wpad=1, hstride=1, wstride=1)
[03:32:49] /media/masaaki/Ubuntu_Disk/DNN/tvm/src/tir/transforms/arg_binder.cc:95: Warning: Trying to bind buffer to another one with lower alignment requirement  required_alignment=256, provided_alignment=128
VTA CONV2D TEST PASSED: Time cost = 0.00539227 sec/op, 42.8782 GOPS
Conv2DWorkload(batch=1, height=28, width=28, in_filter=128, out_filter=256, hkernel=3, wkernel=3, hpad=1, wpad=1, hstride=2, wstride=2)
[03:32:52] /media/masaaki/Ubuntu_Disk/DNN/tvm/src/tir/transforms/arg_binder.cc:95: Warning: Trying to bind buffer to another one with lower alignment requirement  required_alignment=256, provided_alignment=128
VTA CONV2D TEST PASSED: Time cost = 0.00278832 sec/op, 41.4606 GOPS
Conv2DWorkload(batch=1, height=28, width=28, in_filter=128, out_filter=256, hkernel=1, wkernel=1, hpad=0, wpad=0, hstride=2, wstride=2)
[03:32:53] /media/masaaki/Ubuntu_Disk/DNN/tvm/src/tir/transforms/arg_binder.cc:95: Warning: Trying to bind buffer to another one with lower alignment requirement  required_alignment=256, provided_alignment=128
VTA CONV2D TEST PASSED: Time cost = 0.00114291 sec/op, 11.2389 GOPS
Conv2DWorkload(batch=1, height=14, width=14, in_filter=256, out_filter=256, hkernel=3, wkernel=3, hpad=1, wpad=1, hstride=1, wstride=1)
[03:32:56] /media/masaaki/Ubuntu_Disk/DNN/tvm/src/tir/transforms/arg_binder.cc:95: Warning: Trying to bind buffer to another one with lower alignment requirement  required_alignment=256, provided_alignment=128
VTA CONV2D TEST PASSED: Time cost = 0.00506864 sec/op, 45.616 GOPS
Conv2DWorkload(batch=1, height=14, width=14, in_filter=256, out_filter=512, hkernel=3, wkernel=3, hpad=1, wpad=1, hstride=2, wstride=2)
[03:33:01] /media/masaaki/Ubuntu_Disk/DNN/tvm/src/tir/transforms/arg_binder.cc:95: Warning: Trying to bind buffer to another one with lower alignment requirement  required_alignment=256, provided_alignment=128
VTA CONV2D TEST PASSED: Time cost = 0.00410674 sec/op, 28.1502 GOPS
Conv2DWorkload(batch=1, height=14, width=14, in_filter=256, out_filter=512, hkernel=1, wkernel=1, hpad=0, wpad=0, hstride=2, wstride=2)
[03:33:06] /media/masaaki/Ubuntu_Disk/DNN/tvm/src/tir/transforms/arg_binder.cc:95: Warning: Trying to bind buffer to another one with lower alignment requirement  required_alignment=256, provided_alignment=128
VTA CONV2D TEST PASSED: Time cost = 0.00115081 sec/op, 11.1617 GOPS
Conv2DWorkload(batch=1, height=7, width=7, in_filter=512, out_filter=512, hkernel=3, wkernel=3, hpad=1, wpad=1, hstride=1, wstride=1)
[03:33:14] /media/masaaki/Ubuntu_Disk/DNN/tvm/src/tir/transforms/arg_binder.cc:95: Warning: Trying to bind buffer to another one with lower alignment requirement  required_alignment=256, provided_alignment=128
Traceback (most recent call last):
  File "vta/tests/python/integration/test_benchmark_topi_conv2d.py", line 318, in <module>
    test_conv2d(device="vta")
  File "vta/tests/python/integration/test_benchmark_topi_conv2d.py", line 313, in test_conv2d
    vta.testing.run(_run)
  File "/media/masaaki/Ubuntu_Disk/DNN/tvm/vta/python/vta/testing/utils.py", line 74, in run
    run_func(env, remote)
  File "vta/tests/python/integration/test_benchmark_topi_conv2d.py", line 311, in _run
    run_conv2d(env, remote, wl, target)
  File "vta/tests/python/integration/test_benchmark_topi_conv2d.py", line 241, in run_conv2d
    data_arr = tvm.nd.array(data_np, dev)
  File "/media/masaaki/Ubuntu_Disk/DNN/tvm/python/tvm/runtime/ndarray.py", line 598, in array
    return empty(arr.shape, arr.dtype, device).copyfrom(arr)
  File "/media/masaaki/Ubuntu_Disk/DNN/tvm/python/tvm/runtime/ndarray.py", line 183, in copyfrom
    check_call(_LIB.TVMArrayCopyFromBytes(self.handle, data, nbytes))
  File "/media/masaaki/Ubuntu_Disk/DNN/tvm/python/tvm/_ffi/base.py", line 348, in check_call
    raise get_last_ffi_error()
tvm._ffi.base.TVMError: std: :bad_alloc
Exception ignored in: <function NDArrayBase.__del__ at 0x7f6fa241bee0>
Traceback (most recent call last):
  File "/media/masaaki/Ubuntu_Disk/DNN/tvm/python/tvm/_ffi/_ctypes/ndarray.py", line 82, in __del__
    check_call(_LIB.TVMArrayFree(self.handle))
  File "/media/masaaki/Ubuntu_Disk/DNN/tvm/python/tvm/_ffi/base.py", line 348, in check_call
    raise get_last_ffi_error()
tvm._ffi.base.TVMError: std: :bad_alloc
terminate called without an active exception
中止 (コアダンプ)


最終的にコアダンプしてしまったが、”TVM/VTA チュートリアルをやってみる1”よりもだいぶ進んだ。

何をやっているか?というと、resnet-18 を 10 種類評価しているようだ。
test_benchmark_topi_conv2d.py の一部を引用する。

# ResNet18 workloads
resnet_wkls = [
    # Workloads of resnet18 on imagenet
    # ('resnet-18.C1',  Workload(env.BATCH, 224, 224, 3,   64,  7, 7, 3, 3, 2, 2)),
    ("resnet-18.C2", Workload(env.BATCH, 56, 56, 64, 64, 3, 3, 1, 1, 1, 1)),
    ("resnet-18.C3", Workload(env.BATCH, 56, 56, 64, 128, 3, 3, 1, 1, 2, 2)),
    ("resnet-18.C4", Workload(env.BATCH, 56, 56, 64, 128, 1, 1, 0, 0, 2, 2)),
    ("resnet-18.C5", Workload(env.BATCH, 28, 28, 128, 128, 3, 3, 1, 1, 1, 1)),
    ("resnet-18.C6", Workload(env.BATCH, 28, 28, 128, 256, 3, 3, 1, 1, 2, 2)),
    ("resnet-18.C7", Workload(env.BATCH, 28, 28, 128, 256, 1, 1, 0, 0, 2, 2)),
    ("resnet-18.C8", Workload(env.BATCH, 14, 14, 256, 256, 3, 3, 1, 1, 1, 1)),
    ("resnet-18.C9", Workload(env.BATCH, 14, 14, 256, 512, 3, 3, 1, 1, 2, 2)),
    ("resnet-18.C10", Workload(env.BATCH, 14, 14, 256, 512, 1, 1, 0, 0, 2, 2)),
    ("resnet-18.C11", Workload(env.BATCH, 7, 7, 512, 512, 3, 3, 1, 1, 1, 1)),
]


PYNQ-Z1 のターミナルの表示を示す。
TVM_VTA_116_220628.png
TVM_VTA_117_220628.png

xilinx@pynq:~/tvm$ sudo ./apps/vta_rpc/start_rpc_server.sh
[sudo] password for xilinx: 
INFO:RPCServer:bind to 0.0.0.0:9091
INFO:RPCServer:connection from ('192.168.3.10', 38302)
INFO:root:Program FPGA with 1x16_i8w8a32_15_15_18_17.bit 
INFO:RPCServer:Finish serving ('192.168.3.10', 38302)
INFO:RPCServer:connection from ('192.168.3.10', 38304)
INFO:root:Skip reconfig_runtime due to same config.
INFO:RPCServer:Finish serving ('192.168.3.10', 38304)
INFO:RPCServer:connection from ('192.168.3.10', 38326)
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmpwjfhx19n/conv2d.o
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmpwjfhx19n/conv2d.o
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmpwjfhx19n/conv2d.o
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmpwjfhx19n/conv2d.o
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmpwjfhx19n/conv2d.o
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmpwjfhx19n/conv2d.o
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmpwjfhx19n/conv2d.o
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmpwjfhx19n/conv2d.o
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmpwjfhx19n/conv2d.o
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmpwjfhx19n/conv2d.o
INFO:RPCServer:Finish serving ('192.168.3.10', 38326)
INFO:RPCServer:connection from ('192.168.3.10', 38328)
INFO:root:Program FPGA with 1x16_i8w8a32_15_15_18_17.bit 
INFO:root:Skip reconfig_runtime due to same config.
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmpv36gde1g/conv2d.o
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmpv36gde1g/conv2d.o
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmpv36gde1g/conv2d.o
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmpv36gde1g/conv2d.o
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmpv36gde1g/conv2d.o
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmpv36gde1g/conv2d.o
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmpv36gde1g/conv2d.o
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmpv36gde1g/conv2d.o
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmpv36gde1g/conv2d.o
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmpv36gde1g/conv2d.o

  1. 2022年06月29日 03:41 |
  2. TVM_VTA
  3. | トラックバック:0
  4. | コメント:0

TVM/VTA チュートリアルをやってみる2

TVM/VTA チュートリアルをやってみる1”の続き。

前回は、test_benchmark_topi_conv2d.py をやってみたが、コアダンプになってしまった。今回は、test_benchmark_topi_conv2d_transpose.py を実行したが、”TVMError: Socket SockChannel::Send Error:No route to host”で終了した。

環境は、”フィックスターズさんの”実践的!FPGA開発セミナー vol.10”の”Versatile Tensor Accelerator (VTA) 実機検証”をやってみる12”そのままで、PYNQ-Z1 とホスト・パソコンの tvm/3rdparty/vta-hw/config/vta_config.json の "LOG_BATCH" は 2 となっている。

ホスト・パソコンの tvm/3rdparty/vta-hw/build/hardware/xilinx/vivado/pynq_2x16_i8w8a32_15_15_18_17/export/pynq/0_0_2 ディレクトリ に tvm/3rdparty/vta-hw/build/hardware/xilinx/vivado/pynq_4x16_i8w8a32_15_15_18_17/export/vta.bit をコピーして、4x16_i8w8a32_15_15_18_17.bit に名前を変更済みだ。

ホスト・パソコンで、VTA_CACHE_PATH はすでに設定してある。
export VTA_CACHE_PATH=/media/masaaki/Ubuntu_Disk/DNN/tvm/3rdparty/vta-hw/build/hardware/xilinx/vivado/pynq_2x16_i8w8a32_15_15_18_17/export

ホスト・パソコンで環境変数を設定するのだが、すでに設定されているので、やっていない。(ディレクトリは tvm)
export PYTHONPATH=$PYTHONPATH:/media/masaaki/Ubuntu_Disk/DNN/tvm/python:/media/masaaki/Ubuntu_Disk/DNN/tvm/vta/python
export VTA_RPC_HOST=192.168.3.31
export VTA_RPC_PORT=9091

PYNQ-Z1 の ~/tvm ディレクトリで RPC サーバーを起動する。
sudo ./apps/vta_rpc/start_rpc_server.sh

ホスト・パソコン(Ubuntu 18.04 LTS)で test_program_rpc.py を起動した。
python3 vta/tests/python/pynq/test_program_rpc.py

ホスト・パソコンで test_benchmark_topi_conv2d_transpose.py を実行した。
python3 vta/tests/python/integration/test_benchmark_topi_conv2d_transpose.py
TVM_VTA_105_220626.png
TVM_VTA_106_220626.png

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/DNN/tvm$ python3 vta/tests/python/integration/test_benchmark_topi_conv2d_transpose.py
Conv2DTransposeWorkload(batch=4, height=4, width=4, in_filter=1024, out_filter=512, hkernel=4, wkernel=4, hpad=1, wpad=1, hstride=2, wstride=2, o_hpad=0, o_wpad=0)
Cannot find config for target=llvm -keys=arm_cpu,cpu -device=arm_cpu -link-params=0 -mattr=+neon -model=pynq -mtriple=armv7a-linux-eabi, workload=('conv2d_transpose_nchw.arm_cpu', ('TENSOR', (4, 1024, 4, 4), 'int8'), ('TENSOR', (1024, 512, 4, 4), 'int8'), (2, 2), (1, 1, 1, 1), 'int32', (0, 0)). A fallback configuration is used, which may bring great performance regression.
/media/masaaki/Ubuntu_Disk/DNN/tvm/python/tvm/driver/build_module.py:263: UserWarning: target_host parameter is going to be deprecated. Please pass in tvm.target.Target(target, host=target_host) instead.
  warnings.warn(
CPU CONV2D TEST PASSED: Time cost = 6.65868 sec/op, 0.645018 GOPS
Conv2DTransposeWorkload(batch=4, height=8, width=8, in_filter=512, out_filter=256, hkernel=4, wkernel=4, hpad=1, wpad=1, hstride=2, wstride=2, o_hpad=0, o_wpad=0)
Cannot find config for target=llvm -keys=arm_cpu,cpu -device=arm_cpu -link-params=0 -mattr=+neon -model=pynq -mtriple=armv7a-linux-eabi, workload=('conv2d_transpose_nchw.arm_cpu', ('TENSOR', (4, 512, 8, 8), 'int8'), ('TENSOR', (512, 256, 4, 4), 'int8'), (2, 2), (1, 1, 1, 1), 'int32', (0, 0)). A fallback configuration is used, which may bring great performance regression.
Traceback (most recent call last):
  File "vta/tests/python/integration/test_benchmark_topi_conv2d_transpose.py", line 304, in <module>
    test_conv2d_transpose(device="arm_cpu")
  File "vta/tests/python/integration/test_benchmark_topi_conv2d_transpose.py", line 300, in test_conv2d_transpose
    vta.testing.run(_run)
  File "/media/masaaki/Ubuntu_Disk/DNN/tvm/vta/python/vta/testing/utils.py", line 74, in run
    run_func(env, remote)
  File "vta/tests/python/integration/test_benchmark_topi_conv2d_transpose.py", line 298, in _run
    run_conv2d_transpose(env, remote, wl, target)
  File "vta/tests/python/integration/test_benchmark_topi_conv2d_transpose.py", line 232, in run_conv2d_transpose
    kernel_arr = tvm.nd.array(kernel_np, dev)
  File "/media/masaaki/Ubuntu_Disk/DNN/tvm/python/tvm/runtime/ndarray.py", line 598, in array
    return empty(arr.shape, arr.dtype, device).copyfrom(arr)
  File "/media/masaaki/Ubuntu_Disk/DNN/tvm/python/tvm/runtime/ndarray.py", line 183, in copyfrom
    check_call(_LIB.TVMArrayCopyFromBytes(self.handle, data, nbytes))
  File "/media/masaaki/Ubuntu_Disk/DNN/tvm/python/tvm/_ffi/base.py", line 348, in check_call
    raise get_last_ffi_error()
tvm._ffi.base.TVMError: Traceback (most recent call last):
  68: 0xffffffffffffffff
  67: 0x00005636a1bd91c6
  66: __libc_start_main
  65: Py_BytesMain
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Modules/main.c:1141
  64: Py_RunMain
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Modules/main.c:695
  63: pymain_run_python
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Modules/main.c:616
  62: pymain_run_file
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Modules/main.c:391
  61: PyRun_SimpleFileExFlags
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Python/pythonrun.c:472
  60: pyrun_simple_file
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Python/pythonrun.c:439
  59: pyrun_file
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Python/pythonrun.c:1085
  58: run_mod
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Python/pythonrun.c:1188
  57: run_eval_code_obj
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Python/pythonrun.c:1166
  56: PyEval_EvalCode
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Python/ceval.c:718
  55: PyEval_EvalCodeEx
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Python/ceval.c:4327
  54: _PyEval_EvalCodeWithName
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Python/ceval.c:4298
  53: PyEval_EvalFrameEx
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Python/ceval.c:741
  52: _PyEval_EvalFrameDefault
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Python/ceval.c:3515
  51: call_function
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Python/ceval.c:4963
  50: _PyObject_Vectorcall
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Include/cpython/abstract.h:127
  49: _PyFunction_Vectorcall
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Objects/call.c:436
  48: _PyEval_EvalCodeWithName
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Python/ceval.c:4298
  47: PyEval_EvalFrameEx
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Python/ceval.c:741
  46: _PyEval_EvalFrameDefault
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Python/ceval.c:3469
  45: call_function
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Python/ceval.c:4963
  44: _PyObject_Vectorcall
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Include/cpython/abstract.h:127
  43: _PyFunction_Vectorcall
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Objects/call.c:411
  42: function_code_fastcall
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Objects/call.c:284
  41: PyEval_EvalFrameEx
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Python/ceval.c:741
  40: _PyEval_EvalFrameDefault
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Python/ceval.c:3500
  39: call_function
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Python/ceval.c:4963
  38: _PyObject_Vectorcall
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Include/cpython/abstract.h:127
  37: _PyFunction_Vectorcall
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Objects/call.c:436
  36: _PyEval_EvalCodeWithName
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Python/ceval.c:4298
  35: PyEval_EvalFrameEx
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Python/ceval.c:741
  34: _PyEval_EvalFrameDefault
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Python/ceval.c:3500
  33: call_function
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Python/ceval.c:4963
  32: _PyObject_Vectorcall
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Include/cpython/abstract.h:127
  31: _PyFunction_Vectorcall
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Objects/call.c:436
  30: _PyEval_EvalCodeWithName
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Python/ceval.c:4298
  29: PyEval_EvalFrameEx
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Python/ceval.c:741
  28: _PyEval_EvalFrameDefault
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Python/ceval.c:3469
  27: call_function
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Python/ceval.c:4963
  26: _PyObject_Vectorcall
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Include/cpython/abstract.h:127
  25: _PyFunction_Vectorcall
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Objects/call.c:436
  24: _PyEval_EvalCodeWithName
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Python/ceval.c:4298
  23: PyEval_EvalFrameEx
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Python/ceval.c:741
  22: _PyEval_EvalFrameDefault
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Python/ceval.c:3486
  21: call_function
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Python/ceval.c:4963
  20: _PyObject_Vectorcall
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Include/cpython/abstract.h:127
  19: _PyFunction_Vectorcall
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Objects/call.c:411
  18: function_code_fastcall
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Objects/call.c:284
  17: PyEval_EvalFrameEx
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Python/ceval.c:741
  16: _PyEval_EvalFrameDefault
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Python/ceval.c:3469
  15: call_function
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Python/ceval.c:4963
  14: _PyObject_Vectorcall
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Include/cpython/abstract.h:125
  13: _PyObject_MakeTpCall
        at /home/builder/ktietz/cos6/ci_cos6/python_1622837047642/work/Objects/call.c:159
  12: PyCFuncPtr_call
        at /usr/local/src/conda/python-3.8.10/Modules/_ctypes/_ctypes.c:4201
  11: _ctypes_callproc
        at /usr/local/src/conda/python-3.8.10/Modules/_ctypes/callproc.c:1264
  10: _call_function_pointer
        at /usr/local/src/conda/python-3.8.10/Modules/_ctypes/callproc.c:921
  9: ffi_call_int
  8: ffi_call_unix64
  7: TVMArrayCopyFromBytes
  6: tvm::runtime::ArrayCopyFromBytes(DLTensor*, void const*, unsigned long)
  5: tvm::runtime::RPCDeviceAPI::CopyDataFromTo(DLTensor*, DLTensor*, void*)
  4: tvm::runtime::RPCClientSession::CopyToRemote(void*, DLTensor*, unsigned long)
  3: tvm::runtime::RPCEndpoint::CopyToRemote(void*, DLTensor*, unsigned long)
  2: tvm::runtime::RPCEndpoint::HandleUntilReturnEvent(bool, std::function<void (tvm::runtime::TVMArgs)>)
  1: tvm::runtime::SockChannel::Send(void const*, unsigned long)
  0: tvm::support::Socket::Error(char const*)
  File "/media/masaaki/Ubuntu_Disk/DNN/tvm/src/runtime/rpc/../../support/socket.h", line 362
TVMError: Socket SockChannel::Send Error:No route to host


PYNQ-Z1 のターミナルの表示を示す。
TVM_VTA_107_220626.png

xilinx@pynq:~/tvm$ sudo ./apps/vta_rpc/start_rpc_server.sh
[sudo] password for xilinx: 
INFO:RPCServer:bind to 0.0.0.0:9091
INFO:RPCServer:connection from ('192.168.3.10', 32880)
INFO:root:Program FPGA with 4x16_i8w8a32_15_15_18_17.bit 
INFO:RPCServer:Finish serving ('192.168.3.10', 32880)
INFO:RPCServer:connection from ('192.168.3.10', 32898)
INFO:root:Skip reconfig_runtime due to same config.
INFO:RPCServer:Finish serving ('192.168.3.10', 32898)
INFO:RPCServer:connection from ('192.168.3.10', 32912)
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmpwkvrv8yf/conv2d_transpose.o
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmpwkvrv8yf/conv2d_transpose.o


次は、ホスト・パソコンの tvm/3rdparty/vta-hw/config/vta_config.json の "LOG_BATCH" を 0 でやってみよう。
  1. 2022年06月28日 03:37 |
  2. TVM_VTA
  3. | トラックバック:0
  4. | コメント:0

TVM/VTA チュートリアルをやってみる1

今までは、tvm/vta/tests/python/integration/test_benchmark_gemm.py をやってきたが、その他にも 4 個のチュートリアルがあるので、それをやってみよう。
最初に、test_benchmark_topi_conv2d.py をやってみる。

tvm/vta/tests/python/integration ディレクトリの 4 個のチュートリアルを示す。
TVM_VTA_108_220627.png

環境は、”フィックスターズさんの”実践的!FPGA開発セミナー vol.10”の”Versatile Tensor Accelerator (VTA) 実機検証”をやってみる12”そのままで、PYNQ-Z1 とホスト・パソコンの tvm/3rdparty/vta-hw/config/vta_config.json の "LOG_BATCH" は 2 となっている。

ホスト・パソコンの tvm/3rdparty/vta-hw/build/hardware/xilinx/vivado/pynq_2x16_i8w8a32_15_15_18_17/export/pynq/0_0_2 ディレクトリ に tvm/3rdparty/vta-hw/build/hardware/xilinx/vivado/pynq_4x16_i8w8a32_15_15_18_17/export/vta.bit をコピーして、4x16_i8w8a32_15_15_18_17.bit に名前を変更済みだ。

ホスト・パソコンで、VTA_CACHE_PATH はすでに設定してある。
export VTA_CACHE_PATH=/media/masaaki/Ubuntu_Disk/DNN/tvm/3rdparty/vta-hw/build/hardware/xilinx/vivado/pynq_2x16_i8w8a32_15_15_18_17/export

ホスト・パソコンで環境変数を設定するのだが、すでに設定されているので、やっていない。(ディレクトリは tvm)
export PYTHONPATH=$PYTHONPATH:/media/masaaki/Ubuntu_Disk/DNN/tvm/python:/media/masaaki/Ubuntu_Disk/DNN/tvm/vta/python
export VTA_RPC_HOST=192.168.3.31
export VTA_RPC_PORT=9091

PYNQ-Z1 の ~/tvm ディレクトリで RPC サーバーを起動する。
sudo ./apps/vta_rpc/start_rpc_server.sh

ホスト・パソコン(Ubuntu 18.04 LTS)で test_program_rpc.py を起動した。
python3 vta/tests/python/pynq/test_program_rpc.py

ホスト・パソコンで test_benchmark_topi_conv2d.py を実行した。
python3 vta/tests/python/integration/test_benchmark_topi_conv2d.py
コアダンプしてしまった。
TVM_VTA_102_220626.png
TVM_VTA_103_220626.png

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/DNN/tvm$ python3 vta/tests/python/integration/test_benchmark_topi_conv2d.py
Conv2DWorkload(batch=4, height=56, width=56, in_filter=64, out_filter=64, hkernel=3, wkernel=3, hpad=1, wpad=1, hstride=1, wstride=1)
Cannot find config for target=llvm -keys=arm_cpu,cpu -device=arm_cpu -link-params=0 -mattr=+neon -model=pynq -mtriple=armv7a-linux-eabi, workload=('conv2d_nchw_spatial_pack.arm_cpu', ('TENSOR', (4, 64, 56, 56), 'int8'), ('TENSOR', (64, 64, 3, 3), 'int8'), (1, 1), (1, 1, 1, 1), (1, 1), 'int32'). A fallback configuration is used, which may bring great performance regression.
/media/masaaki/Ubuntu_Disk/DNN/tvm/python/tvm/driver/build_module.py:263: UserWarning: target_host parameter is going to be deprecated. Please pass in tvm.target.Target(target, host=target_host) instead.
  warnings.warn(
CPU CONV2D TEST PASSED: Time cost = 1.07412 sec/op, 0.861024 GOPS
Conv2DWorkload(batch=4, height=56, width=56, in_filter=64, out_filter=128, hkernel=3, wkernel=3, hpad=1, wpad=1, hstride=2, wstride=2)
Cannot find config for target=llvm -keys=arm_cpu,cpu -device=arm_cpu -link-params=0 -mattr=+neon -model=pynq -mtriple=armv7a-linux-eabi, workload=('conv2d_nchw_spatial_pack.arm_cpu', ('TENSOR', (4, 64, 56, 56), 'int8'), ('TENSOR', (128, 64, 3, 3), 'int8'), (2, 2), (1, 1, 1, 1), (1, 1), 'int32'). A fallback configuration is used, which may bring great performance regression.
CPU CONV2D TEST PASSED: Time cost = 0.301574 sec/op, 1.53336 GOPS
Conv2DWorkload(batch=4, height=56, width=56, in_filter=64, out_filter=128, hkernel=1, wkernel=1, hpad=0, wpad=0, hstride=2, wstride=2)
Cannot find config for target=llvm -keys=arm_cpu,cpu -device=arm_cpu -link-params=0 -mattr=+neon -model=pynq -mtriple=armv7a-linux-eabi, workload=('conv2d_nchw_spatial_pack.arm_cpu', ('TENSOR', (4, 64, 56, 56), 'int8'), ('TENSOR', (128, 64, 1, 1), 'int8'), (2, 2), (0, 0, 0, 0), (1, 1), 'int32'). A fallback configuration is used, which may bring great performance regression.
CPU CONV2D TEST PASSED: Time cost = 0.0260106 sec/op, 1.97536 GOPS
Conv2DWorkload(batch=4, height=28, width=28, in_filter=128, out_filter=128, hkernel=3, wkernel=3, hpad=1, wpad=1, hstride=1, wstride=1)
Cannot find config for target=llvm -keys=arm_cpu,cpu -device=arm_cpu -link-params=0 -mattr=+neon -model=pynq -mtriple=armv7a-linux-eabi, workload=('conv2d_nchw_spatial_pack.arm_cpu', ('TENSOR', (4, 128, 28, 28), 'int8'), ('TENSOR', (128, 128, 3, 3), 'int8'), (1, 1), (1, 1, 1, 1), (1, 1), 'int32'). A fallback configuration is used, which may bring great performance regression.
CPU CONV2D TEST PASSED: Time cost = 0.627201 sec/op, 1.47456 GOPS
Conv2DWorkload(batch=4, height=28, width=28, in_filter=128, out_filter=256, hkernel=3, wkernel=3, hpad=1, wpad=1, hstride=2, wstride=2)
Cannot find config for target=llvm -keys=arm_cpu,cpu -device=arm_cpu -link-params=0 -mattr=+neon -model=pynq -mtriple=armv7a-linux-eabi, workload=('conv2d_nchw_spatial_pack.arm_cpu', ('TENSOR', (4, 128, 28, 28), 'int8'), ('TENSOR', (256, 128, 3, 3), 'int8'), (2, 2), (1, 1, 1, 1), (1, 1), 'int32'). A fallback configuration is used, which may bring great performance regression.
CPU CONV2D TEST PASSED: Time cost = 0.20858 sec/op, 2.217 GOPS
Conv2DWorkload(batch=4, height=28, width=28, in_filter=128, out_filter=256, hkernel=1, wkernel=1, hpad=0, wpad=0, hstride=2, wstride=2)
Cannot find config for target=llvm -keys=arm_cpu,cpu -device=arm_cpu -link-params=0 -mattr=+neon -model=pynq -mtriple=armv7a-linux-eabi, workload=('conv2d_nchw_spatial_pack.arm_cpu', ('TENSOR', (4, 128, 28, 28), 'int8'), ('TENSOR', (256, 128, 1, 1), 'int8'), (2, 2), (0, 0, 0, 0), (1, 1), 'int32'). A fallback configuration is used, which may bring great performance regression.
CPU CONV2D TEST PASSED: Time cost = 0.0400033 sec/op, 1.2844 GOPS
Conv2DWorkload(batch=4, height=14, width=14, in_filter=256, out_filter=256, hkernel=3, wkernel=3, hpad=1, wpad=1, hstride=1, wstride=1)
Cannot find config for target=llvm -keys=arm_cpu,cpu -device=arm_cpu -link-params=0 -mattr=+neon -model=pynq -mtriple=armv7a-linux-eabi, workload=('conv2d_nchw_spatial_pack.arm_cpu', ('TENSOR', (4, 256, 14, 14), 'int8'), ('TENSOR', (256, 256, 3, 3), 'int8'), (1, 1), (1, 1, 1, 1), (1, 1), 'int32'). A fallback configuration is used, which may bring great performance regression.
Traceback (most recent call last):
  File "vta/tests/python/integration/test_benchmark_topi_conv2d.py", line 317, in <module>
    test_conv2d(device="arm_cpu")
  File "vta/tests/python/integration/test_benchmark_topi_conv2d.py", line 313, in test_conv2d
    vta.testing.run(_run)
  File "/media/masaaki/Ubuntu_Disk/DNN/tvm/vta/python/vta/testing/utils.py", line 74, in run
    run_func(env, remote)
  File "vta/tests/python/integration/test_benchmark_topi_conv2d.py", line 311, in _run
    run_conv2d(env, remote, wl, target)
  File "vta/tests/python/integration/test_benchmark_topi_conv2d.py", line 236, in run_conv2d
    remote.upload(temp.relpath("conv2d.o"))
  File "/media/masaaki/Ubuntu_Disk/DNN/tvm/python/tvm/rpc/client.py", line 115, in upload
    self._remote_funcs["upload"](target, blob)
  File "/media/masaaki/Ubuntu_Disk/DNN/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
tvm._ffi.base.TVMError: std: :bad_alloc
terminate called without an active exception
中止 (コアダンプ)


PYNQ-Z1 のターミナルの表示を示す。
TVM_VTA_104_220626.png

xilinx@pynq:~/tvm$ sudo ./apps/vta_rpc/start_rpc_server.sh
[sudo] password for xilinx: 
INFO:RPCServer:bind to 0.0.0.0:9091
INFO:RPCServer:connection from ('192.168.3.10', 60956)
INFO:root:Program FPGA with 4x16_i8w8a32_15_15_18_17.bit 
INFO:RPCServer:Finish serving ('192.168.3.10', 60956)
INFO:RPCServer:connection from ('192.168.3.10', 60958)
INFO:root:Skip reconfig_runtime due to same config.
INFO:RPCServer:Finish serving ('192.168.3.10', 60958)
INFO:RPCServer:connection from ('192.168.3.10', 60968)
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmp9742g63u/conv2d.o
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmp9742g63u/conv2d.o
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmp9742g63u/conv2d.o
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmp9742g63u/conv2d.o
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmp9742g63u/conv2d.o
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmp9742g63u/conv2d.o

  1. 2022年06月27日 05:39 |
  2. TVM_VTA
  3. | トラックバック:0
  4. | コメント:0

フィックスターズさんの”実践的!FPGA開発セミナー vol.10”の”Versatile Tensor Accelerator (VTA) 実機検証”をやってみる12

フィックスターズさんの”実践的!FPGA開発セミナー vol.10”の”Versatile Tensor Accelerator (VTA) 実機検証”をやってみる11”の続き。

フィックスターズさんの”実践的!FPGA開発セミナー vol.10”の”TVM/VTA の仕組みから学ぶ (第二回) : Versatile Tensor Accelerator (VTA)実機検証”をやってみたいと思っていた。フィックスターズさんから”実践的!FPGA開発セミナー vol.10”の資料をいただいたので、やってみることにした。フィックスターズ様、資料を公開していただいてありがとうございました。

前回は、pynq_2x16_i8w8a32_15_15_18_17 を実行した所、紆余曲折はあったが成功した。今回は、pynq_4x16_i8w8a32_15_15_18_17 をやってみよう。

PYNQ-Z1 の tvm/3rdparty/vta-hw/config/vta_config.json の "LOG_BATCH" を 2 に変更した。
TVM_VTA_96_220625.png

~/tvm/build ディレクトリで cmake を行った。
cmake ..
TVM_VTA_97_220625.png

make を行った。
make runtime vta -j2
TVM_VTA_98_220625.png

ホスト・パソコンの tvm/3rdparty/vta-hw/config/vta_config.json の "LOG_BATCH" を 2 に変更した。
TVM_VTA_93_220625.png

ホスト・パソコンの tvm/3rdparty/vta-hw/build/hardware/xilinx/vivado/pynq_2x16_i8w8a32_15_15_18_17/export/pynq/0_0_2 ディレクトリ に tvm/3rdparty/vta-hw/build/hardware/xilinx/vivado/pynq_4x16_i8w8a32_15_15_18_17/export/vta.bit をコピーして、4x16_i8w8a32_15_15_18_17.bit に名前を変更した。
TVM_VTA_99_220625.png

ホスト・パソコンで、VTA_CACHE_PATH はすでに設定してある。
export VTA_CACHE_PATH=/media/masaaki/Ubuntu_Disk/DNN/tvm/3rdparty/vta-hw/build/hardware/xilinx/vivado/pynq_2x16_i8w8a32_15_15_18_17/export

ホスト・パソコンで環境変数を設定するのだが、すでに設定されているので、やっていない。(ディレクトリは tvm)
export PYTHONPATH=$PYTHONPATH:/media/masaaki/Ubuntu_Disk/DNN/tvm/python:/media/masaaki/Ubuntu_Disk/DNN/tvm/vta/python
export VTA_RPC_HOST=192.168.3.31
export VTA_RPC_PORT=9091


PYNQ-Z1 の ~/tvm ディレクトリで RPC サーバーを起動する。
sudo ./apps/vta_rpc/start_rpc_server.sh

ホスト・パソコン(Ubuntu 18.04 LTS)で test_program_rpc.py を起動した。
python3 vta/tests/python/pynq/test_program_rpc.py

ホスト・パソコンで test_benchmark_gemm.py を実行した。
python3 vta/tests/python/integration/test_benchmark_gemm.py
成功した。
TVM_VTA_100_220625.png

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/DNN/tvm$ python3 vta/tests/python/integration/test_benchmark_gemm.py
========GEMM 128=========
----- GEMM GOPS End-to-End Test-------
[08:33:44] /media/masaaki/Ubuntu_Disk/DNN/tvm/src/tir/transforms/arg_binder.cc:95: Warning: Trying to bind buffer to another one with lower alignment requirement  required_alignment=256, provided_alignment=128
/media/masaaki/Ubuntu_Disk/DNN/tvm/python/tvm/driver/build_module.py:263: UserWarning: target_host parameter is going to be deprecated. Please pass in tvm.target.Target(target, host=target_host) instead.
  warnings.warn(
NORMAL
    Time cost = 0.000112617 sec/op, 37.2441 GOPS
----- GEMM Unit Test-------
[08:33:45] /media/masaaki/Ubuntu_Disk/DNN/tvm/src/tir/transforms/arg_binder.cc:95: Warning: Trying to bind buffer to another one with lower alignment requirement  required_alignment=256, provided_alignment=128
NORMAL
    Time cost = 8.01812e-05 sec/op, 52.3103 GOPS
----- ALU Unit Test-------
[08:33:45] /media/masaaki/Ubuntu_Disk/DNN/tvm/src/tir/transforms/arg_binder.cc:95: Warning: Trying to bind buffer to another one with lower alignment requirement  required_alignment=256, provided_alignment=128
NORMAL
    Time cost = 8.0531e-05 sec/op, 52.0831 GOPS


PYNQ-Z1 の表示を示す。
TVM_VTA_101_220625.png

xilinx@pynq:~/tvm$ sudo ./apps/vta_rpc/start_rpc_server.sh
[sudo] password for xilinx: 
INFO:RPCServer:bind to 0.0.0.0:9091
INFO:RPCServer:connection from ('192.168.3.10', 48668)
INFO:root:Program FPGA with 4x16_i8w8a32_15_15_18_17.bit 
INFO:RPCServer:Finish serving ('192.168.3.10', 48668)
INFO:RPCServer:connection from ('192.168.3.10', 48670)
INFO:root:Skip reconfig_runtime due to same config.
INFO:RPCServer:Finish serving ('192.168.3.10', 48670)
INFO:RPCServer:connection from ('192.168.3.10', 48672)
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmpgrsttaur/gemm.o
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmpgrsttaur/gemm.o
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmpgrsttaur/gemm.o
INFO:RPCServer:Finish serving ('192.168.3.10', 48672)

  1. 2022年06月26日 04:00 |
  2. TVM_VTA
  3. | トラックバック:0
  4. | コメント:0

フィックスターズさんの”実践的!FPGA開発セミナー vol.10”の”Versatile Tensor Accelerator (VTA) 実機検証”をやってみる11

フィックスターズさんの”実践的!FPGA開発セミナー vol.10”の”Versatile Tensor Accelerator (VTA) 実機検証”をやってみる10”の続き。

フィックスターズさんの”実践的!FPGA開発セミナー vol.10”の”TVM/VTA の仕組みから学ぶ (第二回) : Versatile Tensor Accelerator (VTA)実機検証”をやってみたいと思っていた。フィックスターズさんから”実践的!FPGA開発セミナー vol.10”の資料をいただいたので、やってみることにした。フィックスターズ様、資料を公開していただいてありがとうございました。

前回は、tvm/build/CMakeFiles/vta.dir/link.txt を実行してから、再々度、RPCを使ってVTA上でニューラルネットワークを実行することができた。成功だ。ここで動作したのは、pynq_1x16_i8w8a32_15_15_18_17 だった。今回は、pynq_2x16_i8w8a32_15_15_18_17 をやってみようと思う。

最初にホスト・パソコンの twm/3rdparty/vta-hw/config/vta_config.json の "LOG_BATCH" を 1 に変更した。
TVM_VTA_86_220625.png

これで、ホスト・パソコンで以下を実行した。環境変数の設定に関しては、前回やってあるので省略した。
RPCを使ってVTA上でニューラルネットワークを実行する。
PYNQ-Z1 の ~/tvm ディレクトリで RPC サーバーを起動する。
sudo ./apps/vta_rpc/start_rpc_server.sh

ホスト・パソコンで環境変数を設定した。(ディレクトリは tvm)
export PYTHONPATH=$PYTHONPATH:/media/masaaki/Ubuntu_Disk/DNN/tvm/python:/media/masaaki/Ubuntu_Disk/DNN/tvm/vta/python
export VTA_RPC_HOST=192.168.3.31
export VTA_RPC_PORT=9091


ホスト・パソコン(Ubuntu 18.04 LTS)で test_program_rpc.py を起動した。
python3 vta/tests/python/pynq/test_program_rpc.py
エラーになった。
TVM_VTA_87_220625.png
TVM_VTA_88_220625.png

RuntimeError: https://github.com/uwsampl/vta-distro/raw/master/bitstreams/pynq/0.0.2/2x16_i8w8a32_15_15_18_17.bit is not available

このサイトに 2x16_i8w8a32_15_15_18_17.bit が無いということか?というと、もしかして、このサイトの 1x16_i8w8a32_15_15_18_17.bit を前回使用したのか?
TVM_VTA_94_220625.png

これを避けるには、VTA_CACHE_PATH 環境変数を設定する必要がありそうだ。
その前に、PYNQ-Z1 の "LOG_BATCH" を 1 に変更する必要があるだろう?ということで、やっていこう。

PYNQ-Z1 の twm/3rdparty/vta-hw/config/vta_config.json の "LOG_BATCH" を 1 に変更した。
TVM_VTA_89_220625.png

~/tvm/build ディレクトリで cmake を行った。
cmake ..
TVM_VTA_90_220625.png

xilinx@pynq:~/tvm/build$ cmake ..
-- Forbidding undefined symbols in shared library, using -Wl,--no-undefined on platform Linux
-- Build with RPC support...
-- Build with Graph Executor support...
-- Build with profiler...
-- Build with AOT Executor support...
-- Could NOT find GTest (missing: GTEST_LIBRARY GTEST_INCLUDE_DIR GTEST_MAIN_LIBRARY) 
-- VTA build with VTA_HW_PATH=/home/xilinx/tvm/3rdparty/vta-hw
-- Build VTA runtime with target: pynq
-- Build with contrib.random
-- Build with contrib.sort
-- Build with contrib.hybriddump
-- Git found: /usr/bin/git
-- Found TVM_GIT_COMMIT_HASH=27b0aad5a55254815a076dbcacb53e9725019f9d
-- Found TVM_GIT_COMMIT_TIME=2022-06-14 19:30:28 +0900
-- Autoset: USE_LIBBACKTRACE=ON in Linux
-- Building with libbacktrace...
-- Building with TVM Map...
-- Build with thread support...
-- Configuring done
-- Generating done
-- Build files have been written to: /home/xilinx/tvm/build


make を行った。
make runtime vta -j2
TVM_VTA_91_220625.png

ホスト・パソコンで、VTA_CACHE_PATH を設定した。
export VTA_CACHE_PATH=/media/masaaki/Ubuntu_Disk/DNN/tvm/3rdparty/vta-hw/build/hardware/xilinx/vivado/pynq_2x16_i8w8a32_15_15_18_17/export

ホスト・パソコンで環境変数を設定するのだが、すでに設定されているので、やっていない。(ディレクトリは tvm)
export PYTHONPATH=$PYTHONPATH:/media/masaaki/Ubuntu_Disk/DNN/tvm/python:/media/masaaki/Ubuntu_Disk/DNN/tvm/vta/python
export VTA_RPC_HOST=192.168.3.31
export VTA_RPC_PORT=9091


PYNQ-Z1 の ~/tvm ディレクトリで RPC サーバーを起動する。
sudo ./apps/vta_rpc/start_rpc_server.sh

ホスト・パソコン(Ubuntu 18.04 LTS)で test_program_rpc.py を起動した。
python3 vta/tests/python/pynq/test_program_rpc.py
同じエラーで失敗した。

ホスト・パソコンの tvm/3rdparty/vta-hw/build/hardware/xilinx/vivado/pynq_2x16_i8w8a32_15_15_18_17/export に下に、pynq/0_0_2 ディレクトリができた。
このディレクトリの下に tvm/3rdparty/vta-hw/build/hardware/xilinx/vivado/pynq_2x16_i8w8a32_15_15_18_17/export/vta.bit をコピーして、2x16_i8w8a32_15_15_18_17.bit に名前を変更した。
TVM_VTA_95_220625.png

PYNQ-Z1 の ~/tvm ディレクトリで RPC サーバーを起動する。
sudo ./apps/vta_rpc/start_rpc_server.sh

ホスト・パソコン(Ubuntu 18.04 LTS)で test_program_rpc.py を起動した。
python3 vta/tests/python/pynq/test_program_rpc.py
成功した。

ホスト・パソコンで test_benchmark_gemm.py を実行した。
python3 vta/tests/python/integration/test_benchmark_gemm.py
成功した。
TVM_VTA_92_220625.png

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/DNN/tvm$ python3 vta/tests/python/integration/test_benchmark_gemm.py
========GEMM 128=========
----- GEMM GOPS End-to-End Test-------
[04:55:33] /media/masaaki/Ubuntu_Disk/DNN/tvm/src/tir/transforms/arg_binder.cc:95: Warning: Trying to bind buffer to another one with lower alignment requirement  required_alignment=256, provided_alignment=128
/media/masaaki/Ubuntu_Disk/DNN/tvm/python/tvm/driver/build_module.py:263: UserWarning: target_host parameter is going to be deprecated. Please pass in tvm.target.Target(target, host=target_host) instead.
  warnings.warn(
NORMAL
 Time cost = 0.000163101 sec/op, 25.7161 GOPS
----- GEMM Unit Test-------
[04:55:34] /media/masaaki/Ubuntu_Disk/DNN/tvm/src/tir/transforms/arg_binder.cc:95: Warning: Trying to bind buffer to another one with lower alignment requirement  required_alignment=256, provided_alignment=128
NORMAL
 Time cost = 8.06747e-05 sec/op, 51.9903 GOPS
----- ALU Unit Test-------
[04:55:35] /media/masaaki/Ubuntu_Disk/DNN/tvm/src/tir/transforms/arg_binder.cc:95: Warning: Trying to bind buffer to another one with lower alignment requirement  required_alignment=256, provided_alignment=128
NORMAL
 Time cost = 8.25765e-05 sec/op, 50.7929 GOPS


PYNQ-Z1 の表示を示す。

xilinx@pynq:~/tvm$ sudo ./apps/vta_rpc/start_rpc_server.sh
INFO:RPCServer:bind to 0.0.0.0:9091
^[[AINFO:RPCServer:connection from ('192.168.3.10', 47570)
INFO:root:Program FPGA with 2x16_i8w8a32_15_15_18_17.bit 
INFO:RPCServer:Finish serving ('192.168.3.10', 47570)
INFO:RPCServer:connection from ('192.168.3.10', 47572)
INFO:root:Skip reconfig_runtime due to same config.
INFO:RPCServer:Finish serving ('192.168.3.10', 47572)
INFO:RPCServer:connection from ('192.168.3.10', 47574)
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmpn3nef_yo/gemm.o
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmpn3nef_yo/gemm.o
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmpn3nef_yo/gemm.o
INFO:RPCServer:Finish serving ('192.168.3.10', 47574)

  1. 2022年06月25日 06:24 |
  2. TVM_VTA
  3. | トラックバック:0
  4. | コメント:0

フィックスターズさんの”実践的!FPGA開発セミナー vol.10”の”Versatile Tensor Accelerator (VTA) 実機検証”をやってみる10

フィックスターズさんの”実践的!FPGA開発セミナー vol.10”の”Versatile Tensor Accelerator (VTA) 実機検証”をやってみる9”の続き。

フィックスターズさんの”実践的!FPGA開発セミナー vol.10”の”TVM/VTA の仕組みから学ぶ (第二回) : Versatile Tensor Accelerator (VTA)実機検証”をやってみたいと思っていた。フィックスターズさんから”実践的!FPGA開発セミナー vol.10”の資料をいただいたので、やってみることにした。フィックスターズ様、資料を公開していただいてありがとうございました。

前回は、再度、RPCを使ってVTA上でニューラルネットワークを実行しようとしたのだが、PYNQ-Z1 側で”libvta.so: undefined symbol: VTARuntimeShutdown”になってしまった。今回は、tvm/build/CMakeFiles/vta.dir/link.txt を実行してから、再々度、RPCを使ってVTA上でニューラルネットワークを実行することができた。成功だ。

まずは、”libvta.so: undefined symbol: VTARuntimeShutdown”のエラーだが、検索すると、”Error: VTARuntimeShutdown symbol is undefined”がヒットした。

それによると、PYNQ-Z1 上で tvm/build/CMakeFiles/vta.dir/link.txt を実行するそうだ。
最初、tvm/build/CMakeFiles/vta.dir/link.txt の中身をコマンドラインにコピー&ペーストして、やってみたが、うまく行かなかったので、tvm/build/CMakeFiles/vta.dir/link.txt に実行のパーミッションを追加して、直接実行した。
xilinx@pynq:~/tvm/build/CMakeFiles/vta.dir$ more link.txt
/usr/bin/c++ -fPIC -std=c++14 -faligned-new -O2 -Wall -fPIC   -shared -Wl,-sonam
e,libvta.so -o libvta.so CMakeFiles/vta.dir/vta/runtime/device_api.cc.o CMakeFil
es/vta.dir/vta/runtime/runtime.cc.o CMakeFiles/vta.dir/3rdparty/vta-hw/src/pynq/
pynq_driver.cc.o -lcma 

xilinx@pynq:~/tvm/build$ chmod +x CMakeFiles/vta.dir/link.txt
xilinx@pynq:~/tvm/build$ CMakeFiles/vta.dir/link.txt
TVM_VTA_82_220623.png

libvta.so が更新されていた。
TVM_VTA_83_220623.png

再々度、RPCを使ってVTA上でニューラルネットワークを実行する。
PYNQ-Z1 の ~/tvm ディレクトリで RPC サーバーを起動する。
sudo ./apps/vta_rpc/start_rpc_server.sh

ホスト・パソコンで環境変数を設定した。(ディレクトリは tvm)
export PYTHONPATH=$PYTHONPATH:/media/masaaki/Ubuntu_Disk/DNN/tvm/python:/media/masaaki/Ubuntu_Disk/DNN/tvm/vta/python
export VTA_RPC_HOST=192.168.3.31
export VTA_RPC_PORT=9091


ホスト・パソコン(Ubuntu 18.04 LTS)で test_program_rpc.py を起動した。
python3 vta/tests/python/pynq/test_program_rpc.py

ホスト・パソコンで test_benchmark_gemm.py を実行した。
python3 vta/tests/python/integration/test_benchmark_gemm.py
成功だ。ベンチマーク結果が表示された。
TVM_VTA_84_220623.png

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/DNN/tvm$ python3 vta/tests/python/integration/test_benchmark_gemm.py
========GEMM 128=========
----- GEMM GOPS End-to-End Test-------
[21:52:57] /media/masaaki/Ubuntu_Disk/DNN/tvm/src/tir/transforms/arg_binder.cc:95: Warning: Trying to bind buffer to another one with lower alignment requirement  required_alignment=256, provided_alignment=128
/media/masaaki/Ubuntu_Disk/DNN/tvm/python/tvm/driver/build_module.py:263: UserWarning: target_host parameter is going to be deprecated. Please pass in tvm.target.Target(target, host=target_host) instead.
  warnings.warn(
NORMAL
 Time cost = 0.000262097 sec/op, 16.0029 GOPS
----- GEMM Unit Test-------
[21:52:57] /media/masaaki/Ubuntu_Disk/DNN/tvm/src/tir/transforms/arg_binder.cc:95: Warning: Trying to bind buffer to another one with lower alignment requirement  required_alignment=256, provided_alignment=128
NORMAL
 Time cost = 0.000107166 sec/op, 39.1384 GOPS
----- ALU Unit Test-------
[21:52:58] /media/masaaki/Ubuntu_Disk/DNN/tvm/src/tir/transforms/arg_binder.cc:95: Warning: Trying to bind buffer to another one with lower alignment requirement  required_alignment=256, provided_alignment=128
NORMAL
 Time cost = 8.17991e-05 sec/op, 51.2757 GOPS


PYNQ-Z1 の表示を示す。
TVM_VTA_85_220623.png

INFO:RPCServer:bind to 0.0.0.0:9091
INFO:RPCServer:connection from ('192.168.3.10', 44642)
INFO:root:Program FPGA with 1x16_i8w8a32_15_15_18_17.bit 
INFO:RPCServer:Finish serving ('192.168.3.10', 44642)
INFO:RPCServer:connection from ('192.168.3.10', 44644)
INFO:root:Skip reconfig_runtime due to same config.
INFO:RPCServer:Finish serving ('192.168.3.10', 44644)
INFO:RPCServer:connection from ('192.168.3.10', 44654)
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmp88sv43s5/gemm.o
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmp88sv43s5/gemm.o
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmp88sv43s5/gemm.o
INFO:RPCServer:Finish serving ('192.168.3.10', 44654)


フィックスターズさんの”実践的!FPGA開発セミナー vol.10”の”Versatile Tensor Accelerator (VTA) 実機検証”をやってみる6”で tvm/3rdparty/vta-hw/config/vta_config.json の "LOG_BATCH" を 0 に指定して、PYNQ 1x16 を選択していたので、その値のようだ。

なお、ベンチマークは128 * 128 行列演算 shitf + clip で、
GEMM(行列乗算)演算のみ
ALU演算のみ
End to End(DMA含む)
の演算を測定するそうだ。
  1. 2022年06月24日 04:11 |
  2. TVM_VTA
  3. | トラックバック:0
  4. | コメント:0

フィックスターズさんの”実践的!FPGA開発セミナー vol.10”の”Versatile Tensor Accelerator (VTA) 実機検証”をやってみる9

フィックスターズさんの”実践的!FPGA開発セミナー vol.10”の”Versatile Tensor Accelerator (VTA) 実機検証”をやってみる8”の続き。

フィックスターズさんの”実践的!FPGA開発セミナー vol.10”の”TVM/VTA の仕組みから学ぶ (第二回) : Versatile Tensor Accelerator (VTA)実機検証”をやってみたいと思っていた。フィックスターズさんから”実践的!FPGA開発セミナー vol.10”の資料をいただいたので、やってみることにした。フィックスターズ様、資料を公開していただいてありがとうございました。

前回は、tvm の Docs > Installing TVM > Install from Source に従って LLVM を使用して、cmake, make を行って成功した。今回は、再度、RPCを使ってVTA上でニューラルネットワークを実行しようとしたのだが、PYNQ-Z1 側で”libvta.so: undefined symbol: VTARuntimeShutdown”になってしまった。

PYNQ-Z1 の ~/tvm ディレクトリで RPC サーバーを起動する。
sudo ./apps/vta_rpc/start_rpc_server.sh

ホスト・パソコンで環境変数を設定した。(ディレクトリは tvm)
export PYTHONPATH=$PYTHONPATH:/media/masaaki/Ubuntu_Disk/DNN/tvm/python:/media/masaaki/Ubuntu_Disk/DNN/tvm/vta/python
export VTA_RPC_HOST=192.168.3.31
export VTA_RPC_PORT=9091


test_program_rpc.py を起動した。
python3 vta/tests/python/pynq/test_program_rpc.py

268: TVM_LOG_DEBUG ill-formed at position 16: invalid level: "1;relay/ir/transform.cc=1"

のエラーが発生した。

これは、前回設定した環境変数の TVM_LOG_DEBUG が悪さをしているようなので、これを消去した。
export -n TVM_LOG_DEBUG

もう一度、test_program_rpc.py を起動した。
python3 vta/tests/python/pynq/test_program_rpc.py
今度は成功した。
TVM_VTA_77_220622.png

PYNQ-Z1 の表示を示す。
TVM_VTA_78_220622.png

test_benchmark_gemm.py を実行した。
python3 vta/tests/python/integration/test_benchmark_gemm.py
エラーが発生した。
TVM_VTA_79_220622.png
TVM_VTA_80_220622.png

PYNQ-Z1 側の表示を示す。

AttributeError: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so: undefined symbol: VTARuntimeShutdown

エラーが発生した。
TVM_VTA_81_220622.png
TVM_VTA_82_220622.png

test_benchmark_gemm.py 実行時の全表示を示す。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/DNN/tvm$ python3 vta/tests/python/integration/test_benchmark_gemm.py
========GEMM 128=========
----- GEMM GOPS End-to-End Test-------
[21:39:13] /media/masaaki/Ubuntu_Disk/DNN/tvm/src/tir/transforms/arg_binder.cc:95: Warning: Trying to bind buffer to another one with lower alignment requirement  required_alignment=256, provided_alignment=128
/media/masaaki/Ubuntu_Disk/DNN/tvm/python/tvm/driver/build_module.py:263: UserWarning: target_host parameter is going to be deprecated. Please pass in tvm.target.Target(target, host=target_host) instead.
  warnings.warn(
Traceback (most recent call last):
  File "vta/tests/python/integration/test_benchmark_gemm.py", line 287, in <module>
    test_gemm()
  File "vta/tests/python/integration/test_benchmark_gemm.py", line 283, in test_gemm
    vta.testing.run(_run)
  File "/media/masaaki/Ubuntu_Disk/DNN/tvm/vta/python/vta/testing/utils.py", line 74, in run
    run_func(env, remote)
  File "vta/tests/python/integration/test_benchmark_gemm.py", line 281, in _run
    run_gemm_packed(env, remote, 128, 128, 128)
  File "vta/tests/python/integration/test_benchmark_gemm.py", line 275, in run_gemm_packed
    gemm_normal(False)
  File "vta/tests/python/integration/test_benchmark_gemm.py", line 182, in gemm_normal
    run_test("NORMAL", print_ir)
  File "vta/tests/python/integration/test_benchmark_gemm.py", line 169, in run_test
    cost = run_schedule(
  File "vta/tests/python/integration/test_benchmark_gemm.py", line 162, in run_schedule
    return verify(s)
  File "vta/tests/python/integration/test_benchmark_gemm.py", line 85, in verify
    data_arr = tvm.nd.array(data_packed, dev)
  File "/media/masaaki/Ubuntu_Disk/DNN/tvm/python/tvm/runtime/ndarray.py", line 598, in array
    return empty(arr.shape, arr.dtype, device).copyfrom(arr)
  File "/media/masaaki/Ubuntu_Disk/DNN/tvm/python/tvm/runtime/ndarray.py", line 357, in empty
    arr = _ffi_api.TVMArrayAllocWithScope(shape, dtype, device, mem_scope)
  File "/media/masaaki/Ubuntu_Disk/DNN/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
tvm.error.RPCError: Traceback (most recent call last):
  10: TVMFuncCall
  9: _ZN3tvm7runtime13PackedFun
  8: tvm::runtime::TypedPackedFunc<tvm::runtime::NDArray (tvm::runtime::ShapeTuple, DLDataType, DLDevice, tvm::runtime::Optional<tvm::runtime::String>)>::AssignTypedLambda<tvm::runtime::NDArray (*)(tvm::runtime::ShapeTuple, DLDataType, DLDevice, tvm::runtime::Optional<tvm::runtime::String>)>(tvm::runtime::NDArray (*)(tvm::runtime::ShapeTuple, DLDataType, DLDevice, tvm::runtime::Optional<tvm::runtime::String>), std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)::{lambda(tvm::runtime::TVMArgs const&, tvm::runtime::TVMRetValue*)#1}::operator()(tvm::runtime::TVMArgs const&, tvm::runtime::TVMRetValue*) const
  7: tvm::runtime::NDArray::Empty(tvm::runtime::ShapeTuple, DLDataType, DLDevice, tvm::runtime::Optional<tvm::runtime::String>)
  6: tvm::runtime::RPCDeviceAPI::AllocDataSpace(DLDevice, int, long const*, DLDataType, tvm::runtime::Optional<tvm::runtime::String>)
  5: tvm::runtime::RPCClientSession::AllocDataSpace(DLDevice, int, long const*, DLDataType, tvm::runtime::Optional<tvm::runtime::String>)
  4: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<tvm::runtime::RPCEndpoint::Init()::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  3: tvm::runtime::RPCEndpoint::HandleUntilReturnEvent(bool, std::function<void (tvm::runtime::TVMArgs)>)
  2: tvm::runtime::RPCEndpoint::EventHandler::HandleNextEvent(bool, bool, std::function<void (tvm::runtime::TVMArgs)>)
  1: tvm::runtime::RPCEndpoint::EventHandler::HandleProcessPacket(std::function<void (tvm::runtime::TVMArgs)>)
  0: tvm::runtime::RPCEndpoint::EventHandler::HandleReturn(tvm::runtime::RPCCode, std::function<void (tvm::runtime::TVMArgs)>)
  12: TVMFuncCall
  11: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<tvm::runtime::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  10: tvm::runtime::RPCServerLoop(int)
  9: tvm::runtime::RPCEndpoint::ServerLoop()
  8: tvm::runtime::RPCEndpoint::HandleUntilReturnEvent(bool, std::function<void (tvm::runtime::TVMArgs)>)
  7: tvm::runtime::RPCEndpoint::EventHandler::HandleNextEvent(bool, bool, std::function<void (tvm::runtime::TVMArgs)>)
  6: tvm::runtime::RPCEndpoint::EventHandler::HandleProcessPacket(std::function<void (tvm::runtime::TVMArgs)>)
  5: tvm::runtime::RPCEndpoint::EventHandler::HandleSyscall(tvm::runtime::RPCCode)
  4: void tvm::runtime::RPCEndpoint::EventHandler::SysCallHandler<void (*)(tvm::runtime::RPCSession*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)>(void (*)(tvm::runtime::RPCSession*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*))
  3: tvm::runtime::RPCDevAllocDataWithScope(tvm::runtime::RPCSession*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  2: tvm::runtime::DeviceAPIManager::GetAPI(int, bool)
  1: tvm::runtime::DeviceAPIManager::GetAPI(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool)
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 62, in ext_dev_callback
    return tvm.get_global_func("device_api.ext_dev")()
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
  1: TVMFuncCall
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 61, in ext_dev_callback
    load_vta_dll()
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 51, in load_vta_dll
    logging.info("Loading VTA library: %s", dll_path)
  File "/usr/lib/python3.6/logging/__init__.py", line 1900, in info
    root.info(msg, *args, **kwargs)
  File "/usr/lib/python3.6/logging/__init__.py", line 1306, in info
    self._log(INFO, msg, args, **kwargs)
  File "/usr/lib/python3.6/logging/__init__.py", line 1441, in _log
    exc_info, func, extra, sinfo)
  File "/usr/lib/python3.6/logging/__init__.py", line 1411, in makeRecord
    sinfo)
  File "/usr/lib/python3.6/logging/__init__.py", line 277, in __init__
    if (args and len(args) == 1 and isinstance(args[0], collections.Mapping)
  File "/usr/lib/python3.6/abc.py", line 184, in __instancecheck__
    if subclass in cls._abc_cache:
  File "/media/masaaki/Ubuntu_Disk/DNN/tvm/src/runtime/rpc/rpc_endpoint.cc", line 376
RPCError: Error caught from RPC call:
RecursionError: maximum recursion depth exceeded while calling a Python object



PYNQ-Z1 の全表示を示す。

INFO:RPCServer:connection from ('192.168.3.10', 42674)
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:RPCServer:load_module /tmp/tmposbwibs0/gemm.o
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
INFO:root:Loading VTA library: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so
Process Process-3:
Traceback (most recent call last):
  File "/usr/lib/python3.6/multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File "/usr/lib/python3.6/multiprocessing/process.py", line 93, in run
    self._target(*self._args, **self._kwargs)
  File "/home/xilinx/tvm/python/tvm/rpc/server.py", line 116, in _serve_loop
    _ffi_api.ServerLoop(sockfd)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
AttributeError: Traceback (most recent call last):
  4: TVMFuncCall
  3: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<tvm::runtime::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  2: tvm::runtime::RPCServerLoop(int)
  1: tvm::runtime::RPCEndpoint::ServerLoop()
  0: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<TVMFuncCreateFromCFunc::{lambda(tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)#2}> >::Call(tvm::runtime::PackedFuncObj const*, tvm::runtime::TVMArgs, tvm::runtime::TVMRetValue*)
  File "/home/xilinx/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 81, in cfun
    rv = local_pyfunc(*pyargs)
  File "/home/xilinx/tvm/vta/python/vta/exec/rpc_server.py", line 83, in server_shutdown
    runtime_dll[0].VTARuntimeShutdown()
  File "/usr/lib/python3.6/ctypes/__init__.py", line 361, in __getattr__
    func = self.__getitem__(name)
  File "/usr/lib/python3.6/ctypes/__init__.py", line 366, in __getitem__
    func = self._FuncPtr((name_or_ordinal, self))
AttributeError: /home/xilinx/tvm/vta/python/vta/../../../build/libvta.so: undefined symbol: VTARuntimeShutdown

  1. 2022年06月23日 05:47 |
  2. TVM_VTA
  3. | トラックバック:0
  4. | コメント:0

フィックスターズさんの”実践的!FPGA開発セミナー vol.10”の”Versatile Tensor Accelerator (VTA) 実機検証”をやってみる8

フィックスターズさんの”実践的!FPGA開発セミナー vol.10”の”Versatile Tensor Accelerator (VTA) 実機検証”をやってみる7”の続き。

フィックスターズさんの”実践的!FPGA開発セミナー vol.10”の”TVM/VTA の仕組みから学ぶ (第二回) : Versatile Tensor Accelerator (VTA)実機検証”をやってみたいと思っていた。フィックスターズさんから”実践的!FPGA開発セミナー vol.10”の資料をいただいたので、やってみることにした。フィックスターズ様、資料を公開していただいてありがとうございました。

前回は、ホスト・パソコンで tvm を cmake から make してから、RPCを使ってVTA上でニューラルネットワークを実行しようとした。しかし、test_benchmark_gemm.py を実行したら target.build.llvm is not enabled でエラーになった。今回は、tvm の Docs > Installing TVM > Install from Source に従って LLVM を使用して、cmake, make を行った。

tvm の Docs > Installing TVM > Install from Source を参照して、その通りにやっていく。

もうすでに、tvm の下に build ディレクトリを作ってあって、cmake/config.cmake ファイルをコピー済みなので、以下のコマンドは実行していない。
mkdir build
cp cmake/config.cmake build


最初に llvm-config のバージョンを確認する。
llvm-config --version
TVM_VTA_71_220621.png

バージョンは 6.0.0 だった。バージョン 4.0 以降ということなので、問題ない。

build/config.cmake を編集する。

set(USE_CUDA ON)
set(USE_RELAY_DEBUG ON)
に変更した。

set(USE_GRAPH_EXECUTOR ON)
set(USE_PROFILER ON)
set(USE_RELAY_DEBUG ON)
はすでに変更されていた。
TVM_VTA_70_220621.png

set(USE_LLVM ON)
に変更した。
TVM_VTA_72_220621.png

環境変数TVM_LOG_DEBUGを設定した。
export TVM_LOG_DEBUG="ir/transform.cc=1;relay/ir/transform.cc=1"

(追記) TVM_LOG_DEBUG 環境変数を設定すると、test_program_rpc.py 実行時にエラーが発生した。

build ディレクトリに移動して cmake を行った。
cd build
cmake ..

TVM_VTA_73_220621.png
TVM_VTA_74_220621.png

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/DNN/tvm/build$ cmake ..
-- Forbidding undefined symbols in shared library, using -Wl,--no-undefined on platform Linux
-- Build with RPC support...
-- Build with Graph Executor support...
-- Build with profiler...
-- Build with AOT Executor support...
-- Could NOT find GTest (missing: GTEST_LIBRARY GTEST_MAIN_LIBRARY) 
-- VTA build with VTA_HW_PATH=/media/masaaki/Ubuntu_Disk/DNN/tvm/3rdparty/vta-hw
-- Build VTA runtime with target: pynq
-- Found CUDA_TOOLKIT_ROOT_DIR=/usr
-- Found CUDA_CUDA_LIBRARY=/usr/lib/x86_64-linux-gnu/libcuda.so
-- Found CUDA_CUDART_LIBRARY=/usr/lib/x86_64-linux-gnu/libcudart.so
-- Found CUDA_NVRTC_LIBRARY=/usr/lib/x86_64-linux-gnu/libnvrtc.so
-- Found CUDA_CUDNN_INCLUDE_DIRS=
-- Found CUDA_CUDNN_LIBRARY=
-- Found CUDA_CUBLAS_LIBRARY=/usr/lib/x86_64-linux-gnu/libcublas.so
-- Found CUDA_CUBLASLT_LIBRARY=CUDA_CUBLASLT_LIBRARY-NOTFOUND
-- Build with CUDA 9.1 support
-- Link with dynamic LLVM library
-- Found LLVM_INCLUDE_DIRS=/usr/lib/llvm-6.0/include
-- Found LLVM_DEFINITIONS=-D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS
-- Found LLVM_LIBS=LLVM
-- Found TVM_LLVM_VERSION=60
-- Build with LLVM 6.0.0
-- Set TVM_LLVM_VERSION=60
-- Build with contrib.random
-- Build with contrib.sort
-- Build with contrib.hybriddump
-- Git found: /usr/bin/git
-- Found TVM_GIT_COMMIT_HASH=27b0aad5a55254815a076dbcacb53e9725019f9d
-- Found TVM_GIT_COMMIT_TIME=2022-06-14 19:30:28 +0900
-- Autoset: USE_LIBBACKTRACE=ON in Linux
-- Building with libbacktrace...
-- Building Relay in debug mode...
-- Building with TVM Map...
-- Build with thread support...
-- Configuring done
-- Generating done
-- Build files have been written to: /media/masaaki/Ubuntu_Disk/DNN/tvm/build


make を行った。
make -j3
TVM_VTA_75_220621.png

make が成功した。
build ディレクトリに libtvm.so と libtvm_runtime.so が再度生成されていた。
TVM_VTA_76_220621.png
  1. 2022年06月22日 05:21 |
  2. TVM_VTA
  3. | トラックバック:0
  4. | コメント:0

フィックスターズさんの”実践的!FPGA開発セミナー vol.10”の”Versatile Tensor Accelerator (VTA) 実機検証”をやってみる7

フィックスターズさんの”実践的!FPGA開発セミナー vol.10”の”Versatile Tensor Accelerator (VTA) 実機検証”をやってみる6”の続き。

フィックスターズさんの”実践的!FPGA開発セミナー vol.10”の”TVM/VTA の仕組みから学ぶ (第二回) : Versatile Tensor Accelerator (VTA)実機検証”をやってみたいと思っていた。フィックスターズさんから”実践的!FPGA開発セミナー vol.10”の資料をいただいたので、やってみることにした。フィックスターズ様、資料を公開していただいてありがとうございました。

ホスト・パソコンの cmake のバージョンが合わないので、”Ubuntu 18.04 LTS に特定バージョンの cmake (Version 3.12.0)をインストールした”で cmake 3.12.0 をインストールしてある。

前回は、RPCを使ってVTA上でニューラルネットワークを実行しようとしたが、libtvm.so と libtvm_runtime.so が無いと言われてエラーだった。今回は、ホスト・パソコンで tvm を cmake から make してから、RPCを使ってVTA上でニューラルネットワークを実行しようとした。しかし、test_benchmark_gemm.py を実行したら target.build.llvm is not enabled でエラーになった。

今回は、”Docs > Installing TVM > Install from Source”の情報を使わずに適当に cmake , make したので、gcc を使用していたようだ。

ホスト・パソコンの tvm ディレクトリには、build ディレクトリが作ってあって、cmake/config.cmake をコピーしてある。
cd tvm
mkdir build
cp cmake/config.cmake build/


build ディレクトリに入って、cmake を行った。
cmake ..
TVM_VTA_60_220619.png

make を行った。成功した。
make -j3
TVM_VTA_61_220619.png

build ディレクトリに libtvm.so と libtvm_runtime.so ができた。
TVM_VTA_62_220619.png

ここまでは順調だ。

PYNQ-Z1 で RPC サーバーを起動する。
sudo ./apps/vta_rpc/start_rpc_server.sh

ホスト・パソコンで環境変数を設定して test_program_rpc.py を実行する。
export PYTHONPATH=$PYTHONPATH:/media/masaaki/Ubuntu_Disk/DNN/tvm/python:/media/masaaki/Ubuntu_Disk/DNN/tvm/vta/python
export VTA_RPC_HOST=192.168.3.31
export VTA_RPC_PORT=9091
python3 vta/tests/python/pynq/test_program_rpc.py

TVM_VTA_64_220620.png

ホスト・パソコンで test_program_rpc.py を実行した後、PYNQ-Z1 でメッセージが表示された。
TVM_VTA_65_220620.png
TVM_VTA_66_220620.png

xilinx@pynq:~/tvm$ sudo ./apps/vta_rpc/start_rpc_server.sh
[sudo] password for xilinx: 
INFO:RPCServer:bind to 0.0.0.0:9091
INFO:RPCServer:connection from ('192.168.3.10', 36472)
INFO:root:Program FPGA with 1x16_i8w8a32_15_15_18_17.bit 
INFO:RPCServer:Finish serving ('192.168.3.10', 36472)
INFO:RPCServer:connection from ('192.168.3.10', 36478)
INFO:root:Rebuild runtime:
 output=/home/xilinx/tvm/vta/python/vta/../../../build/libvta.so,
 cflags=-O2
    -std=c++14
    -I/home/xilinx/tvm/include
    -I/home/xilinx/tvm/3rdparty/vta-hw/include
    -I/home/xilinx/tvm/3rdparty/dlpack/include
    -I/home/xilinx/tvm/3rdparty/dmlc-core/include
    -DVTA_TARGET=pynq
    -DVTA_HW_VER=0.0.2
    -DVTA_LOG_INP_WIDTH=3
    -DVTA_LOG_WGT_WIDTH=3
    -DVTA_LOG_ACC_WIDTH=5
    -DVTA_LOG_BATCH=0
    -DVTA_LOG_BLOCK=4
    -DVTA_LOG_UOP_BUFF_SIZE=15
    -DVTA_LOG_INP_BUFF_SIZE=15
    -DVTA_LOG_WGT_BUFF_SIZE=18
    -DVTA_LOG_ACC_BUFF_SIZE=17
    -DVTA_LOG_BLOCK_IN=4
    -DVTA_LOG_BLOCK_OUT=4
    -DVTA_LOG_OUT_WIDTH=3
    -DVTA_LOG_OUT_BUFF_SIZE=15
    -DVTA_LOG_BUS_WIDTH=6
    -DVTA_IP_REG_MAP_RANGE=0x1000
    -DVTA_FETCH_ADDR=0x43C00000
    -DVTA_LOAD_ADDR=0x43C01000
    -DVTA_COMPUTE_ADDR=0x43C02000
    -DVTA_STORE_ADDR=0x43C03000
    -DVTA_FETCH_INSN_COUNT_OFFSET=16
    -DVTA_FETCH_INSN_ADDR_OFFSET=24
    -DVTA_LOAD_INP_ADDR_OFFSET=16
    -DVTA_LOAD_WGT_ADDR_OFFSET=24
    -DVTA_COMPUTE_DONE_WR_OFFSET=16
    -DVTA_COMPUTE_DONE_RD_OFFSET=24
    -DVTA_COMPUTE_UOP_ADDR_OFFSET=32
    -DVTA_COMPUTE_BIAS_ADDR_OFFSET=40
    -DVTA_STORE_OUT_ADDR_OFFSET=16
    -DVTA_COHERENT_ACCESSES=true,
 source=/home/xilinx/tvm/3rdparty/vta-hw/src/pynq/pynq_driver.cc,
 ldflags=-L/usr/lib
    -l:libcma.so
INFO:RPCServer:Finish serving ('192.168.3.10', 36478)


ホスト・パソコンで test_benchmark_gemm.py を実行したら、”Check failed: (bf != nullptr) is false: target.build.llvm is not enabled”でエラーになった。
python3 vta/tests/python/integration/test_benchmark_gemm.py
TVM_VTA_67_220620.png
TVM_VTA_68_220620.png

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/DNN/tvm$ python3 vta/tests/python/integration/test_benchmark_gemm.py
========GEMM 128=========
----- GEMM GOPS End-to-End Test-------
[04:23:13] /media/masaaki/Ubuntu_Disk/DNN/tvm/src/tir/transforms/arg_binder.cc:95: Warning: Trying to bind buffer to another one with lower alignment requirement  required_alignment=256, provided_alignment=128
/media/masaaki/Ubuntu_Disk/DNN/tvm/python/tvm/driver/build_module.py:263: UserWarning: target_host parameter is going to be deprecated. Please pass in tvm.target.Target(target, host=target_host) instead.
  warnings.warn(
Traceback (most recent call last):
  File "vta/tests/python/integration/test_benchmark_gemm.py", line 287, in <module>
    test_gemm()
  File "vta/tests/python/integration/test_benchmark_gemm.py", line 283, in test_gemm
    vta.testing.run(_run)
  File "/media/masaaki/Ubuntu_Disk/DNN/tvm/vta/python/vta/testing/utils.py", line 74, in run
    run_func(env, remote)
  File "vta/tests/python/integration/test_benchmark_gemm.py", line 281, in _run
    run_gemm_packed(env, remote, 128, 128, 128)
  File "vta/tests/python/integration/test_benchmark_gemm.py", line 275, in run_gemm_packed
    gemm_normal(False)
  File "vta/tests/python/integration/test_benchmark_gemm.py", line 182, in gemm_normal
    run_test("NORMAL", print_ir)
  File "vta/tests/python/integration/test_benchmark_gemm.py", line 169, in run_test
    cost = run_schedule(
  File "vta/tests/python/integration/test_benchmark_gemm.py", line 162, in run_schedule
    return verify(s)
  File "vta/tests/python/integration/test_benchmark_gemm.py", line 63, in verify
    mod = vta.build(
  File "/media/masaaki/Ubuntu_Disk/DNN/tvm/vta/python/vta/build_module.py", line 125, in build
    return tvm.build(*args, **kwargs)
  File "/media/masaaki/Ubuntu_Disk/DNN/tvm/python/tvm/driver/build_module.py", line 278, in build
    rt_mod_host = _driver_ffi.tir_to_runtime(annotated_mods, target_host)
  File "/media/masaaki/Ubuntu_Disk/DNN/tvm/python/tvm/_ffi/_ctypes/packed_func.py", line 237, in __call__
    raise get_last_ffi_error()
tvm._ffi.base.TVMError: Traceback (most recent call last):
  3: TVMFuncCall
  2: tvm::runtime::PackedFuncObj::Extractor<tvm::runtime::PackedFuncSubObj<tvm::runtime::TypedPackedFunc<tvm::runtime::Module (tvm::runtime::Map<tvm::Target, tvm::IRModule, void, void> const&, tvm::Target)>::AssignTypedLambda<tvm::{lambda(tvm::runtime::Map<tvm::Target, tvm::IRModule, void, void> const&, tvm::Target)#6}>(tvm::{lambda(tvm::runtime::Map<tvm::Target, tvm::IRModule, void, void> const&, tvm::Target)#6}, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)::{lambda(tvm::runtime::TVMArgs const&, tvm::runtime::TVMRetValue*)#1}> >::Call(tvm::runtime::PackedFuncObj const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, tvm::runtime::TVMRetValue)
  1: tvm::TIRToRuntime(tvm::runtime::Map<tvm::Target, tvm::IRModule, void, void> const&, tvm::Target const&)
  0: tvm::codegen::Build(tvm::IRModule, tvm::Target)
  File "/media/masaaki/Ubuntu_Disk/DNN/tvm/src/target/codegen.cc", line 58
TVMError: 
---------------------------------------------------------------
An error occurred during the execution of TVM.
For more information, please see: https://tvm.apache.org/docs/errors.html
---------------------------------------------------------------
  Check failed: (bf != nullptr) is false: target.build.llvm is not enabled


ホスト・パソコンで test_benchmark_gemm.py を実行した時の PYNQ-Z1 に表示されたメッセージを示す。
TVM_VTA_69_220620.png

次回は LLVM を使って make してみよう。
  1. 2022年06月21日 04:23 |
  2. TVM_VTA
  3. | トラックバック:0
  4. | コメント:0

Ubuntu 18.04 LTS に特定バージョンの cmake (Version 3.12.0)をインストールした

TVM のコンパイルをしようとしたのだが、cmake のバージョンが 3.12 以降が必要だというメッセージが出てしまった。apt でインストールできる cmake のバージョンは 3.10 ということで、cmake 3.12.0 を”Linuxに特定のバージョンのcmakeをインストール”を参考にインストールした。

現在の cmake のバージョンは 3.4.3 だった。
これで、cmake .. を実行すると cmake のバージョンが 3.12 以降が必要だというメッセージが出てしまった。
TVM_VTA_50_220619.png

sudo apt remove cmake で削除しても削除されなかった。これは、/usr/local/bin に直接 cmake をインストールしてしまったのが原因の様だ。よって、/usr/local/bin から ccmake, cmake, cpack, ctest を削除した。

なお、sudo apt remove cmake した時に libdvd-pkg パッケージが壊れていたので dpkg-reconfigure を使用して、再設定した。
TVM_VTA_54_220619.png

TVM_VTA_55_220619.png

TVM_VTA_56_220619.png

cmake 3.12.0 を”Linuxに特定のバージョンのcmakeをインストール”を参考にインストールする。

cmake.org の Index of /filesIndex of /files/v3.12 から cmake-3.12.0-Linux-x86_64.sh をダウンロードした。
cmake-3.12.0-Linux-x86_64.sh を実行した。
sudo ./cmake-3.12.0-Linux-x86_64.sh
TVM_VTA_51_220619.png
TVM_VTA_52_220619.png

cmake-3.12.0-Linux-x86_64 ディレクトリが生成された。

cmake-3.12.0-Linux-x86_64 ディレクトリを /opt に移動する。
sudo mv cmake-3.12.0-Linux-x86_64 /opt

/opt/cmake-3.12.0-Linux-x86_64/bin/* を /usr/local/bin にシンボリックリンクする。(パスの順番が早いので /usr/local/bin になった)
sudo ln -s /opt/cmake-3.12.0-Linux-x86_64/bin/* /usr/local/bin

/opt/cmake-3.12.0-Linux-x86_64/bin ディレクトリを示す。
TVM_VTA_63_220620.png

これで、cmake バージョン 3.12.0 が使用可能になった。
  1. 2022年06月20日 04:11 |
  2. Linux
  3. | トラックバック:0
  4. | コメント:0

フィックスターズさんの”実践的!FPGA開発セミナー vol.10”の”Versatile Tensor Accelerator (VTA) 実機検証”をやってみる6

フィックスターズさんの”実践的!FPGA開発セミナー vol.10”の”Versatile Tensor Accelerator (VTA) 実機検証”をやってみる5”の続き。

フィックスターズさんの”実践的!FPGA開発セミナー vol.10”の”TVM/VTA の仕組みから学ぶ (第二回) : Versatile Tensor Accelerator (VTA)実機検証”をやってみたいと思っていた。フィックスターズさんから”実践的!FPGA開発セミナー vol.10”の資料をいただいたので、やってみることにした。フィックスターズ様、資料を公開していただいてありがとうございました。

前回は、vta_config.json の "LOG_BATCH" を 0 から 1 に変更して、ビットストリームを生成する。次に、vta_config.json の "LOG_BATCH" を 2 に変更して、ビットストリームを生成した。今回は、RPCを使ってVTA上でニューラルネットワークを実行しようとしたが、libtvm.so と libtvm_runtime.so が無いと言われてエラーだった。

PYNQ-Z1 上で RPC サーバーを起動する。
sudo pip3 install cloudpickle
実行した所エラーになってしまった。
TVM_VTA_42_220618.png

いろいろと調べていたのだが、”pip3でpipenvをインストールしようとすると「ERROR: Could not find a version that satisfies the requirement pipenv (from versions: none)」「ERROR: No matching distribution found for pipenv」と出力される”がヒットした。
sudo pip3 install cloudpickle -vvv
コマンドを実行すると、cloudpickle がインストールできたようだ。
TVM_VTA_43_220618.png
TVM_VTA_44_220618.png

なお、この辺りから PYNQ-Z1 の PYNQ に SSH で入るのが不安定になってしまった。よって、以後、シリアルターミナルを使用する。

RPC サーバーを起動する。
sudo ./apps/vta_rpc/start_rpc_server.sh
TVM_VTA_45_220619.png

次はホスト側での作業となる。
環境変数を設定した。
export PYTHONPATH=$PYTHONPATH:/media/masaaki/Ubuntu_Disk/DNN/tvm/python:/media/masaaki/Ubuntu_Disk/DNN/tvm/vta/python
export VTA_RPC_HOST=192.168.3.31
export VTA_RPC_PORT=9091

TVM_VTA_46_220619.png

tvm/3rdparty/vta-hw/config/vta_config.json の "LOG_BATCH" を 0 に変更した。
TVM_VTA_47_220619.png

test_program_rpc.py を起動する。
python3 vta/tests/python/pynq/test_program_rpc.py
libtvm.so と libtvm_runtime.so が無いと言われてエラーになってしまった。
TVM_VTA_48_220619.png

libtvm.so と libtvm_runtime.so は tvm ディレクトリを探しても見つからないので、make で作るしか無いのかな?
最後にエラーのログを貼っておく。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/DNN/tvm$ python3 vta/tests/python/pynq/test_program_rpc.py
Traceback (most recent call last):
  File "vta/tests/python/pynq/test_program_rpc.py", line 18, in <module>
    import tvm
  File "/media/masaaki/Ubuntu_Disk/DNN/tvm/python/tvm/__init__.py", line 26, in <module>
    from ._ffi.base import TVMError, __version__, _RUNTIME_ONLY
  File "/media/masaaki/Ubuntu_Disk/DNN/tvm/python/tvm/_ffi/__init__.py", line 28, in <module>
    from .base import register_error
  File "/media/masaaki/Ubuntu_Disk/DNN/tvm/python/tvm/_ffi/base.py", line 71, in <module>
    _LIB, _LIB_NAME = _load_lib()
  File "/media/masaaki/Ubuntu_Disk/DNN/tvm/python/tvm/_ffi/base.py", line 51, in _load_lib
    lib_path = libinfo.find_lib_path()
  File "/media/masaaki/Ubuntu_Disk/DNN/tvm/python/tvm/_ffi/libinfo.py", line 146, in find_lib_path
    raise RuntimeError(message)
RuntimeError: Cannot find libraries: ['libtvm.so', 'libtvm_runtime.so']
List of candidates:
/usr/local/systemc/2.3.3/lib-linux64/libtvm.so
/media/masaaki/Ubuntu_Disk/DNN/tvm/libtvm.so
/usr/local/verilator/v4.202/bin/libtvm.so
/home/masaaki/anaconda3/bin/libtvm.so
/home/masaaki/anaconda3/condabin/libtvm.so
/usr/local/sbin/libtvm.so
/usr/local/bin/libtvm.so
/usr/sbin/libtvm.so
/usr/bin/libtvm.so
/sbin/libtvm.so
/bin/libtvm.so
/usr/games/libtvm.so
/usr/local/games/libtvm.so
/snap/bin/libtvm.so
/media/masaaki/Ubuntu_Disk/DNN/tvm/python/tvm/libtvm.so
/media/masaaki/Ubuntu_Disk/DNN/libtvm.so
/usr/local/systemc/2.3.3/lib-linux64/libtvm_runtime.so
/media/masaaki/Ubuntu_Disk/DNN/tvm/libtvm_runtime.so
/usr/local/verilator/v4.202/bin/libtvm_runtime.so
/home/masaaki/anaconda3/bin/libtvm_runtime.so
/home/masaaki/anaconda3/condabin/libtvm_runtime.so
/usr/local/sbin/libtvm_runtime.so
/usr/local/bin/libtvm_runtime.so
/usr/sbin/libtvm_runtime.so
/usr/bin/libtvm_runtime.so
/sbin/libtvm_runtime.so
/bin/libtvm_runtime.so
/usr/games/libtvm_runtime.so
/usr/local/games/libtvm_runtime.so
/snap/bin/libtvm_runtime.so
/media/masaaki/Ubuntu_Disk/DNN/tvm/python/tvm/libtvm_runtime.so
/media/masaaki/Ubuntu_Disk/DNN/libtvm_runtime.so

  1. 2022年06月19日 04:48 |
  2. TVM_VTA
  3. | トラックバック:0
  4. | コメント:0

フィックスターズさんの”実践的!FPGA開発セミナー vol.10”の”Versatile Tensor Accelerator (VTA) 実機検証”をやってみる5

フィックスターズさんの”実践的!FPGA開発セミナー vol.10”の”Versatile Tensor Accelerator (VTA) 実機検証”をやってみる4”の続き。

フィックスターズさんの”実践的!FPGA開発セミナー vol.10”の”TVM/VTA の仕組みから学ぶ (第二回) : Versatile Tensor Accelerator (VTA)実機検証”をやってみたいと思っていた。フィックスターズさんから”実践的!FPGA開発セミナー vol.10”の資料をいただいたので、やってみることにした。フィックスターズ様、資料を公開していただいてありがとうございました。

前回は、生成された Vivado HLS 2020.1 と Vivado 2020.1 のプロジェクトを見た。今回は、vta_config.json の "LOG_BATCH" を 0 から 1 に変更して、ビットストリームを生成する。次に、vta_config.json の "LOG_BATCH" を 2 に変更して、ビットストリームを生成する

まずは、Vivado 2020.1 で合成を行うので、それ用の settings64.sh を実行する。
source /media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2020.1/settings64.sh

vta_config.json の "LOG_BATCH" を 0 から 1 に変更して、ビットストリームを生成
tvm/3rdparty/vta-hw/config/vta_config.json を編集する。
"LOG_BATCH" を 0 から 1 に変更した。
TVM_VTA_32_220616.png

make ip を行った。
make ip
TVM_VTA_33_220616.png

make を行った。
make
TVM_VTA_34_220616.png

vm/3rdparty/vta-hw/build/hardware/xilinx/vivado/pynq_2x16_i8w8a32_15_15_18_17/export ディレクトリに vta.bit が生成された。
TVM_VTA_35_220616.png

vm/3rdparty/vta-hw/build/hardware/xilinx/vivado/pynq_2x16_i8w8a32_15_15_18_17 ディレクトリの Vivado 2020.1 プロジェクトを起動して、Project Summary を見た所、前回の pynq_2x16_i8w8a32_15_15_18_17 の Project Summary と変わっていないようだ。
TVM_VTA_36_220617.png

vta_config.json の "LOG_BATCH" を 2 に変更して、ビットストリームを生成
tvm/3rdparty/vta-hw/config/vta_config.json を編集する。
"LOG_BATCH" を 2 に変更した。
TVM_VTA_37_220617.png

make ip を行った。
make ip
TVM_VTA_38_220617.png

make を行った。
make
TVM_VTA_39_220617.png

vm/3rdparty/vta-hw/build/hardware/xilinx/vivado/pynq_4x16_i8w8a32_15_15_18_17/export ディレクトリに vta.bit が生成された。
TVM_VTA_40_220617.png

vm/3rdparty/vta-hw/build/hardware/xilinx/vivado/pynq_4x16_i8w8a32_15_15_18_17 ディレクトリの Vivado 2020.1 プロジェクトを起動して、Project Summary を見た所、 pynq_2x16_i8w8a32_15_15_18_17 と pynq_2x16_i8w8a32_15_15_18_17 の Project Summary と変わっていないようだ。これで良いのだろうか?
TVM_VTA_41_220617.png
  1. 2022年06月18日 04:34 |
  2. TVM_VTA
  3. | トラックバック:0
  4. | コメント:0

フィックスターズさんの”実践的!FPGA開発セミナー vol.10”の”Versatile Tensor Accelerator (VTA) 実機検証”をやってみる4

フィックスターズさんの”実践的!FPGA開発セミナー vol.10”の”Versatile Tensor Accelerator (VTA) 実機検証”をやってみる3”の続き。

フィックスターズさんの”実践的!FPGA開発セミナー vol.10”の”TVM/VTA の仕組みから学ぶ (第二回) : Versatile Tensor Accelerator (VTA)実機検証”をやってみたいと思っていた。フィックスターズさんから”実践的!FPGA開発セミナー vol.10”の資料をいただいたので、やってみることにした。フィックスターズ様、資料を公開していただいてありがとうございました。

前回は、Ubuntu 18.04 LTS のパソコンで、twm を git clone し、スクリプトを実行して、ビットストリームを生成した。裏では Vitis HLS と Vivado でハードウェアの合成を行ったようだ。今回は、前回生成された Vivado HLS 2020.1 と Vivado 2020.1 のプロジェクトを見てみよう。

まずは、Vivado 2020.1 プロジェクトを見ていこう。
Vivado 2020.1 プロジェクトは tvm/3rdparty/vta-hw/build/hardware/xilinx/vivado/pynq_1x16_i8w8a32_15_15_18_17/vta.xpr だった。
TVM_VTA_15_220614.png

vta プロジェクトのブロック・デザインを示す。
TVM_VTA_16_220614.png
TVM_VTA_17_220614.png

fetch_0, stroe_0, compute_0, load_0, 4 個の Vivado HLS で生成された IP が見える。

Address Editor 画面を示す。
TVM_VTA_18_220614.png

Project Summary を示す。
TVM_VTA_19_220614.png

次に Vivado HLS 2020.1 のプロジェクトを示す。
Vivado HLS 2020.1 のプロジェクトは、tvm/3rdparty/vta-hw/build/hardware/xilinx/hls/pynq_1x16_i8w8a32_15_15_18_17 の下にある。
TVM_VTA_22_220615.png

最初に vta_compute を見ていこう。
ソースコードは vta.cc だった。このファイルには、fetch(), stroe(), compute(), load() の 4 個の関数が含まれていた。ソースコードは同一でどの関数を合成するかが違うようだ。
vta.cc のある場所は tvm/3rdparty/vta-hw/hardware/xilinx/src だった。このディレクトリには、vta.h もある。
TVM_VTA_20_220615.png

C コードの合成結果を示す。
TVM_VTA_21_220615.png

次に、vta_fetch を見ていこう。
TVM_VTA_23_220615.png

C コードの合成結果を示す。
TVM_VTA_24_220615.png

vta_load を見る。
TVM_VTA_25_220615.png

C コードの合成結果を示す。
TVM_VTA_26_220615.png

vta_sim を見る。
テストベンチのファイルは tvm/3rdparty/vta-hw/hardware/xilinx/sim/vta_test.cc と tvm/3rdparty/vta-hw/tests/hardware/common/test_lib.cc のようだ。 test_lib.h もある。
TVM_VTA_27_220615.png

C シミュレーション結果を示す。

INFO: [SIM 2] *************** CSIM start ***************
INFO: [SIM 4] CSIM will launch GCC as the compiler.
make[1]: ディレクトリ '/media/masaaki/Ubuntu_Disk/DNN/tvm/3rdparty/vta-hw/build/hardware/xilinx/hls/pynq_1x16_i8w8a32_15_15_18_17/vta_sim/soln/csim/build' に入ります
   Compiling ../../../../../../../../../tests/hardware/common/test_lib.cc in debug mode
   Compiling ../../../../../../../../../hardware/xilinx/sim/vta_test.cc in debug mode
   Compiling ../../../../../../../../../hardware/xilinx/src/vta.cc in debug mode
   Generating csim.exe
make[1]: ディレクトリ '/media/masaaki/Ubuntu_Disk/DNN/tvm/3rdparty/vta-hw/build/hardware/xilinx/hls/pynq_1x16_i8w8a32_15_15_18_17/vta_sim/soln/csim/build' から出ます
=====================================================================================
INFO - ALU test of min imm: batch=16, vector_size=128, uop_compression=1
INFO - ALU test successful!
=====================================================================================
INFO - ALU test of min imm: batch=16, vector_size=128, uop_compression=0
INFO - ALU test successful!
=====================================================================================
INFO - ALU test of max imm: batch=16, vector_size=128, uop_compression=1
INFO - ALU test successful!
=====================================================================================
INFO - ALU test of max imm: batch=16, vector_size=128, uop_compression=0
INFO - ALU test successful!
=====================================================================================
INFO - ALU test of add imm: batch=16, vector_size=128, uop_compression=1
INFO - ALU test successful!
=====================================================================================
INFO - ALU test of add imm: batch=16, vector_size=128, uop_compression=0
INFO - ALU test successful!
=====================================================================================
INFO - ALU test of shr: batch=16, vector_size=128, uop_compression=1
INFO - ALU test successful!
=====================================================================================
INFO - ALU test of shr: batch=16, vector_size=128, uop_compression=0
INFO - ALU test successful!
=====================================================================================
INFO - ALU test of min: batch=16, vector_size=128, uop_compression=1
INFO - ALU test successful!
=====================================================================================
INFO - ALU test of min: batch=16, vector_size=128, uop_compression=0
INFO - ALU test successful!
=====================================================================================
INFO - ALU test of max: batch=16, vector_size=128, uop_compression=1
INFO - ALU test successful!
=====================================================================================
INFO - ALU test of max: batch=16, vector_size=128, uop_compression=0
INFO - ALU test successful!
=====================================================================================
INFO - ALU test of add: batch=16, vector_size=128, uop_compression=1
INFO - ALU test successful!
=====================================================================================
INFO - ALU test of add: batch=16, vector_size=128, uop_compression=0
INFO - ALU test successful!
=====================================================================================
INFO - ALU test of shr: batch=16, vector_size=128, uop_compression=1
INFO - ALU test successful!
=====================================================================================
INFO - ALU test of shr: batch=16, vector_size=128, uop_compression=0
INFO - ALU test successful!
=====================================================================================
INFO - Blocked GEMM test: batch=256, channels=256, block=64, uop_comp=0, vt=2
INFO - Blocked GEMM test successful!
=====================================================================================
INFO - Blocked GEMM test: batch=256, channels=256, block=64, uop_comp=0, vt=1
INFO - Blocked GEMM test successful!
=====================================================================================
INFO - Blocked GEMM test: batch=4, in_channels=64, out_channels=64, uop_comp=0
INFO - Blocked GEMM test successful!
INFO: [SIM 1] CSim done with 0 errors.
INFO: [SIM 3] *************** CSIM finish ***************


vta_store を見る。
TVM_VTA_28_220615.png

C コードの合成結果を示す。
TVM_VTA_29_220615.png
  1. 2022年06月17日 04:35 |
  2. TVM_VTA
  3. | トラックバック:0
  4. | コメント:0

フィックスターズさんの”実践的!FPGA開発セミナー vol.10”の”Versatile Tensor Accelerator (VTA) 実機検証”をやってみる3

フィックスターズさんの”実践的!FPGA開発セミナー vol.10”の”Versatile Tensor Accelerator (VTA) 実機検証”をやってみる2”の続き。

フィックスターズさんの”実践的!FPGA開発セミナー vol.10”の”TVM/VTA の仕組みから学ぶ (第二回) : Versatile Tensor Accelerator (VTA)実機検証”をやってみたいと思っていた。フィックスターズさんから”実践的!FPGA開発セミナー vol.10”の資料をいただいたので、やってみることにした。フィックスターズ様、資料を公開していただいてありがとうございました。

前回は、、twm を git clone して、設定をし、cmake して make した。今回は、Ubuntu 18.04 LTS のパソコンで、twm を git clone し、スクリプトを実行して、ビットストリームを生成した。裏では Vitis HLS と Vivado でハードウェアの合成を行ったようだ。

まずは、Vivado 2020.1 で合成を行うので、それ用の settings64.sh を実行する。
source /media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2020.1/settings64.sh

/media/masaaki/Ubuntu_Disk/DNN ディレクトリに行って、 twm を git clone する。
git clone --recursive https://github.com/apache/tvm
TVM_VTA_11_220614.png

前回同様に、3rdparty/vta-hw/config ディレクトリの vta_config.json を vta_config.json.org にリネームして、pynq_sample.json を vta_config.json にコピーする。
tvm/3rdparty/vta-hw/hardware/xilinx/ に入った。
mv tvm/3rdparty/vta-hw/config/vta_config.json tvm/3rdparty/vta-hw/config/vta_config.json.org
cp tvm/3rdparty/vta-hw/config/pynq_sample.json tvm/3rdparty/vta-hw/config/vta_config.json
cd tvm/3rdparty/vta-hw/hardware/xilinx/

TVM_VTA_12_220614.png

make ip を行った。
make ip
TVM_VTA_13_220614.png

make を行った。
make
TVM_VTA_14_220614.png

tvm/3rdparty/vta-hw/build/hardware/xilinx/vivado/pynq_1x16_i8w8a32_15_15_18_17/export ディレクトリに vta.bit が生成された。
TVM_VTA_30_220616.png
  1. 2022年06月16日 05:01 |
  2. TVM_VTA
  3. | トラックバック:0
  4. | コメント:0

フィックスターズさんの”実践的!FPGA開発セミナー vol.10”の”Versatile Tensor Accelerator (VTA) 実機検証”をやってみる2

フィックスターズさんの”実践的!FPGA開発セミナー vol.10”の”TVM/VTA の仕組みから学ぶ (第二回) : Versatile Tensor Accelerator (VTA)実機検証”をやってみたいと思っていた。フィックスターズさんから”実践的!FPGA開発セミナー vol.10”の資料をいただいたので、やってみることにした。フィックスターズ様、資料を公開していただいてありがとうございました。

前回は、PYNQ-Z1 用の PYNQ 2.5 のイメージをダウンロードして、MicroSD カードに書いた。今回は、twm を git clone して、設定をし、cmake して make した。

PYNQ 2.5 のイメージを書いた MicroSD カードを PYNQ-Z1 に挿入して、電源ON して起動した。
ifconfig で IP アドレスを確認した。
TVM_VTA_4_220614.png

ssh で PYNQ-Z1 に入った。
ssh 192.168.3.31 -X -l xilinx

tvm を git clone した。
git clone --recursive https://github.com/apache/tvm
TVM_VTA_5_220614.png

xilinx@pynq:~$ git clone --recursive https://github.com/apache/tvm
Cloning into 'tvm'...
remote: Enumerating objects: 143895, done.
remote: Counting objects: 100% (270/270), done.
remote: Compressing objects: 100% (178/178), done.
remote: Total 143895 (delta 133), reused 180 (delta 90), pack-reused 143625
Receiving objects: 100% (143895/143895), 65.22 MiB | 3.33 MiB/s, done.
Resolving deltas: 100% (108130/108130), done.
Checking out files: 100% (4277/4277), done.
Submodule '3rdparty/cutlass' (https://github.com/NVIDIA/cutlass.git) registered for path '3rdparty/cutlass'
Submodule 'dlpack' (https://github.com/dmlc/dlpack.git) registered for path '3rdparty/dlpack'
Submodule 'dmlc-core' (https://github.com/dmlc/dmlc-core.git) registered for path '3rdparty/dmlc-core'
Submodule '3rdparty/libbacktrace' (https://github.com/tlc-pack/libbacktrace.git) registered for path '3rdparty/libbacktrace'
Submodule '3rdparty/rang' (https://github.com/agauniyal/rang.git) registered for path '3rdparty/rang'
Submodule '3rdparty/vta-hw' (https://github.com/apache/tvm-vta.git) registered for path '3rdparty/vta-hw'
Cloning into '/home/xilinx/tvm/3rdparty/cutlass'...
remote: Enumerating objects: 15745, done.        
remote: Counting objects: 100% (4213/4213), done.        
remote: Compressing objects: 100% (846/846), done.        
remote: Total 15745 (delta 3532), reused 3823 (delta 3328), pack-reused 11532        
Receiving objects: 100% (15745/15745), 19.02 MiB | 3.12 MiB/s, done.
Resolving deltas: 100% (11512/11512), done.
Cloning into '/home/xilinx/tvm/3rdparty/dlpack'...
remote: Enumerating objects: 437, done.        
remote: Counting objects: 100% (112/112), done.        
remote: Compressing objects: 100% (47/47), done.        
remote: Total 437 (delta 83), reused 70 (delta 63), pack-reused 325        
Receiving objects: 100% (437/437), 1.69 MiB | 3.09 MiB/s, done.
Resolving deltas: 100% (147/147), done.
Cloning into '/home/xilinx/tvm/3rdparty/dmlc-core'...
remote: Enumerating objects: 6253, done.        
remote: Counting objects: 100% (117/117), done.        
remote: Compressing objects: 100% (78/78), done.        
remote: Total 6253 (delta 45), reused 64 (delta 24), pack-reused 6136        
Receiving objects: 100% (6253/6253), 1.64 MiB | 2.52 MiB/s, done.
Resolving deltas: 100% (3791/3791), done.
Cloning into '/home/xilinx/tvm/3rdparty/libbacktrace'...
remote: Enumerating objects: 459, done.        
remote: Counting objects: 100% (3/3), done.        
remote: Compressing objects: 100% (3/3), done.        
remote: Total 459 (delta 0), reused 1 (delta 0), pack-reused 456        
Receiving objects: 100% (459/459), 1.08 MiB | 2.79 MiB/s, done.
Resolving deltas: 100% (334/334), done.
Cloning into '/home/xilinx/tvm/3rdparty/rang'...
remote: Enumerating objects: 731, done.        
remote: Counting objects: 100% (27/27), done.        
remote: Compressing objects: 100% (23/23), done.        
remote: Total 731 (delta 7), reused 15 (delta 3), pack-reused 704        
Receiving objects: 100% (731/731), 264.09 KiB | 1.67 MiB/s, done.
Resolving deltas: 100% (369/369), done.
Cloning into '/home/xilinx/tvm/3rdparty/vta-hw'...
remote: Enumerating objects: 3312, done.        
remote: Counting objects: 100% (330/330), done.        
remote: Compressing objects: 100% (137/137), done.        
remote: Total 3312 (delta 258), reused 193 (delta 193), pack-reused 2982        
Receiving objects: 100% (3312/3312), 1.43 MiB | 2.38 MiB/s, done.
Resolving deltas: 100% (1442/1442), done.
Submodule path '3rdparty/cutlass': checked out 'c2ee13a0fe99241b0e798ce647acf98e237f1d0c'
Submodule path '3rdparty/dlpack': checked out 'ddeb264880a1fa7e7be238ab3901a810324fbe5f'
Submodule path '3rdparty/dmlc-core': checked out '09511cf9fe5ff103900a5eafb50870dc84cc17c8'
Submodule path '3rdparty/libbacktrace': checked out '08f7c7e69f8ea61a0c4151359bc8023be8e9217b'
Submodule path '3rdparty/rang': checked out 'cabe04d6d6b05356fa8f9741704924788f0dd762'
Submodule path '3rdparty/vta-hw': checked out '36a91576edf633479c78649e050f18dd2ddc8103'


cd tvm
mkdir build
cp cmake/config.cmake build/
echo 'set(USE_VTA_FPGA ON)' >> build/config.cmake

TVM_VTA_6_220614.png

3rdparty/vta-hw/config ディレクトリには FPGA ボードのコンフィグレーションが json ファイルで用意されているようだ。
cp 3rdparty/vta-hw/config/pynq_sample.json 3rdparty/vta-hw/config/vta_config.json

現在の 3rdparty/vta-hw/config/vta_config.json を示す。
TVM_VTA_7_220614.png

cd build
cmake ..

TVM_VTA_9_220614.png

xilinx@pynq:~/tvm/build$ cmake ..
-- The C compiler identification is GNU 7.3.0
-- The CXX compiler identification is GNU 7.3.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Forbidding undefined symbols in shared library, using -Wl,--no-undefined on platform Linux
-- Build with RPC support...
-- Build with Graph Executor support...
-- Build with profiler...
-- Build with AOT Executor support...
-- Could NOT find GTest (missing: GTEST_LIBRARY GTEST_INCLUDE_DIR GTEST_MAIN_LIBRARY) 
-- VTA build with VTA_HW_PATH=/home/xilinx/tvm/3rdparty/vta-hw
-- Build VTA runtime with target: pynq
-- Build with contrib.random
-- Build with contrib.sort
-- Build with contrib.hybriddump
-- Git found: /usr/bin/git
-- Found TVM_GIT_COMMIT_HASH=27b0aad5a55254815a076dbcacb53e9725019f9d
-- Found TVM_GIT_COMMIT_TIME=2022-06-14 19:30:28 +0900
-- Performing Test SUPPORT_CXX14
-- Performing Test SUPPORT_CXX14 - Success
-- Autoset: USE_LIBBACKTRACE=ON in Linux
-- Building with libbacktrace...
-- Building with TVM Map...
-- Build with thread support...
-- Looking for pthread.h
-- Looking for pthread.h - found
-- Looking for pthread_create
-- Looking for pthread_create - not found
-- Check if compiler accepts -pthread
-- Check if compiler accepts -pthread - yes
-- Found Threads: TRUE  
-- Configuring done
-- Generating done
-- Build files have been written to: /home/xilinx/tvm/build


make runtime vta -j2
TVM_VTA_8_220614.png

make clean
make runtime vta -j2

TVM_VTA_10_220614.png

tvm/build ディレクトリの内容を示す。
TVM_VTA_31_220616.png
  1. 2022年06月15日 04:00 |
  2. TVM_VTA
  3. | トラックバック:0
  4. | コメント:0

フィックスターズさんの”実践的!FPGA開発セミナー vol.10”の”Versatile Tensor Accelerator (VTA) 実機検証”をやってみる1

フィックスターズさんの”実践的!FPGA開発セミナー vol.10”の”TVM/VTA の仕組みから学ぶ (第二回) : Versatile Tensor Accelerator (VTA)実機検証”をやってみたいと思っていた。フィックスターズさんから”実践的!FPGA開発セミナー vol.10”の資料をいただいたので、やってみることにした。フィックスターズ様、資料を公開していただいてありがとうございました。

フィックスターズさんの”実践的!FPGA開発セミナー vol.10”から TVM と VTA の説明を引用する。

TVM: オープンソースの深層学習用コンパイラスタック
VTA: TVM を FPGA 上で動かすための、カスタマイズ可能なアーキテクチャ


TVM に付いては、”「VTA: An Open Hardware-Software Stack for Deep Learning」の翻訳と感想”に詳しく書かれている。

PYNQ-Z1 を使用するために、PYNQ 2.5 をダウンロードして、Micro SD カードに書き込む。
https://github.com/Xilinx/PYNQ/releases/tag/v2.5 から PYNQ-Z1 v2.5 SDCard image をダウンロードした。PYNQ Ver. 2.7 には VTA が未対応ということだった。

balena Etcher を起動して、ダウンロードした Pynq_z1_v2.5.zip を MicroSD カードに書き込む。
TVM_VTA_1_220614.png

書き込み終了後、105 MB ボリュームと 5.7 GB ボリュームが生成された。
TVM_VTA_2_220614.png

TVM_VTA_3_220614.png
  1. 2022年06月14日 04:11 |
  2. TVM_VTA
  3. | トラックバック:0
  4. | コメント:0

kv260_median_platform のメディアン・フィルタを KV260 の Petalinux から動作させる7

kv260_median_platform のメディアン・フィルタを KV260 の Petalinux から動作させる6”の続き。

前回は、vadd.bit.bin を KV260 の Petalinux にアップロードし、KV260 上でロードして、ILA ダッシュボードを開いてデバッグする。とりあえず、median_axis_RGB_0 の設定を確認した。今回は、AXI DMA の設定が間違っていることに気付いて、アプリケーション・ソフトウェアを修正したら、median_filter.jpg がノイズを除去した画像ファイルになったが、色が違っていた。

medianf_pf.cpp の AXI DMA を MM2S_DMACR.RS = 1 に修正した。

// medianf_pf.cpp
// 2022/05/30 by marsee
// I referred to http://independence-sys.net/main/?p=2209
// 2022/06/06 : Added udmabuf0.

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#include "opencv2/opencv.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgcodecs/imgcodecs.hpp"

#define BLOCK_SIZE    4096
#define MIDEAIN_REG_ADDR        0x80020000
#define AXI_DMA_REG_ADDR        0x80010000
#define IMAGE_WIDTH         800
#define IMAGE_HEIGHT            600
#define MAT_IMGAGE_BUF      (IMAGE_WIDTH*IMAGE_HEIGHT*3)

#define MM2S_CONTROL_REG    0x00
#define MM2S_STATUS_REG (0x4 >> 2)
#define MM2S_START_ADDR (0x18 >> 2)
#define MM2S_LENGTH_REG (0x28 >> 2)
#define S2MM_CONTROL_REG    (0x30 >> 2)
#define S2MM_STATUS_REG (0x34 >> 2)
#define S2MM_DESTINATION_ADDR   (0x48 >> 2)
#define S2MM_LENGTH_REG (0x58 >> 2)
// bits 1 - idle
#define MM2S_IDLE_MASK  0xfffffffd
#define S2MM_IDLE_MASK  0xfffffffd 

#define MEDIAN_CONTROL      0x00
#define MEDIAN_FUNCTION_R   (0x18 >> 2)
#define MEDIAN_ROW_SIZE     (0x20 >> 2)
#define MEDIAN_COL_SIZE     (0x28 >> 2)

volatile uint32_t *reg;

int main(int argc, char **argv){
    int fd;
    volatile uint32_t *median_reg, *axi_dma_reg;
    volatile uint8_t *pict_buf;
    uint32_t phy_addr;
    uint32_t phy_addr_base;
    int addr, wd;
    uint32_t write_data;
    cv::Mat in_img, median_img;
    int fd_udmabuf;
    u_int32_t fd_paddr;
    unsigned char  attr[1024];
    unsigned long  phys_addr;
    
    if (argc != 3){
        fprintf(stderr, "Usage : ./median_filer <input image file name> <output image file name>\n");
        exit(-1);
    }
    
    in_img = cv::imread(argv[1], 1);
    median_img.create(cv::Size(in_img.cols, in_img.rows), CV_8UC3);
    
    fd = open("/dev/mem", O_RDWR | O_SYNC);
    if (fd == -1){
        fprintf(stderr, "/dev/mem open error\n");
        exit(-1);
    }
    
    // median_filter registers
    median_reg = (uint32_t *)mmap(NULL, BLOCK_SIZE,
                PROT_READ | PROT_WRITE, MAP_SHARED,
                fd, MIDEAIN_REG_ADDR );
    if ((int64_t)median_reg == -1){
        fprintf(stderr,"/dev/mem map error for median_filter registers\n");
        exit(-1);
    }

    // axi_dma registers
    axi_dma_reg = (uint32_t *)mmap(NULL, BLOCK_SIZE,
                PROT_READ | PROT_WRITE, MAP_SHARED,
                fd, AXI_DMA_REG_ADDR );
    if ((int64_t)axi_dma_reg == -1){
        fprintf(stderr,"/dev/mem map error for axi_dma registers\n");
        exit(-1);
    }
    
    // udmabuf0
    fd_udmabuf = open("/dev/udmabuf0", O_RDWR | O_SYNC); // frame_buffer, The chache is disabled. 
    if (fd_udmabuf == -1){
        fprintf(stderr, "/dev/udmabuf0 open errorn");
        exit(-1);
    }

    // phys_addr of udmabuf0
    fd_paddr = open("/sys/class/u-dma-buf/udmabuf0/phys_addr", O_RDONLY);
    if (fd_paddr == -1){
        fprintf(stderr, "/sys/class/u-dma-buf/udmabuf0/phys_addr open errorn");
        exit(-1);
    }
    read(fd_paddr, (void *)attr, 1024);
    sscanf((const char *)attr, "%lx", &phys_addr);  
    close(fd_paddr);
    printf("phys_addr = %x\n", (unsigned int)phys_addr);

    uint32_t total_bytes = in_img.total()*in_img.channels();
    uint32_t in_img_total_bytes = (in_img.total()*in_img.channels()+4096) & 0xfffff000; // 4k byte boundary
    printf("in_img_total_bytes = %d\n", in_img_total_bytes);

    pict_buf = (volatile uint8_t *)mmap(NULL, in_img_total_bytes*2, PROT_READ|PROT_WRITE, MAP_SHARED, fd_udmabuf, 0);
    if (pict_buf == MAP_FAILED){
        fprintf(stderr, "org_mat mmap error\n");
        exit(-1);
    }
    
    // Copy Mat data from in_img to org_mat
    uint8_t *in_img_data = in_img.data;
    for(int i=0; i<total_bytes; i++){
        pict_buf[i] = in_img_data[i];
    }
    
    // Resetting DMA
    axi_dma_reg[MM2S_CONTROL_REG] = 4; // MM2S DMA Controll Reg. Reset
    axi_dma_reg[S2MM_CONTROL_REG] = 4; // S2MM DMA Control Reg. Reset
    
    // Halting Run DMA
    axi_dma_reg[MM2S_CONTROL_REG] = 1; // MM2S DMA Controll Reg. Run
    axi_dma_reg[S2MM_CONTROL_REG] = 1; // S2MM DMA Control Reg. Run
    
    uint32_t median_mat_addr = (uint32_t)phys_addr+in_img_total_bytes;
    uint32_t org_mat_addr = (uint32_t)phys_addr;
    // axi dma settings
    axi_dma_reg[S2MM_DESTINATION_ADDR] = median_mat_addr;
    axi_dma_reg[MM2S_START_ADDR] = org_mat_addr;
    axi_dma_reg[S2MM_LENGTH_REG] = total_bytes;
    axi_dma_reg[MM2S_LENGTH_REG] = total_bytes;
    
    // median filter start
    median_reg[MEDIAN_COL_SIZE] = in_img.cols;
    median_reg[MEDIAN_ROW_SIZE] = in_img.rows;
    median_reg[MEDIAN_FUNCTION_R] = 3;  // median filter for AXI DMA
    median_reg[MEDIAN_CONTROL] = 1;         // ap_start
    
    // DMA completion detection
    uint32_t mm2s_status_reg = axi_dma_reg[MM2S_STATUS_REG] & MM2S_IDLE_MASK;
    while(mm2s_status_reg == 0){
        mm2s_status_reg = axi_dma_reg[MM2S_STATUS_REG] & MM2S_IDLE_MASK;
    }
    
    uint32_t s2mm_status_reg = axi_dma_reg[S2MM_STATUS_REG] & S2MM_IDLE_MASK;
    while(s2mm_status_reg == 0){
        s2mm_status_reg = axi_dma_reg[S2MM_STATUS_REG] & S2MM_IDLE_MASK;
    }
    
    // Copy median image data from median_mat to megian_img
    uint8_t *median_img_data = median_img.data;
    for(int i=0; i<total_bytes; i++){
        median_img_data[i] = pict_buf[in_img_total_bytes+i];
    }

    // Write to median_filter.jgp
    cv::imwrite(argv[2], median_img);
    
    return(0);
}


KV260 で ~/opencv/examples/median_pf/build/ ディレクトリに行って、make を実行する。
cd ~/opencv/exampels/median_pf/build/
make


KV260 の Petalinux 上で、ホーム・ディレクトリに行って、 u-dma-buf をロードする。
sudo insmod u-dma-buf.ko udmabuf0=3000000

すでにロードされているハードウェアをアンロードして、mvadd をロードする。
sudo xmutil unloadapp
sudo xmutil loadapp mvadd


KV260 で ~/opencv/examples/median_pf/build/ ディレクトリに行って、medianf_pf を実行した。
cd ~/opencv/exampels/median_pf/build/
sudo ./medianf_pf test2.jpg median_filter.jpg

kv260_median_platform_189_220613.png

median_filter.jpg が生成された。
ホスト・パソコンに SFTP して median_filter.jpg を見るとノイズは取れているが、色がおかしかった。RGB じゃなく BGR の様だ。
kv260_median_platform_190_220613.jpg
  1. 2022年06月13日 04:45 |
  2. KRIA KV260 Vision AI Starter Kit
  3. | トラックバック:0
  4. | コメント:0

FPGAの部屋のまとめサイトの更新(2022年6月12日)

FPGAの部屋のまとめサイトを更新しました。
今回は、新しいカテゴリの追加はありません。記事をまとめました。
  1. 2022年06月12日 14:39 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

kv260_median_platform のメディアン・フィルタを KV260 の Petalinux から動作させる6

kv260_median_platform のメディアン・フィルタを KV260 の Petalinux から動作させる5”の続き。

前回は、Vitis アクセラレーション・アプリケーション・プロジェクト vadd_xrt の Vivado 2021.1 プロジェクトのブロック・デザインに ILA を挿入して、vadd.bit.bin を作成した。今回は、vadd.bit.bin を KV260 の Petalinux にアップロードし、KV260 上でロードして、ILA ダッシュボードを開いてデバッグする。とりあえず、median_axis_RGB_0 の設定を確認した。

まずは前回作成した vadd.bit.bin を SFTP で KV260 の kv260_median/vadd に SFTP した。
kv260_median_platform_182_220609.png

vadd.bit.bin を /lib/firmware/xilinx/mvadd ディレクトリに移動した。
sudo mv vadd.bit.bin /lib/firmware/xilinx/mvadd
kv260_median_platform_183_220609.png

KV260 の Petalinux 上で、ホーム・ディレクトリに行って、 u-dma-buf をロードする。
sudo insmod u-dma-buf.ko udmabuf0=3000000

すでにロードされているハードウェアをアンロードして、mvadd をロードする。
sudo xmutil unloadapp
sudo xmutil loadapp mvadd

kv260_median_platform_184_220609.png

Vivado 2021.1 の Flow Navigator から PROGRAM AND DEBUG -> Open Hardware Manager -> open Target をクリックして、Auto Connect を選択した。
ILA ダッシュボードが表示された。
kv260_median_platform_185_220609.png

KV260 で ~/opencv/examples/median_pf/build/ ディレクトリに行って、medianf_pf 実行形式ファイルを実行する。
cd ~/opencv/exampels/median_pf/build/
sudo ./medianf_pf test2.jpg median_filter.jpg


最初に median_axis_RGB26_0 の AXI4-Lite インターフェースの AWVALID が立ち上がった時にトリガーがかかるように設定して、データを取得した。
kv260_median_platform_186_220609.png

メディアン・フィルタ IP のレジスタ設定を説明する。
1. 画像の列の数を設定する(0x28、アドレス) 0x320 十進数では 800 ピクセル
2. 画像の行の数を設定する(0x20) 0x258 十進数では、600 行
3. メディアン・フィルタの動作モードを設定する(0x18) 3 median filter for AXI DMA モード
4. median_axis_RGB24_0 IP にスタート信号を送る (0x00) 1 ap_start
  1. 2022年06月10日 05:16 |
  2. KRIA KV260 Vision AI Starter Kit
  3. | トラックバック:0
  4. | コメント:0

kv260_median_platform のメディアン・フィルタを KV260 の Petalinux から動作させる5

kv260_median_platform のメディアン・フィルタを KV260 の Petalinux から動作させる4”の続き。

前回は、メディアン・フィルタを動作させるソースコードを見直して、やり直してみたが、今度は真っ黒な画像だった。今回は、Vitis アクセラレーション・アプリケーション・プロジェクト vadd_xrt の Vivado 2021.1 プロジェクトのブロック・デザインに ILA を挿入して、vadd.bit.bin を作成する。

現在使用しているのは、Vitis アプリケーション・プロジェクトを作成する場合に Templates 画面で Vector Addition を選択した vadd プロジェクトだが、Templates 画面で Native XRT examples の Hello World を選択した vadd_xrt アクセラレーション・アプリケーション・プロジェクトも作成してあった。その vadd_xrt プロジェクトの Vivado プロジェクトを起動して、ILA を挿入して、論理合成、インプリメンテーション、ビットストリームの生成を行う。

Vivado プロジェクトのディレクトリは、kv260_median_platform/kv260_median_pkg/vadd_xrt_system_hw_link/Hardware/vadd.build/link/vivado/vpl/prj/prj.runs/impl_1

Vivado 2021.1 のプロジェクトの system ブロック・デザインの median_axis_RGB24_0 や axi_dma_0 のバスに ILA を追加した。
kv260_median_platform_175_220609.png

Address Editor 画面を示す。
kv260_median_platform_176_220609.png

論理合成、インプリメンテーション、ビットストリームの生成を行った。
Project Summary を示す。
kv260_median_platform_177_220609.png

system_wrapper.bit が生成された。
kv260_median_platform_178_220609.png

kv260_median_platform/kv260_median_pkg/vadd_xrt_system/Hardware/package.build/package に移動する。
元々あった system.bit の名前を system_org.bit に変更した。
system_wrapper.bit をこのディレクトリにコピーした。
kv260_median_platform_179_220609.png

vadd.bit.bin を生成する。
cd /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_median_platform/kv260_median_pkg/vadd_xrt_system/Hardware/package.build/package
echo 'all:{system.bit}'>bootgen.bif
bootgen -w -arch zynqmp -process_bitstream bin -image bootgen.bif
mv system.bit.bin vadd.bit.bin

kv260_median_platform_180_220609.png

vadd.bit.bin が生成できた。
kv260_median_platform_181_220609.png
  1. 2022年06月09日 04:44 |
  2. KRIA KV260 Vision AI Starter Kit
  3. | トラックバック:0
  4. | コメント:0

kv260_median_platform のメディアン・フィルタを KV260 の Petalinux から動作させる4

kv260_median_platform のメディアン・フィルタを KV260 の Petalinux から動作させる3”の続き。

前回は、medianf_pf 実行ファイルを実行してメディアン・フィルタ処理後のファイルを作成したが、ノイズが取れていなかった。今回は、ソースコードを見直して、やり直してみたが、今度は真っ黒な画像だった。

まずは改編した medianf_pf.cpp を示す。

// medianf_pf.cpp
// 2022/05/30 by marsee
// I referred to http://independence-sys.net/main/?p=2209
// 2022/06/06 : Added udmabuf0.

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#include "opencv2/opencv.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgcodecs/imgcodecs.hpp"

#define BLOCK_SIZE    4096
#define MIDEAIN_REG_ADDR        0x80020000
#define AXI_DMA_REG_ADDR        0x80010000
#define IMAGE_WIDTH         800
#define IMAGE_HEIGHT            600
#define MAT_IMGAGE_BUF      (IMAGE_WIDTH*IMAGE_HEIGHT*3)

#define MM2S_CONTROL_REG    0x00
#define MM2S_STATUS_REG (0x4 >> 2)
#define MM2S_START_ADDR (0x18 >> 2)
#define MM2S_LENGTH_REG (0x28 >> 2)
#define S2MM_CONTROL_REG    (0x30 >> 2)
#define S2MM_STATUS_REG (0x34 >> 2)
#define S2MM_DESTINATION_ADDR   (0x48 >> 2)
#define S2MM_LENGTH_REG (0x58 >> 2)
// bits 1 - idle
#define MM2S_IDLE_MASK  0xfffffffd
#define S2MM_IDLE_MASK  0xfffffffd 

#define MEDIAN_CONTROL      0x00
#define MEDIAN_FUNCTION_R   (0x18 >> 2)
#define MEDIAN_ROW_SIZE     (0x20 >> 2)
#define MEDIAN_COL_SIZE     (0x28 >> 2)

volatile uint32_t *reg;

int main(int argc, char **argv){
    int fd;
    volatile uint32_t *median_reg, *axi_dma_reg;
    volatile uint8_t *pict_buf;
    uint32_t phy_addr;
    uint32_t phy_addr_base;
    int addr, wd;
    uint32_t write_data;
    cv::Mat in_img, median_img;
    int fd_udmabuf;
    u_int32_t fd_paddr;
    unsigned char  attr[1024];
    unsigned long  phys_addr;
    
    if (argc != 3){
        fprintf(stderr, "Usage : ./median_filer <input image file name> <output image file name>\n");
        exit(-1);
    }
    
    in_img = cv::imread(argv[1], 1);
    median_img.create(cv::Size(in_img.cols, in_img.rows), CV_8UC3);
    
    fd = open("/dev/mem", O_RDWR | O_SYNC);
    if (fd == -1){
        fprintf(stderr, "/dev/mem open error\n");
        exit(-1);
    }
    
    // median_filter registers
    median_reg = (uint32_t *)mmap(NULL, BLOCK_SIZE,
                PROT_READ | PROT_WRITE, MAP_SHARED,
                fd, MIDEAIN_REG_ADDR );
    if ((int64_t)median_reg == -1){
        fprintf(stderr,"/dev/mem map error for median_filter registers\n");
        exit(-1);
    }

    // axi_dma registers
    axi_dma_reg = (uint32_t *)mmap(NULL, BLOCK_SIZE,
                PROT_READ | PROT_WRITE, MAP_SHARED,
                fd, AXI_DMA_REG_ADDR );
    if ((int64_t)axi_dma_reg == -1){
        fprintf(stderr,"/dev/mem map error for axi_dma registers\n");
        exit(-1);
    }
    
    // udmabuf0
    fd_udmabuf = open("/dev/udmabuf0", O_RDWR | O_SYNC); // frame_buffer, The chache is disabled. 
    if (fd_udmabuf == -1){
        fprintf(stderr, "/dev/udmabuf0 open errorn");
        exit(-1);
    }

    // phys_addr of udmabuf0
    fd_paddr = open("/sys/class/u-dma-buf/udmabuf0/phys_addr", O_RDONLY);
    if (fd_paddr == -1){
        fprintf(stderr, "/sys/class/u-dma-buf/udmabuf0/phys_addr open errorn");
        exit(-1);
    }
    read(fd_paddr, (void *)attr, 1024);
    sscanf((const char *)attr, "%lx", &phys_addr);  
    close(fd_paddr);
    printf("phys_addr = %x\n", (unsigned int)phys_addr);

    uint32_t in_img_total_bytes = (in_img.total()*in_img.channels()+4096) & 0xfffff000; // 4k byte boundary
    printf("in_img_total_bytes = %d\n", in_img_total_bytes);

    pict_buf = (volatile uint8_t *)mmap(NULL, in_img_total_bytes*2, PROT_READ|PROT_WRITE, MAP_SHARED, fd_udmabuf, 0);
    if (pict_buf == MAP_FAILED){
        fprintf(stderr, "org_mat mmap error\n");
        exit(-1);
    }
    
    // Copy Mat data from in_img to org_mat
    uint8_t *in_img_data = in_img.data;
    for(int i=0; i<in_img_total_bytes; i++){
        pict_buf[i] = in_img_data[i];
    }
    
    // Resetting DMA
    axi_dma_reg[MM2S_CONTROL_REG] = 4; // MM2S DMA Controll Reg. Reset
    axi_dma_reg[S2MM_CONTROL_REG] = 4; // S2MM DMA Control Reg. Reset
    
    // Halting Run DMA
    axi_dma_reg[MM2S_CONTROL_REG] = 0; // MM2S DMA Controll Reg. Halt
    axi_dma_reg[S2MM_CONTROL_REG] = 0; // S2MM DMA Control Reg. Halt
    
    uint32_t median_mat_addr = fd_paddr+in_img_total_bytes;
    uint32_t org_mat_addr = fd_paddr;
    // axi dma settings
    axi_dma_reg[S2MM_DESTINATION_ADDR] = median_mat_addr;
    axi_dma_reg[MM2S_START_ADDR] = org_mat_addr;
    axi_dma_reg[S2MM_LENGTH_REG] = in_img_total_bytes;
    axi_dma_reg[MM2S_LENGTH_REG] = in_img_total_bytes;
    
    // median filter start
    median_reg[MEDIAN_COL_SIZE] = in_img.cols;
    median_reg[MEDIAN_ROW_SIZE] = in_img.rows;
    median_reg[MEDIAN_FUNCTION_R] = 3;  // median filter for AXI DMA
    median_reg[MEDIAN_CONTROL] = 1;         // ap_start
    
    // DMA completion detection
    uint32_t mm2s_status_reg = axi_dma_reg[MM2S_STATUS_REG] & MM2S_IDLE_MASK;
    while(mm2s_status_reg == 0){
        mm2s_status_reg = axi_dma_reg[MM2S_STATUS_REG] & MM2S_IDLE_MASK;
    }
    
    uint32_t s2mm_status_reg = axi_dma_reg[S2MM_STATUS_REG] & S2MM_IDLE_MASK;
    while(s2mm_status_reg == 0){
        s2mm_status_reg = axi_dma_reg[S2MM_STATUS_REG] & S2MM_IDLE_MASK;
    }
    
    // Copy median image data from median_mat to megian_img
    uint8_t *median_img_data = median_img.data;
    for(int i=0; i<in_img_total_bytes; i++){
        median_img_data[i] = pict_buf[in_img_total_bytes+i];
    }

    // Write to median_filter.jgp
    cv::imwrite(argv[2], median_img);
    
    return(0);
}


~/opencv/examples/median_pf/build ディレクトリに行って make した。
make

KV260 の Petalinux 上で、ホーム・ディレクトリに行って、 u-dma-buf をロードする。
sudo insmod u-dma-buf.ko udmabuf0=3000000

メディアン・フィルタ付きのビットストリームをロードする。
sudo xmutil unloadapp
sudo xmutil loadapp mvadd
sudo xmutil listapps


median_pf を実行した所、

free(): invalid pointer
Aborted

になってしまったが、median_filter.jpg は生成された。
sudo ./medianf_pf test2.jpg median_filter.jpg

median_filter.jpg を SFTP で持ってきて確認したのだが、メディアン・フィルタがかかっていなくて、真っ暗な画像だった。。。
  1. 2022年06月08日 20:54 |
  2. KRIA KV260 Vision AI Starter Kit
  3. | トラックバック:0
  4. | コメント:0

kv260_median_platform のメディアン・フィルタを KV260 の Petalinux から動作させる3

kv260_median_platform のメディアン・フィルタを KV260 の Petalinux から動作させる2”の続き。

現在行っていることは、kv_median_platform でメディアン・フィルタ付きのプラットフォームを作成したので、プラットフォームのメディアン・フィルタを動作させてみたいということだ。プラットフォームにメディアン・フィルタが付いているとそのプラットフォームを元に作成した Vitis アクセラレーション・アプリケーションのカーネルもメディアン・フィルタ付きになる。

前回は、”u-dma-buf を Petalinux 2021.1 でビルドする”で作成した u-dma-buf.ko を使用して、メモリ上に連続領域を取れることになったので、u-dma-buf を利用するように medianf_pf.cpp を書き直して、ビルドして成功した。今回は、前回作成された medianf_pf 実行ファイルを実行してメディアン・フィルタ処理後のファイルを作成する。

KV260 の Petalinux 上で、u-dma-buf をロードする。
sudo insmod u-dma-buf.ko udmabuf0=3000000
kv260_median_platform_171_220607.png

メディアン・フィルタ付きのビットストリームをロードする。
sudo xmutil unloadapp
sudo xmutil loadapp mvadd
sudo xmutil listapps

kv260_median_platform_172_220607.png

median_pf を実行した所、

free(): invalid pointer
Aborted

になってしまったが、median_filter.jpg は生成された。
sudo ./medianf_pf test2.jpg median_filter.jpg
kv260_median_platform_173_220607.png

median_filter.jpg を SFTP で持ってきて確認したのだが、メディアン・フィルタがかかっていなくて、test2.jpg と同じにノイズが付加されている画像だった。
kv260_median_platform_174_220607.jpg

何処かバグっていると思うので、もう一度 medianf_pf.cpp を見直してみる。
メディアン・フィルタ IP には入力された画像をそのままストリームに流す機能が付いているので、それが働いているのかも知れない?
とにかく、見えるファイルは生成されたので、良いところまで行っているのではないだろうか?
  1. 2022年06月07日 05:11 |
  2. KRIA KV260 Vision AI Starter Kit
  3. | トラックバック:0
  4. | コメント:0

kv260_median_platform のメディアン・フィルタを KV260 の Petalinux から動作させる2

kv260_median_platform のメディアン・フィルタを KV260 の Petalinux から動作させる1”の続き。

前回は、medianf_pf.cpp を作成したが、メモリ上にDMA 用の連続領域を取れないというバグがあった。今回は、”u-dma-buf を Petalinux 2021.1 でビルドする”で作成した u-dma-buf.ko を使用して、メモリ上に連続領域を取れることになったので、u-dma-buf を利用するように medianf_pf.cpp を書き直して、ビルドして成功した。

まずは、現在の medianf_pf.cpp を示す。

// medianf_pf.cpp
// 2022/05/30 by marsee
// I referred to http://independence-sys.net/main/?p=2209
// 2022/06/06 : Added udmabuf0.

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#include "opencv2/opencv.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgcodecs/imgcodecs.hpp"

#define BLOCK_SIZE    4096
#define MIDEAIN_REG_ADDR        0x80020000
#define AXI_DMA_REG_ADDR        0x80010000
#define IMAGE_WIDTH         800
#define IMAGE_HEIGHT            600
#define MAT_IMGAGE_BUF      (IMAGE_WIDTH*IMAGE_HEIGHT*3)

#define MM2S_CONTROL_REG    0x00
#define MM2S_STATUS_REG (0x4 >> 2)
#define MM2S_START_ADDR (0x18 >> 2)
#define MM2S_LENGTH_REG (0x28 >> 2)
#define S2MM_CONTROL_REG    (0x30 >> 2)
#define S2MM_STATUS_REG (0x34 >> 2)
#define S2MM_DESTINATION_ADDR   (0x48 >> 2)
#define S2MM_LENGTH_REG (0x58 >> 2)
// bits 1 - idle
#define MM2S_IDLE_MASK  0xfffffffd
#define S2MM_IDLE_MASK  0xfffffffd 

#define MEDIAN_CONTROL      0x00
#define MEDIAN_FUNCTION_R   (0x18 >> 2)
#define MEDIAN_ROW_SIZE     (0x20 >> 2)
#define MEDIAN_COL_SIZE     (0x28 >> 2)

volatile uint32_t *reg;

int main(int argc, char **argv){
    int fd;
    volatile uint32_t *median_reg, *axi_dma_reg;
    volatile uint8_t *org_mat, *median_mat;
    uint32_t phy_addr;
    uint32_t phy_addr_base;
    int addr, wd;
    uint32_t write_data;
    cv::Mat in_img, median_img;
    int fd_udmabuf, fd_paddr;
    unsigned char  attr[1024];
    unsigned long  phys_addr;
    
    if (argc != 3){
        fprintf(stderr, "Usage : ./median_filer <input image file name> <output image file name>\n");
        exit(-1);
    }
    
    in_img = cv::imread(argv[1], 1);
    median_img.create(cv::Size(in_img.cols, in_img.rows), CV_8UC3);
    
    fd = open("/dev/mem", O_RDWR | O_SYNC);
    if (fd == -1){
        fprintf(stderr, "/dev/mem open error\n");
        exit(-1);
    }
    
    // median_filter registers
    median_reg = (uint32_t *)mmap(NULL, BLOCK_SIZE,
                PROT_READ | PROT_WRITE, MAP_SHARED,
                fd, MIDEAIN_REG_ADDR );
    if ((int64_t)median_reg == -1){
        fprintf(stderr,"/dev/mem map error for median_filter registers\n");
        exit(-1);
    }

    // axi_dma registers
    axi_dma_reg = (uint32_t *)mmap(NULL, BLOCK_SIZE,
                PROT_READ | PROT_WRITE, MAP_SHARED,
                fd, AXI_DMA_REG_ADDR );
    if ((int64_t)axi_dma_reg == -1){
        fprintf(stderr,"/dev/mem map error for axi_dma registers\n");
        exit(-1);
    }
    
    // udmabuf0
    fd_udmabuf = open("/dev/udmabuf0", O_RDWR | O_SYNC); // frame_buffer, The chache is disabled. 
    if (fd_udmabuf == -1){
        fprintf(stderr, "/dev/udmabuf0 open errorn");
        exit(-1);
    }

    // phys_addr of udmabuf0
    fd_paddr = open("/sys/class/u-dma-buf/udmabuf0/phys_addr", O_RDONLY);
    if (fd_paddr == -1){
        fprintf(stderr, "/sys/class/u-dma-buf/udmabuf0/phys_addr open errorn");
        exit(-1);
    }
    read(fd_paddr, (void *)attr, 1024);
    sscanf((const char *)attr, "%lx", &phys_addr);  
    close(fd_paddr);
    printf("phys_addr = %x\n", (unsigned int)phys_addr);

    uint32_t in_img_total_bytes = (in_img.total()*in_img.channels()+4096) & 0xfffff000; // 4k byte boundary
    printf("in_img_total_bytes = %d\n", in_img_total_bytes);

    org_mat = (volatile uint8_t *)mmap(NULL, in_img_total_bytes, PROT_READ|PROT_WRITE, MAP_SHARED, fd_udmabuf, 0);
    if (org_mat == MAP_FAILED){
        fprintf(stderr, "org_mat mmap error\n");
        exit(-1);
    }

    median_mat = (volatile uint8_t *)mmap(NULL, in_img_total_bytes, PROT_READ|PROT_WRITE, MAP_SHARED, fd_udmabuf, 0);
    if (median_mat == MAP_FAILED){
        fprintf(stderr, "median_mat mmap error\n");
        exit(-1);
    }
    
    // Copy Mat data from in_img to org_mat
    uint8_t *in_img_data = in_img.data;
    for(int i=0; i<in_img_total_bytes; i++){
        org_mat[i] = in_img_data[i];
    }
    
    // Resetting DMA
    axi_dma_reg[MM2S_CONTROL_REG] = 4; // MM2S DMA Controll Reg. Reset
    axi_dma_reg[S2MM_CONTROL_REG] = 4; // S2MM DMA Control Reg. Reset
    
    // Halting Run DMA
    axi_dma_reg[MM2S_CONTROL_REG] = 0; // MM2S DMA Controll Reg. Halt
    axi_dma_reg[S2MM_CONTROL_REG] = 0; // S2MM DMA Control Reg. Halt
    
    uint64_t median_mat_addr = (uint64_t)median_mat;
    uint64_t org_mat_addr = (uint64_t)org_mat;
    // axi dma settings
    axi_dma_reg[S2MM_DESTINATION_ADDR] = (uint32_t)(median_mat_addr & 0xffffffff);
    axi_dma_reg[MM2S_START_ADDR] = (uint32_t)(org_mat_addr & 0xffffffff);
    axi_dma_reg[S2MM_LENGTH_REG] = in_img_total_bytes;
    axi_dma_reg[MM2S_LENGTH_REG] = in_img_total_bytes;
    
    // median filter start
    median_reg[MEDIAN_COL_SIZE] = in_img.cols;
    median_reg[MEDIAN_ROW_SIZE] = in_img.rows;
    median_reg[MEDIAN_FUNCTION_R] = 1;  // median filter
    median_reg[MEDIAN_CONTROL] = 1;         // ap_start
    
    // DMA completion detection
    uint32_t mm2s_status_reg = axi_dma_reg[MM2S_STATUS_REG] & MM2S_IDLE_MASK;
    while(mm2s_status_reg == 0){
        mm2s_status_reg = axi_dma_reg[MM2S_STATUS_REG] & MM2S_IDLE_MASK;
    }
    
    uint32_t s2mm_status_reg = axi_dma_reg[S2MM_STATUS_REG] & S2MM_IDLE_MASK;
    while(s2mm_status_reg == 0){
        s2mm_status_reg = axi_dma_reg[S2MM_STATUS_REG] & S2MM_IDLE_MASK;
    }
    
    // Copy median image data from median_mat to megian_img
    uint8_t *median_img_data = median_img.data;
    for(int i=0; i<in_img_total_bytes; i++){
        median_img_data[i] = median_mat[i];
    }

    // Write to median_filter.jgp
    cv::imwrite(argv[2], median_img);
    
    return(0);
}


medianf_pf.cpp をコンパイルする。

median_pf ディレクトリを作成した。その下に build ディレクトリを作成した。
median_pf ディレクトリに medianf_pf.cpp と CMakeLists.txt をコピーした。
CMakeLists.txt は ~/opencv/examples ディレクトリからコピーした。
cp ~/opencv/exampels/CMakeLists.txt .
kv260_median_platform_166_220606.png

build ディレクトリに移動して cmake を行った。
cmake -D SOURCE_CODE=medianf_pf ..
kv260_median_platform_167_220606.png

make を行った。
make
kv260_median_platform_170_220606.png

medianf_pf 実行ファイルが生成された。
  1. 2022年06月06日 05:25 |
  2. KRIA KV260 Vision AI Starter Kit
  3. | トラックバック:0
  4. | コメント:0

Petalinux 2021.1 でビルドした u-dma-buf を insmod する

u-dma-buf を Petalinux 2021.1 でビルドする”で作成した u-dma-buf.ko を KV260 の Petalinux に SFTP してコピーし、insmod してみたところ、無事に u-dma-buf がロードできた。

u-dma-buf の解説については、”u-dma-buf(User space mappable DMA Buffer)”参照。

u-dma-buf を Petalinux 2021.1 でビルドする”で作成した u-dma-buf.ko を KV260 の Petalinux に SFTP した。

u-dma-buf.ko を insmod した。udmabuf0 インスタンスを作成する。
sudo insmod u-dma-buf.ko udmabuf0=0x80000

/dev ディレクトリに udmabuf0 ができた。
ls -l /dev/udmabuf0
crw------- 1 root root 237, 0 Jun  4 12:40 /dev/udmabuf0

/sys/class/u-dma-buf/udmabuf0 ができていた。
cd /sys/class/u-dma-buf/udmabuf0
ls

ファイルができていた。
kv260_median_platform_163_220605.png

/sys/class/u-dma-buf/udmabuf0 のファイルの値を見た。
xilinx-k26-starterkit-2021_1:/sys/class/u-dma-buf/udmabuf0$ cat phys_addr 
0x0000000039180000
xilinx-k26-starterkit-2021_1:/sys/class/u-dma-buf/udmabuf0$ cat size
524288
xilinx-k26-starterkit-2021_1:/sys/class/u-dma-buf/udmabuf0$ cat sync_mode 
1
xilinx-k26-starterkit-2021_1:/sys/class/u-dma-buf/udmabuf0$ cat sync_offset 
0x0
xilinx-k26-starterkit-2021_1:/sys/class/u-dma-buf/udmabuf0$ cat sync_size 
524288
xilinx-k26-starterkit-2021_1:/sys/class/u-dma-buf/udmabuf0$ cat sync_direction 
0
xilinx-k26-starterkit-2021_1:/sys/class/u-dma-buf/udmabuf0$ cat dma_coherent 
0
xilinx-k26-starterkit-2021_1:/sys/class/u-dma-buf/udmabuf0$ cat sync_owner 
0
kv260_median_platform_164_220605.png

ファイルの意味については、”u-dma-buf(User space mappable DMA Buffer)”を参照のこと。

rmmod で u-dma-buf をアンロードした。
sudo rmmod u-dma-buf

すると、/sys/class から u-dma-buf は無くなった。
ls /sys/class

もう一度、insmod して u-dma-buf をロードすると、/sys/class に u-dma-buf が現れる。
kv260_median_platform_165_220605.png

うまく行ってる。嬉しい。
  1. 2022年06月05日 05:13 |
  2. KRIA KV260 Vision AI Starter Kit
  3. | トラックバック:0
  4. | コメント:0

u-dma-buf を Petalinux 2021.1 でビルドする

kv260_median_platform のメディアン・フィルタを KV260 の Petalinux から動作させる1”で連続領域のメモリにマップできる u-dma-buf の必要性を痛感したので、Petalinux 2021.1 で u-dma-buf をビルドしてみよう。

今回のブログには元ネタがあって、それは、”udmabufをPetaLinux 2018.2でビルドする”だ。このブログに沿ってやっていく。

使用している OS は Ubuntu 18.04 LTS だ。
Petalinux 2021.1 のプロジェクトの kv260_median_plnx を使用して、u-dma-buf をカーネル・モジュールとして生成する。
petalinux-create -t modules --name u-dma-buf --enable
kv260_median_platform_157_220604.png

kv260_median_plnx/project-spec/meta-user/recipes-modules ディレクトリの下に u-dma-buf ディレクトリが作成され、その下の files ディレクトリの下に u-dma-buf.c が生成された。
kv260_median_platform_158_220604.png

rootfs をビルドする。
petalinux-build -c rootfs
kv260_median_platform_159_220604.png

kv260-median_plnx/project-spec/meta-user/recipes-module/udmabuf/files/u-dma-buf.c に ikwzm/udambuf/u-dma-buf.c の内容をコピペする。
kv260_median_platform_160_220604.png

u-dma-buf をビルドする。
petalinux-build -c u-dma-buf
kv260_median_platform_161_220604.png

kv260_median_platform/kv260_median_plnx/build/tmp/sysroots-components/zynqmp_generic/u-dma-buf/lib/modules/5.10.0-xilinx-v2021.1/extra ディレクトリに u-dma-buf.ko が作成された。
kv260_median_platform_162_220604.png
  1. 2022年06月04日 14:05 |
  2. PetaLinux
  3. | トラックバック:0
  4. | コメント:0

kv260_median_platform のメディアン・フィルタを KV260 の Petalinux から動作させる1

kv260_median_platform に埋め込まれているメディアン・フィルタを OpenCV 3.4.16 をインストールした KV260 の Petalinux から動作させてみよう。

kv260_median_platform を使用した vadd サンプルのアクセラレーション・アプリケーションを使用する。
Vivado のブロック・デザインを示す。
kv260_median_platform_79_220517.png

axi_dma_0 と median_axis_rgb24_0 に AXI4-Lite インターフェース経由で設定できれば動作させられるはずだ。
アドレスが書かれている Address Editor 画面を示す。
kv260_median_platform_80_220517.png

memread, memwrite を使用して kv260_median_platform を使用した vadd アプリケーション・プロジェクトの IP にアクセスする”で memread, memwrite の動作を確かめているため /dev/mem を使えば axi_dma_0 と median_axis_rgb24_0 にアクセスできるはずだ。

そういうことで作成したのが、medianf_pf.cpp となる。
medianf_pf.cpp を示す。

// medianf_pf.cpp
// 2022/05/30 by marsee
// I referred to http://independence-sys.net/main/?p=2209
//

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#include "opencv2/opencv.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgcodecs/imgcodecs.hpp"

#define BLOCK_SIZE    4096
#define MIDEAIN_REG_ADDR        0x80020000
#define AXI_DMA_REG_ADDR        0x80010000
#define IMAGE_WIDTH         800
#define IMAGE_HEIGHT            600
#define MAT_IMGAGE_BUF      (IMAGE_WIDTH*IMAGE_HEIGHT*3)

#define MM2S_CONTROL_REG    0x00
#define MM2S_STATUS_REG (0x4 >> 2)
#define MM2S_START_ADDR (0x18 >> 2)
#define MM2S_LENGTH_REG (0x28 >> 2)
#define S2MM_CONTROL_REG    (0x30 >> 2)
#define S2MM_STATUS_REG (0x34 >> 2)
#define S2MM_DESTINATION_ADDR   (0x48 >> 2)
#define S2MM_LENGTH_REG (0x58 >> 2)
// bits 1 - idle
#define MM2S_IDLE_MASK  0xfffffffd
#define S2MM_IDLE_MASK  0xfffffffd 

#define MEDIAN_CONTROL      0x00
#define MEDIAN_FUNCTION_R   (0x18 >> 2)
#define MEDIAN_ROW_SIZE     (0x20 >> 2)
#define MEDIAN_COL_SIZE     (0x28 >> 2)

volatile uint32_t *reg;

int main(int argc, char **argv){
    int fd;
    uint32_t *median_reg, *axi_dma_reg;
    uint8_t *org_mat, *median_mat;
    uint32_t phy_addr;
    uint32_t phy_addr_base;
    int addr, wd;
    uint32_t write_data;
    cv::Mat in_img, median_img;
    
    if (argc != 3){
        fprintf(stderr, "Usage : ./median_filer <input image file name> <output image file name>\n");
        exit(-1);
    }
    
    in_img = cv::imread(argv[1], 1);
    median_img.create(cv::Size(in_img.cols, in_img.rows), CV_8UC3);
    
    fd = open("/dev/mem", O_RDWR | O_SYNC);
    if (fd == -1){
        fprintf(stderr, "/dev/mem open error\n");
        exit(-1);
    }
    
    // median_filter registers
    median_reg = (uint32_t *)mmap(NULL, BLOCK_SIZE,
                PROT_READ | PROT_WRITE, MAP_SHARED,
                fd, MIDEAIN_REG_ADDR );
    if ((int64_t)median_reg == -1){
        fprintf(stderr,"/dev/mem map error for median_filter registers\n");
        exit(-1);
    }

    // axi_dma registers
    axi_dma_reg = (uint32_t *)mmap(NULL, BLOCK_SIZE,
                PROT_READ | PROT_WRITE, MAP_SHARED,
                fd, AXI_DMA_REG_ADDR );
    if ((int64_t)axi_dma_reg == -1){
        fprintf(stderr,"/dev/mem map error for axi_dma registers\n");
        exit(-1);
    }
    
    uint32_t in_img_total_bytes = (in_img.total()*in_img.channels()+4096) & 0xfffff000; // 4k byte boundary
    // original image data
    org_mat = (uint8_t *)mmap(NULL, in_img_total_bytes,
                PROT_READ | PROT_WRITE, MAP_SHARED,
                fd, MIDEAIN_REG_ADDR );
    if ((int64_t)org_mat == -1){
        fprintf(stderr,"/dev/mem map error for original image data\n");
        exit(-1);
    }

    // median filter image data
    median_mat = (uint8_t *)mmap(NULL, in_img_total_bytes,
                PROT_READ | PROT_WRITE, MAP_SHARED,
                fd, AXI_DMA_REG_ADDR );
    if ((int64_t)median_mat == -1){
        fprintf(stderr,"/dev/mem map error for meditan filter image data\n");
        exit(-1);
    }
    
    // Copy Mat data from in_img to org_mat
    uint8_t *in_img_data = in_img.data;
    for(int i=0; i<in_img_total_bytes; i++){
        org_mat[i] = in_img_data[i];
    }
    
    // Resetting DMA
    axi_dma_reg[MM2S_CONTROL_REG] = 4; // MM2S DMA Controll Reg. Reset
    axi_dma_reg[S2MM_CONTROL_REG] = 4; // S2MM DMA Control Reg. Reset
    
    // Halting Run DMA
    axi_dma_reg[MM2S_CONTROL_REG] = 0; // MM2S DMA Controll Reg. Halt
    axi_dma_reg[S2MM_CONTROL_REG] = 0; // S2MM DMA Control Reg. Halt
    
    uint64_t median_mat_addr = (uint64_t)median_mat;
    uint64_t org_mat_addr = (uint64_t)org_mat;
    // axi dma settings
    axi_dma_reg[S2MM_DESTINATION_ADDR] = (uint32_t)(median_mat_addr & 0xffffffff);
    axi_dma_reg[MM2S_START_ADDR] = (uint32_t)(org_mat_addr & 0xffffffff);
    axi_dma_reg[S2MM_LENGTH_REG] = in_img_total_bytes;
    axi_dma_reg[MM2S_LENGTH_REG] = in_img_total_bytes;
    
    // median filter start
    median_reg[MEDIAN_COL_SIZE] = in_img.cols;
    median_reg[MEDIAN_ROW_SIZE] = in_img.rows;
    median_reg[MEDIAN_FUNCTION_R] = 1;  // median filter
    median_reg[MEDIAN_CONTROL] = 1;         // ap_start
    
    // DMA completion detection
    uint32_t mm2s_status_reg = axi_dma_reg[MM2S_STATUS_REG] & MM2S_IDLE_MASK;
    while(mm2s_status_reg == 0){
        mm2s_status_reg = axi_dma_reg[MM2S_STATUS_REG] & MM2S_IDLE_MASK;
    }
    
    uint32_t s2mm_status_reg = axi_dma_reg[S2MM_STATUS_REG] & S2MM_IDLE_MASK;
    while(s2mm_status_reg == 0){
        s2mm_status_reg = axi_dma_reg[S2MM_STATUS_REG] & S2MM_IDLE_MASK;
    }
    
    // Copy median image data from median_mat to megian_img
    uint8_t *median_img_data = median_img.data;
    for(int i=0; i<in_img_total_bytes; i++){
        median_img_data[i] = median_mat[i];
    }

    // Write to median_filter.jgp
    cv::imwrite("median_filter.jgp", median_img);
    
    return(0);
}


今気がついたが、medianf_pf.cpp を作ったのだが、画像用バッファを作るところがバグっている。バグを修正するために、malloc() で書き直しても、連続領域の画像バッファを取る保証が無いので、KV260 上でやるのは無理だと思う。
やるならば、XRT Native APIs を使ってやる必要があると思う。
  1. 2022年06月03日 05:14 |
  2. KRIA KV260 Vision AI Starter Kit
  3. | トラックバック:0
  4. | コメント:0

KV260 の Petalinux にインストールした OpenCV を使った sobel_filter を実装する

KV260 の Petalinux にインストールした OpenCV を使った median_filter を実装する”の続き。

前回は、KV260 の Petalinux 上にインストールした OpenCV 3.4.16 で、メディアン・フィルタを動作させた。今回は、KV260 の Petalinux 上にインストールした OpenCV 3.4.16 で、ソーベル・フィルタを動作させた。

KV260 の Petalinux で examples ディレクトリに入って、OpenCV を使用した sobel_filter.cpp を作成した。
kv260_median_platform_153_220601.png

// sobel_filter.cpp
// 2022/05/31 by marsee
//

#include "opencv2/opencv.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgcodecs/imgcodecs.hpp"
#include "opencv2/features2d.hpp"

int main(int argc, char** argv){
    cv::Mat in_img;

    if(argc < 3){
        printf("opencv_test [input files] [output files]\n");
        exit(0);
    }
    in_img = cv::imread(argv[1], 0);
    
    cv::Mat sobelx, sobely, sobel;
    cv::Mat sobel_result;
    cv::Sobel(in_img, sobelx, CV_32F, 1, 0, 3);
    cv::Sobel(in_img, sobely, CV_32F, 0, 1, 3);
    cv::magnitude(sobelx, sobely, sobel);
    cv::convertScaleAbs(sobel, sobel_result, 1, 0);
    
    cv::imwrite(argv[2], sobel_result);

    return(0);
}


CMakeLists.txt を”KV260 の Petalinux にインストールした OpenCV を使った C++ アプリケーション・ソフトウェアを cmake でコンパイルする”からコピーした。

build ディレクトリを作成して build ディレクトリに入った。

cmake を行った。
cmake -D SOURCE_CODE=sobel_filter ..
kv260_median_platform_154_220601.png

make を行った。
make

sobel_filter 実行形式が生成された。

メディアン・フィルタ結果の median_filter.jpg を build ディレクトリにコピーした。
cp ../../median_filter/build/median_filter.jpg .

sobel_filter 実行形式ファイルを実行した。
./sobel_filter median_filter.jpg sobel_filter.jpg
kv260_median_platform_155_220601.png

sobel_fitler.jpg が生成された。

sobel_filter.jpg を示す。ソーベル・フィルタがかかっている。
kv260_median_platform_156_220601.jpg
  1. 2022年06月02日 04:08 |
  2. KRIA KV260 Vision AI Starter Kit
  3. | トラックバック:0
  4. | コメント:0

KV260 の Petalinux にインストールした OpenCV を使った median_filter を実装する

KV260 の Petalinux にインストールした OpenCV を使った C++ アプリケーション・ソフトウェアを cmake でコンパイルする”で KV260 の Petalinux で OpenCV を使用したアプリケーション・ソフトウェアの median_filter を cmake でコンパイルして、実際に動作することを確認しよう。

KV260 の Petalinux で examples ディレクトリに入って、OpenCV を使用した median_filter.cpp を作成した。
kv260_median_platform_151_220601.png

// median_filter.cpp
// 2022/05/31 by marsee
//

#include "opencv2/opencv.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgcodecs/imgcodecs.hpp"
#include "opencv2/features2d.hpp"

int main(int argc, char** argv){
    cv::Mat in_img;

    if(argc < 3){
        printf("opencv_test [input files] [output files]\n");
        exit(0);
    }
    in_img = cv::imread(argv[1], 1);
    cv::Mat medianf;
    medianBlur(in_img, medianf, 3);
    cv::imwrite(argv[2], medianf);

    return(0);
}


CMakeLists.txt を”KV260 の Petalinux にインストールした OpenCV を使った C++ アプリケーション・ソフトウェアを cmake でコンパイルする”からコピーした。

build ディレクトリを作成して build ディレクトリに入った。
kv260_median_platform_147_220601.png

cmake を行った。
cmake -D SOURCE_CODE=median_filter ..
kv260_median_platform_148_220601.png

make を行った。
make
kv260_median_platform_149_220601.png

median_filter 実行ファイルが生成された。

test2.jpg をコピーした。
cp ../../build/test2.jpg .

median_filter を実行して、median_filter.jpg ができた。
./median_filter test2.jpg medain_filter.jpg
kv260_median_platform_150_220601.png

test2.jpg を示す。ノイズが付加された画像だ。
kv260_median_platform_145_220531.jpg

メディアン・フィルタをかけるとノイズが除去されている。
median_filter.jpg を示す。
kv260_median_platform_152_220601.jpg
  1. 2022年06月01日 05:10 |
  2. KRIA KV260 Vision AI Starter Kit
  3. | トラックバック:0
  4. | コメント:0