Spacy训练多线程CPU usag

2024-05-17 06:25:42 发布

您现在位置:Python中文网/ 问答频道 /正文

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

环境:
-spaCy 2.0.8版
-Location/root/.env/lib/python3.6/site packages/spacy
-平台Linux-3.14.32-xxxx-grs-ipv6-64-x86_64-with-debian-buster-sid
-Python 3.6.4版


Tags: env核心环境spacylibsite消费者location
1条回答
网友
1楼 · 发布于 2024-05-17 06:25:42

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

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

另一个问题是OpenBLAS可能会启动比它应该启动的线程更多的线程。这在容器中尤其常见。在

最后,并行的效率很大程度上取决于批处理的大小。在小批量中,矩阵很小,每次更新例程(如Adam optimiser)占用更多时间。在

我通常禁用多线程并在一个核心上进行训练,因为这是最有效的(从工作成本的意义上来说),然后我将更多的模型作为单独的进程进行训练(通常在单独的GCE vm上)。在

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

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

如果你怀疑你的BLAS不好,一个简单的尝试就是使用conda安装numpy。这会给你一个链接到英特尔MKL库的副本。在

相关问题 更多 >