我在 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)
测量时间表明循环比多处理
快。我也尝试过 threading
模块但没有成功(然后我读到这是个坏主意;阅读更多 here )
我开始使用多线程进行这项实验,因为我需要将图像、标签、边界框……转换为 tfrecords。为此,我正在研究来自 tensorflow/inception 的一个文件(如果你想深入了解 build_imagenet_data.py, line 453)。我相信多线程在这里起作用,这就是他们使用它的原因。
说到这里,我的问题可以这样说,
- 我的代码中缺少什么;是否有可能通过小的修改实现某些目标?
- inception 中的示例是否有效,因为 tensorflow 是用 c++ 和 CUDA 编写的?
- 什么时候建议使用 numpy、tensorflow 等多处理或多线程?
最佳答案
总会有一些开销(同步、数据准备、数据复制等)。
但是:如果设置良好,您在 numpy 中的矩阵向量和向量向量操作已经是多线程的,使用 BLAS (这是最先进的标准,包括 numpy、matlab 和可能的 tensorflow 的 cpu 后端;尽管有不同的实现)。
因此,如果 BLAS 能够占据您的所有核心(大维度更容易),您只会看到开销。
是的,在它的核心中,tensorflow 将至少由 C/C++/Fortran 和 BLAS 中的一种实现,用于它的 CPU 后端和一些 Cuda-libs,当以 GPU 为目标时。这也意味着,梯度计算和优化计算等核心算法永远不需要外部并行化(在所有用例的 99.9% 中)。
关于python-2.7 - 我在 python-multiprocessing/multithreading 中缺少什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46082610/