我在python-multiprocessing / multithreading中缺少什么?

时间:2017-09-06 19:05:06

标签: python-2.7 numpy tensorflow python-multiprocessing python-multithreading

我在numpy中创建,乘以然后求和两个大矩阵的所有元素。我用两种方法做了几百次,一个循环,并在multiprocessing模块的帮助下(参见下面的snipet)。

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)。我相信这里的多线程工作就是他们使用它的原因。

这样说,我的问题可以如下,

  • 我的代码中缺少什么;是否有可能实现一些小改动?
  • 从初始起作用的例子是因为tensorflow是用c ++和CUDA编写的吗?
  • 什么时候建议使用numpy,tensorflow等多处理或多线程?

1 个答案:

答案 0 :(得分:3)

总有一些开销(同步,数据准备,数据副本和合作)。

但是:给定一个好的设置,numpy中的矩阵向​​量和向量向量操作已经是多线程的,使用BLAS(这是迄今为止使用的最先进的标准,包括numpy,matlab和可能是tensorflow的cpu-backend;虽然有不同的实现。)

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

是的,它的核心中的tensorflow将由至少一个C / C ++ / Fortran加BLAS实现,因为它的CPU后端和一些Cuda-lib在定位GPU时。这也意味着,作为梯度计算和优化计算的核心算法永远不需要外部并行化(占所有用例的99.9%)。