抱着吃水不忘挖井人的想法,写一篇安装warpctc时候遇到的坑,pytorch 2.0的+Ubuntu16.04
养成一个习惯,不要所有方法都试,先找一个你看起来最信得过的试,不行再换,如何信得过,看评论,如果有it works for me。 it worked like a charm. 等等,或者直接就是readme 里面安装。https://github.com/SeanNaren/warp-ctc
首先配置环境要搞清楚,环境出错原因,这里讲几个问题
ImportError: libwarpctc.so: cannot open shared object file: No such file or directory in develop branch
1.这个是一个很大的原因,大概就是说,你没有安装好这个warpctc的库,
分为一个是没安装好。
没安装好的原因又有安装的时候是系统环境,你不可写
像这个,就是error: could not create '/usr/local/lib/python2.7/dist-packages/': Permission denied
root权限下的python环境你不可以在里面写,这个时候最好就是重新找一个环境安装,因为你的环境你自己安装,最好也不用在root的公共环境下安装。
你可以打开bashrc:
看一下你的环境:因为它读入安装路径的话,安装的是其中一个,在这里你可以修改setup.py,这里面有博主试过,https://blog.csdn.net/qq_29133371/article/details/80407985,具体我没这么做,
no module named __warp
因为我的环境变量乱七八糟,我直接全删了,保留了一个系统变量cuda-8.0的,另外就是anaconda的 ,其实就是因为环境变量乱七八糟,他试到了系统目录下的路径,所以才会显示not permited。
如果仅保留我自己可以动的目录就不存在这种情况,所以断舍离,删掉它。
这一个算是解决了。
还有setup.py 发现
一个是安装好了找不到,gcc,就是说,在退出状态下,无法使用gcc 编译。
THC_API cudaError_t THCudaMalloc(THCState *state, void **ptr, size_t size);
error: command 'x86_64-linux-gnu-gcc' failed with exit status 1。
这个时候修改一下 文件,具体看github 下的issue里面的讨论,养成看github issue的习惯,因为你的坑,别人也遇到过,尤其是有人点亮的,十有八九都要试一试。
i only modify a little at "pytorch_binding/src/binding.cpp" ,it compile success:
1 at 92 line
int probs_size = THCudaTensor_size(state, probs, 2);
2 at l05 lines
void* gpu_workspace;
THCudaMalloc(state, &gpu_workspace, gpu_size_bytes);
good luck to you!
注意上面的92行是THCudaTensor_size,仔细不要敲错
另外装完这个你可能会遇到最操蛋的ctcloss 等于zero的问题,这个是因为ctcloss 不能加载到GPU上,如果只在cpu上是没问题的。可以测试这个问题用这一段代码
import torch
import ipdb
from torch.autograd import Variable
from warpctc_pytorch import CTCLoss
ctc_loss = CTCLoss()
# expected shape of seqLength x batchSize x alphabet_size
probs = torch.FloatTensor([[[0.1, 0.6, 0.1, 0.1, 0.1], [0.1, 0.1, 0.6, 0.1, 0.1]]]).transpose(0, 1).contiguous()
labels = Variable(torch.IntTensor([1, 2]))
label_sizes = Variable(torch.IntTensor([2]))
probs_sizes = Variable(torch.IntTensor([2]))
ipdb.set_trace()
probs = Variable(probs.cuda(), requires_grad=True) # tells autograd to compute gradients for probs
cost = ctc_loss(probs, labels, probs_sizes, label_sizes)
cost.backward()
print("pytorch bindings for Warp-ctc")
你会发现如果去掉.cuda()可以正常使用,不去掉就会loss zero
另外遇到cost.backward() out of memory的问题,
这个问题解决时在warp-ctc/pytorch_binding/warpctc_pytorch/__init__.py 的 22行修改 with torch.autograd.Variable(ctx.grads)
.
I’m also affected with my own autograd functions.
这个解决了的结果也是loss是zero
我没找到办法解决,因为我的框架是torch2.0 python2.7 的,看issue 中有人提到这个问题没办法解决,换成torch 4.0的了,楼主横下一条心,就4.0了,其实readme中也很清楚说最先安装torch4.0
另外还遇到了一些其他问题,设置cuda 环境问题,针对于cuda不是默认的usr/local/cuda的
This repo support GPU. When compiling you have to set the CUDA_TOOLKIT_ROOT_DIR to cmake (as I specified in another issue):cmake -D CUDA_TOOLKIT_ROOT_DIR=/path/to/cuda-x.x.x ..修改成你的cuda路径。例如我的/usr/local/cuda-8.0
最后我把
libwarpctc.so 复制到我的anaconda路径下的lib中,其实这个.dylib和.so 是针对于不同版本的linux生成对应的库。下面是截的一张图
cd ../build
cp libwarpctc.dylib /Users/$WHOAMI/anaconda3/lib
这个复制到anaconda里面。