解决mmcv,mmdet环境安装过程中出现的问题。
前言:
如果是复现别人论文里的代码,那么要注意mmdet和mmcv版本匹配的问题。
从论文中把代码下载下来之后首先要看一下项目文件中的mmdet/__init__.py和mmdet/version.py这两个文件:
这里version.py 中的__version__指明了当前项目使用的mmdet版本,这里作者用mmdet是2.3.0版本。(ps:如果项目中没有version.py文件,虽然不能直接得知所使用的mmdet版本,但是影响不大。)
这里的mmcv_*_version参数指明了所需要的mmcv版本,这里mmcv=1.0.5,mmcv和mmdet版本要对应好,不然容易出一些问题。(如果没有version.py文件指明mmdet版本,这里把mmcv的版本安装对也可以。)
下面是官方的版本匹配图:
安装指定版本的mmcv和mmdet
知道需要的版本之后开始正式安装过程。
下面简单演示一下安装:
mmcv-full=1.0.5
mmdet=2.3.0
步骤1:安装依赖项和设置环境
在开始配置之前,确保你的系统已经安装了Anaconda或Miniconda。
创建并激活虚拟环境:
conda create --name mmdetection python=3.8 -y
conda activate mmdetection
将创建一个Python版本为3.8的虚拟环境,并自动安装所有默认依赖项.
步骤2:安装pytorch
先看一眼mmcv官网的安装要求:https://mmcv.readthedocs.io/zh_CN/latest/get_started/installation.html
看下面图片描述:
然后进入pytorch官网:https://pytorch.org/
找到需要的pytorch 1.6
复制命令到刚刚创建的虚拟环境中安装pytorch:
conda install pytorch==1.6.0 torchvision==0.7.0 cudatoolkit=10.2 -c pytorch
步骤3:安装mmcv-full
安装好pytorch了,进入mmcv官网刚刚打开的页面
可以先看一下pytorch安装状态:
python -c 'import torch;print(torch.__version__);print(torch.version.cuda)'
输出已安装的版本号。
开始安装mmcv 1.0.5:
pip install mmcv-full==1.0.5 -f https://download.openmmlab.com/mmcv/dist/cu102/torch1.6/index.html
正确执行完毕就可以了,一般不用验证。
步骤4:安装mmdet (复现别人的项目中的代码一般不需要这一步,看步骤5)
这里面找到需要的版本:
https://github.com/open-mmlab/mmdetection/tags
下载压缩包解压后,cd 进入mmdetection目录后直接执行:pip install -v -e .
完成编译即可。
至此,完整安装了mmcv-full 1.0.5和mmdet 2.3.0。
步骤5:复现代码步骤(不需要单独下载mmdetection)
完成步骤1,2, 3之后,直接进入你所下载的项目目录中,因为框架已经包含了mmdet,其中mmdet/version.py中已经指明了mmdet的版本。
这个时候你已经按照上面的步骤安装好mmcv-full了,只需在项目主目录中执行:
pip install -r requirements.txt
pip install -v -e .
完成编译即可。
执行完毕可以发现mmdet已经安装好了,pip list命令查看。
然后就可以运行代码了,如果运行失败,一般是缺少某些工具包,根据提示安装相应的包即可,如:
pip install numpy==1.23.5
pip install yapf==0.40.1
pip install git+https://github.com/lvis-dataset/lvis-api.git
如果失败,则在本地浏览器输入https://github.com/lvis-dataset/lvis-api.git,下载后将lvis-api压缩包传输到服务器,
命令行输入:pip install lvis-api-master.zip
老版本容易出现的问题:
RuntimeError: CUDA error: CUBLAS_STATUS_INVALID_VALUE when calling cublasSgemm( handle, opa, opb, m, n, k, &alpha, a, lda, b, ldb, &beta, c, ldc)
解决:unset LD_LIBRARY_PATH
问题:
[E ProcessGroupNCCL.cpp:737] [Rank 3] Watchdog caught collective operation timeout: WorkNCCL(SeqNum=1751615, OpType=ALLREDUCE, Timeout(ms)=1800000) ran for 1800265 milliseconds before timing out…
[E ProcessGroupNCCL.cpp:414] Some NCCL operations have failed or timed out. Due to the asynchronous nature of CUDA kernels, subsequent GPU operations might run on corrupted/incomplete data. To avoid this inconsistency, we are taking the entire process down…
解决:export NCCL_P2P_DISABLE=1