python虚拟环境配置若干错误及解决办法

        研一时跑程序遇到了各种神奇问题,有时候问了别人也是爱莫能助,很是绝望.所以把我的经验分享出来,让大家少走些弯路.

1. 安装mmcv时
执行:pip install mmcv-full==1.2.4 -f https://download.openmmlab.com/mmcv/dist/cu111/torch1.9.0/index.html
报错:distutils.errors.DistutilsError: Could not find suitable distribution for Requirement.parse('pytest-runner')
解决:pip install pytest-runner

2. 安装OpenCV-Python时
报错: Problem with the CMake installation, aborting build. CMake executable is cmake
解决:安装cmake

3.安装各种包时
执行:conda install -y cython==0.27.3
报错:Solving environment: failed with initial frozen solve. Retrying with flexible solve.
解决:有可能是包版本不对,把版本号去掉

4.运行程序时明明安装了包,却提示没有该模块
解决:可能是因为刚安装上,重启终端即可

5.安装多个版本的cuda也可以,只要把原来版本的环境变量注释掉就行。重装后记得重启终端,就可以看到新版本了

6.有时候安装github上的项目包,用python setup.py install安装会报runtime错误,或者其他错误,试试Python setup.py develop。
至于两个安装命令的区别,有人说前者是安装后不会变的包,后者安装后可能还会发生改变。

7. bulid时报错‘[‘ninja‘, ‘-v‘]‘ returned non-zero,换成--version会报错g++问题,安装ninja也不起作用。最后把我的pytorch从1.9降级到1.3,问题解决了。听说1.5以下都行,不管多少,都要把cuda重装成10.2,很烦 参考https://blog.csdn.net/qq_41452267/article/details/124087590
试试修改 E:\Applications\My__Anaconda\envs\py3.7\Lib\site-packages\torch\utils\cpp_extension.py L1682 将['ninja','-v']改成['ninja','--v']


8. 命令行运行模型,如果报错找不到自定义的包,首先排查路径问题,一般在run.py下面执行会有路径问题,在project下运行 ./demo/run.py不会有路径问题,倒是有可能因为setup.py未运行

9. 如果自己的源码里面没有说在线下载pth文件,但是命令行运行时去下载文件了,那就说明你的命令行语句有问题,可能把源码或者配置弄错了w

10.安装了包,但是import时找不到。方法:用 import site print(site.getsitepackages())查看当前的import搜索路径,然后在该路径下,新建xxx.pth文件,里面放上包所在的目录。注意分隔符都是双斜线

11.某些包conda找不到,只能用
pip install -r requirements.txt  -i  https://pypi.tuna.tsinghua.edu.cn/simple
pip install  -i  https://pypi.tuna.tsinghua.edu.cn/simple


12.conda直接从清华源下载的pytorch是CPU版本的,不能用。要么自己下载包,本地装,要么指定来自官网-c pytorch

13.安装指定版本的cuda:服务器cudnn版本对应cuda11.3。百度上搜不到11.3,都是11.6,用谷歌加谷歌引擎就可以搜到了
查看cuda是否可用
python
import torch
import torchvision
print(torch.cuda.is_available())
torch.zeros(1).cuda()

22.修改conda源 执行conda config后home下就会出现condarc文件
最好用下面的命令式添加,从网上直接复制文本有可能会因为缩进等原因无法被正确识别

#添加清华源

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附加库:
# Conda Forge
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
# msys2
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/
# bioconda
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/
#menpo
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/menpo/
# pytorch
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
conda config --set auto_activate_base false
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple


如果想设置打开终端后自动激活自己的环境,比如py3.7:只需在.bashrc里最后一行加上 conda activate py3.7即可。然后source  ~/.bashrc可以运行一遍bashrc中的命令,不用再重启会话

