DeepLearning ハードウェアアクセラレータ：VTAをPYNQ-Z1 で動くようにセットアップして見た

#MacからsshfsでPYNQのファイルをリモートアクセスするための設定
最初は、VivadoをWindows10で動作させていて、そこからPYNQ-Z1にbitstreamファイルを
送り込んでいたので、WindowsのWSL（Windows Subscribe for Linux)のUbuntu16.04から
sshfsしてみようと試みたのですが、なんか色々モジュールが足りないとのことで、接続出来なかったので、
Macからやってみたら出来た。

https://qiita.com/ysk24ok/items/bb148530a55a4e55d99b

```
brew install osxfuse
brew install sshfs
mkdir mountp
sshfs xilinx@192.168.2.99:/home/xilinx mountp
```
として、ローカルのmountpに移動して、中身を見ると、PYNQ-z1のファイルがみれていますね。
素晴らしい。

```
cd mountp
kinomacpro-4:mountp kinoca77$ ls
REVISION		jupyter_notebooks	pynq
```

これで、PYNQからはインターネットに繋がらないのですが、git cloneしてきたソースファイルなどを
取り込んで、コンパイルが出来ます！
では早速、TVMのソースをcloneします。

```
git clone --recursive https://github.com/dmlc/tvm
```

この状態で、PYNQにログインして、ビルドしましょう。
本家の手順はこちら。

```
ssh xilinx@192.168.2.99
cd /home/xilinx/tvm
mkdir build
cp cmake/config.cmake build/.
cp vta/config/pynq_sample.json build/vta_config.json
cd build
cmake ..
make runtime vta -j2
cd ..
sudo ./apps/pynq_rpc/start_rpc_server.sh # pw is 'xilinx'
```

/tvm/vta/config/pynq_sample.jsonには、PYNQ用の以下のような推論パラメータ（各種演算に利用する計算資源の量を、対象の計算資源に合わせて調整できる）が参照できます。

```
{
  "TARGET" : "pynq",
  "HW_FREQ" : 100,
  "HW_CLK_TARGET" : 8,
  "HW_VER" : "0.0.0",
  "LOG_INP_WIDTH" : 3,
  "LOG_WGT_WIDTH" : 3,
  "LOG_ACC_WIDTH" : 5,
  "LOG_OUT_WIDTH" : 3,
  "LOG_BATCH" : 0,
  "LOG_BLOCK_IN" : 4,
  "LOG_BLOCK_OUT" : 4,
  "LOG_UOP_BUFF_SIZE" : 15,
  "LOG_INP_BUFF_SIZE" : 15,
  "LOG_WGT_BUFF_SIZE" : 18,
  "LOG_ACC_BUFF_SIZE" : 17
}

```

手順の詳細結果は、以下。

```
xilinx@pynq:~$ ls
jupyter_notebooks  pynq  REVISION  tvm
xilinx@pynq:~$ pwd
/home/xilinx
xilinx@pynq:~$ cd tvm
xilinx@pynq:~/tvm$ mkdir build
xilinx@pynq:~/tvm$ cp cmake/config.cmake build/.
xilinx@pynq:~/tvm$ ls
3rdparty  cmake           CONTRIBUTORS.md  golang       jvm       NEWS.md  python     src    tutorials  web
apps      CMakeLists.txt  docker           include      LICENSE   nnvm     README.md  tests  verilog
build     conda           docs             Jenkinsfile  Makefile  NOTICE   rust       topi   vta
xilinx@pynq:~/tvm$ cd build
xilinx@pynq:~/tvm/build$ ls
config.cmake
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
-- Performing Test SUPPORT_CXX11
-- Performing Test SUPPORT_CXX11 - Success
-- Build with RPC support...
-- Build with Graph runtime support...
-- Build VTA runtime with target: sim
-- Configuring done
-- Generating done
-- Build files have been written to: /home/xilinx/tvm/build
```
TVMをビルドします。
```
xilinx@pynq:~/tvm/build$ make runtime vta -j2
```

```
[100%] Built target vta
```
が表示されればビルドは成功です。
ここでPYNQ上でRPCサーバーを起動します。（パスワードは、xilinx)

```
xilinx@pynq:~$ cd tvm
xilinx@pynq:~/tvm$ sudo ./apps/pynq_rpc/start_rpc_server.sh # pw is 'xilinx'
[sudo] password for xilinx: 
INFO:RPCServer:bind to 0.0.0.0:9091

```
#Mac(Host)からRPCサーバーを使用するための設定
ホストPC側で以下の設定をします。

```
export VTA_PYNQ_RPC_HOST=192.168.2.99
export VTA_PYNQ_RPC_PORT=9091
```
tvmのルートフォルダに,PYNQのファイルからTARGETがpynqとしたファイルをコピーします。

```
cd mountp/tvm
cp vta/config/pynq_sample.json vta_config.json

```
PYNQで設定したものと同じものを、ホスト側でも置く訳です。

```
{
  "TARGET" : "pynq",
  "HW_FREQ" : 100,
  "HW_CLK_TARGET" : 8,
  "HW_VER" : "0.0.0",
  "LOG_INP_WIDTH" : 3,
  "LOG_WGT_WIDTH" : 3,
  "LOG_ACC_WIDTH" : 5,
  "LOG_OUT_WIDTH" : 3,
  "LOG_BATCH" : 0,
  "LOG_BLOCK_IN" : 4,
  "LOG_BLOCK_OUT" : 4,
  "LOG_UOP_BUFF_SIZE" : 15,
  "LOG_INP_BUFF_SIZE" : 15,
  "LOG_WGT_BUFF_SIZE" : 18,
  "LOG_ACC_BUFF_SIZE" : 17
}
```


```
import os
import tvm
from tvm import rpc
from vta import get_bitstream_path, download_bitstream, program_fpga, reconfig_$

host = os.environ.get("VTA_PYNQ_RPC_HOST", "pynq")
port = int(os.environ.get("VTA_PYNQ_RPC_PORT", "9091"))

def program_rpc_bitstream(path=None):
    """Program the FPGA on the RPC server

    Parameters
    ----------
    path : path to bitstream (optional)
    """
    assert tvm.module.enabled("rpc")
    remote = rpc.connect(host, port)
    program_fpga(remote, path)

def reconfig_rpc_runtime():
    """Reconfig the RPC server runtime
    """
    assert tvm.module.enabled("rpc")
    remote = rpc.connect(host, port)
    reconfig_runtime(remote)

program_rpc_bitstream()
reconfig_rpc_runtime()
```
#Mac(host side)側でも、TVMをインストール

```
git clone --recursive https://github.com/dmlc/tvm
```
Macで必要なライブラリは以下。

```
On OSX the target library are libtvm.dylib, libtvm_topi.dylib
```