深度学习环境安装-docker

前言

实验室里有多台服务器,因为采购时间的不同,每台服务器上的发行版本、CUDA版本是不同的。在之前的服务器上配置完成的OpenPose,想在新的服务器上也配置,按照当初的步骤,在make时由于cudnn版本太高识别不了,而cudnn和CUDA版本有个对应关系,但实验室其他人也需要使用服务器,不能因为我一个人将CUDA版本降下去。挣扎了几天,还是无法成功地配置好。忽然想起之前配过OpenPose的docker环境,由于X11没有配置,配置完OpenPose后就丢在一边了。这次拿过来用,把X11配置好,并对步骤做了总结,因此有了这篇博文。

环境说明

Ubuntu21.04。可用lsb_release -a查看版本信息

查看Linux系统版本信息的几种方法

nvidia-docker安装

可参照官方文档安装,但是Ubuntu21.04暂时没有支持,所以直接按照步骤的话会出现Unsupported distribution!错误,解决的办法可参考Ubuntu21.04无法安装nvidia-docker

下面展示步骤:

  1. curl https://get.docker.com | sh \
      && sudo systemctl --now enable docker
    
  2. distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
       && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \
       && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
       
    # 注意:对于21.04,可能要用下面的方式
    distribution=$(. /etc/os-release;echo ${ID}21.04) \
       && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \
       && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
    
  3. # 21.04需要该步骤
    sudo vim /etc/apt/sources.list.d/nvidia-docker.list
    # 添加下面内容
    deb https://nvidia.github.io/libnvidia-container/ubuntu18.04/amd64 /
    deb https://nvidia.github.io/nvidia-container-runtime/ubuntu18.04/amd64 /
    deb https://nvidia.github.io/nvidia-docker/ubuntu18.04/amd64 /
    
   
4. ```shell
   # 更新源
   sudo apt update
  1. # 安装nvidia-docker
    sudo apt install -y nvidia-docker2
    # 重启
    sudo service docker restart
    

配置docker权限给当前用户(可选)

现在安装完的docker需要sudo才能使用,通过将权限授予当前用户,可以不用sudo

  1. # 如果没有docker group,则先添加
    sudo groupadd docker 
    
  2. # 将当前用户加入docker group。然后退出并重新登录就生效
    sudo gpasswd -a ${USER} docker 
    
  3. # 重启docker服务
    sudo service docker restart
    

添加docker权限给当前用户,使docker命令免sudo

Ubuntu镜像配置

  1. # 拉取镜像
    docker pull nvidia/cuda:10.2-cudnn7-devel-ubuntu18.04
    # 可通过inspect查看镜像详细信息
    # docker inspect nvidia/cuda:10.2-cudnn7-devel-ubuntu18.04
    
  2. 编辑dockerfile

    FROM nvidia/cuda:10.2-cudnn7-devel-ubuntu18.04
    ENV APT_PATH /etc/apt
    # 更新阿里源
    RUN cp $APT_PATH/sources.list $APT_PATH/sources.list.bak
    RUN rm $APT_PATH/sources.list
    RUN echo "deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse" >> $APT_PATH/sources.list
    RUN echo "deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse" >> $APT_PATH/sources.list
    RUN echo "deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse" >> $APT_PATH/sources.list
    RUN echo "deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse" >> $APT_PATH/sources.list
    RUN echo "deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse" >> $APT_PATH/sources.list
    RUN echo "deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse" >> $APT_PATH/sources.list
    RUN echo "deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse" >> $APT_PATH/sources.list
    RUN echo "deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse" >> $APT_PATH/sources.list
    RUN echo "deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse" >> $APT_PATH/sources.list
    RUN echo "deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse" >> $APT_PATH/sources.list
    
    RUN apt update
    WORKDIR /root
    
  3. 构建镜像

    # -t指定构建出来的镜像tag
    docker build -t nvidia:1 -f /path/to/Dockerfile .
    

深度学习环境配置

  1. 启动镜像

    # -p映射端口,-v映射目录
    docker run --gpus all -it -p 10122:22 --name test \
    -v /media/exchange:/workspace \
    nvidia:1
    # 如果需要窗口(X11)显示,用下面的命令
    docker run --gpus all -it -p 10122:22 --name test \
    -v /tmp/.X11-unix/:/tmp/.X11-unix -e DISPLAY=${DISPLAY} \
    -v /media/exchange:/workspace \
    nvidia:1
    
  2. 配置Python

    # 安装基本库
    apt install gcc
    apt install -y --no-install-recommends make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python-openssl
    
    # 这里是用make来编译python的
    tar -zxv -f tar -zxv -f Python-3.6.7.tgz
    cd Python-3.6.7
    ./configure --prefix=/usr/local/python3.6.7
    make && make install
    
    # 更新软链接
    rm /usr/bin/python 
    ln -s /usr/local/python3.6.7/bin/python3.6 /usr/bin/python
    ln -s /usr/local/python3.6.7/bin/pip3 /usr/bin/pip
    
  3. 更换pip源到国内镜像

    mkdir ~/.pip
    vim ~/.pip/pip.conf
    
    # 复制以下内容
    [global]
    index-url = https://pypi.tuna.tsinghua.edu.cn/simple
    
    # 升级pip
    pip install --upgrade pip
    
  4. 安装pytorch等其他需要用的深度学习库

创建和宿主机用户相同的用户(可选)

  1. 查看宿主机用户id

    id -u # 1002
    
  2. 容器中添加用户

    # 添加指定gid的组
    groupadd -g 1002 skb
    # 添加指定uid的用户,并加入到指定组
    useradd -u 1002 -g skb -d /home/skb -m skb
    
  3. 更改bash

    # 创建完用户后,不能自动补全或使用基本的shell命令的,则进行以下操作
    vim /etc/passwd 
    # 将skb默认的shell从/bin/sh改为/bin/bash即可
    
  4. 更改skb用户的密码,顺便把root的密码也一并改了

    passwd skb # 更改skb用户密码
    passwd # 更改root密码,慎重
    

理解 docker 容器中的 uid 和 gid

配置ssh登录

apt install -y --no-install-recommends openssh-server

# 修改配置
vim /etc/ssh/sshd_config
# 修改参数
PubkeyAuthentication yes # 启用公钥私钥配对认证方式

# 启动sshd服务
service ssh restart

# 在宿主机上,测试ssh
ssh skb@127.0.0.1 -p 10122

配置X11显示(可选)

# 配置xorg
apt install xorg

vim /etc/ssh/sshd_config
# 修改下面两个参数
X11Forwarding yes
X11UseLocalhost no

# 重启ssh服务
service ssh restart

镜像备份(导入导出)

# 提交镜像,容器id,通过docker ps -a查看
docker commit -m="pytorch" -a="skb" 容器id 标签
docker commit -m="pytorch" -a="skb" 9881af7244f8 pytorch:1.7
# 导出镜像
docker save -o pytorch.tar pytorch:1.7
# 导入镜像
docker load -i pytorch.tar

其他问题补充

apt install

出现问题,比如Unable to locate package libssl-dev

解决:apt update

容器随宿主机启动而启动

docker update --restart=always 容器id

退出后容器处于exit状态

在容器内部可通过Crtl+P+Q退出,此时容器不会处于exit状态

如果配置了容器随宿主机启动而启动,则用exit退出容器后,容器立刻重启

上一篇:1357:车厢调度(train)


下一篇:【Pix2Pix】当生成式对抗神经网络遇到车道线检测