搭建 detectron2 + pytorch + cuda 的ubuntu镜像

由于业务要求,需要搭建运行coco数据集的环境。具体的环境配置要求如下:

  • ubuntu
  • pytorch: 1.6
  • torchvision: 0.7.0
  • detectron2: 0.2.1
  • cudatoolkit: 10.1

基础镜像

我选用的基础镜像为:registry.cn-huhehaote.aliyuncs.com/lumo/pytorch-with-tensorboard:1.5.1-cuda10.1-cudnn7-runtime
(这个镜像是 arena github 上提交 pytorch 任务的事例命令行中的镜像地址,里面已经安装好了 python3.7.7,anaconda,pytorch 1.5.1,nvidia-smi 10.1)

启动并进入容器

使用 docker pull 将上述镜像拉到本地,然后基于该镜像启动容器。

docker pull registry.cn-huhehaote.aliyuncs.com/lumo/pytorch-with-tensorboard:1.5.1-cuda10.1-cudnn7-runtime
docker images | grep registry.cn-huhehaote.aliyuncs.com/lumo/pytorch-with-tensorboard:1.5.1-cuda10.1-cudnn7-runtime (得到镜像id ${image_id})
docker run -it --name ${container_name} ${image_id} /bin/bash

开启与新容器的交互式命令行。

docker ps | grep ${container_name}   (得到容器id ${container_id})
docker exec -it ${container_id} /bin/bash

安装环境

参考文章:detectron2云服务器部署 安装 测试
很优秀的文章,进入容器中基本就是按照上面的步骤做的。

安装 vim

apt update
apt install vim

修改 ubuntu apt 源

备份:

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

修改:

vim /etc/apt/sources.list

将其中除了security外的所有http url 修改为 http://mirrors.aliyun.com/ubuntu/

修改完毕后再次更新apt。

apt update

anaconda虚拟环境

由于源镜像已经安装了anaconda,因此不需要额外安装anaconda,但需要创建anaconda虚拟环境。

conda create -n ${env_name} python=3.7
conda env list
conda activate ${env_name}

如果报错说要执行 conda init,那就执行 init 后再 activate。

以下步骤全部是在刚刚创建的anaconda虚拟环境中执行的。

安装 pytorch 1.6

由于我所需要的是1.6,而源镜像预装的是pytorch1.5的,因此需要下载新的pytorch。

先安装 conda 国内加速源。

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --set show_channel_urls yes 

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/menpo/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/

具体安装 pytorch 的命令可以在 pytorch 的官网找到,每个版本都有对应的安装命令。pytorch安装页面:pytorch官网安装页面

我的需求是在linux上安装 pytorch1.6, torchvision 0.7.0, cudatoolkit 10.1,在官网上查询命令如下:

conda install pytorch==1.6.0 torchvision==0.7.0 cudatoolkit=10.1

安装 OpenCV

使用pip安装OpenCV,使用清华源。

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python

安装 fvcore

fvcore 是 FAIR 开源的 一个轻量级的核心库,它提供了在各种计算机视觉框架(如 Detectron2)中共享的最常见和最基本的功能。

pip install fvcore

安装gcc与g++

apt install gcc
apt install g++

安装 pycocotools

微软发布的 COCO 数据库是一个大型图像数据集, 专为对象检测、分割、人体关键点检测、语义分割和字幕生成而设计。

pip install -U Cython
pip install -U pycocotools

安装 detectron2

由于我需要的是 detectron2:0.2.1,于是到 detectron2: 0.2.1的github页面查询。

detectron2: 0.2.1页面

根据我的CUDA与pytorch环境,选择使用图中命令安装。其他版本需要额外查询。

python -m pip install detectron2==0.2.1 -f \
  https://dl.fbaipublicfiles.com/detectron2/wheels/cu101/torch1.6/index.html

如果速度比较慢。。。我也暂时没找到好的解决方法。。。

安装 AdelaiDet

进入AdelaiDet的Github主页,向下翻到 Installation。根据步骤安装:

git clone https://github.com/aim-uofa/AdelaiDet.git
cd AdelaiDet
python setup.py build develop