14.安装pytorch的方法:
方法一:上官网https://pytorch.org/,  查看命令conda install pytorch torchvision torchaudio cudatoolkit=11.3 -c pytorch。
        安装时不要先加-y ,要等他搜索出来后确认是否是GPU版本,这个非常重要。(10112上虽然慢 ,但是15分钟后还是能安装好的。但是我换了服务器后说找不到包,尽管命令里有-c)
        此外,有可能这个命令它搜索出来的是CPU版本的,那就先把pytorch去掉,先安装cudatoolkit=11.3 -c pytorch,它自动就给你安装tookit依赖的cuda版pytorch了。
        后面安装torchvision时还是总是推荐安装CPU版本的torch,这时只需要给torchvision=0.11.0指定版本号就行了。
        另外,单独安装torchvision时,要注意看与pytorch的版本对着表(https://github.com/pytorch/vision#installation) ,不然可能安装torchvision时又给你重新安装一遍pytorch,很烦。
方法二:pip离线安装:上官网比较慢,直接在这里下载吧https://download.pytorch.org/whl/torch_stable.html 如果报错.whl is not a supported wheel on this platform,可能是因为没有激活conda环境
方法三:conda离线安装:在https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/linux-64/    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/   https://anaconda.org/anaconda/repo上下载tar.bz2文件。
    进入镜像站后先Ctrl F搜一下你要的包比如pytorch,再下载。 然后用conda install --use-local xxx.tar.bz2安装。(最终地址https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/linux-64/pytorch-1.7.0-py3.7_cuda11.0.221_cudnn8.0.3_0.tar.bz2)
    使用conda install --use-local时报错没有conda-build,直接安装却报错说只能安装在root 环境中。所以就先在root里安装好conda-build,再去我自己的环境里安装build就好了。
    安装torchvision同样用离线安装
    但是方法三的话,后面用conda安装其他包可能会报错这个torch包导致环境不一致,然后给你安装一个CPU版的新torch。后面只能用pip安装其他包了
方法四:pip在线安装。先更新pip清华源,pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple  再安装,pip上名字是torch,而非pytorch
    
不知道pip -i qinghua 安装的pytorch会不会符合要求
先安装torchvision,他会自动安装一个CPU版本的,再安装pyyaml,他会提示冲突了,要换成GPU版本的pytorch

一次成功的安装经历(一):
1.新建环境;利用pip安装默认版本的torch 和torchvision;
2.运行时报错:libmkl_intel_lp64.so: cannot open shared object file: No such file or direct。
解决:sudo find /home -name libmkl_intel_lp64.so,找到系统中此lib文件的位置,sudo find /home -name libmkl_intel_lp64.so,得到位置后打开~/.bashrc添加环境变量。export LD_LIBRARY_PATH="/home/yangqingchun/Applications/cuda11.3/lib64:$LD_LIBRARY_PATH"
3.成功运行deep search

一次成功的安装经历(二):
1.新建环境,为了和cudnn对应,我的cuda是11.3版本
2.pip3 install torch==1.10.0+cu113 torchvision==0.11.1+cu113 torchaudio==0.10.0+cu113 -f https://download.pytorch.org/whl/cu113/torch_stable.html
参考自https://blog.csdn.net/qq_37541097/article/details/120951214
3.成功运行

pip3 install torchvision==0.11.1+cu113 torchaudio==0.10.0+cu113 -f https://download.pytorch.org/whl/cu113/torch_stable.html
https://download.pytorch.org/whl/cu100/torch_stable.html


15.Ubuntu安装pycharm。先去官网下载Linux版本安装包。上传,tar -zxvf解压。再进入bin,执行sh pycharm.sh即可运行。
添加运行参数:进入run下面的edit config,add Python,script路径就是要运行的py文件,参数里写参数。下面的work directory也很重要,避免了相对路径寻址问题。

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

17.运行前先看哪个显卡是空的。再指定自己用的显卡export CUDA_VISIBLE_DEVICES=空闲卡号。

18.运行时挂起 nohup python train.py --cfg configs/cuhk_sysu.yaml >output.txt 2>&1 &

nohup  python -m memory_profiler main.py \
    --benchmark ssm --batch_size 4 \
    --backbone bsl --in_level C5 --cls_type oim \
    --lr 0.0024 --warmup_epochs 1 --max_epoch 7 \
    --suffix ""   >output.txt 2>&1 &

CUDA_VISIBLE_DEVICES=0 nohup python ./tools/test.py ${CONFIGPATH} ${MODELPATH}  --eval bbox --out ${OUTPATH} >./exproutput/testbs5epc20.txt 2>&1 & 3590528

后面的&表示后台运行,nohup表示退出不中断。后面的0、1、2分别表示标准输入、输出、错误。
查看进程时用ps -u yangqingchun,cmd为Python的就是自己的。可以用kill + 进程号来杀死进程,进程被杀死后,执行下一条任意指令时会提示某进程被terminated
查看显卡使用者及其命令:smi查看显卡使用情况,下面是进程号。用ps -f -p pid查看该进程的详细信息

19.CUDNN_STATUS_EXECUTION_FAILED,可能是因为cuda torch torchvision版本不一致。

20.Unable to find a valid cuDNN algorithm to run convolution。可能是因为模型较大,显卡内存不够了。把batchsize调小试试。可以在刚刚加载代码的时候 通过命令窗口 nVidia-smi 看看你的gpu 消耗情况就会发现 你的batchsize太多了

21.os.environ["CUDA_VISIBLE_DEVICES"] = "2"

23.如果运行时内存占用很高。可以通过查看内存占用情况来检查 https://www.cnblogs.com/luoahong/articles/9259063.html
    如果运行一会就显存爆了,可以看看todevice()了哪些东西,一般显存满了就是因为todevice()的东西太多了
24.can‘t convert cuda:0 device type tensor to numpy 是因为numpy不能把tensor转为numpy数组,要先放到CPU上。arr.cpu().numpy(),或者降低版本,numpy1.19不会报这个错误

25.for detection, sim in zip(detections, similarities) 如果报错参数#1 或者 #2不可迭代,那是因为往往参数会是[[a,b,c]]这种,而特殊情况下,会是[[a]],两者经过squeeze()以后,前者仍是数组,可迭代,后者已经变成一个数字了,不可迭代了。只需要在tensor.dim()==0时,unsqueeze(0)即可

26.多卡并行中的一点小注意点:
(1)计算并行,但是模型和数据必须放主卡上。 因此data.to(device) 和model.to(device)两个device要相同
(2)据上所述,要先把模型放到主卡,才能配置并行。因此顺序是
        model.to(device)
        model = nn.DataParallel(model, device_ids=device_ids)
(3)关于torch.device("cuda:0") 和 device_ids = [1, 2],博客都说cuda:后跟虚拟卡号,0代表ids里的1,实际上根据报错信息,cuda后面就是物理卡号

并行操作流程:

os.environ['CUDA_VISIBLE_DEVICES'] = '1,2,3'
device_ids = [1, 2]
device = torch.device("cuda:0")
model.to(device)
data.to(device)
model = nn.DataParallel(model, device_ids=device_ids)

可以用torch.cuda.device_count()查看CUDA_VISIBLE_DEVICES的个数

27.显卡内存上升太快。若是在训练中可以减小batch size;也可以检查一下有没有及时使用 optimizer.zero_grad()    # 清空梯度。若是在测试过程中,可以检查一下有没有with torch.no_grad():prediction = net(testdata),原因是当你的模型在测试数据时每次运行测试数据依旧会计算梯度并得到新的计算图,所以占用显存逐步增多,在测试过程中只需要网络计算输出结果,不需要网络计算梯度。
加上这句后,第一个epoch的占用显存将会稳定到后续epoch中,若仍然升高,可能因为把结果保存到list中了,因为数据在显卡上,所以list也会在显卡上,所以可以继续
with torch.no_grad():
    with torch.no_grad():
    prediction = net(testdata)
    prediction.cpu()
    pre_list.append(prediction)
    
    
28.bash小妙招
Ctrl + L:清除屏幕并将当前行移到页面顶部。
Ctrl + U:从光标位置删除到行首。
Ctrl + K:从光标位置删除到行尾。
Ctrl + W:删除整行命令。
Ctrl + D:关闭 Shell 会话。

29.运行程序的指令包括  --arg_name 的参数和yacs里面CfgNode格式的参数,后者是没法用 -- 来赋值的,所以一般会有parser.add_argument("opts", nargs=argparse.REMAINDER),意思是把所有剩余的参数放到一个列表里
在这种情况下,--开头的参数要全部放到运行指令的前面,不带--的要统一放到后面。原因在于无--的要求必须是kv成对的,而我刚才把--ckpt和--resume混在一起了,导致不成对了

30.关于将一维np数组封装为二维,常用于需要遍历二维数组,但是一维不可遍历的情况。
0_dimarr=np.array([0_dimarr]),注意中括号不可少

31.pip安装时报错ValueError: check_hostname requires server_hostname,关掉梯子就行

32.安装mmcv
pip 下搜索包,pip install pip-search
pip index versions 包名

https://mmcv.readthedocs.io/en/latest/get_started/installation.html
pip install mmcv-full=={mmcv_version} -f https://download.openmmlab.com/mmcv/dist/{cu_version}/{torch_version}/index.html
pip install mmcv-full==1.4.7 -f https://download.openmmlab.com/mmcv/dist/cu113/torch1.11.0/index.html
pip install mmcv-full==1.3.17 -f https://download.openmmlab.com/mmcv/dist/cu113/torch1.10.0/index.html
上面紧跟一个pip install mmdet==2.18.1
mmdet版本和mmcv版本对应图:https://www.cnblogs.com/cs-markdown10086/p/16001953.html

pip 安装mmcv-full时,编译半天没动静或者报错CalledProcessError: Command '['which', 'g++']' returned non-zero exit status 1.
可能是因为没有安装g++,切换root用户apt install g++试试

33.argperse中有parser.add_argument('some_string', default = 'hello world'),哪怕设置了default,运行时还是会提示缺失参数some_string,只需在前面加上--变成 --some_string即可,也可以用-s

34.mmdetection 之 AttributeError: module ‘pycocotools‘ has no attribute ‘__version__‘, 应该先使用 pip uninstall pycocotools 卸载之前安装过的不合适的版本,
最后运行pip install mmpycocotools 。如果卸载了发现问题“ModuleNotFoundError: No module named 'pycocotools'”,只需要uninstall mmpycocotools, 然后再次 install mmpycocotools
即可。

'pycocotools' has no attribute '__version__'
pip uninstall mmpycocotools -y
pip install mmpycocotools

35.unexpected EOF, expected 7491165 more bytes. The file might be corrupted.是torchvision的模型下载失败了,或者下载中断了,需要进入
“/home/××××××/.cache/torch/hub/checkpoints”目录将下载了一半的模型文件删除掉,再重新下载预训练模型。Windows下就是C:\Users\Administrator\.cache\torch\hub\checkpoints

36.ImportError: No module named 'pkg_resources' 卸载重装一下setuptools
pip uninstall setuptools  -y
conda install setuptools==58.0.4 -y

37.安装apex后运行错误,是因为pip 中apex只是个同名的其他包,而非nvidia的apex加速模块。正确安装方法:
git clone https://github.com/NVIDIA/apex
cd apex
pip install -v --no-cache-dir ./

38.关于python模块管理,_init_.py的作用。
一般from xx import xx,前面的xx指代一个py文件,表示从某个py模块里导入一个类或者函数。如果前者是个目录呢?那就用一个init.py来指代这个目录吧,
里面放上要被其他文件引入的函数类什么的,有的是init文件里定义的,有的是同目录下其他文件里定义的。

39.设计mmdet的模型源码,一定要记得进入mmcv install一下

40.编译某些包(setup the whl)时,报出一大堆错误,观察里面有没有
 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\include\crt/host_config.h(143): fatal error C1189: #error: – unsupported Microsoft Visual Studio version! Only the versions between 2013 and 2017 (inclusive) are supported!
 这句话,如有,可能是因为visual studio的版本太新了,cuda编译器跟不上,打开
 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\include\crt\host_config.h
修改 ‘_MSC_VER >=’ 后面的数值为一个较大值就行,比如2000

41.Linux版的pycharm上按下方向键后会出现一连串的数字8,数字4什么的,在Windows下切换几次输入法到英文就好了,最好能切换到微软自带的英文输入法

42.目前为止遇到的修复难度第二高的bug,上一个是当时deep person search的rpn问题。今天用自己改造的COCO格式的数据集跑PSTR,总是运行几个batch后报错
File "/home/yangqingchun/Projects/PSTR-main/mmdet/models/dense_heads/triplet_loss.py", line 34, in forward
if targets[i] == -1:
RuntimeError: CUDA error: device-side assert triggered
CUDA kernel errors might be asynchronously reported at some other API call,so the stacktrace below might be incorrect.
For debugging consider passing CUDA_LAUNCH_BLOCKING=1.
百思不得其解,打印targets能有什么错,本以为是i越界了,打印了所有的target,没发现问题。
后来看谷歌百度,在train.py开头加了这两句:
os.environ['CUDA_VISIBLE_DEVICES'] = '0'
os.environ['CUDA_LAUNCH_BLOCKING'] = '1' 禁止并行的意思
也可以是CUDA_LAUNCH_BLOCKING=1 python3 train.py的形式
让GPU同步,以前异步运行时,可能同时有多个指令同时在显卡上运行,导致张三犯的错却traceback成李四了,干扰了我的判断。偶然发现这次报错语句变成了LabeledMatchingQ.forward()里面的
pos_feats = pos_feats[pos_pids]
这下终于明白了,是lookuptable只初始化了5532,但是我的id标注到了5570,最终用上面的语句筛选特征时越界了。而以前别人的模型读取数据构建dataset对象时都是从0开始重新分配id的,PSTR却没有,导致了意外的发生。

论文,据说cuda的问题,把程序放CPU上跑,就能确定具体错误是什么了,但是mmdet的mmperalel不支持CPU训练,让我走了不少弯路。

alias myall='cd /home/Newdisk/yangqingchun/data/myall/ssm/'
cd /home/Newdisk/yangqingchun/data/myall/ssm/annotation

43.zip指令压缩文件排除某个文件夹 zip -r  dir.zip  dir -x "dir/cast/*" , -x可以多次出现, 且必须都加双引号

44.linux指令
查看磁盘各用户占用情况 du (disk usage) du -sh 显示当前目录大小,
du -lh --max-depth=1查看当前目录各个文件夹大小,不会递归
ps -o lstart -p pid 查看进程开始时间
ps -fww -p pid 查看完整的进程所执行的命令,因为我跑实验用的命令都很长,普通ps命令输出的只有一小段命令内容,需要这个完全显示
ls -l |grep "^-"|wc -l  查看目录下文件个数。-代表普通文件,d代表目录文件

alias psp='ps -f -p '
alias pstime='ps -o lstart -p '
alias psname='ps -fww -p '

45.Linux版pycharm里有时候会选中即复制,问题根源在于Linux的x11系统复制的逻辑上,常用的复制粘贴逻辑是 PRIMARY:按下鼠标中键复制、粘贴。或者选择复制,右键粘贴。要想不让pycharm选中即复制,在mobaxterm setting -> Configuration -> X11 -> x11 settings -> Clipboard 里选中disable primary即可
pycharm里按下方向键会出现一串数字时,只需把输入法改为英文即可

46.'pycocotools' has no attribute '__version__'
pip uninstall pycocotools -y
pip install mmpycocotools

47.python try catch 语法
try:
    c=a/b
except Exception as e:
    print(e)
finally:
    print('go on')
    # continue
    # exit(99)

48.Linux版pycharm 断联关闭后,杀掉进程,再打开出现企鹅图标,无法正常运行,此时,执行ps -ef|grep pycharm找出其他pycharm相关的进程, 杀掉后就能正常使用了
ps -ef|grep pycharm|grep -v grep|cut -c 9-15|xargs kill -9

49.Pycharm进入debug模式后一直显示collecting data解决方法
设置-> Build,Execution -> Python Debugger勾选 Gevent compatible

50.Trying to backward through the graph a second time (or directly access saved tensors after they have already been freed).Specify retain_graph=True if you need to backward  a second time
一般来说,出现这个错误是因为: 你第二个epoch计算时候还是用到了第一个epoch的Z1,而Z1的梯度在第一个backward后释放掉了。
示例代码见 CSDN:解决pytorch反向传播过程中出现 RuntimeError: Trying to backward through the graph a second time 问题

另一个例子(运行不了):
    a = torch.rand(3,3)
    b = a*a

    for i in range(10):
        d = b*b
        d.backwrad()
10个迭代中,每次都会共享外部定义的b,但是关于b的计算图又会在每个迭代后被删除。所以报错

retain_graph大多是False,需要True 的情况有:
一个网络有两个output分别执行backward进行回传的时候: output1.backward(), output2.backward().
一个网络有两个loss需要分别执行backward进行回传的时候: loss1.backward(), loss2.backward().

51.pycharm的报错看看就好,别太信以为真,具体错误还得去命令行看,以命令行的错误提示为准。今天做实验,在命令行遇到了
RuntimeError: Trying to backward through the graph a second time (or directly access saved tensors after they have already been freed).
Saved intermediate values of the graph are freed when you call .backward() or autograd.grad(). Specify retain_graph=True if you need to backward second time
检查了半天,没发现哪里有当前迭代使用上一次迭代数据的情况,最后把自己写的地方逐个注释掉后发现,原来是因为BN对bs=1的特征集合做处理了,命令行会提示BN错误,而pycharm只会报告计算图问题
以后遇到错误还是别相信pycharm的,先取命令行看看

另外,遇到错误后,不一定非得去看看附近的堆栈情况,可以先感性思考一下,可能的原因以及解决方法
最后,排错过程中,要有足够的敏锐性,不放过任何可疑的点,没有什么现象的出现是偶然或者理所当然的


52.多卡并行训练
1).
device_ids = [0,1,2] # 给torch分配gpu的虚拟卡号,虚拟号必须从0开始
os.environ["CUDA_VISIBLE_DEVICES"] = "0,1,3"  # 指定物理卡号

