前言
实验室里有多台服务器,因为采购时间的不同,每台服务器上的发行版本、CUDA版本是不同的。在之前的服务器上配置完成的OpenPose,想在新的服务器上也配置,按照当初的步骤,在make时由于cudnn版本太高识别不了,而cudnn和CUDA版本有个对应关系,但实验室其他人也需要使用服务器,不能因为我一个人将CUDA版本降下去。挣扎了几天,还是无法成功地配置好。忽然想起之前配过OpenPose的docker环境,由于X11没有配置,配置完OpenPose后就丢在一边了。这次拿过来用,把X11配置好,并对步骤做了总结,因此有了这篇博文。
环境说明
Ubuntu21.04。可用lsb_release -a
查看版本信息
nvidia-docker安装
可参照官方文档安装,但是Ubuntu21.04暂时没有支持,所以直接按照步骤的话会出现Unsupported distribution!
错误,解决的办法可参考Ubuntu21.04无法安装nvidia-docker。
下面展示步骤:
-
curl https://get.docker.com | sh \ && sudo systemctl --now enable docker
-
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
-
# 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
-
# 安装nvidia-docker sudo apt install -y nvidia-docker2 # 重启 sudo service docker restart
配置docker权限给当前用户(可选)
现在安装完的docker需要sudo才能使用,通过将权限授予当前用户,可以不用sudo
-
# 如果没有docker group,则先添加 sudo groupadd docker
-
# 将当前用户加入docker group。然后退出并重新登录就生效 sudo gpasswd -a ${USER} docker
-
# 重启docker服务 sudo service docker restart
添加docker权限给当前用户,使docker命令免sudo
Ubuntu镜像配置
-
# 拉取镜像 docker pull nvidia/cuda:10.2-cudnn7-devel-ubuntu18.04 # 可通过inspect查看镜像详细信息 # docker inspect nvidia/cuda:10.2-cudnn7-devel-ubuntu18.04
-
编辑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
-
构建镜像
# -t指定构建出来的镜像tag docker build -t nvidia:1 -f /path/to/Dockerfile .
深度学习环境配置
-
启动镜像
# -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
-
配置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
-
mkdir ~/.pip vim ~/.pip/pip.conf # 复制以下内容 [global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple # 升级pip pip install --upgrade pip
-
安装pytorch等其他需要用的深度学习库
创建和宿主机用户相同的用户(可选)
-
查看宿主机用户id
id -u # 1002
-
容器中添加用户
# 添加指定gid的组 groupadd -g 1002 skb # 添加指定uid的用户,并加入到指定组 useradd -u 1002 -g skb -d /home/skb -m skb
-
更改bash
# 创建完用户后,不能自动补全或使用基本的shell命令的,则进行以下操作 vim /etc/passwd # 将skb默认的shell从/bin/sh改为/bin/bash即可
-
更改skb用户的密码,顺便把root的密码也一并改了
passwd skb # 更改skb用户密码 passwd # 更改root密码,慎重
配置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
退出容器后,容器立刻重启