Tiryoh / docker-ros-desktop-vnc

🐳 Dockerfiles to provide HTML5 VNC interface to access Ubuntu Desktop + ROS
https://memoteki.net/archives/2955
Apache License 2.0
273 stars 56 forks source link

docker内でgazebo起動時にハードウェアアクセラレーションする方法について #12

Closed seigot closed 3 years ago

seigot commented 4 years ago

docker_ros-desktop-vnc docker内でgazebo起動時にハードウェアアクセラレーションする方法について質問があります。

通常、docker内ではgpuは使えないと認識しています。そのため、docker内でgazeboを使うと、docker外でgazeboを使う場合と比べてrealtimefatorが低く出る傾向があると認識しています。 nvidia dockerを使えばこれが解決できるかもと考えているのですが、何かご存知ありませんでしょうか。。

Tiryoh commented 4 years ago

nvidia dockerを使えばこれが解決できるかもと考えているのですが、何かご存知ありませんでしょうか。。

ハードウェアアクセラレーションについて考えたことはありませんでした。確認してみます。

Tiryoh commented 4 years ago

とりあえず思いつくのは、このDockerイメージでベースとしているdorowu/ubuntu-desktop-lxde-vncのベースを、NVIDIA Container Toolkitに対応したGPUを使用するイメージに置き換えることです。 とりあえずtiryoh/ubuntu-desktop-lxde-vnc:bionic-cuda-10.2Dockefile)としてnvidia/cudaベースのCUDA対応版dorowu/ubuntu-desktop-lxde-vncを作りました。 そして、とりあえずtiryoh/ros-desktop-vnc:melodic-cuda-10.2Dockerfile)としてtiryoh/ubuntu-desktop-lxde-vnc-cudaベースのtiryoh/ros-desktop-vncを作ってみました。 一応手元のMX150入りのノートパソコンでは動いているようですが、GPUを有効にできたことをどうやって確認したらよいのか、というところでちょっと悩んでいます。

Tiryoh commented 4 years ago

一応手元のMX150入りのノートパソコンでは動いているようですが、GPUを有効にできたことをどうやって確認したらよいのか、というところでちょっと悩んでいます。

この件について、Twitterにてinata39さんより以下のアドバイスをいただきました

Docker上でシミュレーターを起動させ、「$ nvidia-smi l」コマンドでGPUが受け持っているprocessが表示されるので、それっぽいプロセスがいるか? を確認する というのはどうでしょう

確認してみます。

Tiryoh commented 4 years ago

以下のコマンドでNVIDIA Container Toolkitを利用したコンテナを起動してみました。

$ docker run --gpus all -p 6080:80 --shm-size=512m --rm tiryoh/ros-desktop-vnc:melodic-cuda-10.2

デスクトップ環境がGPUを利用できてないようで、X11やgzclientがnvidia-smiコマンドの出力結果に出てきませんでした。 スクリーンショットの撮影方法がよくなかったのでちょっと見づらいですが、Processes:のところにプロセス名は何も出ていません。

Screenshot from 2020-08-23 20-14-17

参考までに以下がGPUが有効になっているPC上で(Docker上ではなく)、Gazeboを起動した際のnvidia-smiコマンドの実行結果です。

GazeboがGPUを利用できているのでgzservergzclientがプロセス名として出てきます。 また、デスクトップ環境がGPUを利用しているので/usr/bin/gnome-shell/usr/lib/xorg/Xorgが同様にプロセス名として列挙されていることを確認できます。

$ nvidia-smi
Sun Aug 23 20:08:36 2020       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.100      Driver Version: 440.100      CUDA Version: 10.2     |
|-------------------------------+----------------------+----------------------+
| 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 MX150       Off  | 00000000:01:00.0 Off |                  N/A |
| N/A   61C    P0    N/A /  N/A |   1578MiB /  2002MiB |     24%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      2002      G   /usr/lib/xorg/Xorg                           626MiB |
|    0      2171      G   /usr/bin/gnome-shell                         261MiB |
|    0     15995      G   ...AAAAAAAAAAAACAAAAAAAAAA= --shared-files   414MiB |
|    0     26858      G   gzclient                                      90MiB |
|    0     26871      G   gzserver                                       3MiB |
|    0     28418      G   ...quest-channel-token=9490849909445542573   177MiB |
+-----------------------------------------------------------------------------+
seigot commented 4 years ago