如果发现容器中 git 比较慢,我的解决方法是:在本机git clone,使用 docker cp 将文件夹传入容器中。

在执行 python setup.py build develop 时,会发现从 https://files.pythonhosted.org 下载非常慢,这是 pip install 默认的源。但又无法通过命令行指定 pip 源。于是查询解决方法:让PIP源使用国内镜像,提升下载速度和安装成功率。里面说到 新版ubuntu要求使用 https 的源,之前我没注意,使用的是 阿里的http源,发现 pip install 还是很慢。后来改成 清华的https源,但是没有尝试了。
文章中关于修改pip install的方法:

Linux下,修改 ~/.pip/pip.conf (没有就创建一个文件夹及文件。文件夹要加“.”,表示是隐藏文件夹)

[global]
index-url = http://pypi.douban.com/simple
[install]
trusted-host=pypi.douban.com

安装 tensorboard > 1.5

在原镜像中,tensorboard的版本是1.4,但需要1.5以上,因此需要更新。

pip uninstall tensorboard  # 先卸载老tensorboard
pip install tensorboard  # 安装新tensorboard

安装 CUDA

原本我以为已经大功告成了,结果报错。查询发现没装CUDA。

查询 /usr/local/cuda,发现没有这个文件夹。

进入CUDA官网找到对应版本,根据提示安装。CUDA 10.1 官网安装

apt install wget
wget https://developer.download.nvidia.com/compute/cuda/10.1/Prod/local_installers/cuda_10.1.243_418.87.00_linux.run
sh cuda_10.1.243_418.87.00_linux.run

此时应该就有 /usr/local/cuda 文件夹了,将其加入到环境变量中。

export CUDA_HOME=/usr/local/cuda
export PATH=$PATH:/usr/local/cuda/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64:/usr/local/cuda/lib
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/cuda/lib64

一些额外的安装

运行时可能会报错,说找不到 libgthread-2.0.so.0 以及 找不到 libGL.so.1,解决方法如下:

apt install libgl1-mesa-glx  # 安装 libGL.so.1
apt-get install libglib2.0-0  # 安装 libgthread-2.0.so.0

又一些可能遇到的恶心错误

如果说任务是在容器中跑,则可能会报错:RuntimeError: DataLoader worker (pid 13268) is killed by signal: Bus error. It is possible that dataloader workers are out of shared memory. Please try to raise your shared memory limit.RuntimeError: Address already in use

在网上查了资料,发现这篇文章写的很好:Dataloader中的num_workers设置与docker的shared memory相关问题

这篇文章里面比较详细的说了产生该问题的原因,现摘抄一段:

由于在docker镜像中默认限制了shm(shared memory),然而数据处理时pythorch则使用了shm。这就导致了在运行多线程时会将超出限制的DataLoader并直接被kill掉。dataloader从RAM中找本轮迭代要用的batch,如果找到了就使用。如果没找到,就要num_worker个worker继续加载batch到内存,直到dataloader在RAM中找到目标batch。

我浅显的理解是:shm太小,导致无法一次加载很多数据,超过shm的部分的线程会被kill掉,导致训练进程出现问题。

文中提到了两种解决方法,一是将num_worker设置为0,二是修改docker的shm大小。

我使用的是第二种方式,亲测有效。具体命令为,在使用docker run启动容器时,加上参数--shm-size 60G

可以看出,第二种方法需要起一个新的容器,因此需要先将该容器打包成一个镜像,然后在启动这个新镜像时带上--shm-size 60G这个参数。

后记

整个安装过程可谓是一波三折,花了大量时间,着实不易。有几点感想:

  1. 每操作完一步之后,都检查一下这一步是否成功了,确认成功后再进行下一步。这样会减少从头来过的可能性,从头来过才是最浪费时间的。
  2. 如果有安装教程(无论是官网还是博客),尽量完全安装教程的步骤来,这可以避免很多的坑,大大减少时间的浪费。把有限的时间投入到开发中,而不是浪费在环境安装中。

你可能感兴趣的:(搭建 detectron2 + pytorch + cuda 的ubuntu镜像)