【论文复现】QAFactEval: 《QAFactEval: Improved QA-Based Factual Consistency Evaluation for Summarization》

论文《QAFactEval: Improved QA-Based Factual Consistency Evaluation for Summarization》(NAACL 2022)代码https://github.com/salesforce/QAFactEval

本人的服务器:学校实验室服务器,不支持正常访问huggingface

因为本论文的时间是2021年,当时使用的transformers库为3.0.2版本的,并且按照代码的框架逻辑,不能高于3.1.0版本,否则要大改特改。

transformers库最恶心的地方就在于,更新换代的速度非常之快,并且新版本的修改可谓是大刀阔斧的修改,很多旧有的方法不再支持。

对于本代码而言,困难之处在于:

  • 在封装好的库qafacteval中写死了必须远程加载facebook/bart-large模型和tokenizer,并且加载facebook/bart-large的那几行代码无法找到。并且是基于3.0.2版本的加载,加载的逻辑已经不同于现在的transformers库。

总结复现流程如下:

  1. 在服务器上conda创建虚拟环境qafacteval。(亲测,python版本不能超过3.8,作者的readme里没说qwq)

    conda create -n questeval python=3.8
    
  2. git clone下载项目代码于本地,用pycharm打开并远程连接到服务器的该环境中。

  3. 服务器上进入该项目目录,安裝本项目需要的库。

    pip install -e .
    
  4. 还需要再安装库gdown,不然待会儿没法下载模型。(这个作者没在setup.py中实现,也没另外说qwq)

    pip install gdown
    
  5. 执行download_models.sh,下载本框架所依赖的所有子模型。(其实还依赖了bert-large作为生成模型,被隐藏在库里面了,这是最搞人的地方)

    chmod +x download_models.sh
    ./download_models.sh
    
  6. 现在需要来搞定facebook/bert-large模型加载的问题。如果你能直接访问huggingface并下载模型,那本步骤可以跳过,直接跑通了;如果你的服务器和我一样无法直接访问huggingface,那么很不幸,你不得不去改动transformers的源代码。因为

    ①加载facebook/bert-large模型的代码看不见,我猜测是很底层的库默认加载了它,我们不可控。因此“直接改为本地加载,在from_pretrained()的第一个参数改成本地模型路径,从本地文件加载”这个方法是行不通的。(就根本看不到这行代码)

    ②3.0.2的transformers和现今我们用的4.X版本的transformers对于缓存路径的理解不一样,加载的逻辑也非常不一样。所以"将另一台电脑下载好的模型传输到服务器的huggingface缓存路径~/.cache/huggingface/hub,再直接以默认从本地缓存中加载"这个方法也行不通。(除非你愿意花时间再去钻研现在已经不用了的3.X版本的缓存结构)

    根据几个小时的摸索,终于找到了解决之道:强制修改当前环境的3.0.2transformers的库文件,把加载方法写死到咱们存放的路径上

    请按照下面的步骤走:

    1. 首先请各显神通把facebook/bert-large模型传进服务器的某个位置上(我是用自己的电脑下载好,然后用文件传输工具传输到服务器上的某个位置)

    2. 修改transformers.configuration_utils.py中的get_config_dict()方法,即加载对应模型配置文件的工具库。把它写死到.config文件的绝对路径。

      【论文复现】QAFactEval: 《QAFactEval: Improved QA-Based Factual Consistency Evaluation for Summarization》_第1张图片

    3. 修改transformers.modeling_utils.py中的from_pretrained()方法,即加载对应模型文件的工具库。把它写死到.bin文件的绝对路径。

      【论文复现】QAFactEval: 《QAFactEval: Improved QA-Based Factual Consistency Evaluation for Summarization》_第2张图片

  7. 现在就可以跑通本论文的模型框架了!创建一个文件my_run.py,把README中作者提供的样例程序放进去,就可以跑起来啦!

    from qafacteval import QAFactEval
    kwargs = {"cuda_device": 0, "use_lerc_quip": True, \
            "verbose": True, "generation_batch_size": 32, \
            "answering_batch_size": 32, "lerc_batch_size": 8}
    
    model_folder = "/dev_data_2/zkyao/code/QAFactEval/models" # path to models downloaded with download_models.sh
    metric = QAFactEval(
        lerc_quip_path=f"{model_folder}/quip-512-mocha",
        generation_model_path=f"{model_folder}/generation/model.tar.gz",
        answering_model_dir=f"{model_folder}/answering",
        lerc_model_path=f"{model_folder}/lerc/model.tar.gz",
        lerc_pretrained_model_path=f"{model_folder}/lerc/pretraining.tar.gz",
        **kwargs
    )
    
    results = metric.score_batch_qafacteval(["This is a source document"], [["This is a summary."]], return_qa_pairs=True)
    score = results[0][0]['qa-eval']['lerc_quip']
    print(score)
    

你可能感兴趣的:(论文学习,nlp)