2).
main()里指定并行模型,data虽然没有data=nn.DataParallel(data),但是在后面output = model(data)的时候,model的DataParallel会自动将data分发到不同卡上的
if len(device_ids) != 1:
    model = nn.DataParallel(model, device_ids=device_ids)

3).
由于多张卡,可能最终losses里每一个具体的loss不再是一个值,而是一个列表,大小等于他分的卡数,估计是按照最大原则,塞满一个再来下一个,比如最多能塞4个,bs=6时,4+2,而非平均原则
要先手动把多卡的loss都加起来求平均,或者求sum
loss_dict_dp = model(images, targets)

loss_dict = {}
for k, v in loss_dict_dp.items():
    loss_dict[k] = torch.mean(v)

别人源码里自带的 loss_dict_reduced = reduce_dict(loss_dict) 说的是能收集多卡的loss,但是我实践中发现他进去后第一步 get_world_size()=1,
就当做单卡跳出来,把loss dict原来返回了,有人说world size是主机个数的意思,只有一台服务器,size为1倒也不奇怪

4).
对每项loss求和
losses = sum(loss for loss in loss_dict.values())

5).
反传,加个损失函数的同尺寸矩阵,万一不是1个标量,会报错的
losses.backward(losses.clone().detach())


(二)mmdet并行测试 dist_test,注意点

    1.并行
    2.${@:4}可能是从第四个参数往后的意思,也就是说,在并行的脚本里指定一些并行相关参数后,程序本身的参数依次扔进去就行了
    3.并行测试时,程序里面千万不要有指定单卡的语句 os.environ["CUDA_VISIBLE_DEVICES"] = "1"

