python-multiprocessing/multithreading 我错过了什么?

What am I missing in python-multiprocessing/multithreading?

我在 numpy 中创建、相乘然后对两个大矩阵的所有元素求和。我用两种方法、一个循环和 multiprocessing 模块的帮助(参见下面的代码片段)执行了数百次。

def worker_loop(n):
  for i in n:
    mul = np.sum(np.random.normal(size=[i,i])*np.random.normal(size=[i,i]))

def worker(i):
  mul = np.sum(np.random.normal(size=[i,i])*np.random.normal(size=[i,i]))

n = range(100,300)

pool = ThreadPool(2)
pool.map(worker, n)
pool.close()
pool.join()

worker_loop(n)

测量时间表明 循环 multiprocessing 快。我也试过 threading 模块但没有成功(然后我读到这是个坏主意;阅读更多 here

我开始尝试多线程,因为我需要将图像、标签、边界框……转换为 tfrecords。为此,我正在研究 tensorflow/inception 中的一个文件(如果你想深入了解 build_imagenet_data.py, line 453)。我相信多线程在这里起作用,这就是他们使用它的原因。

说到这里,我的问题可以这样表述,

总有一些开销(同步、数据准备、数据复制等)。

但是:如果设置良好,您在 numpy 中的矩阵向​​量和向量向量操作已经是多线程的,使用 BLAS(这是无处不在的艺术标准,包括 numpy、matlab 和可能的 tensorflow 的 cpu-后端;尽管有不同的实现。

因此,如果 BLAS 能够占据所有核心(大尺寸更容易),您只会看到开销。

是的,在它的核心中,tensorflow 将至少由 C/C++/Fortran 加上 BLAS 之一实现,因为它的 CPU-backend 和一些 Cuda-libs 以 GPU 为目标。这也意味着,梯度计算和优化计算等核心算法永远不需要外部并行化(在所有用例的 99.9% 中)。