回答が遅れまして申し訳ありません。上記お試し頂きありがとうございます。 確認なのですが、上記は以下どちらの理解とすればよろしいでしょうか。  A. そもそも、「VIDIA Container Toolkitに対応したGPUを使用するイメージ」でも、GPUを有効にできていない(nvidia-smiコマンドの出力結果に出てこない)  B.「VIDIA Container Toolkitに対応したGPUを使用するイメージ」ではGPUを有効にできるが、今回試行頂いたnvidia/cudaベースのCUDA対応版では、GPUを有効にできていない

また、本件について色々調べていたところ以下記事を見つけました。直接のLinuxPC環境ではないですが、何か私の方でも確認できましたら共有させて頂きます。 https://qiita.com/yamamo-to/items/51bfb92a00033257f02a

seigot commented 4 years ago

以下を参考にしてnvidia-dockerをインストールした後、 https://medium.com/nvidiajapan/nvidia-docker-%E3%81%A3%E3%81%A6%E4%BB%8A%E3%81%A9%E3%81%86%E3%81%AA%E3%81%A3%E3%81%A6%E3%82%8B%E3%81%AE-20-09-%E7%89%88-558fae883f44

同サイトの「GPU 付きコンテナの起動方法」を試しましたが、 nvidia-smiコマンド実行時にプロセスが出力されませんでした。

すべての GPU を使用

docker run --gpus all --rm nvidia/cuda:9.0-base nvidia-smi

Tiryohさんに用意頂いたコマンドでも同様です。

$ docker run --gpus all -p 6080:80 --shm-size=512m --rm tiryoh/ros-desktop-vnc:melodic-cuda-10.2
...
# nvidia-smi 
Sat Sep 19 06:24:49 2020       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 450.51.06    Driver Version: 450.51.06    CUDA Version: 11.0     |
|-------------------------------+----------------------+----------------------+
| 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 2060    On   | 00000000:01:00.0  On |                  N/A |
| N/A   40C    P8     3W /  N/A |    261MiB /  5932MiB |      2%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

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

他サイトをみると、「コンテナの中でnvidia-smiが実行できたら成功」みたいな表現はあるので、 GPU自体は使えるがアプリ側の対応が要るのかな?と考えています。 http://verifiedby.me/adiary/0137

更に他サイトをみると、 「NVIDIA_VISIBLE_DEVICES を指定しただけでは、nvidia-smi コマンドは使えても OpenGL や CUDA を利用することができない。 これらを利用するためには、用途に応じて環境変数 NVIDIA_DRIVER_CAPABILITIES を指定する必要がある。」 みたいな記述もあるので色々試したいと考えています。(手詰まってきてる感はあります) https://qiita.com/hoto17296/items/be34849412e7ae9db6ff

ちなみに、用意頂いたコマンドを実行すると、ブラウザからlocalhost:6080 で入れなくなるのですが何かご存知でしょうか、、? $ docker run --gpus all -p 6080:80 --shm-size=512m --rm tiryoh/ros-desktop-vnc:melodic-cuda-10.2

Tiryoh commented 4 years ago

バタバタしててお返事できてませんでした

確認なのですが、上記は以下どちらの理解とすればよろしいでしょうか。  A. そもそも、「VIDIA Container Toolkitに対応したGPUを使用するイメージ」でも、GPUを有効にできていない(nvidia-smiコマンドの出力結果に出てこない)  B.「VIDIA Container Toolkitに対応したGPUを使用するイメージ」ではGPUを有効にできるが、今回試行頂いたnvidia/cudaベースのCUDA対応版では、GPUを有効にできていない

上記の質問、解決したようですが、記録のためコメントしておきます。 ABどちらでもなく、GPU自体は使えているものの、使いたいアプリケーションがGPUを利用せずCPUを利用しているという状況です。 具体的には

という状況です。

