【环境配置】使用 docker 制作一个ubuntu16.04 + ROS + pytorch-gpu 的镜像

文章目录

  • 使用 docker 制作一个ubuntu16.04 + ROS + pytorch-gpu 镜像的过程
    • 1. 我的笔记本环境:
    • 2. 环境配置过程
      • 2.1. 在 ubuntu 16.04 中安装 docker
      • 2.2. 在docker 中安装 ubuntu 16.04 含 cuda9.0 和cudnn7(这里说的安装就是指 从dockerhub 上 pull 镜像,生成容器的过程)
      • 2.3. 启动镜像
      • 2.4. 在容器中安装自己需要的软件
        • 2.4.1 安装 anaconda
        • 2.4.2 安装 pytorch
        • 2.4.3 安装 opencv
        • 2.4.4 安装 ros
        • 下面记录安装过程中的部分异常,及解决方案:
        • 2.4.5 解决不能 import rospkg 的问题
        • 2.4.6 docker 中不能使用显卡的原因:启动镜像时需要进行显卡设置。
        • 2.4.7 ifconfig (查看IP的工具) 找不到
        • 2.4.7 异常:**docker: Error response from daemon: Unknown runtime specified nvidia.**
      • 2.5. 通信时,IP的配置方法
      • 2.6. 将容器生成镜像,push 镜像到 dockerhub 账户
    • 3. 自己制作好的镜像的使用方法(需要在另一台机子上测试):
      • 3.1 新机子上安装 docker
      • 3.2 从 docker hub 上 pull 之前上传的镜像
      • 3.2 启动镜像, 测试容器是否正常
      • 3.3 根据 各个ros之间的关系来配置 IP,启动交通标志检测程序。
        • 3.3.1 我只实现过本地 ros 和 docker 中 ros 之间的通信,没有条件测试其他情况,所以 你的 ip 配置应该和我不相同。
        • 3.3.2 启动 docker 中的交通标志检测程序
        • 3.3.3 启动本地 roscore 并发布 /image_raw 话题
    • 一些命令备份在这里(临时存储):
    • 常用命令
      • 2002年05月24日11:54:07
      • 2020年6月13日 13:07:06
    • 有用请点赞,谢谢!
      • 1. 点赞,积分+1
      • 2. 评论,积分+1

使用 docker 制作一个ubuntu16.04 + ROS + pytorch-gpu 镜像的过程

1. 我的笔记本环境:

  1. lsb_release -a: Ubuntu 16.04.6 LTS xenial
  2. nvidia-smi : GeForce GTX 965M

2. 环境配置过程

2.1. 在 ubuntu 16.04 中安装 docker

参考链接(英文官网):https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-16-04

参考链接(中文翻译):https://www.runoob.com/docker/ubuntu-docker-install.html

2.2. 在docker 中安装 ubuntu 16.04 含 cuda9.0 和cudnn7(这里说的安装就是指 从dockerhub 上 pull 镜像,生成容器的过程)

直接从 dockerhub 官网上找到自己需要的版本 pull 下来;

dockerhub 官网链接:https://hub.docker.com/r/nvidia/cuda/tags?page=2&name=cudnn7

我这里使用的是 pull 下来的镜像 包含 ubuntu16.04 和 显卡驱动(cuda9.0+cudnn7)的版本, 具体该 pull 的 cuda 的什么版本是由自己的显卡决定的,英伟达官网可以查到不同显卡最高支持的cuda的版本 。

$ docker pull nvidia/cuda:9.0-cudnn7-devel-ubuntu16.04

2.3. 启动镜像

$ docker run -it [IMAGE ID 或者 REPOSITORY ]  /bin/bash
# 具体使用如下:(挂载方法是 “-v  本地目录:docker文件目录”    镜像名是 nvidia/cuda:9.0-cudnn7-devel-ubuntu16.04)
$ docker run -it -v /home/yzn/Downloads/share:/media  nvidia/cuda:9.0-cudnn7-devel-ubuntu16.04 /bin/bash 

以命令行模式进入该容器,然后就可以在这个容器里面安装自己需要的软件了

ctrl + D 可以退出容器, 容器停止工作
再次进入容器 ,需要先 start 容器,再进入容器:

$ docker start [容器的ID]  # 启动 stop 的容器
$ docker exec -it [容器的ID] /bin/bash  # 进入 start 的容器

2.4. 在容器中安装自己需要的软件

