gpt4 book ai didi

python - Numba `nogil` +迟钝的线程后端导致无法加快速度(计算速度较慢!)

转载 作者:行者123 更新时间:2023-12-03 13:07:46 33 4
gpt4 key购买 nike

我正在尝试使用NumbaDask来加快慢速计算的速度,这与计算大量点的kernel density estimate相似。我的计划是在jit ed函数中编写计算量大的逻辑,然后使用dask在CPU内核之间分配工作。我想使用nogil函数的numba.jit功能,以便可以使用dask线程后端,以避免输入数据的不必要的内存副本(非常大)。

不幸的是,除非我使用'processes'调度程序,否则Dask不会加快速度。如果我改用ThreadPoolExector,则可以看到预期的速度提高。

这是我的问题的简化示例:

import os
import numpy as np
import numba
import dask

CPU_COUNT = os.cpu_count()

def render_internal(size, mag):
"""mag is the magnification to apply
generate coordinates internally
"""
coords = np.random.rand(size, 2)
img = np.zeros((mag, mag), dtype=np.int64)
for i in range(len(coords)):
y0, x0 = coords[i] * mag
y1, x1 = int(y0), int(x0)
m = 1
img[y1, x1] += m

jit_render_internal = numba.jit(render_internal, nogil=True, nopython=True)

args = 10000000, 100

print("Linear time:")
%time linear_compute = [jit_render_internal(*args) for i in range(CPU_COUNT)]

delayed_jit_render_internal = dask.delayed(jit_render_internal)

print()
print("Threads time:")
%time dask_compute_threads = dask.compute(*[delayed_jit_render_internal(*args) for i in range(CPU_COUNT)])

print()
print("Processes time:")
%time dask_compute_processes = dask.compute(*[delayed_jit_render_internal(*args) for i in range(CPU_COUNT)], scheduler="processes")

这是我机器上的输出:
Linear time:
Wall time: 1min 17s

Threads time:
Wall time: 1min 47s

Processes time:
Wall time: 7.79 s

正如预期的那样,对于处理后端和线程后端,我都看到所有CPU内核的完全利用。但是无法加快线程后端的速度。我非常确定jitted函数 jit_render_internal实际上不会释放GIL。

我的两个问题是:
  • 如果将nogil关键字传递给numba.jit并且无法释放GIL,为什么不引发错误?
  • 为什么我编写的代码没有释放GIL?所有计算都嵌入在函数中,没有返回值。
  • 最佳答案

    请尝试以下操作,它更快并且似乎可以解决线程性能问题:

    def render_internal(size, mag):
    """mag is the magnification to apply
    generate coordinates internally
    """
    coords = np.random.rand(size, 2)
    img = np.zeros((mag, mag), dtype=np.int64)
    for i in range(len(coords)):
    #y0, x0 = coords[i] * mag
    y0 = coords[i,0] * mag
    x0 = coords[i,1] * mag
    y1, x1 = int(y0), int(x0)
    m = 1
    img[y1, x1] += m

    我在上面拆分了 x0y0的计算。在我的机器上,基于线程的解决方案实际上比更改后的进程要快。

    关于python - Numba `nogil` +迟钝的线程后端导致无法加快速度(计算速度较慢!),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56855897/

    33 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com