一次成功的经历
#!/usr/bin/env bash

CONFIG='../configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py'
CHECKPOINT='../logs/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth'
SHOW_DIR='../logs/PRW_photo_with_box'
OUT_PKL='../logs/eval_pkl/eval_faster_rcnn.pkl'

GPU_NUMS=3
PORT=${PORT:-29505}

CUDA_VISIBLE_DEVICES="1,2,3" \
PYTHONPATH="$(dirname $0)/..":$PYTHONPATH \
python -m torch.distributed.launch --nproc_per_node=$GPU_NUMS --master_port=$PORT \
    $(dirname "$0")/test_photos.py --config $CONFIG --checkpoint $CHECKPOINT --launcher pytorch \
    --eval 'bbox' --show-dir $SHOW_DIR --out $OUT_PKL


53.当调试涉及到数据预处理,或者多线程时,不管bs是几,最好先把数据线程置为1 _C.INPUT.NUM_WORKERS_TRAIN = 1
 
54.今天遇到一个错误
loss计算需要的变量被inplace操作修改了,使用torch.autograd.set_detect_anomaly(True)后提示 Error detected in OIM Backward. No forward pass information available
最后发现,原来是因为我用了
 loss_a = Loss(feat_a)
 loss_b = Loss(feat_b),
 loss前传了两次,导致反传时后面那个loss找不到原始节点了,解决办法是把feat_a, feat_b合并后,统一送到 Loss里面前传,一开始偷懒了。