我这主要安装了

  1. anaconda
  2. pytorch
  3. opencv
  4. ros

2.4.1 安装 anaconda

anaconda 官网下载 安装文件:**.sh 文件

$ bash **.sh  #  .sh 文件的安装方法

提示:因为在容器中不方便下载,这个安装文件。所以我采用在本地ubuntu上下载,然通过挂载 本地文件到容器的方法,实现在容器中访问本地ubuntu下载的文件。挂载时,需要在 docker run 生成容器的命令中挂载。

2.4.2 安装 pytorch

$ conda install pytorch==1.1.0 torchvision==0.3.0 cudatoolkit=9.0 -c pytorch

安装速度比较慢的话,建议修改为 阿里源,修改前一定要备份

2.4.3 安装 opencv

$ pip instll opencv-python #  建议使用
或
$ conda install -c conda-forge opencv  #  不建议 经常不成功

2.4.4 安装 ros

参见链接:https://blog.csdn.net/weixin_42419002/article/details/103157489

安装过程中会出现 lsb_release 不存的问题,谷歌一下就能解决。

下面记录安装过程中的部分异常,及解决方案:

2.4.5 解决不能 import rospkg 的问题

参见链接:https://blog.csdn.net/weixin_42419002/article/details/103157489

2.4.6 docker 中不能使用显卡的原因:启动镜像时需要进行显卡设置。

如果在 启动镜像生成容器的过程中没有 设置 --runtime=nvidia 或者 --gpus all 的话,docker 中是无法使用 cuda/显卡 的。

测试在容器中是否能使用显卡的方法:

方法一: torch.cuda.is_available()

