SRU:ModuleNotFoundError: No module named ‘cuda_functional‘和OSError: libnvrtc.so: cannot open shared
最近为了尝试解决LSTM开销大的问题,在查找一些改进工作,首先是找到了Simple Recurrent Units for Highly Parallelizable Recurrence(SRU)这篇工作,但是在使用的过程中一直遇到两个错(如题),看了作者Github(https://github.com/asappresearch/sru)上Issue中的帖子,别没有发现好的解决办法,今天下午就尝试着自己去分析了这两个问题的根源。
实验环境
OS:Linux
Cuda:10.0.130
pytorch:1.2.0
sru:2.1.6
安装SRU
-
pip install sru
(默认最新版) - 通过源码
python setup.py install or pip install .
- 如果要指定版本,例如我的环境不支持目前最新的2.5.1所以我选择了2.1.6
a)pip install sru==2.16
b)下载相应版本的源码,通过python setup.py install or pip install .
安装
c)下载方式:点击tags标签就会看到所有的版本,可以选择合适的进行下载
d)安装前一定要先安装好requirements.txt中所需要的库
为了验证是否会遇到该帖子的问题,建议先运行GitHub仓库中给定的样例代码(我们在最后添加一行打印输出)
import torch
from sru import SRU, SRUCell
# input has length 20, batch size 32 and dimension 128
x = torch.FloatTensor(20, 32, 128).cuda()
input_size, hidden_size = 128, 128
rnn = SRU(input_size, hidden_size,
num_layers = 2, # number of stacking RNN layers
dropout = 0.0, # dropout applied between RNN layers
bidirectional = False, # bidirectional RNN
layer_norm = False, # apply layer normalization on the output of each layer
highway_bias = 0, # initial bias of highway gate (<= 0)
rescale = True, # whether to use scaling correction
)
rnn.cuda()
output_states, c_states = rnn(x) # forward pass
print(output_states.shape)
# output_states is (length, batch size, number of directions * hidden size)
# c_states is (layers, batch size, number of directions * hidden size)
问题一:ModuleNotFoundError: No module named 'cuda_functional’
解决思路:
既然问题是找不到module,那我们就直接去源码分析,首先通过上图可以看到问题出在sru库,那我们直接到这个库看一下,通过命令 ls /home/***/anaconda3/lib/python3.6/site-packages/sru/
实际中根据自己的环境路径来更改,我们发现,sru下有这个模块
既然有这个模块依然找不到,那么第一反应就应该是查看__init__.py文件,我们发现其中确实没有导入这个模块,那么我们就自己加入这个引用from .cuda_functional import *
,问题得到根本解决
问题二:OSError: libnvrtc.so: cannot open shared object file: No such file or directory
解决了问题一,这是接下来的报错
GitHub Issue中有人提到libnvrtc.so.10.0的问题,可能是cuda版本不匹配,自己可以去尝试,我的是匹配的,而且服务器不是自己的也无法更改cuda版本,检测方式如下图:
第一步:还是从报错内容上分析,找不到这个.so文件,就先去查一下这到底是是个什么(https://www.cnpython.com/pypi/pynvrtc),通过下图可知,我们是可以自己传这个.so文件的参数的
第二步:分析源码是在什么位置,是在如下文件的49行,这个lib_name就是关键点,我们再去找这个参数如何传递过去,是在红色箭头上一行的文件中的444行
第三步:那么这里就可以有两种改法
方式一:通过命令ls /usr/local/cuda-10.0/lib64/
我们可以看到这里有两个libnvrtc.so文件,不过后边带了版本号,那么我们可以复制一份,命名为libnvrtc.so(需要权限,所以没有采用该方式)
方式二:更改源码:
我们可以到刚才的文件的444行去,添加一个参数**lib_name=‘libnvrtc.so.10.0’**即可
样例代码输出为:
至此,在2.1.6版本上这两个问题得以解决,其他版本未做使用,具体的版本差异在哪也未做深入研究,所以不过多保证其他版本也会遇到该问题。
本文地址:https://blog.csdn.net/qq_32239767/article/details/109626626