はじめに
前回、denso-robot-rosをDockerで動かすところまでこぎつけましたが、
GUIがおかしい状態でした。
前回記事:https://qiita.com/kineneticnamaco/items/2a7039200307c1fda0db
GUIがおかしいならGPUをちゃんと使えばいいじゃない?
ということでやってみたら動きました。
さて、DockerでGPUを使うためにはNVIDIAが出しているツールの導入が必要です。
ただ、Dockerが19.03からGPUにネイティブ対応した関係で、
必要なツールがnvidia-docker2からNVIDIA Container Toolkit(以下、toolkit)に変わっています。
参考:https://qiita.com/ksasaki/items/b20a785e1a0f610efa08
(追加ツールがいるのにネイティブ対応ってなんやねん、手間変わんねーじゃねーか。あと--gpusって言うならROCm対応しないとフェアじゃなくね?でも肝心のAMDはやる気なさそうだしなあブツブツ…)
ros公式にはnvidia-docker2を使うdockerイメージの作り方が説明されていますが、
「toolkitでも同じやろwww」と思って進めたらコケました。
toolkitの記事もあんまりないので、一例として記事にします。
なお、なんでnvidia-docker2で動いてtoolkitで動かないのか原因はつかめていないので、
その手の話に詳しい人はまとめてくれると嬉しいです。
できること
前回は左の操作パネルなどが表示されてませんでしたが、今回は大丈夫です。
環境
項目 | バージョン等 |
---|---|
CPU | Intel Core i7 860 |
GPU | NVIDIA GeForce GTX750Ti |
Mem | 8GB |
OS | Ubuntu 18.04.3 64bit |
Docker | 19.03.5 |
GPU driver | NVIDIA Driver 440.33.01 |
前と比べてGPUを変えました。
環境構築
コマンドだけさらっと紹介します。
docker
curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh
参考:https://docs.docker.com/install/linux/docker-ce/centos/#install-using-the-convenience-script
NVIDIA driver
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin
sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
sudo add-apt-repository "deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/ /"
sudo apt-get update
sudo apt-get -y install cuda-drivers
NVIDIA Container Toolkit
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker
参考:https://github.com/NVIDIA/nvidia-docker/tree/master#quickstart
やり方
というかDockerfile。
FROM nvidia/opengl:1.1-glvnd-runtime-ubuntu16.04
RUN sh -c 'echo "deb http://packages.ros.org/ros/ubuntu xenial main" > /etc/apt/sources.list.d/ros-latest.list'
RUN apt-key adv --keyserver 'hkp://ha.pool.sks-keyservers.net:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
RUN apt-get update
RUN apt-get install ros-kinetic-desktop-full ros-kinetic-denso-robot-ros -y
RUN echo "source /opt/ros/kinetic/setup.bash" >> /root/.bashrc
前回はosrfのイメージをもとにつくりましたが、
今回の発想は「GPUが動く保証のあるnvidiaのイメージから組み立てる」です。
あとrosの可視化ツールがopenglを使ってそうなので、openglイメージを使いました。
これじゃないと動かないかは試してません。
前回からの違いは、ROSのリポジトリ追加です。
これがないと目当てのパッケージがインストールできません。
あとは、ビルドして、
$sudo docker build . --tag nv_opengl_ros
コンテナからxへのアクセスを許可して、
$xhost + local:root
コンテナを立ち上げて、
$sudo docker run -ti --rm --name master -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY -e QT_X11_NO_MITSHM=1 --gpus all nv_opengl_ros /bin/bash
rosを実行します。
#roslaunch denso_robot_gazebo denso_robot_gazebo.launch
これで最初に紹介した画面が立ち上がるはずです。
環境によっては時間がかかるのでのんびり待ちましょう。
その他
詰まったポイント
公式にnvidia-docker2を使う方法が説明されてます。
http://wiki.ros.org/docker/Tutorials/Hardware%20Acceleration
そこに習って作ってみてうまく行かなかったDockerfileが以下になります。
FROM osrf/ros:kinetic-desktop-full
RUN apt-get update
RUN apt-get install ros-kinetic-denso-robot-ros -y
RUN apt-get install ros-kinetic-denso-launch -y
ENV NVIDIA_VISIBLE_DEVICES ${NVIDIA_VISIBLE_DEVICES:-all}
ENV NVIDIA_DRIVER_CAPABILITIES ${NVIDIA_DRIVER_CAPABILITIES:+$NVIDIA_DRIVER_CAPABILITIES,}graphics
RUN echo "source /opt/ros/kinetic/setup.bash" >> /root/.bashrc
走らせてもGPUを起こしてる途中で即落ちます。ターミナル抜粋。
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
困ったときは公式を確認。すると
What do I have to install in my container images?
Library dependencies vary from one application to another. In order to make things easier for >developers, we provide a set of official images to base your images on.
「こまけーことはいいからnvidiaの公式イメージをベースにしろ」という話だったので素直に従いました。
おわりに
UMPCきになるなあ・・・
参考文献
変更履歴
- 2020/3/3 最後のところで動かないバグがあったので修正