【发布时间】: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