论文是 Aspect-Level Sentiment Analysis Via Convolution over Dependency Tree,于2019年发表在EMNLP。
源码地址:https://github.com/Guangzidetiaoyue/CDT_ABSA
复现这篇论文源码的时候,走了很多弯路,故在此总结,给出快速而详细的解决方法。
10系显卡解决步骤
首先,10系显卡不局限于GTX1050至GTX1080ti,同时也包括诸如GTX1650\GTX1660等甜品卡。
源码中的环境要求是:
- Python 3.6.8
- PyTorch 1.0.0
- CUDA 9.0
在anaconda中创建Python=3.6.8的虚拟环境。由于官方已经没有pytorch=1.0.0的安装命令,我们采用本地安装的方式。
安装教程:https://zhuanlan.zhihu.com/p/636607358
根据上面的教程依次安装torch和torchvision,并在虚拟环境中进行torch、cuda和cudnn的可用性测试。这里测试出cuda版本是10.0不要紧,仍能运行,因为笔者也是一样。
之后在pycharm中clone项目,选择刚刚创建好的虚拟环境,运行train.py,查看报错,预计会有3-4次缺包报错,缺什么包安装什么包即可。但是,在安装gensim包的时候,很有可能会报Microsoft Visual C++ 14.0 or greater is required的错误。
解决教程:https://zhuanlan.zhihu.com/p/471661231
根据上面的教程下载 Visual C++ Build Tools for Visual Studio 2015 with Update 3 的 DVD 文件(千万注意是DVD文件)。
继续安装gensim包即可成功,顺带将其他缺省包也下载好。
经过上面两步后,根据源码文件中 README.md 文件运行即可。注:.sh文件可在pycharm中指定git bush命令行运行。
40系显卡解决步骤
一开始笔者用40系显卡也是按照上述方式安装,但会运行超时后报错,一般会卡在下面这个位置:
运行不成功的原因是,40系显卡最低支持cuda11.3,所以不管是源码需求的cuda9.0还是10.0,40系显卡都不支持,跑代码跑不到GPU上,cuda使用率为0:
解决方法:
首先,在anaconda中创建Python=3.6.8的虚拟环境,之后在pytorch官网上用conda方式下载稳定的版本:
这里这么选择就可以,先不要问为什么,因为笔者是这样做的且成功了,后面会解释。另外,如果日后可能cuda会有更高版本,没有11.8的版本选择,选择最低的应该就可以。
安装好pytorch之后,查看cuda版本,会发现cuda版本自动变成了11.3。这里猜测可能是和python=3.6.8有关,自动降低了。
接着在此虚拟环境中进行torch、cuda和cudnn的可用性测试。参照:https://zhuanlan.zhihu.com/p/636607358 中测试步骤即可。
之后在pycharm中clone项目,选择刚刚创建好的虚拟环境,运行train.py,查看报错,预计会有3-4次缺包报错,缺什么包安装什么包即可。但是,在安装gensim包的时候,很有可能会报Microsoft Visual C++ 14.0 or greater is required的错误。
解决教程:https://zhuanlan.zhihu.com/p/471661231
根据上面的教程下载 Visual C++ Build Tools for Visual Studio 2015 with Update 3 的 DVD 文件(千万注意是DVD文件)。
继续安装gensim包即可成功,顺带将其他缺省包也下载好。
解决所有包的问题之后,会发现报新的错误:RuntimeError: ‘lengths’ argument should be a 1D CPU int64 tensor, but got 1D cuda:0 Long tensor
报错的原因是pytorch 1.5以上Bi-LSTM升级了,实现方式有些许差别,但无需究其原理,解决方法如下:
经过上面的步骤,再根据源码文件中 README.md 文件运行即可。注:.sh文件可在pycharm中指定git bush命令行运行。
复现结果
经过不同的解决步骤后,成功运行的显示是:
且在运行过程中,cuda使用率有显著提升:
模型训练和测试结束后,以Rest14数据集为例,最优的测试精度和F1 Score对比如下:
我们发现测试精度甚至比论文数据更高,且F1 Score只有微小的差别。这说明我们的源码复现成功了。
注:
如果显卡是20/30系显卡,大致解决方法应该和上述40系方法差不多,根据上述思路具体问题具体分析即可。
Pingback:Dual Graph Convolutional Networks for Aspect-based Sentiment Analysis 源码复现 – 方堃的博客