Ubutnu 20.04インストールとVitis 2020.2とVitis AI 1.3関連の開発環境構築のメモ

# Ubutnu 20.04インストールとVitis 2020.2とVitis AI 1.3関連の開発環境構築のメモ

恒例の行事なので特別な作業はないが、2019.2とVitis AI 1.1の時と比べてXilinx環境の必要パッケージのインストールが楽になったり、gpu版のdocker環境構築でエラーが出たりしたので記事にしておく。

インストール先のPCのスペック

* AMD Ryzen 5 3600
* GeForce RTX 2060 SUPER


## OSのインストール

### USBのイメージが起動しない

[Ubuntu 20.04 LTS 日本語 Remix リリース](https://www.ubuntulinux.jp/News/ubuntu2004-ja-remix)のページからisoファイルをダウンロードしてusbに書き込んでusbブートする。
isoファイルの書き込みは、[rufus](https://rufus.ie/)を使用した(`choco install rufus`でインストール)。

nvidiaのグラフィックスカードがついているとusbブートでも正しく起動できない。
grubの起動メニューで、`e`を押してコマンドを編集する必要がある。
linux行の`quiet splash`を`nomodeset`に変更すると起動するようになる。

### インストール中のパーティション編集でウィンドウが見えない

参考: [Ubuntu18.04インストール時、パーティション作成画面のウィンドウの下部が隠れて操作が出来ない際の対処法](https://magidropack.hatenablog.com/entry/2018/10/25/182817)

いったんインストール用の画面を閉じてから、ターミナルを起動して`gnome-tweaks`をインストールして起動。

```sh
sudo apt install gnome-tweaks
gnome-tweaks
```

フォント -> 倍率 の設定を 0.75 程度に変更することでウィンドウサイズが小さくなって、インストール中画面のすべてのボタン類が見えるようになる。


### nvidiaの推奨ドライバをインストール

リポジトリを登録して、自動で推奨のドライバをインストールする。

```sh
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
sudo ubuntu-drivers autoinstall
```

自動でインストールしない場合、`ubuntu-drivers devices`で使えるドライバを一覧できる。

```sh
$ ubuntu-drivers devices
== /sys/devices/pci0000:00/0000:00:03.1/0000:08:00.0 ==
modalias : pci:v000010DEd00001F06sv00001462sd00008D93bc03sc00i00
vendor   : NVIDIA Corporation
model    : TU106 [GeForce RTX 2060 SUPER]
driver   : nvidia-driver-450-server - distro non-free
driver   : nvidia-driver-450 - distro non-free
driver   : nvidia-driver-440-server - distro non-free
driver   : nvidia-driver-460 - distro non-free recommended
driver   : xserver-xorg-video-nouveau - distro free builtin
```

手動でインストールする場合は以下。

```sh
sudo apt install nvidia-driver-460
```

### homeフォルダ英語化

`LANG=C xdg-user-dirs-gtk-update`


### ssh公開鍵登録

sftpなど適当な方法で公開鍵を持ってきて、配置する。

```sh
sudo apt install ssh
mv id_rsa.pub ~/.ssh/id_rsa.pub
```

### Windows側の名前解決

```sh
sudo apt install samba winbind libnss-winbind
```

Windows側に参加出来るようにする。`/etc/nsswitch.conf`に`wins`追記

```sh
hosts:          files mdns4_minimal [NOTFOUND=return] dns wins
```

`avahi-daemon`がインストールされていない場合はインストールして起動する必要がある。

```sh
sudo apt install avahi-daemon
sudo systemctl start avahi-daemon
```

### Windowsから見える共有フォルダ作成

sambaユーザを作成

```sh
sudo smbpasswd -a $USER
```

`/etc/samba/smb.conf`を編集(変更のみ表示)


```ini
[global]
   unix charset = UTF-8
   dos charset = CP932

   interfaces = 127.0.0.0/8 enp0s3
   bind interfaces only = yes

;   map to guest = bad user

[homes]
   comment = Home Directories
   browseable = no
   writable = yes
   read only = no
   valid users = %S

# Shared HDD
[HDD]
   path = /mnt/HDD
   writable = yes
   readonly = no
   guest ok = yes
   guest only = yes
```

### Windowsからリモートデスクトップ接続できるようにする

[Ubuntu 20.04 LTSでxrdpを使用する](https://gihyo.jp/admin/serial/01/ubuntu-recipe/0621)を参考にしたが、独自スクリプトを実行させるようにしていた部分を`.xsessionrc`に書くように変更している。

```sh
# xrdpだけでなく、xserver-xorg-core xorgxrdpも必要らしい
# xserver-xorg-input-allがないとマウスキーボードが効かない
sudo apt install xserver-xorg-input-all xserver-xorg-core xorgxrdp xrdp

# Gnomeでログインできるようにする
# ただし、同時ログインはできない
cat <<EOF > ~/.xsessionrc
export GNOME_SHELL_SESSION_MODE=ubuntu
export XDG_CURRENT_DESKTOP=ubuntu:GNOME
export XDG_DATA_DIRS=/usr/share/ubuntu:/usr/local/share:/usr/share:/var/lib/snapd/desktop
export XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg
EOF

# カーソル周りの不具合回避
sudo sed -e 's/^new_cursors=true/new_cursors=false/g' -i /etc/xrdp/xrdp.ini

# rename the redirected drives to 'shared-drives'
# 個人的にあまり気にならないのでそのままにした
# sudo sed -i -e 's/FuseMountName=thinclient_drives/FuseMountName=shared-drives/g' /etc/xrdp/sesman.ini

# Changed the allowed_users
sudo sed -i_orig -e 's/allowed_users=console/allowed_users=anybody/g' /etc/X11/Xwrapper.config

# Configure the policy xrdp session
cat <<EOF | sudo tee /etc/polkit-1/localauthority/50-local.d/45-allow-colord.pkla
[Allow Colord all Users]
Identity=unix-user:*
Action=org.freedesktop.color-manager.create-device;org.freedesktop.color-manager.create-profile;org.freedesktop.color-manager.delete-device;org.freedesktop.color-manager.delete-profile;org.freedesktop.color-manager.modify-device;org.freedesktop.color-manager.modify-profile
ResultAny=no
ResultInactive=no
ResultActive=yes
EOF

# https://askubuntu.com/questions/1193810/authentication-required-to-refresh-system-repositories-in-ubuntu-19-10
cat <<EOF | sudo tee /etc/polkit-1/localauthority/50-local.d/46-allow-update-repo.pkla
[Allow Package Management all Users]
Identity=unix-user:*
Action=org.freedesktop.packagekit.system-sources-refresh
ResultAny=yes
ResultInactive=yes
ResultActive=yes
EOF

# サービスを再起動
sudo systemctl restart xrdp
sudo systemctl restart polkit
```

## Xilinxツール(2020.2)のインストール

事前にインストール先を作っておく。

```sh
sudo mkdir /opt/Xilinx
sudo chown $USER /opt/Xilinx
sudo mkdir /opt/petalinux
sudo mkdir /opt/petalinux/2020.2
```

インストール用のバイナリをダウンロードして、インストール。
必要なパッケージをインストールためのスクリプトも用意されているので実行。

```sh
# Vitisのインストール
chmod +x ./Xilinx_Unified_2020.2_1118_1232_Lin64.bin
./Xilinx_Unified_2020.2_1118_1232_Lin64.bin
# 必要なパッケージをインストール
sudo /opt/Xilinx/Vitis/2020.2/scripts/installLibs.sh


# petalinuxのインストール
chmod +x ./petalinux-v2020.2-final-installer.run
./petalinux-v2020.2-final-installer.run -d /opt/Xilinx/petalinux/2020.2

# 必要なパッケージをインストール
wget https://www.xilinx.com/Attachment/plnx-env-setup.sh
chmod +x plnx-env-setup.sh
./plnx-env-setup.sh
```

### Vitis-AI関連

[githubのVitis-AIページ](https://github.com/Xilinx/Vitis-AI)を見ながらインストールを進める。

#### docker

まずはdockerを[docker公式ページ](https://docs.docker.com/engine/install/ubuntu/)を見てインストールするとのこと。

```sh
sudo apt-get update
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

# Add GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

# set up the stable repository
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

# install
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
```

動作確認してみる。

```sh
sudo docker run hello-world
```

管理者権限がないユーザーでもdockerを管理できるようにする。(dockerグループにユーザを加える)

```sh
# sudo groupadd docker
sudo usermod -aG docker $USER
```

一度ログアウトしてログインしな直して動作確認する。(`sudo`なしで実行できるかの確認)

```sh
docker run hello-world
```

#### Vitis-AI本体(docker環境)

```sh
git clone --recurse-submodules https://github.com/Xilinx/Vitis-AI
cd Vitis-AI

# CPU版/GPU版docker環境のビルド(CPU版はpullでも可)
cd setup/docker
./docker_build_cpu.sh
# docker pull xilinx/vitis-ai-cpu:latest
./docker_build_gpu.sh

# CPU/GPU版dokcer環境の実行
cd ../..
./docker_run.sh xilinx/vitis-ai-cpu:latest
./docker_run.sh xilinx/vitis-ai-gpu:latest
```

##### gpu版が以下のエラーで起動できないとき

動作確認用に、nvidia/cudaを実行してもダメ。
[Docker(19.03)でgpu有効化してpytorchで訓練するまでやる(Ubuntu18.04)](https://qiita.com/tomp/items/50081b99df7963462488)を参考に対処する。


```sh
$ docker run --rm --gpus all nvidia/cuda:10.0-cudnn7-runtime-ubuntu18.04 nvidia-smi
docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]].
```

上記のQiita記事では[New Docker CLI API Support for NVIDIA GPUs under Docker Engine 19.03.0 Pre-Release](https://collabnix.com/introducing-new-docker-cli-api-support-for-nvidia-gpus-under-docker-engine-19-03-0-beta-release/)を参考にしたらしいが、スクリプトの作成は不要だと思うので省略した。
以下のようにリポジトリを追加して、ランタイムをインストールする。(再起動が必要かも)

```sh
curl -s -L https://nvidia.github.io/nvidia-container-runtime/gpgkey | \
  sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-container-runtime/$(. /etc/os-release;echo $ID$VERSION_ID)/nvidia-container-runtime.list | \
  sudo tee /etc/apt/sources.list.d/nvidia-container-runtime.list
sudo apt-get update
sudo apt-get install nvidia-container-runtime
```

これで、正しく実行できる。

```sh
$ docker run --rm --gpus all nvidia/cuda:10.0-cudnn7-runtime-ubuntu18.04 nvidia-smi
Sun Jan 10 08:24:18 2021
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 460.32.03    Driver Version: 460.32.03    CUDA Version: 11.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  GeForce RTX 206...  Off  | 00000000:08:00.0  On |                  N/A |
| 40%   33C    P8    10W / 184W |     45MiB /  7973MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+
```

xilinx/vitis-ai-gpu:latestも問題なし。

```
$ ./docker_run.sh xilinx/vitis-ai-gpu:latest

...(ライセンスなどのプロンプト表示があるが、省略)

==========================================

__      ___ _   _                   _____
\ \    / (_) | (_)            /\   |_   _|
 \ \  / / _| |_ _ ___ ______ /  \    | |
  \ \/ / | | __| / __|______/ /\ \   | |
   \  /  | | |_| \__ \     / ____ \ _| |_
    \/   |_|\__|_|___/    /_/    \_\_____|

==========================================

Docker Image Version:  latest
Build Date: 2021-01-10
VAI_ROOT: /opt/vitis_ai

For TensorFlow Workflows do:
     conda activate vitis-ai-tensorflow
For Caffe Workflows do:
     conda activate vitis-ai-caffe
For Neptune Workflows do:
     conda activate vitis-ai-neptune
For PyTorch Workflows do:
     conda activate vitis-ai-pytorch
For TensorFlow 2.3 Workflows do:
     conda activate vitis-ai-tensorflow2
For Darknet Optimizer Workflows do:
     conda activate vitis-ai-optimizer_darknet
For Caffe Optimizer Workflows do:
     conda activate vitis-ai-optimizer_caffe
For TensorFlow 1.15 Workflows do:
     conda activate vitis-ai-optimizer_tensorflow
For LSTM Workflows do:
     conda activate vitis-ai-lstm
Vitis-AI /workspace >
```


#### XRT

2020.2向けのXRTのパッケージが用意されていないようなのでビルドする。
まずはソースコードをダウンロードして、それっぽいブランチをcheckoutしておく。

```sh
git clone https://github.com/Xilinx/XRT
cd XRT
git checkout origin/2020.2
```

[Building the XRT Software Stack](https://xilinx.github.io/XRT/master/html/build.html)を参考にビルド。

```sh
# 依存パッケージなどをインストール
sudo ./src/runtime_src/tools/scripts/xrtdeps.sh
# ランタイムをビルド
cd build
./build.sh
# debパッケージ作成
cd build/Release
make package
# インストール
sudo dpkg -i xrt_202020.2.8.0_20.04-amd64-xrt.deb
# 必要なら、生成したdebを適当な場所においておく
cp xrt_202020.2.8.0_20.04-amd64-xrt.deb ~/Downloads/
```