AllenNLP 预测器对象在调用之前加载——脚本的其余部分挂起

AllenNLP predictor object loading before it is called -- rest of the script hangs

背景

我正在做一个项目,我需要对大量文本进行共指解析。在这样做的过程中,我涉足了 NLP 世界并找到了 AllenNLP 的 coref 模型。

一般来说,我有一个脚本,我在其中使用 pandas 加载要解析的“文章”数据集,并将这些文章传递给要解析的 predictor.from_path() 对象。由于我要解决的文章很多,我 运行 在远程集群上解决这个问题(虽然我不认为这是这个问题的根源,因为当我 运行 本地脚本)。也就是说,我的脚本看起来像这样:

from allennlp.predictors.predictor import Predictor
import allennlp_models.tagging
import pandas as pd

print("HERE TEST")

def predictorFunc(article):
     predictor = predictor.from_path("https://storage.googleapis.com/allennlp-public-models/coref-spanbert-large-2021.03.10.tar.gz")
     resolved_object = predictor(document=article)

     ### Some other interrogation of the predicted clusters ###
     return resolved_object['document']

df = pd.read_csv('articles.csv')
### Some pandas magic ###

resolved_text = predictorFunc(article_pre_resolved)

问题

当我执行脚本时,以下消息会先打印到我的 .log 文件 ,然后再打印 (例如我包含的 print("HERE TEST"))——甚至之前predictor 对象本身称为:

Some weights of BertModel were not initialized from the model checkpoint at SpanBERT/spanbert-large-cased and are newly initialized: ['bert.pooler.dense.weight', 'bert.pooler.dense.bias']
You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.

我知道这条消息本身是预料之中的,因为我使用的是预训练模型,但是当这条消息出现时,它会完全锁定 .log 文件(在脚本结束之前不会打印任何其他内容,所有内容立即打印)。这对我来说是个大问题,因为它几乎不可能以有意义的方式调试脚本的其他部分。 (这也会使跟踪最终脚本在大型数据集上的进度变得非常困难...... :'( ) 另外,我非常想知道为什么预测对象似乎在被调用之前就已经加载了。 虽然我不能确定,但​​我也认为无论是什么原因造成的,也会导致 运行 占用内存(即使对于只有一个 'article' 的玩具示例(几百个单词作为字符串)).

有没有其他人有过这种情况problem/know为什么会这样?非常感谢!

我想我在我所做的事情中找出了两个相互竞争且不相关的问题。首先,无序打印的原因与 SLURM 有关。使用 --unbuffered 选项修复了打印问题并使诊断变得更加容易。第二个问题(看起来像内存使用失控)与一篇非常长的文章(大约 10,000 字)有关,该文章刚刚超过 Predictor 对象的最大长度。我现在要结束这个问题!