【问题标题】:Parallelism with SciPy.optimize与 SciPy.optimize 的并行性
【发布时间】:2011-06-03 15:45:37
【问题描述】:

我正在编写一些使用scipy.optimize.leastsq 优化功能的研究代码。它每次迭代大约执行 18 次,所以我想并行调用 minimumsq 以减少运行时间。这应该不是问题,因为优化几乎是完全独立的,因此只需要很少的同步。我最近发现了multiprocessing.pool.ThreadPool,它可以让我在不必显式设置共享内存的情况下执行此操作(因为我的大部分数据都在 NumPy 数组中,所以很痛苦)。所以我稍微重写了我的代码,希望它能工作,但它会抛出一个奇怪的错误:SystemError: null argument to internal routine。

以下是我的代码的简化:

def optfunc(id):
    def errfunc(x):
        return somedata[id] - somefunc(x)

    lock.acquire()
    x0 = numpy.copy(currentx[id])
    lock.release()

    result = scipy.optimize.leastsq(errfunc, x0)

    lock.acquire()
    currentx[id] = result
    lock.release()

ThreadPool(processes=8).map(optfunc, range(idcount))

这应该可以正常工作,除非scipy.optimize.leastsq 不是线程安全的。所以我尝试在scipy.optimize.leastsq 周围加锁;瞧,它的工作原理。但是,处理器利用率一直停留在 100%,所以这对我来说毫无用处。

我的问题是我能做些什么呢?我认为我的选择是:

  1. 找到 LM 的线程安全实现(也许是 levmar?)
  2. 尝试使用进程而不是线程(我认为这不会产生影响)

任何帮助或建议将不胜感激。

【问题讨论】:

  • 您使用的是 Windows 吗? Windows 上的 optimize.leastsq 中的线程存在一个已知问题:projects.scipy.org/scipy/ticket/1117。
  • 嗯,有趣的是我搜索时没有出现。我正在使用 Ubuntu,但它可能会影响两个操作系统。

标签: python multithreading optimization thread-safety scipy


【解决方案1】:

使用进程而不是线程会有所不同——无论程序是否是线程安全的,它都可以工作。当然,是否更快取决于解决问题所花费的时间是否大于开销。

使用流程可能需要一些额外的麻烦来设置所有必要的数据。然而,multiprocessing 模块负责大部分工作,所以这应该不会太难。

【讨论】:

    【解决方案2】:

    多少 CPU/内核?如果您所拥有的东西在没有线程的情况下以 100% 运行,那么您将一无所获。如果leastq() 不是线程安全的,并且您没有使用 100% 的计算机,那么您可以为每个内核运行一个程序实例并让这些实例通过文件系统同步。

    【讨论】:

    • 研究机器上有8个CPU。我不知道你为什么说如果它以 100% 运行就什么也得不到。当我尝试上面的示例时,代码会在抛出 SystemError 之前运行一段时间,并且在此期间它的 CPU 使用率徘徊在 400% 左右。我正在考虑使用您提出的解决方案,但我认为此时它可能比它的价值更麻烦。不过谢谢你的帖子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多