当前位置: 移动技术网 > 网络运营>服务器>Linux > 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

2020年11月11日  | 移动技术网网络运营  | 我要评论
  最近为了尝试解决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标签就会看到所有的版本,可以选择合适的进行下载
    在这里插入图片描述
    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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网