55.服务器显卡驱动安装不上的话,就下载个最新版

56.torch.set_printoptions(precision=4,sci_mode=False)

57.使用pytorch时 出现bug: "Only Tensors created explicitly by the user (graph leaves) support the deepcopy protocol at the moment"

这个bug的出现可能是因为在调用copy.deepcopy的时候,复制的是含有梯度信息的可求导的非叶子节点(也就是非用户创建的tensor)。

因此,对于在计算图中的tensor,我们需要先用XX.detach()将其从计算图中脱离,单独拷贝一份下来。然后如果需要求导则再torch.requires_grad = True就好啦

58.loss反传时出现nan。
调试方法:有时候自定义的autograd.Function类的backward过程中pycharm的断点不会停下,要用pdb调试
import pdb
if torch.isnan(张量).any(): pdb.set_trace()
基本命令可以查看 https://blog.csdn.net/qq_43799400/article/details/122582895
一般都是因为除零引起的,看看哪里有除法操作

59.python设置跨文件全局变量
global声明的全局变量只能本文件有效,无法跨文件生效,因此需要单独写一个全局变量模块,被其他文件import
写一个global.py,内容为:

def _init():  # 初始化
    global _global_dict
    _global_dict = {}

def set_value(key, value):
    # 定义一个全局变量
    _global_dict[key] = value

