2019年年底的时候,有一个idea,想在一篇论文的基础上改一下,写一篇文章,于是就找了那篇论文的代码,开始了调试工作。代码地址GitHub - ctr4si/A-Hierarchical-Latent-Structure-for-Variational-Conversation-Modeling: PyTorch Implementation of "A Hierarchical Latent Structure for Variational Conversation Modeling" (NAACL 2018 Oral)
https://github.com/ctr4si/A-Hierarchical-Latent-Structure-for-Variational-Conversation-Modeling。
首先在服务器上配置环境,服务器上的linux环境里的配置:GPU是RTX 2080T,cuda是10.1。
其次处理数据,程序本身带的自动下载数据那部分有问题,没法下载数据,应该是程序里面提供的数据网址上不能再下载数据了。于是自己从网上找到相应的数据集下载到电脑上,然后上传到服务器,开始处理数据。主要数据集有Cornell Movie Dialogue dataset和Ubuntu Dialog Dataset。处理数据部分还算顺利,创建好相应的文件夹,然后运行处理数据程序,我先处理了cornell数据集试试程序能跑通吗。Ubuntu数据集处理起来有点问题,具体的处理过程遇到的问题请看下一篇博客。
然后是运行train.py函数,我首先尝试用cornell数据集,在HRED 模型上跑train函数,中间也出现了很多小的bug,不过通过查资料都解决了。直到出现困扰我半年的bug出现,就是RuntimeError: cuDNN error: CUDNN_STATUS_EXECUTION_FAILED。网上的方法有:
(1)加上命令:torch.backends.cudnn.enabled = False ,该命令的作用是不用GPU,只用cpu跑。这样尝试了一下,可以调通代码,就是训练的比较慢。
(2)环境配置的问题,cuda、Python、pytorch等之间有冲突,不匹配,github上提供的必备的包有pandas==0.20.3、numpy==1.14.0、gensim==3.1.0、spacy==1.9.0、tqdm==4.15.0、nltk==3.4.5、tensorboardX==1.1、torch==0.4。其中最主要的是torch的版本要匹配。出现该问题的主要原因是提示cuda的版本偏低,应该是10.0以上,实际是9.0。但是,我在服务器上输入:nvidia-smi,查看cuda的版本是10.1,也不知道是哪里出问题了,一直都没有解决。
因为疫情的原因,在家待了大半年,在家也断断续续的调试过程序,用cpu可以跑通,但是实在是太慢了。上面出现的那个问题也一直没有解决。
直到九月六号开学后,我又开始调这个程序,当时也想过放弃这个程序和idea,但是考虑到后面的工作可能还得在这个的基础上进行,于是又开始调这个程序。直到九号晚上,我重新离线下载了一个torch安装包,torch-0.4.1-cp37-cp37m-linux_x86_64.whl,该安装包对应的cuda是9.2的,当时考虑的是我服务器上cuda是10.1,应该能带起9.2的程序,重新安装torch后,程序竟然在训练了,我当时感觉要哭了。
但是,跑到validation的时候,程序又报了一个错:RuntimeError : PyTorch was compiled without NumPy support,网上搜索发现有两种解释:
(1)numpy没有安装到运行环境下,加入你在python3运行环境下,可能默认安装到Python2运行环境下。我通过conda list指令发现里面有numpy,应该没有问题。
(2)numpy和torch的版本不匹配。torch的版本是0.4.1,numpy的版本是1.17.3。参考博客(RuntimeError: PyTorch was compiled without NumPy support - DuanYongchun - 博客园——https://www.cnblogs.com/dyc99/p/12584412.html)里面的方法,卸载torch,安装pip install torch==0.4.1.post2,安装numpy==1.15.0。
安装好之后运行,出行了另外一个错误:RuntimeError: CuDNN error: CUDNN_STATUS_SUCCESS。于是又搜索网上的方法,一种方法是在前面加入代码cudnn.benchmark = True,由于用到cudnn的地方太多,加这个有点麻烦,就放弃了这种方法。另一种方法是cuda、cudnn和pytorch的版本不匹配。于是考虑是不是执行上面(2)里面的pip install torch==0.4.1.post2的时候,系统是从网上下载的cuda10.1版本的torch0.4.1.post2,于是自己手动下载cuda9.2版本的torch0.4.1.post2。下载地址:
https://download.pytorch.org/whl/torch_stable.html。
离线安装后,惊奇的发现程序正常运行了,一点错误也没有了。我TMD的要哭了,真的要哭了。整整半年多的时间,我就一直卡在这一个问题上,没想到开学才两天就解决了。
总结:
(1)运行程序前环境一定要配好,各种包之间要对应,不然就会出现不兼容的问题;
(2)cuda可能可以运行比它对应版本低版本的torch,比如cuda10.1对应的torch版本一般为1.3.0-1.6.0,但是运行9.2版本cuda的torch0.4.1也可以;
(3)有时候出现版本不匹配的问题时 ,可以直接先卸载原来的版本,然后pip install XXX,系统会为你自动更新到最新的版本,如果还不行,就需要自己离线下载安装;
(4)该程序所需要的包对应的版本如下:
torch:cu92/torch-0.4.1.post2-cp37-cp37m-linux_x86_64.whl
cuda:10.1
python:3.7.4
pandas:0.25.1
numpy:1.15.0
gensim:3.8.3
spacy:2.3.2
tqdm:4.38.0
nltk:3.4.5
tensorboardX:1.1
protobuf: 3.19.0
torch的下载地址:https://download.pytorch.org/whl/torch_stable.html 这个地址一定要记好,就是这里面的torch版本救了我。
未弄明白的问题:
为什么服务器上cuda=10.1,程序还会提示cuda版本偏低,应需要10.0以上版本,实际为9.0。考虑可能是被覆盖了,或者没有用到服务器上预设的cuda,如果是这种情况的话,那总结(2)就不成立。