【问题标题】:Is there a way to optimize SpaCy training?有没有办法优化 SpaCy 培训?
【发布时间】:2020-12-24 02:20:23
【问题描述】:

我目前正在训练用于多标签文本分类的 SpaCy 模型。有6个标签:愤怒、期待、厌恶、恐惧、喜悦、悲伤、惊讶和信任。数据集超过 200k。但是,每个 epoch 需要 4 个小时。我想知道是否有一种方法可以优化训练并更快地完成,也许我在这里跳过了一些可以改进模型的东西。


培训数据

TRAIN_DATA = list(zip(train_texts, [{"cats": cats} for cats in final_train_cats]))

[...
  {'cats': {'anger': 1,
    'anticipation': 0,
    'disgust': 0,
    'fear': 0,
    'joy': 0,
    'sadness': 0,
    'surprise': 0,
    'trust': 0}}),
 ('mausoleum',
  {'cats': {'anger': 1,
    'anticipation': 0,
    'disgust': 0,
    'fear': 0,
    'joy': 0,
    'sadness': 0,
    'surprise': 0,
    'trust': 0}}),
 ...]

培训

nlp = spacy.load("en_core_web_sm")
category = nlp.create_pipe("textcat", config={"exclusive_classes": True})
nlp.add_pipe(category)

# add label to text classifier
category.add_label("trust")
category.add_label("fear")
category.add_label("disgust")
category.add_label("surprise")
category.add_label("anticipation")
category.add_label("anger")
category.add_label("joy")

optimizer = nlp.begin_training()
losses = {}

for i in range(100):
    random.shuffle(TRAIN_DATA)

    print('...')
    for batch in minibatch(TRAIN_DATA, size=8):
        texts = [nlp(text) for text, entities in batch]
        annotations = [{"cats": entities} for text, entities in batch]
        nlp.update(texts, annotations, sgd=optimizer, losses=losses)
    print(i, losses)

...
0 {'parser': 0.0, 'tagger': 27.018985521040854, 'textcat': 0.0, 'ner': 0.0}
...
1 {'parser': 0.0, 'tagger': 27.01898552104131, 'textcat': 0.0, 'ner': 0.0}
...

【问题讨论】:

    标签: python performance machine-learning spacy


    【解决方案1】:

    “200k 记录数据集每个 epoch 需要 4 小时”并不能告诉我们太多:

    1. 确保您没有耗尽内存(是吗?)它占用了多少 RAM?
    2. 由于 GIL,您可能正在运行单线程。参见例如this 关于如何关闭 GIL 以运行多核训练。你有多少个内核?
    • 将texts = [nlp(text) ...] 放入内循环for batch in minibatch(TRAIN_DATA, size=8): 看起来很麻烦,因为您的代码将始终保存 GIL,即使您只需要它用于处理输入文本的 C 库字符串调用,即parser 舞台,不用于训练。
    • 重构您的代码,以便您首先在所有输入上运行nlp() 管道,然后保存一些中间表示(数组或其他)。将该代码与您的训练循环分开,以便训练可以是多线程的。
    1. 我无法评论您选择的 minibatch() 参数,但 8 似乎非常小,而且这些参数似乎对性能很重要,因此请尝试调整它们(/grid-search 一些值)。
    2. 最后,一旦您首先检查了以上所有内容,找到您能找到的最快的单核/多核机器,并且有足够的 RAM。

    【讨论】:

    • 我使用的是 google colab pro,(25 gb RAM)。你建议在哪里使用text = [nlp(text)... 你能用你当前的建议编辑你的评论吗?我已经更新了 minibach 的尺寸并进行了改进
    • 对不起,这是我能说的最好的了,不熟悉语法,但很高兴听到你 mde 的进步。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多