def get_value(key):
    # 获得一个全局变量,不存在则提示读取对应变量失败
    try:
        return _global_dict[key]
    except:
        print('读取' + key + '失败\r\n')

在其他文件内import global
主文件设置前先 global._init(),然后global.set_value('key',val),其他文件只需要import 后用 global.get_value('key')即可。
注意:可能涉及资源锁,用的时候尽量设置单线程。

60.三维重建相关bug
安装neural_renderer_pytorch排坑(cuda11.0+),github源码是18年的,只能用py2,现在要适配到py3,在Linux上要修改cpp里CHECK方式,Windows上修改一下也没错
https://blog.csdn.net/axept/article/details/127359947


pip install 上述包编译报错 LINK : fatal error LNK1181: 无法打开输入文件 xxx.obj
那是因为ninja没有生成obj文件,禁用它就行,具体做法是把setup.py最后一句改成下面这个
cmdclass = {'build_ext':torch.utils.cpp_extension.BuildExtension.with_options(use_ninja=False)}

如果还是报错 nvcc.exe failed with exit code 2,那放弃吧,这个包版本太老,里面定义的cuda算子无法在当前设备的新版cuda上用nvcc编译。但是有时候Windows不行,在Linux可以
但是前提是要按照第60条的博客中连接修改CHECK方式。
不对,我解决了。此时报错1 error detected in the compilation of "neural_renderer/cuda/rasterize_cuda_kernel.cu"
neural_renderer-master\neural_renderer\cuda\rasterize_cuda_kernel.cu中第9行atomicAdd函数重复定义,打开看到确实有个函数定义,
并且前面注释道:// for the older gpus atomicAdd with double arguments does not exist,可能这个函数是专为旧版本GPU设计的,新版本GPU已经自动包含了,导致重复定义,把这个函数定义注释掉就安装成功了

