欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

SRU:ModuleNotFoundError: No module named ‘cuda_functional‘和OSError: libnvrtc.so: cannot open shared

程序员文章站 2022-03-11 21:14:43
  最近为了尝试解决LSTM开销大的问题,在查找一些改进工作,首先是找到了Simple Recurrent Units for Highly Parallelizable Recurrence(SRU)这篇工作,但是在使用的过程中一直遇到两个错(如题),看了作者Github(https://github.com/asappresearch/sru)上Issue中的帖子,别没有发现好的解决办法,今天下午就尝试着自己去分析了这两个问题的根源。实验环境OS:LinuxCuda:10.0.130pytorc...

  最近为了尝试解决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

  1. pip install sru(默认最新版)
  2. 通过源码python setup.py install or pip install .
  3. 如果要指定版本,例如我的环境不支持目前最新的2.5.1所以我选择了2.1.6
    a) pip install sru==2.16
    b)下载相应版本的源码,通过python setup.py install or pip install .安装
    c)下载方式:点击tags标签就会看到所有的版本,可以选择合适的进行下载
    SRU:ModuleNotFoundError: No module named ‘cuda_functional‘和OSError: libnvrtc.so: cannot open shared
    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’
SRU:ModuleNotFoundError: No module named ‘cuda_functional‘和OSError: libnvrtc.so: cannot open shared
解决思路:
  既然问题是找不到module,那我们就直接去源码分析,首先通过上图可以看到问题出在sru库,那我们直接到这个库看一下,通过命令 ls /home/***/anaconda3/lib/python3.6/site-packages/sru/实际中根据自己的环境路径来更改,我们发现,sru下有这个模块
SRU:ModuleNotFoundError: No module named ‘cuda_functional‘和OSError: libnvrtc.so: cannot open shared
既然有这个模块依然找不到,那么第一反应就应该是查看__init__.py文件,我们发现其中确实没有导入这个模块,那么我们就自己加入这个引用from .cuda_functional import *,问题得到根本解决
SRU:ModuleNotFoundError: No module named ‘cuda_functional‘和OSError: libnvrtc.so: cannot open shared
问题二:OSError: libnvrtc.so: cannot open shared object file: No such file or directory
  解决了问题一,这是接下来的报错
SRU:ModuleNotFoundError: No module named ‘cuda_functional‘和OSError: libnvrtc.so: cannot open shared
  GitHub Issue中有人提到libnvrtc.so.10.0的问题,可能是cuda版本不匹配,自己可以去尝试,我的是匹配的,而且服务器不是自己的也无法更改cuda版本,检测方式如下图:
SRU:ModuleNotFoundError: No module named ‘cuda_functional‘和OSError: libnvrtc.so: cannot open shared
   第一步:还是从报错内容上分析,找不到这个.so文件,就先去查一下这到底是是个什么(https://www.cnpython.com/pypi/pynvrtc),通过下图可知,我们是可以自己传这个.so文件的参数的
SRU:ModuleNotFoundError: No module named ‘cuda_functional‘和OSError: libnvrtc.so: cannot open shared
  第二步:分析源码是在什么位置,是在如下文件的49行,这个lib_name就是关键点,我们再去找这个参数如何传递过去,是在红色箭头上一行的文件中的444行
SRU:ModuleNotFoundError: No module named ‘cuda_functional‘和OSError: libnvrtc.so: cannot open shared
SRU:ModuleNotFoundError: No module named ‘cuda_functional‘和OSError: libnvrtc.so: cannot open shared

  第三步:那么这里就可以有两种改法
方式一:通过命令ls /usr/local/cuda-10.0/lib64/我们可以看到这里有两个libnvrtc.so文件,不过后边带了版本号,那么我们可以复制一份,命名为libnvrtc.so(需要权限,所以没有采用该方式)SRU:ModuleNotFoundError: No module named ‘cuda_functional‘和OSError: libnvrtc.so: cannot open shared
方式二:更改源码:
我们可以到刚才的文件的444行去,添加一个参数**lib_name=‘libnvrtc.so.10.0’**即可
SRU:ModuleNotFoundError: No module named ‘cuda_functional‘和OSError: libnvrtc.so: cannot open shared
样例代码输出为:
SRU:ModuleNotFoundError: No module named ‘cuda_functional‘和OSError: libnvrtc.so: cannot open shared
至此,在2.1.6版本上这两个问题得以解决,其他版本未做使用,具体的版本差异在哪也未做深入研究,所以不过多保证其他版本也会遇到该问题。

本文地址:https://blog.csdn.net/qq_32239767/article/details/109626626