2020/11/24
今回できたこと
Jetson Nanoで、本体とnvidiaランタイムを使ったDockerコンテナの間でOpenGLの性能を比較し、ほとんど遜色がないことがわかった。
Docker Desktop for Windowsをインストールし、GUIなど違いがほとんどないことを確認した。
お約束
定例作業
参考文献
Docker Desktop for Windows
Windows版独自の機能としては、以下のようなものがある。
仮想環境に、Hyper-V を使っている。
Windows コンテナ機能が必要。
コンテナは、WindowsコンテナとLinuxコンテナを切り替えて利用できる。
Dockerの入門環境として、Docker Desktopを使うのはありだという気がした。
JetsonNano nvidiaランタイム実験
nvidiaランタイムの動作を確認するために、JetsonNanoに元から入っているコンテナイメージnvcr.io/nvidia/l4t-baseを利用する。
code:shell
$ sudo docker images|grep nvidia
nvcr.io/nvidia/l4t-base r32.2.1 593e936de911 15 months ago 1.06GB
code:shell
$ sudo docker run -it --runtime nvidia 593e936de911 /bin/bash
root@040c8db6b90c:/#
Xのアプリケーションを動かすために、起動は以下の手順で行う。
code:shell
$ export DISPLAY=:1
$ xhost +
access control disabled, clients can connect from any host
$ sudo docker run -it --rm --net=host --runtime nvidia -e DISPLAY=$DISPLAY -v /tmp/.X11-unix/:/tmp/.X11-unix nvcr.io/nvidia/l4t-base:r32.2.1
このコンテナイメージには、CUDAのデモが含まれているため、例えば以下のように実行可能である。
code:shell
# ls /usr/local/cuda-10.0/
LICENSE README doc include nvml samples targets version.txt
NsightCompute-1.0 bin extras lib64 nvvm share tools
# cd /usr/local/cuda-10.0/samples/bin/aarch64/linux/release/
# ./oceanFFT
同じデモをruncランタイムで実行すると、そもそも/usr/local/cuda-10.0/samples/が存在しない。
code:shell
$ sudo docker run -it --rm --net=host --runtime runc -e DISPLAY=$DISPLAY -v /tmp/.X11-unix/:/tmp/.X11-unix nvcr.io/nvidia/l4t-base:r32.2.1
# ls /usr/local/cuda-10.0/
bin include lib64 nvvm targets
このようなランタイムでディレクトリ構成が変更される仕組みを調べてみたが、理由がわからなかった。
以下は、docker inspectでイメージ調べた結果だが、起動時コマンド(CMD)も普通の/bin/bashであり、~/.bashrcなども特別なことはしていなかった。
code:shell
$ sudo docker images|grep nvidia
nvcr.io/nvidia/l4t-base r32.2.1 593e936de911 15 months ago 1.06GB
$ sudo docker inspect 593e936de911
[
{
"Id": "sha256:593e936de911b5e8fb61fa3ade6272afe62ac01d43715a56bb7a560190e95d2c",
"RepoTags": [
"nvcr.io/nvidia/l4t-base:r32.2.1"
],
"RepoDigests": [
"nvcr.io/nvidia/l4t-base@sha256:d76b1a4521f06810b065c550c4c451f4b66f4cbf40a0ecfdd418eb0c777836db"
],
"Parent": "",
"Comment": "",
"Created": "2019-08-19T19:36:57.37160036Z",
"Container": "",
"ContainerConfig": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": null,
"Cmd": null,
"Image": "",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": null
},
"DockerVersion": "",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/cuda-10.0/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"LD_LIBRARY_PATH=/usr/local/cuda-10.0/targets/aarch64-linux/lib:",
"NVIDIA_VISIBLE_DEVICES=all",
"NVIDIA_DRIVER_CAPABILITIES=all"
],
"Cmd": [
"/bin/bash"
],
"Image": "",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": null
},
"Architecture": "amd64",
"Os": "linux",
"Size": 1058316954,
"VirtualSize": 1058316954,
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/5fa6f12253fc4e242af1c24cab9509be36f5ed9a2b4d1a6666d998fee4f7a2a4/diff:/var/lib/docker/overlay2/07c0ff932230b83738b4767bc854967c20679a193cdad7294d13c46f97fadbcb/diff:/var/lib/docker/overlay2/bc70548020fdec3320c64dc400e4081760a4430371a2c46a6f0f6d2f9b52ce43/diff:/var/lib/docker/overlay2/5965a87baefd26479752607d4931fa80098f0f94dbb7488ef3517b44cbc89ac8/diff:/var/lib/docker/overlay2/16baed61559b23d93957f19935b358781531d5252371aaa0da31107ba5aee11f/diff:/var/lib/docker/overlay2/a7ebca8003cd0b7bf9cde7ef979146cddbb0b2649a1b3506d9614ac387dc9616/diff:/var/lib/docker/overlay2/ebf992e5ea78da31dd8d0ab33bb7e9c6ba4fcad1db106c5c3ebe3cdd38e6ec5b/diff:/var/lib/docker/overlay2/4192b2310ea219224757337592fb2cc09daa277a64e091c73b42e1a22d3e4c18/diff:/var/lib/docker/overlay2/e8d53080dc13563225a8d9c53da2edfa7ceba3c7c6c9d4322323e075dcda7ec6/diff:/var/lib/docker/overlay2/565a054307446eaf6cd2a4faf3a652a5e2b968516e6a9f3e9647ae19824b3eab/diff:/var/lib/docker/overlay2/e4ea813235beb46e018d93c729fac4b90cc3873a53249ed44812f05ccb3dd981/diff:/var/lib/docker/overlay2/1478f7171649c038934e73616656e47f5e8761724df07b71f450b3cea1d843fa/diff:/var/lib/docker/overlay2/aac5936769820b0fb35b079edf585897efa97d88b9dd1499310dfd91f77f154b/diff:/var/lib/docker/overlay2/578e7b87623265ff6a5672f00a42750eebad99ce67c943e74856d2ef56f52937/diff:/var/lib/docker/overlay2/d03dc5127ba01f1543c12ebbd4afb8de2122b039b208c4e3f8aa4507301f6570/diff",
"MergedDir": "/var/lib/docker/overlay2/9af33acc11c7b722c637469b301f6c60a10b996fc8f99da52351735cafd140ed/merged",
"UpperDir": "/var/lib/docker/overlay2/9af33acc11c7b722c637469b301f6c60a10b996fc8f99da52351735cafd140ed/diff",
"WorkDir": "/var/lib/docker/overlay2/9af33acc11c7b722c637469b301f6c60a10b996fc8f99da52351735cafd140ed/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:2adbecb1a41615b5cdabe439f630d473a0620ac07b03f6d3e3fb921f621f64ad",
"sha256:0f281575a19a61e6ac886487c1c7b5bca6a5a1bc51245447c22b6667aaf79108",
"sha256:91d0b5503603f19b6cd2ad8453f6b0cc06a43d656cd0e3a83d5eaa6850956483",
"sha256:8023dc5179362ede8271c13a0168ee40e5d80f2121890d97edbb5ea807fa8776",
"sha256:2d47753c51a73a4f29145cdef6614b37836dd2b4b0aed53f72ee7091da1f8709",
"sha256:3f7f9f563a48043865bd726a45d0fc7d2ffbf188e9cae5354c4f6b88fbce1e73",
"sha256:5f7e82f6ed42b7cd90cdbe483a064890962377e4671dafd4b2f8bd59a23a109d",
"sha256:ca7fe27332359b713fbb3a4bbbad98afabd048aee3fe65924a73c5566630e7ca",
"sha256:40cff2d027c3f2461bb809f87a93c27a4d092cfd060e57079803b0311613da84",
"sha256:c3113266db547b2fdddff00b15ae1ddc8aff6a3b2bf71df49fe8a20068255ab0",
"sha256:46e6a739c9ff63a4e8108a4f2718c5a5fd8188f729b279aa41a264e9386bcabd",
"sha256:ab42322cc6d59fb952b0cf6f511886b3729cdb8cce7c6baa418e9e16c67d500c",
"sha256:c325903dd232b8d8113131324f7cefb1fc095cd4a502becc7b0fc42378f95653",
"sha256:2542512268c8fb570a0bc1190b283a8cc6e69e4d8127c7482a3914561bed94aa",
"sha256:2dea288fb5fa2a9163c1b3ddf4def76221b023dc08e247f6aa0965750bc27c80",
"sha256:eba42f0a4de12861c8e790838dc49ac4ae44aeadbee22b2c978eb380e43492e1"
]
},
"Metadata": {
"LastTagTime": "0001-01-01T00:00:00Z"
}
}
]
CUDAのデモが、runcランタイムで利用できないため、ランタイムruncとnvidia間のパフォーマンスチェックは、CUDAデモではできないという結果になった。
Mesaのデモで、手軽にFPS(Frame Per Second)を測るコマンドとして、glxgearsがあるため、これで(Jetson Nano本体とnvidiaランタイム間の)パフォーマンスを確認する。
code:shell
$ sudo apt install mesa-utils
(snip)
### native Jetson Nano
$ glxgears
300 frames in 5.0 seconds = 59.990 FPS
299 frames in 5.0 seconds = 59.720 FPS
298 frames in 5.0 seconds = 59.517 FPS
コンテナ内では、一度apt updateをしないとmesa-utilsはインストールできない。
code:shell
# sudo apt-get install mesa-utils
Reading package lists... Done
Building dependency tree
Reading state information... Done
Package mesa-utils is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
E: Package 'mesa-utils' has no installation candidate
# sudo apt update
(snip)
# sudo apt install mesa-utils
(snip)
コンテナ内でglxgearsを実行した時の様子は、以下の通り。
code:shell
### nvidiaランタイム
# glxgears
Running synchronized to the vertical refresh. The framerate should be
approximately the same as the monitor refresh rate.
209 frames in 5.0 seconds = 41.601 FPS
263 frames in 5.0 seconds = 52.496 FPS
### runcランタイム
# glxgears
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
X Error of failed request: BadValue (integer parameter out of range for operation)
Major opcode of failed request: 154 (GLX)
Minor opcode of failed request: 3 (X_GLXCreateContext)
Value in failed request: 0x0
Serial number of failed request: 39
Current serial number in output stream: 41
今回試したOpenGLに関するデモの性能をまとめる。
驚いたことに、nvidiaコンテナを使った場合でも、Jetson Nano本体の環境と比べて、パフォーマンスにそれほど違いがなかった。
table:OpenGLデモの性能比較
環境 glxgears particles 備考
Jetson Nano本体 59.7FPS前後 350FPS前後
nvidia runtimeでのコンテナ 40-59FPS前後 310FPS前後
runc runtimeでのコンテナ - - そもそも実行できない
Dockerコンテナイメージに関する注意
今回、コンテナイメージを実行した時に、"exec format error"が出ることがあった。
code:shell
$ sudo docker images|grep nvidia
nvcr.io/nvidia/cudagl 11.0-devel-centos8 acb6e712587f 6 days ago 4.07GB
nvcr.io/nvidia/l4t-base r32.2.1 593e936de911 15 months ago 1.06GB
coreyhanson/glxgears-nvidia latest 252aa74cacf2 2 years ago 232MB
$ sudo docker run -it --runtime nvidia acb6e712587f /bin/sh
standard_init_linux.go:211: exec user process caused "exec format error"
$ sudo docker run -it 252aa74cacf2 /bin/bash
standard_init_linux.go:211: exec user process caused "exec format error"
これは、コンテナイメージのアーキテクチャが異なることが原因で、エラーが出たものはlinux/amd64アーキテクチャのものであった。
イメージのアーキテクチャは、Tagsの部分で確認できるようである。
Jetson Nano(おそらく、Raspberry Piも)では、Dockerイメージはlinux/arm64のものしか実行できないので、注意が必要である。
アーキテクチャ違いで不要になったイメージを以下のように消去した。
code:shell
$ sudo docker rmi -f acb6e712587f
Untagged: nvcr.io/nvidia/cudagl:11.0-devel-centos8
Untagged: nvcr.io/nvidia/cudagl@sha256:f751f1714b786b2a65ef875f47ab8a137542d150f59874a8c3f258f297e565f0
Deleted: sha256:acb6e712587f4a1ee77191eb60b63627a261fbd5ddc1863249442d7ed88f4a79
$ sudo docker rmi -f 252aa74cacf2
Untagged: coreyhanson/glxgears-nvidia:latest
Untagged: coreyhanson/glxgears-nvidia@sha256:68c88d87f4089ab088293ead6431103cb472bbd3b5e71386a5ca586fccc97a5d
Deleted: sha256:252aa74cacf217f773df1fd3854b0eb26594a01031eef53a275d7ae9841bfee9