他サイトをみると、「コンテナの中でnvidia-smiが実行できたら成功」みたいな表現はあるので、 GPU自体は使えるがアプリ側の対応が要るのかな?と考えています。

はい、同じように考えています。 先のコメントにて書いたように、デスクトップ (x11)をGPU対応させることが次にためせることだと思われますが、現在取りかかれていない状況です。

ちなみに、用意頂いたコマンドを実行すると、ブラウザからlocalhost:6080 で入れなくなるのですが何かご存知でしょうか、、? $ docker run --gpus all -p 6080:80 --shm-size=512m --rm tiryoh/ros-desktop-vnc:melodic-cuda-10.2

こちらでは特にWebブラウザからアクセスできなくなることはありませんでした。何かエラー等は出ていますか? すでに6080番ポートを別のコンテナが使用していると、アクセスできなくなるとは思います。

Tiryoh commented 3 years ago

ちょっと時間があいてしまいましたが、GPUを利用したイメージの作成について調べてみました。

Xvfbでデスクトップアプリケーションを起動していますが、これがGPUを利用できていないようです。 Xvfbを呼び出している場所:https://github.com/Tiryoh/docker-ubuntu-vnc-desktop/blob/07244b4af28044e267c9abf752d9b217b5e0b547/rootfs/etc/supervisor/conf.d/supervisord.conf#L50

普段利用しているデスクトップアプリケーションとは別に、Docker内でGPUを利用してデスクトップアプリケーションを実行する例はあまりないようです。 多くはX11転送を使ってGUIのアプリケーションを起動しているようです。この方法はこのDockerfileで実現したい「Webブラウザ内で操作が完結するデスクトップ環境」とは異なります。 少し調べてみると以下の資料にたどり着きました。

ryought/glx-docker-headless-gpuwillkessler/nvidia-docker-novncのようにGCPやAWS上の仮想マシンで実行している例はあるようですが、これはそのまま手元のマシンで実行するには不向きでした。 コードを読めばなんとなくわかりますが、気になってつい実行してみたので後のために記録しておくと、 実行すると普段利用しているデスクトップアプリケーションであるGNOMEではなく、Docker内部のデスクトップがモニタに表示されるようになってしまいました。 キーボードもモニタも繋がないクラウド上の仮想マシンならこれでよいですが、普段のPC上で使用するのには向いていませんでした。

--allow-empty-initial-configurationをつけてnvidia-xconfigを実行するとよいようですが、2020年10月17日現在、nvidia/cudaglにはnvidia-xconfigが入っていないようでした。

https://7me.nobiki.com/2019/11/11/xorg-virtual-screen-with-nvidia-gpu/

そのためryought/glx-docker-headless-gpuのDockerfile#L54-L77のようにDockerfile内でnvidia-installerを実行する必要がありそうで、汎用的に使うのは難しそうです。

また機会があれば調べてみますが、難しそうというのがわかったところでこの件は一旦保留にしたいと思います。

seigot commented 3 years ago

すみません、丁寧に回答頂きありがとうございます。 せっかく調べてまとめて頂いたのですが、私の知識では2割未満の理解度です。。 汎用的な解決はないとの事で、使うデバイスを統一したり、AWS等クラウドの場合は運用ルールに準拠するといった配慮が要りそうですね。 (細かいオプションは理解できていないです)

また、docker内のGPUを利用してる方はもっと多いと思っていたのですがあまり事例がないのですね。 docker内GPU有無で処理速度がどう変わるかベンチマークとってる方も見かけないです。

また何か分かりましたらアップデートさせて頂きますが、一旦保留で問題ございません。

Tiryoh commented 3 years ago

レスポンスありがとうございます。ご質問頂いて私も気になったので調べた結果をメモしてみました。 もう少しわかりやすく説明できればよかったのですが、理解が曖昧なところも多くて説明が難しく、歯がゆいです……

ツールを色々組み合わせているからだと思いますが、私もそれぞれのツールの使い方をなんとなくわかった程度です。 探せばもっといろんなオプションやもっと賢いやり方があるかもしれませんし、どこかで誰かの参考になるかもしれないので、とりあえずこのissueはこのまま残しておきます。