【docker】配置深度学习环境

背景

本文是在师兄已经配置好宿主机的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

dataloader’s workers are out of shared memory

我们在创建容器的时候没有指定容器中共享内存shm的大小,默认值很小,所以需要在创建容器的时候指定使用的共享内存大小,参数为--shm-size 8g;或者让容器和主机使用同样的共享内存,参数为:--ipc=host

opencv的使用问题

# 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

python中的模块调用

python随记之模块调用

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值