rospyでPyTorchを使うためのDocker環境構築方法をご紹介します。
【Docker】rospyでPyTorchを使う
PyTorchをrospyで使うのに苦労したため、その解決策をまとめます。
この記事では、Dockerを用いた環境構築をご紹介します。Dockerを使わずローカルで環境構築する方々もDockerfileの中身は参考になると思います。
何が問題か?
以下のようなPyTorch、ROSのバージョン対応・非対応が環境構築をややこしくしています。
- PyTorch
- ほとんどのバージョンがPython3
- 最新バージョン(v1.6.0)ではCUDA11に非対応
- ROS
- Noeticより前のrospyのデフォルトがPython2
- OpenCV(cv2)やcv_bridgeもPython2
- NoeticはCUDA11
- Noeticより前のrospyのデフォルトがPython2
紹介する環境構築
この記事では、2種類の仮想環境構築をご紹介します。それぞれDocker(バージョン19.03以降)用、Nvidia Docker 1用、Nvidia Docker 2用の実装例を載せます。
- ROS Kinetic on Ubuntu 16.04
- Docker(バージョン19.03以降)の場合
- Nvidia Docker 1の場合
- Nvidia Docker 2の場合
- ROS Noetic on Ubuntu 20.04
- Docker(バージョン19.03以降)の場合
- Nvidia Docker 1の場合
- Nvidia Docker 2の場合
事前準備
Dockerコンテナ内でCUDAを利用するために、バージョン19.03以降のDocker、もしくはNvidia Dockerが必要です。
具体的には以下をインストールする必要があります。
- Nvidia driver
-
Docker(バージョン19.03以降)
or
Docker+Nvidia Docker 1 or 2
※Docker19.03以降はNvidia dockerなしで、コンテナ内でCUDAを利用できます。
仮想環境:ROS Kinetic on Ubuntu 16.04
ROS KineticのデフォルトはPython2なので、対処すべき課題がたくさんあります。
Docker(バージョン19.03以降)の場合
Dockerfile
########## Pull ##########
FROM nvidia/cuda:9.0-cudnn7-devel-ubuntu16.04
########## BASIS ##########
RUN apt-get update && \
apt-get install -y \
vim \
wget \
unzip \
git \
build-essential
########## ROS Kinetic insatall ##########
RUN apt-get update && \
apt-get install -y \
lsb-release && \
sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' && \
apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 && \
apt-get update && \
apt-get install -y \
ros-kinetic-ros-base
########## ROS setup ##########
RUN mkdir -p /home/ros_catkin_ws/src && \
cd /home/ros_catkin_ws/src && \
/bin/bash -c "source /opt/ros/kinetic/setup.bash; catkin_init_workspace" && \
cd /home/ros_catkin_ws && \
/bin/bash -c "source /opt/ros/kinetic/setup.bash; catkin_make" && \
echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc && \
echo "source /home/ros_catkin_ws/devel/setup.bash" >> ~/.bashrc && \
echo "export ROS_PACKAGE_PATH=\${ROS_PACKAGE_PATH}:/home/ros_catkin_ws" >> ~/.bashrc && \
echo "export ROS_WORKSPACE=/home/ros_catkin_ws" >> ~/.bashrc
########## PyTorch & Python3 on rospy ##########
RUN apt-get update && \
apt-get install -y \
python3-pip && \
pip3 install --upgrade "pip < 21.0" && \
pip3 install \
torch==1.1.0 \
torchvision==0.3.0 \
rospkg \
catkin_pkg
########## cv_bridge on Python3 ##########
RUN apt-get update && \
apt-get install -y \
python-catkin-tools \
python3-dev \
python3-catkin-pkg-modules \
python3-numpy \
python3-yaml \
ros-kinetic-cv-bridge && \
pip3 install \
opencv-python && \
mkdir -p /home/catkin_build_ws/src && \
cd /home/catkin_build_ws && \
catkin init && \
catkin config -DPYTHON_EXECUTABLE=/usr/bin/python3 -DPYTHON_INCLUDE_DIR=/usr/include/python3.5m -DPYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.5m.so && \
catkin config --install && \
cd /home/catkin_build_ws/src && \
git clone https://github.com/ros-perception/vision_opencv.git && \
cd vision_opencv && \
git checkout 1.12.8 && \
ln -s \
/usr/lib/x86_64-linux-gnu/libboost_python-py35.so \
/usr/lib/x86_64-linux-gnu/libboost_python3.so && \
cd /home/catkin_build_ws && \
/bin/bash -c "source /opt/ros/kinetic/setup.bash; catkin build cv_bridge" && \
/bin/bash -c "source install/setup.bash --extend" && \
echo "source /home/catkin_build_ws/install/setup.bash --extend" >> ~/.bashrc && \
rm /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so
Build
$ docker build . -t pytorch_rospy_kinetic:docker
Run
$ docker run -it --rm --gpus all pytorch_rospy_kinetic:docker
Nvidia Docker 1の場合
Dockerfile
########## Pull ##########
FROM nvidia/cuda:9.0-cudnn7-devel-ubuntu16.04
########## nvidia-docker1 hooks ##########
LABEL com.nvidia.volumes.needed="nvidia_driver"
ENV PATH /usr/local/nvidia/bin:${PATH}
ENV LD_LIBRARY_PATH /usr/local/nvidia/lib:/usr/local/nvidia/lib64:${LD_LIBRARY_PATH}
########## BASIS ##########
# ~ OMITTED ~ #
########## ROS Kinetic insatall ##########
# ~ OMITTED ~ #
########## ROS setup ##########
# ~ OMITTED ~ #
########## PyTorch & Python3 on rospy ##########
# ~ OMITTED ~ #
########## cv_bridge on Python3 ##########
# ~ OMITTED ~ #
「# ~ OMITTED ~ #」の部分は、Docker(バージョン19.03以降)の場合と同じなので、この節内では省略しました。
Build
$ docker build . -t pytorch_rospy_kinetic:nvidia_docker1
Run
$ nvidia-docker run -it --rm pytorch_rospy_kinetic:nvidia_docker1
Nvidia Docker 2の場合
Dockerfile
########## Pull ##########
FROM nvidia/cuda:9.0-cudnn7-devel-ubuntu16.04
########## nvidia-docker2 hooks ##########
ENV NVIDIA_VISIBLE_DEVICES ${NVIDIA_VISIBLE_DEVICES:-all}
ENV NVIDIA_DRIVER_CAPABILITIES ${NVIDIA_DRIVER_CAPABILITIES:+$NVIDIA_DRIVER_CAPABILITIES,}graphics
########## BASIS ##########
# ~ OMITTED ~ #
########## ROS Kinetic insatall ##########
# ~ OMITTED ~ #
########## ROS setup ##########
# ~ OMITTED ~ #
########## PyTorch & Python3 on rospy ##########
# ~ OMITTED ~ #
########## cv_bridge on Python3 ##########
# ~ OMITTED ~ #
「# ~ OMITTED ~ #」の部分は、Docker(バージョン19.03以降)の場合と同じなので、この節内では省略しました。
Build
$ docker build . -t pytorch_rospy_kinetic:nvidia_docker2
Run
$ docker run -it --rm --runtime=nvidia pytorch_rospy_kinetic:nvidia_docker2
解説
ベースイメージ:nvidia/cuda
ベースイメージはnvidia/cudaから取得(pull)します。使用予定のPyTorchのバージョンに合ったCUDAのタグを選択します。
ROS Kineticのインストール
「ROS kinetic insatall」ブロックと「ROS setup」ブロックでROS Kineticのインストールを実装しています。
インストールの詳細はROS Wikiで確認できます。
▶︎ROS Wiki:ROS Kinetic の Ubuntu へのインストール
pipのインストール
以下のコマンドでpip3をインストールしています。
apt-get update && apt-get install -y python3-pip
追記:最新版のpipでは、python3.5がサポート対象外になったので、以下のようにバージョンを指定する必要があります。
▶stackoverflow - Python Pip broken with sys.stderr.write(f"ERROR: {exc}")
pip3 install --upgrade "pip < 21.0"
PyTorchのインストール
ベースイメージで指定したCUDAに対応するバージョンのPyTorchをインストールします。
pip3 install \ torch==1.1.0 \ torchvision==0.3.0
rospy on Python3
ROS KineticのrospyはPython2がデフォルトなので、Python3でimportできるようにpip3でインストールします。
pip3 install \ rospkg \ catkin_pkg
cv_bridge on Python3
OpenCV(cv2)やcv_bridgeをPython3で使うために、ソースコードからビルドする必要があります。
詳細は以下のページが参考になると思います。
▶︎How to setup ROS with Python 3
▶︎ERROR: Cv_bridge for Python3
以下のBoostのエラーを回避するためにリンクを設定します。
Unable to find the requested Boost libraries.
ln -s \ /usr/lib/x86_64-linux-gnu/libboost_python-py35.so \ /usr/lib/x86_64-linux-gnu/libboost_python3.so
また、cv2をimportすると、Python2用のcv2が呼ばれてエラーが出るので、以下のように削除します。
$ python3
>> import cv2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so: undefined symbol: PyCObject_Type
rm /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so
仮想環境:ROS Noetic on Ubuntu 20.04
ROS NoeticのデフォルトはもともとPython3なので、煩わしい問題は少ないです。
Docker(バージョン19.03以降)の場合
Dockerfile
########## Pull ##########
FROM vistart/cuda:10.0-cudnn7-devel-ubuntu20.04
########## non-interactive ##########
## Avoiding "Country of origin for the keyboard"
## in "apt-get install -y ros-noetic-desktop-full"
ENV DEBIAN_FRONTEND=noninteractive
########## time zone ##########
##### UTC #####
RUN echo 'Etc/UTC' > /etc/timezone && \
ln -s /usr/share/zoneinfo/Etc/UTC /etc/localtime && \
apt-get update && \
apt-get install -q -y --no-install-recommends tzdata && \
rm -rf /var/lib/apt/lists/*
########## BASIS ##########
RUN apt-get update && \
apt-get install -y \
vim \
wget \
unzip \
git \
build-essential
########## ROS Noetic insatall ##########
RUN apt-get update && apt-get install -y lsb-release &&\
sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' &&\
apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 &&\
apt-get update && apt-get install -y ros-noetic-desktop-full
########## ROS setup ##########
RUN mkdir -p /home/ros_catkin_ws/src && \
cd /home/ros_catkin_ws/src && \
/bin/bash -c "source /opt/ros/noetic/setup.bash; catkin_init_workspace" && \
cd /home/ros_catkin_ws && \
/bin/bash -c "source /opt/ros/noetic/setup.bash; catkin_make" && \
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc && \
echo "source /home/ros_catkin_ws/devel/setup.bash" >> ~/.bashrc && \
echo "export ROS_PACKAGE_PATH=\${ROS_PACKAGE_PATH}:/home/ros_catkin_ws" >> ~/.bashrc && \
echo "export ROS_WORKSPACE=/home/ros_catkin_ws" >> ~/.bashrc
########## PyTorch ##########
RUN apt-get update && \
apt-get install -y \
python3-pip && \
pip3 install \
torch==1.5.0 \
torchvision==0.6.0
Build
$ docker build . -t pytorch_rospy_noetic:docker
Run
$ docker run -it --rm --gpus all pytorch_rospy_noetic:docker
Nvidia Docker 1の場合
Dockerfile
########## Pull ##########
FROM vistart/cuda:10.0-cudnn7-devel-ubuntu20.04
########## nvidia-docker1 hooks ##########
LABEL com.nvidia.volumes.needed="nvidia_driver"
ENV PATH /usr/local/nvidia/bin:${PATH}
ENV LD_LIBRARY_PATH /usr/local/nvidia/lib:/usr/local/nvidia/lib64:${LD_LIBRARY_PATH}
########## non-interactive ##########
# ~ OMITTED ~ #
########## time zone ##########
##### UTC #####
# ~ OMITTED ~ #
########## BASIS ##########
# ~ OMITTED ~ #
########## ROS Noetic insatall ##########
# ~ OMITTED ~ #
########## ROS setup ##########
# ~ OMITTED ~ #
########## PyTorch ##########
# ~ OMITTED ~ #
「# ~ OMITTED ~ #」の部分は、Docker(バージョン19.03以降)の場合と同じなので、この節内では省略しました。
Build
$ docker build . -t pytorch_rospy_noetic:nvidia_docker1
Run
$ nvidia-docker run -it --rm pytorch_rospy_noetic:nvidia_docker1
Nvidia Docker 2の場合
Dockerfile
########## Pull ##########
FROM vistart/cuda:10.0-cudnn7-devel-ubuntu20.04
########## nvidia-docker2 hooks ##########
ENV NVIDIA_VISIBLE_DEVICES ${NVIDIA_VISIBLE_DEVICES:-all}
ENV NVIDIA_DRIVER_CAPABILITIES ${NVIDIA_DRIVER_CAPABILITIES:+$NVIDIA_DRIVER_CAPABILITIES,}graphics
########## non-interactive ##########
# ~ OMITTED ~ #
########## time zone ##########
##### UTC #####
# ~ OMITTED ~ #
########## BASIS ##########
# ~ OMITTED ~ #
########## ROS Noetic insatall ##########
# ~ OMITTED ~ #
########## ROS setup ##########
# ~ OMITTED ~ #
########## PyTorch ##########
# ~ OMITTED ~ #
「# ~ OMITTED ~ #」の部分は、Docker(バージョン19.03以降)の場合と同じなので、この節内では省略しました。
Build
$ docker build . -t pytorch_rospy_noetic:nvidia_docker2
Run
$ docker run -it --rm --runtime=nvidia pytorch_rospy_noetic:nvidia_docker2
解説
ベースイメージ:vistart/cuda
ベースイメージはvistart/cudaから取得(pull)します。使用予定のPyTorchのバージョンに合ったCUDAのタグを選択します。
vistart/cudaは、Tsinghua Universityが提供しているイメージだそうです。PyTorch1.6.0時点ではCUDA11に対応していないので、このようなCUDA10以下のUbuntu20.04イメージが役立ちます。
PyTorchがCUDA11に対応したら「nvidia/cuda:11.0-devel-ubuntu20.04」などを使えば良いでしょう。
ROS Noeticのインストール
「ROS Noetic insatall」ブロックと「ROS setup」ブロックでROS Noeticのインストールを実装しています。
インストールの詳細はROS Wikiで確認できます。
▶︎ROS Wiki:Ubuntu install of ROS Noetic
PyTorchのインストール
ベースイメージで指定したCUDAに対応するバージョンのPyTorchをインストールします。
pip3 install \ torch==1.5.0 \ torchvision==0.6.0
テスト
以下を試してエラーが出なけれOKです。
$ (イメージのbuild) $ (コンテナのrun) $ python3 >> import rospy >> import cv_bridge >> import cv2 >> import torch >> print(torch.cuda.is_available())
補足
- PyTorchがCUDA11に対応したら迷わずROS Noeticの仮想環境が良いでしょう。
さいごに
rospyでPyTorchを使うための環境構築をご紹介しました。参考になれば幸いです。
以上です。
コメント