由于业务要求,需要搭建运行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页面查询。
根据我的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
这个参数。
后记
整个安装过程可谓是一波三折,花了大量时间,着实不易。有几点感想:
- 每操作完一步之后,都检查一下这一步是否成功了,确认成功后再进行下一步。这样会减少从头来过的可能性,从头来过才是最浪费时间的。
- 如果有安装教程(无论是官网还是博客),尽量完全安装教程的步骤来,这可以避免很多的坑,大大减少时间的浪费。把有限的时间投入到开发中,而不是浪费在环境安装中。