61.跟踪程序踩雷
源码:https://github.com/Smorodov/Multitarget-tracker
要先安装opencv,现在已经装好了,最初是去官网找了zip文件,当exe安装的
cudnn也已经安装好,上述两个软件的位置需要在  CmakeLists.txt 里set好,路径用\\转义符
C:\\ProgramData\\chocolatey\\lib\\pkgconfiglite\\tools\\pkg-config-lite-0.28-1\\bin\\pkg-config.exe不知道干啥的,也要set到PKG_CONFIG_EXECUTABLE上面

然后把readme中自己不需要的东西都置为OFF,注意他们给的cmake指令,后面跟了一堆 -D参数,这个要看情况删减
别忘了最后的make -j
make -j出问题了,因为前面的cmake没有生成makefile,百度说主要是因为编译器选择的问题,很有可能选择到了vs的编译器MSVC*了导致生成了解决方案
确实cmake一开始能看到 MSVC的字样,他们说要 cmake . -G "Unix Makefiles",但是我报错 CMake was unable to find a build program corresponding to "Unix Makefiles".
换成 cmake .. -G "MinGW Makefiles"好一些了,但是又报错 but it set OpenCV_FOUND to FALSE so package "OpenCV" is considered to be NOT


62.python从绝对路径导入模块
只需要添加一下搜索路径就行了,适用于bat中无法conda 进入虚拟环境的场景
sys.path.append('E:\Applications\My__Anaconda\envs\yiqingtianbao\Lib\site-packages')

