当工作线程数量增加并且 numpy 生成大型阵列时,Keras 使用较少的 CPU



我的代码使用了相对广泛的增强策略,但我注意到当fit_generator(...workers=N)中的N增加时,CPU 利用率不成比例。我有一个 4 核 CPU。

  • N=1时,htop显示大约 105% 的使用率
  • N=2时,htop显示大约 202% 的使用率
  • N=3时,htop显示大约 287% 的使用率
  • N=4时,htop显示使用率约为 342%

GPU 使用率始终低于 40%。

如果我减少增强策略以省略噪声添加,我可以在N=4时实现大约 360% 或更高的 GPU 使用率。噪声由

x += numpy.random.normal(0, noise_sigma, x.shape) / 255.0

其中x是 640x480 BGR 输入图像。这是一个缓慢的调用,平均每次调用约24.3ms,但是CPU不应该在N=4时仍然做工作吗?为什么 numpy 在生成大量随机数数组时似乎会阻塞其他线程?

normal调用cont2_array*

https://github.com/numpy/numpy/blob/master/numpy/random/mtrand/mtrand.pyx#L1651

而且有一个lock

这是原因吗?

您可以尝试使用单个RandomState来生成随机数吗?

r = numpy.random.RandomState() 
.....
for ... :
x += r.normal(0, noise_sigma, x.shape) / 255.0

最新更新