本文是在师兄已经配置好宿主机的CUDA环境之后,尝试使用docker容器搭建自己的个人环境,跑深度学习代码。而硬件是只有一张2070显卡。
容器基本操作:
# 按照服务器配置拉取对应的镜像
docker pull pytorch/pytorch:1.9.0-cuda10.2-cudnn7-devel
# 查看主机端口 没有信息 说明端口空闲
netstat -anp |grep 8088
# 生成对应容器
docker run -it --ipc=host --runtime=nvidia --name Det-yxx -p 8088:22 -v /home/yxx/3D_object_dection/kitti:/workspace/kitti pytorch/pytorch:1.9.0-cuda10.2-cudnn7-devel /bin/bash
# --ipc=host 容器与宿主主机共享内存
# --runtime=nvidia: 使用GPU
# 重新进入该容器
docker exec -it 容器id /bin/bash # 进入容器后,打开一个新的终端
docker attach 容器id # 进入容器后,进入正在执行的终端
容器内查看GPU相关:
进入python控制台
import torch
# 查看容器中是否可以使用CUDA
torch.cuda.is_available()
# 查看有几张卡
torch.cuda.device_count()
# 查看卡的型号 'NVIDIA GeForce RTX 2070'
# 不管宿主机有多少张显卡,对于容器而言,就只看得到一张(启动容器的时候指定的那一张,这里因为只有一张卡,所以启动容器的时候没有指定)
torch.cuda.get_device_name(0)
Ubuntu配置apt-get更新源设置为国内镜像源
:链接
容器内配置ssh
# 给当前容器设置密码 后面ssh使用密码登录
passwd
# 安装ssh
apt-get update
apt-get install openssh-server
apt-get install openssh-client
apt-get install ssh
# 安装vim
apt-get install vim
# 安装网络工具包
apt-get install net-tools
# 查看端口占空 发现22端口确实空闲
netstat -anp |grep 22
# ssh的连接设置
vim /etc/ssh/sshd_config
# 文件末尾追加:
PermitRootLogin yes
port=22
PubkeyAuthentication yes
PasswordAuthentication yes
# 启动ssh
/etc/init.d/ssh restart
# 再次查看端口 发现被ssh占用了已经
netstat -anp |grep 22
# 尝试远程登录容器 这边其实和登录服务器一样了
# 登录服务器是 ssh 用户名@ip -p 22
# 容器内我们没有设置其他用户 直接就用root登录 ip还是服务器的ip 端口就是主机的8088端口 对应容器的22端口
ssh root@ip -p 8088
其他环境:
# 配置pip 参考这里:https://blog.csdn.net/qq_44173974/article/details/125336916
# 安装git zip等常用软件
apt-get update
apt-get install git
apt-get install zip
# 安装conda
# 参考https://blog.csdn.net/qq_44173974/article/details/125336916
# 将容器打包成镜像(因为做完了基本的环境配置了)
docker commit -m="基本环境" -a="yxx" 容器ID dl-environment-yxx:1.0
# 重新生成容器
docker run -it --ipc=host --runtime=nvidia --name dl-yxx -p 8088:22 -v /home/yxx/3D_object_dection/dl-yxx:/dl-yxx dl-environment-yxx:1.0 /bin/bash
一般添加端口自映射需要在生成容器的时候用-p指定映射规则,但如果当时忘记指定了或者后期需要新的映射规则,就需要这一步了
方法1:
将现有的容器打包成镜像,然后在使用新的镜像运行容器时重新指定要映射的端口,比较暴力
方法2:
直接修改当前容器的配置文件
# 停止容器 但是停止容器之前记得吧容器ID记下来哟
docker stop 容器ID/name
# 停掉docker服务
systemctl stop docker
# 查看容器的端口映射 是空
docker port 容器ID/name
# 进入容器配置文件的存放目录
# 注意 这里的容器ID需要是完全的 一般docker ps之类看到的都是部分的 可以使用docker inspect 查看完整的容器id
cd /var/lib/docker/containers/容器Id
vim hostconfig.json
vim config.v2.json
注意我们要实现的是将主机的8088端口和容器的22端口进行映射,并且此前两者不存在其他的映射关系
首先是在hostconfig.json中添加如下:
然后在config.v2.json中添加如下两处:
# 发现端口映射成功了
docker port Det-yxx
# 启动docker服务
systemctl start docker
# 启动容器
docker start Det-yxx
# 容器中启动ssh
/etc/init.d/ssh restart
# 容器中查看端口 发现被22端口占用了已经
netstat -anp |grep 22
# 主机中查看端口 发现被8088端口占用了已经
netstat -anp |grep 8088
我们在创建容器的时候没有指定容器中共享内存shm的大小,默认值很小,所以需要在创建容器的时候指定使用的共享内存大小,参数为--shm-size 8g
;或者让容器和主机使用同样的共享内存,参数为:--ipc=host
# opencv的安装
pip install opencv-python
# 但是使用的时候报错
# Importerror: libgl.so.1: cannot open shared object file: no such file or directory
# 原因是opencv这些图像库会依赖一些计算机的软件,这些软件在容器中是没有的,我们需要手动安装一下
apt-get update
apt-get install ffmpeg libsm6 libxext6 -y