63.pycharm无法使用自己指定的环境里的python.exe,总是用某一个,把他钟爱的环境目录删了就会报错找不到python文件,无法运行,可能和run configuration里指定了python.exe位置有关。
我解决时,先重装pycharm了,结果报错SDK is not defined for Run Configuration,然后我在配置里面把所有参数都删了重新填写一遍,就好了,可能配置里除了运行参数,
还有python文件的启动位置,这里一直是放的旧的位置,没有更新,当你把参数重新填写一遍后,他就会自动更新一下。

64.
module 'distutils' has no attribute 'version'
pip uninstall setuptools
conda install setuptools==58.0.4

pip install pytorch-ignite==0.1.2

65.安装faiss
It should not be so:
pip install faiss

should do:
CPU version only
conda install faiss-cpu -c pytorch

GPU version
conda install faiss-gpu cudatoolkit=8.0 -c pytorch # For CUDA8
conda install faiss-gpu cudatoolkit=9.0 -c pytorch # For CUDA9
conda install faiss-gpu cudatoolkit=10.0 -c pytorch # For CUDA10

conda install -c pytorch faiss-gpu cudatoolkit=11.3

link: https://github.com/facebookresearch/faiss/blob/master/INSTALL.md

安装sklearn
pip install scikit-learn

你可能感兴趣的:(python,pytorch,深度学习)