【问题标题】:How to limit the amount of CPU cores used in a python library?如何限制 python 库中使用的 CPU 内核数量?
【发布时间】:2022-08-15 23:19:41
【问题描述】:

我正在为 TensorFlow 模型(自己的代码,而不是 tf.Data)运行 DataPipeline,并使用多处理库进行可调整的并行计算量。尽管限制了并行进程的数量 (#CPU),但我注意到 CPU 负载非常高(显着高于 100%*#CPU)。

我将问题追溯到我用来计算音频特征的 librosa 库。

示例代码:

import librosa
while True:
    librosa.feature.mfcc(y=np.random.normal(0, 1, (26783, )), sr=16000, n_mfcc=24, win_length=640, hop_length=640, n_fft=640)
    time.sleep(0.1)

上面简单的最小示例代码 sn-p 将使用我机器上大约 2000% - 3000% 的单个 CPU,如 htop 所示,这是因为 librosa 似乎在内部并行化了该操作。 由于高 CPU 负载会影响我的同事并控制我消耗的 CPU 负载,因此我想强制计算在单个(或至少可控数量的)内核上运行。

我想像:

limit_cpu_cores_for_this_process(os.getpid())
librosa.feature.mfcc(y=np.random.normal(0, 1, (26783, )), sr=16000, n_mfcc=24, win_length=640, hop_length=640, n_fft=640)

在循环内部调用(在最小示例中)或我的子进程应该只使用一个 CPU 内核,但我无法找到关于那个非常具体的主题的东西。最后,每个限制 CPU 使用上述代码的解决方案(在某种程度上放慢速度是可以的)都会有所帮助!

由于 librosa 在内部执行此操作,我无法直接限制 CPU 核心数,但我必须限制已经由 s.o. 并行化的代码。别的。


编辑:自己找到了解决方案,请参阅我的答案。

    标签: python parallel-processing multiprocessing joblib librosa


    【解决方案1】:

    我找到了一个解决方案,它实际上直接来自 joblib(虽然很难找到)。

    以下将不仅使用大约 20% 的单个 CPU 内核执行。最重要的是,它更快(110ms vs 140ms 在我的机器上进行一次迭代,睡眠时间为 100ms。计算时间减少了 4 倍)。我猜这是因为要处理的音频部分相对较小,并且并行化的开销更大。

    from threadpoolctl import threadpool_limits
    while True:
        with threadpool_limits(limits=1):
            librosa.feature.mfcc(y=np.random.normal(0, 1, (26783, )), sr=16000, n_mfcc=24, win_length=640, hop_length=640, n_fft=640)
        time.sleep(0.1)
    

    【讨论】:

      猜你喜欢
      • 2022-09-18
      • 2017-01-25
      • 2016-04-17
      • 2017-08-30
      • 2020-09-21
      • 2019-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多