2019年8月27日火曜日

Fedora 30 に Docker 19.03 を入れて GPU 対応する

目的

Fedora 30 の Docker(バージョン19.3) に、NVIDIA Container Toolkit を導入し、GPU対応を行う。

動機

Fedora 30 の Docker はバージョン19.3が採用されたが、NVIDIA Container Toolkit (nvidia-docker2) が対応できていなかったため、Fedora 29 のリポジトリのdockerを導入していた。
バージョン19.3ではGPU連携されたこと、NVIDIA Container Toolkit が Docker バージョン19.3に対応したので、切り替えることとした。

入れ替え


古いDockerの削除

まずはすでにインストール済みのDockerを削除する。

$  sudo dnf remove docker \
>                   docker-client \
>                   docker-client-latest \
>                   docker-common \
>                   docker-latest \
>                   docker-latest-logrotate \
>                   docker-logrotate \
>                   docker-selinux \
>                   docker-engine-selinux \
>                   docker-engine


Fedora 30のリポジトリからDockerをインストール

新規にインストールする場合は、公式の通りリポジトリを追加する。

$ sudo dnf -y install dnf-plugins-core
$ sudo dnf config-manager \
    --add-repo \
    https://download.docker.com/linux/fedora/docker-ce.repo

自分の環境は、すでにインストール済みで、Fedora29 のリポジトリを参照するようにしていたので、/etc/yum.repos.d/docker-ce.repo を直接編集。

[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://download.docker.com/linux/fedora/$releasever/$basearch/stable
# baseurl=https://download.docker.com/linux/fedora/29/$basearch/stable

インストール

$ sudo dnf install docker-ce docker-ce-cli containerd.io


NVIDIA Container Toolkitのインストール

Fedora 30は用意されていないので、ここを参照しながらインストール。

$ curl -s -L https://nvidia.github.io/nvidia-docker/centos7/nvidia-docker.repo | sudo tee /etc/yum.repos.d/nvidia-docker.repo
$ sudo dnf install -y nvidia-container-toolkit


動作確認


$ sudo docker run --gpus all nvidia/cuda:9.0-base nvidia-smi
Unable to find image 'nvidia/cuda:9.0-base' locally
9.0-base: Pulling from nvidia/cuda
f7277927d38a: Pull complete 
8d3eac894db4: Pull complete 
edf72af6d627: Pull complete 
3e4f86211d23: Pull complete 
d6e9603ff777: Pull complete 
9454aa7cddfc: Pull complete 
a296dc1cdef1: Pull complete 
Digest: sha256:1883759ad42016faba1e063d6d86d5875cecf21c420a5c1c20c27c41e46dae44
Status: Downloaded newer image for nvidia/cuda:9.0-base
Tue Aug 27 11:45:10 2019       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 430.40       Driver Version: 430.40       CUDA Version: 10.1     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 1070    Off  | 00000000:09:00.0  On |                  N/A |
|  0%   46C    P8    12W / 151W |    466MiB /  8116MiB |      4%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+

2019年8月13日火曜日

Edge TPUでDeepLabv3のベンチマークを測定する

目的

DeepLabのTF-Lite, Edge TPU Modelについて、tflite::Interpreter::SetNumThreadsを変えることによって推論時間がどの程度変化する計測した。


動機

Coral Edge TPUのJuly 2019 UpdatesによってCompilerとAPIがDeepLabモデルをサポート。

Pythonのサンプルが作成できたところで、「TFlite interpreterのスレッド数を増やすことでパフォーマンスが向上する可能性がある」とアドバイスを頂いた。

これは、DeepLabのEdge TPU ModelはサポートしていないOpeがありCPUにオフロードされるため、マルチスレッドで動作させればCPU側にオフロードされたOpeのパフォーマンスが向上するためと思われる。

Edge TPU Compilerで変換。いくつかのOpeがCPU側にオフロードされている


Edge TPUのPython APIはSetNumThreadsを変更できない(1固定)ため、C++でサンプルを作成した。Edge TPU Model、TF-Lite Modelについて、Jetson Nano、Raspberry Pi 3 B+でスレッド数を変えてモデルの推論時間のベンチマークを計測した。


まとめとかいろいろ

  • スレッド数を変更することでパフォーマンス向上が確認できた。
    これは、CPU側の処理がマルチスレッドで向上したことによる効果。
  • Edge TPU ModelはサポートするOpeが増えた場合、スレッド数の効果は減る(CPU側オフロードが少なくなるから)ので、今後のEdge TPU Compilerのアップデートに期待。
  • TF-Lite ModelはCPUで実行するため、マルチスレッドにする効果は大。
  • Jetson NanoとRaspberry Pi 3 B+ではJetson Nanoのほうが推論時間が短い。
    これは、
    ・Edge TPU Modelの場合は、USB2.0と3.0の違いが大きい
    ・TF-Lite Modelの場合は、CPU/Memoryの性能がJetson Nanoの上のため
  • Raspberry Pi 4はどうなるかな?
  • Dev Boardは手持ちにないので未計測。


ベンチマーク方法など

使用したベンチマーク用のコードはGitHubにアップ。
  • 読み込んだ画像に対して推論を20回行った平均で算出。
  • スレッド数は1〜4(コア数分)まで変化させて計測。
  • 入力(1, 513, 513, 3)、出力(1, 513, 513, 1)のリサイズ、セグメンテーションマップの生成は含まない。
  • 使用したモデルは
    ・TF-Lite ModelはQuantized modelのdeeplabのモデルを使用。
    ・Edge TPU ModelはQuantized modelから生成(ここにモデルをアップ)。
  • Edge TPU Compiler、APIはJuly 2019 Updatesを使用。
  • tflite::Interpreter::SetNumThreadsの指定はここを参照。


ベンチマーク結果

DeepLabのモデルとデバイスごとの推論時間(単位:ms)

Model
SetNumThreads
Device
Raspberry Pi 3 B+Jetson Nano
Edge TPU Model
deeplabv3_mnv2_dm05_pascal_trainaug_edgetpu.tflite

MobileNet-v2
Depth-Multiplier = 0.5
1459213
2377172
3352159
4333153
deeplabv3_mnv2_pascal_train_aug_edgetpu.tflite

MobileNet-v2
1834363
2668262
3561224
4511209
TF-LIte Model
deeplabv3_mnv2_dm05_pascal_trainaug_edgetpu.tflite

MobileNet-v2
Depth-Multiplier = 0.5
1862368
2537240
3445198
4385179
deeplabv3_mnv2_pascal_train_aug_edgetpu.tflite

MobileNet-v2
11873736
21070432
3763333
4674284

その他

  • 公式のベンチマークによると、DevBoardでは推論時間は156msとある。
    これは、Jetson Nanoでスレッド数に4を指定した場合とほぼ同等である。
    公式ではDeepLabのモデル、ベンチマークプログラムとも公開されていない。
    公開されてから比較が必要かもしれない。
  • Edge TPU Compilerのバージョンがアップされ、サポートOpeが増えた場合、このベンチマークは意味がなくなる。注意が必要。

感謝

  • @Mangobearさん
    「TFlite interpreterのスレッド数を増やすことでパフォーマンスが向上する可能性がある」とアドバイスいただきました。今回のベンチマークを行うきっかけをいただきました。
  • iwatakeさん
    C++コードを書く際に「Google Coral Edge TPU with C++ on Jetson Nano」を参考にさせていただきました。
ありがとうございます。