• 【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 # 进入容器后,进入正在执行的终端
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    容器内查看GPU相关:

    进入python控制台
    import torch
    # 查看容器中是否可以使用CUDA
    torch.cuda.is_available()
    
    # 查看有几张卡
    torch.cuda.device_count()
    
    # 查看卡的型号 'NVIDIA GeForce RTX 2070'
    # 不管宿主机有多少张显卡,对于容器而言,就只看得到一张(启动容器的时候指定的那一张,这里因为只有一张卡,所以启动容器的时候没有指定)
    torch.cuda.get_device_name(0)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    其他环境:

    # 配置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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    问题与解决

    容器启动后添加端口映射

    一般添加端口自映射需要在生成容器的时候用-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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    注意我们要实现的是将主机的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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    python中的模块调用

    python随记之模块调用

  • 相关阅读:
    性能分析5部曲:瓶颈分析与问题定位,如何快速解决瓶颈?
    Ubuntu14.04 gtest+gcov+lcov/gcovr简单使用
    canvas 系列学习笔记三《样式和颜色》
    【JMeter】threadNum:将接口查询结果列表按顺序赋值给各线程
    【二】【SQL Server】如何运用SQL Server中查询设计器通关数据库期末查询大题
    js刷题巩固之路
    Qt(day2)
    设计模式面试指南
    asp.net老年大学信息VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio计算机毕业设计
    【ElasticSearch系列-05】SpringBoot整合elasticSearch
  • 原文地址:https://blog.csdn.net/qq_44173974/article/details/128171480