搭建 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. 如果有安装教程(无论是官网还是博客),尽量完全安装教程的步骤来,这可以避免很多的坑,大大减少时间的浪费。把有限的时间投入到开发中,而不是浪费在环境安装中。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342