代码之家  ›  专栏  ›  技术社区  ›  Thoc theodox

Spacy培训多线程CPU使用率

  •  2
  • Thoc theodox  · 技术社区  · 6 年前

    我正在用自己的NER管道训练一些模特。我需要在lxc容器中运行spacy,这样我就可以用python3.6运行它(它允许多线程训练)。
    但是在我授权在我的容器上运行的7核上,只有1核以100%的速度运行,其他核以40-60%的速度运行(实际上,它们以100%的速度开始运行,但在fews分钟后下降)。我真的很想提高这%的核心使用率。知道去哪里找吗?这可能是生产者/消费者的问题吗?

    环境:
    -spaCy版本2.0.8
    -位置/根/。env/lib/python3.6/site-packages/spacy
    -平台Linux-3.14.32-xxxx-grs-ipv6-64-x86\u 64-with-debian-buster-sid
    -Python版本3.6.4

    1 回复  |  直到 6 年前
        1
  •  4
  •   syllogism_    6 年前

    多线程的惟一功能是矩阵乘法,在v2.0.8中,矩阵乘法是通过numpy完成的,它将矩阵乘法委托给BLAS库。其他一切都是单线程的。

    您应该检查numpy链接到的BLAS库,并确保该库已针对您的机器进行了适当的编译。在我的机器上,我通过pip安装的numpy附带一个OpenBLAS副本,它认为我的机器有一个普雷斯科特CPU。这会阻止它使用AVX指令。因此,如果我在我的机器上从pip安装默认numpy,它的运行速度会比应该的慢2-3倍。

    另一个问题是OpenBLAS可能会启动更多的线程。这在容器中似乎特别常见。

    最后,并行的效率在很大程度上取决于批大小。在小批量上,矩阵很小,每次更新例程(如Adam Optimizer)需要更多的时间。

    我通常禁用多线程并在单核上进行训练,因为这是最有效的(从工作成本的角度来看)——然后我将更多的模型作为单独的进程进行训练(通常在单独的GCE虚拟机上)。

    在编写spaCy时,我没有假设目标是使用大量内核。目标是提高效率。使用您的整个机器来执行可以在单个核心上完成的相同工作并不是一种美德。在这方面,许多论文都具有误导性。例如,跨云启动12个培训流程并使用异步SGD策略(如Hogwild!)进行优化可能会让人感到满意!。这是一种消耗大量能量的有效方法,但不一定会更快地训练模型:使用Adam和更小的批量,训练更稳定,并且通常在更少的迭代中达到相同的精度。同样,我们可以扩大网络,让机器得到锻炼。。。但为什么呢?目标是训练模型。将一组矩阵相乘是一种手段,而不是目的。

    我最关心的问题是可怕的BLAS链接情况。这将在v2.1中得到很大改进,因为我们将带来自己的OpenBLAS内核。默认情况下,内核将是单线程的。

    如果您怀疑自己的BLAS不好,可以尝试使用conda安装numpy。这将为您提供一个与intel的MKL库链接的副本。