root@2c4635c3c3cd:/# python 
Python 2.7.16 |Anaconda, Inc.| (default, Sep 24 2019, 21:51:30) 
[GCC 7.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch 
>>> torch.cuda.is_available()
True  # 这里如果显示 False 的话,就表示在docker 中不能使用显卡

方法二:容器中没有自带 nvidia-smi, 需要谷歌解决问题。

$ nvidia-smi  #  查看显卡信息

设置 容器可调用本地显卡的两个命令:
docker run 后添加:
--runtime=nvidia 这个没有试成功:
添加后错误提示:docker: Error response from daemon: Unknown runtime specified nvidia.See ‘docker run --help’.
错误原因:

--gpus all 成功了, 这个问题弄了好久,具体是怎么解决的,忘记了…………

参考链接:https://github.com/NVIDIA/nvidia-docker/issues/838
参考链接:https://discuss.pytorch.org/t/docker-torch-cuda-is-available-returns-false/47282/2
参考链接:https://stackoverflow.com/questions/50462153/nvidia-docker-run-vs-docker-run-runtime-nvidia
参考链接:https://github.com/NVIDIA/nvidia-docker/issues/1018

2.4.7 ifconfig (查看IP的工具) 找不到

apt-get install net-tools -y  

2.4.7 异常:docker: Error response from daemon: Unknown runtime specified nvidia.

2.5. 通信时,IP的配置方法

ubuntu主机中的docker 中的ros 与 ubuntu主机的通信IP配置,参考: https://blog.csdn.net/Chenming_Hnu/article/details/60469410

由于我目前只需要 docker 中ros 与本地的 ros (两个ros 在同一个电脑中国)进行通信,所以只需要设置
参考链接中的:
【环境配置】使用 docker 制作一个ubuntu16.04 + ROS + pytorch-gpu 的镜像_第1张图片

2.6. 将容器生成镜像,push 镜像到 dockerhub 账户

参考链接:https://www.okcode.net/article/41799

push 结果如下:

root@yzn-cn15s:/home/yzn# docker push siat123/ubuntu1604-ros-pytorch_trafficsign
The push refers to repository [docker.io/siat123/ubuntu1604-ros-pytorch_trafficsign]
28dd93accea0: Pushed 
93775b877d1e: Pushed 
6e1d0db5981d: Pushed 
647e685c5838: Pushed 
6b34d15ed20b: Pushed 
84e7743c151b: Pushed 
17a831445aa8: Pushed 
827bbdc23ac2: Pushed 
b7ee80f86be3: Pushed 
aa7f8c8d5f39: Pushed 
48817fbd6c92: Pushed 
1b039d138968: Pushed 
7082d7d696f8: Pushed 
latest: digest: sha256:dfc7470d9ddf5aa43d318852ec564e50ed7023bbe380a704c9e842a0cf5b188b size: 3055

3. 自己制作好的镜像的使用方法(需要在另一台机子上测试):

3.1 新机子上安装 docker

参考链接(英文官网):https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-16-04

参考链接(中文翻译):https://www.runoob.com/docker/ubuntu-docker-install.html

3.2 从 docker hub 上 pull 之前上传的镜像

$ docker login # 输入dockerhub 的账户和密码 
$ docker pull docker pull siat123/ubuntu1604-ros-pytorch_trafficsign

3.2 启动镜像, 测试容器是否正常

# 启动镜像,生成容器 trafficsign_docker,进入容器的命令行界面
docker run  --gpus all --name=trafficsign_docker -it siat123/ubuntu1604-ros-pytorch_trafficsign /bin/bash

输入以下命令,测试容器是否正常,如果能使用显卡,则说明正常。

(base) yzn@yzn-cn15s:~$ docker run  --gpus all --name=trafficsign_docker -it siat123/ubuntu1604-ros-pytorch_trafficsign /bin/bash

root@38bd9764b735:/# python 
Python 2.7.16 |Anaconda, Inc.| (default, Sep 24 2019, 21:51:30) 
[GCC 7.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> import rospkg
>>> import torch
>>> torch.cuda.is_available()
True
>>>

3.3 根据 各个ros之间的关系来配置 IP,启动交通标志检测程序。

3.3.1 我只实现过本地 ros 和 docker 中 ros 之间的通信,没有条件测试其他情况,所以 你的 ip 配置应该和我不相同。

我参考的链接是:https://blog.csdn.net/Chenming_Hnu/article/details/60469410
部分截图如下:
【环境配置】使用 docker 制作一个ubuntu16.04 + ROS + pytorch-gpu 的镜像_第2张图片
我的相关配置如下,仅供参考,具体方法见上面那个参考链接。

我的 ip 配置(ifconfig)如下 :

  • 笔记本 ip: 172.17.0.1
  • 笔记本 docker 中 ubuntu 的 ip:172.17.0.2

所以,

  1. 将笔记本docker 中的 vim /etc/profile 添加 ip 配置如下:
export ROS_HOSTNAME=172.17.0.2
export ROS_MASTER_URI=http://172.17.0.1:11311
  1. 将笔记本 docker 中 ubuntu 的 vim ~/.bashrc 添加 ip 配置如下:
export ROS_HOSTNAME=172.17.0.2
export ROS_MASTER_URI=http://172.17.0.1:11311
  1. 将笔记本的 vim ~/.bashrc 添加 ip 配置如下:
export ROS_HOSTNAME=172.17.0.1
export ROS_MASTER_URI=http://172.17.0.1:11311

3.3.2 启动 docker 中的交通标志检测程序

在启动的容器的命令行中输入如下命令:

cd /home/catkin_ws_20191218/
source devel/setup.bash
cd /home/catkin_ws_20191218/src/traffic_sign_2030/src
python2 detect_traffic_sign_2030.py

上述命令在我的电脑上运行结果如下:

root@38bd9764b735:/# cd /home/catkin_ws_20191218/
root@38bd9764b735:/home/catkin_ws_20191218# source devel/setup.bash
root@38bd9764b735:/home/catkin_ws_20191218# cd /home/catkin_ws_20191218/src/traffic_sign_2030/src
root@38bd9764b735:/home/catkin_ws_20191218/src/traffic_sign_2030/src# python2 detect_traffic_sign_2030.py
waiting topic : image_raw 
Unable to register with master node [http://172.17.0.1:11311]: master may not be running yet. Will keep trying.

3.3.3 启动本地 roscore 并发布 /image_raw 话题

启动本地 roscore 发布话题 /image_raw 给 docker 中的 ros, docker 中的 ros 就会接受图片,并发布检测结果 /traffic_sign_type ,数据是字符串类型,用下划线"_"表示未检测到交通标志,字符 20 30 表示检测到的交通标志。

在本地计算机中显示 ros 信息,/traffic_sign_type 话题正常,则说明程序正常。

(py37_cl) yzn@yzn-cn15s:~$ rostopic list
/clock
/image_raw  # 图片数据
/image_show_ts_result
/rosout
/rosout_agg
/traffic_sign_type  # 交通标志检测结果,字符串

(py37_cl) yzn@yzn-cn15s:~$ rostopic echo /traffic_sign_type 
data: "_"
---
data: "_"
---
data: "_"
---

一些命令备份在这里(临时存储):

# 启动镜像
docker run  --runtime=nvidia  --name=trafficsign -it ubuntu1604-ros-pytorch/trafficsign /bin/bash

退出容器之后,再次运行需要使用下面两个命令:

# start 容器
docker start trafficsign_docker

# 进入容器
docker exec -it trafficsign_docker /bin/bash
docker run  --gpus all  --name=trafficsign -it ubuntu1604-ros-pytorch/trafficsign /bin/bash

docker run -it  -p 80:80 -v /home/yzn/Downloads/share:/media  nvidia/cuda:9.0-cudnn7-devel-ubuntu16.04 /bin/bash 
docker run  --runtime=nvidia  --name=trafficsign -it ubuntu1604-ros-pytorch/trafficsign /bin/bash
docker run  --runtime=nvidia --rm nvidia/cuda nvidia-smi --name=trafficsign -it ubuntu1604-ros-pytorch/trafficsign /bin/bash
docker run   --name=trafficsign3 -it ubuntu1604-ros-pytorch/trafficsign /bin/bash

cd /home/catkin_ws_20191218/src# 
source devel/setup.bash
cd /home/catkin_ws_20191218/src/traffic_sign_2030/src
python2 detect_traffic_sign_2030.py

$$$$
docker exec -it 243c32535da7 /bin/bash
RuntimeError: Attempting to deserialize object on a CUDA device but torch.cuda.is_available() is False. If you are running on a CPU-only machine, please use torch.load with map_location='cpu' to map your storages to the CPU.

# 本地ros环境激活:
conda activate ros_py27
source /home/yzn/code/catkin_ws_20191218/devel/setup.bash

# bag play  播放数据 发布话题
cd /media/yzn/软件110G/video
rosbag play -l TS2.bag camera/image_raw:=image_raw

rqt_graph  
rqt_image_view


# ############3

## rosbag 


cd  /home/yzn/code/catkin_ws_20191218
source devel/setup.bash

roscore


cd /media/yzn/软件110G/video
rosbag play -l TS2.bag camera/image_raw:=image_raw

rqt_graph  
rqt_image_view


## Start traffic sign detection

cd /home/yzn/code/catkin_ws_20191218/src/traffic_sign_2030/src
python2 detect_traffic_sign_2030.py
python2 sub_ts_type.py



##  #######################


##  ros  notes

source devel/setup.bash


mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace

cd ~/catkin_ws
catkin_make


source devel/setup.bash


echo $ROS_PACKAGE_PATH 


cd ~/catkin_ws/src
catkin_create_pkg test_pkg std_msgs rospy roscpp


cd ~/catkin_ws
catkin_make
source ~/catkin_ws/devel/setup.bash

# #### ####################

cd ~/catkin_ws/src
catkin_create_pkg learning_topic roscpp rospy std_msgs geometry_msgs turtlesim


####   create pkg
cd /home/yzn/code/catkin_ws_20191218/src
catkin_create_pkg traffic_light roscpp rospy std_msgs
catkin_create_pkg traffic_sign_2030 roscpp rospy std_msgs

常用命令

2002年05月24日11:54:07

启动镜像生成容器,同时设置 容器可用GPU,容器名称,本地文件挂在到容器的 /media  使用的镜像名称或ID

docker run --gpus all --name=traffic_sign_roslaunch -it  -v /media/yzn/工程/share:/media  siat123/byd_traffic_sign:roslaunch

2020年6月13日 13:07:06

其他信息:
使用 VNC Viewer 创建

docker run --runtime=nvidia 
           --user 0 
           --name=yzn_pytorch_cl 
           -d 
           -e VNC_RESOLUTION=1920x1000 
           -p 6907:5901 
           --shm-size 200G  
           -v /home/BackUp/docker-file/common:/media/common 
           -v /home/BackUp/docker-file/yzn:/media/yzn               
           siat123/yzn_pycharm:latest
echo "vncserver port is 172.20.7.168:6907"
echo "password is vncpassword"

服务器上的挂载路径:

sudo mount /dev/sdc1 /home/BackUp
sudo mount /dev/sdd1 /home/BackUp/docker-file

有用请点赞,谢谢!

1. 点赞,积分+1

2. 评论,积分+1

你可能感兴趣的:(docker)