gpt4 book ai didi

python - 尝试实例化 NumPy RandomState 时出现 Numba 错误

转载 作者:行者123 更新时间:2023-11-28 19:22:40 25 4
gpt4 key购买 nike

我有一门课,我想用 Numba 加快速度。该类通过简单地使用特定种子创建 NumPy 的 RandomState 实例,为每个实例使用一个“随机数生成器”(因此我可以稍后复制我的工作)。当我使用 Numba 的 autojit 时,我收到一个奇怪的错误,这在“常规”Python 中不会出现。

幸运的是,这种行为非常容易复制。这是一个说明错误的简单示例:

from numpy.random import RandomState
from numba import autojit

# ------- This works in "regular Python" ------------

class SillyClass1(object):
def __init__(self, seed):
self.RNG = RandomState(seed)
def draw_uniform(self):
return self.RNG.uniform(0,1)

test1 = SillyClass1(123456)

test1.draw_uniform()

# Output:
# 0.12696983303810094


# The following code -- exactly the same as above, but with the @autojit
# decorator, doesn't work, and throws an error which I am having a hard
# time understanding how to fix:

@autojit
class SillyClass2(object):
def __init__(self, seed):
self.RNG = RandomState(seed)
def draw_uniform(self):
return self.RNG.uniform(0,1)

test2 = SillyClass2(123456)

test2.draw_uniform()

# Output:
#
# ValueError Traceback (most recent call last)
# <ipython-input-86-a18f95c11a1b> in <module>()
# 10
# 11
# ---> 12 test2 = SillyClass2(123456)
# 13
# 14 test2.draw_uniform()
#
# ...
#
# ValueError: object of too small depth for desired array

我在 Ubuntu 13.10 上使用 Anaconda 发行版。

有什么想法吗?

编辑:我找到了一个解决方法,即简单地使用 Python 的标准“random.Random”而不是 NumPys 的“numpy.random.RandomState”

例子:

from random import Random 
@autojit
class SillyClass3(object):
def __init__(self, seed):
self.RNG = Random(seed)
def draw_uniform(self):
return self.RNG.uniform(0,1)

test3 = SillyClass3(123456)

test3.draw_uniform()

# Output:
# 0.8056271362589

这适用于我的即时应用程序(尽管其他问题立即出现,万岁)。

但是,此修复不适用于我知道我需要使用 numpy.random.RandomState 的 future 算法。所以我的问题仍然存在——是否有人对原始错误有任何见解,和/或在 Numba 中使用 numy.random.RandomState 的解决方法?

最佳答案

迟到的答案,但问题是 Numba does not support Numpy 的 RandomState 对象(截至 2019 年 7 月)。它也不支持使用 Python standard library 设置随机状态.

但是,鉴于 Numba 支持 np.random.seed,您可以通过将 seed 参数传递到函数中来在 jitted 函数中使用 numpy 的 PRNG,并且然后调用其中的 np.random.seed(seed) 方法。来自Numba documentation :

Numba supports top-level functions from the numpy.random module, butdoes not allow you to create individual RandomState instances. Thesame algorithms are used as for the standard random module (andtherefore the same notes apply), but with an independent internalstate: seeding or drawing numbers from one generator won’t affect theother.

代码示例

import random, numba, numpy

@numba.njit
def random_func(seed: int = 1234) -> str:
seeded_prng = numpy.random.seed(seed)
# Do random stuff
random_computation = numpy.random.uniform(0, 1)
return random_computation

# Example Invocation
seed = 1337
random_result = random_func(seed)
print(random_result)

应该产生:

0.2620246750155817

如果您想为每个类实例设置不同的随机状态,则需要为每个类设置一个单独的线程,因为 PRNG 与它们在其中实例化的线程相关联。幸运的是,Numba 会自动处理这个问题假设每个类都出现在它自己的线程中:

Since version 0.28.0, the generator is thread-safe and fork-safe. Eachthread and each process will produce independent streams of randomnumbers.

最后,如果您的目标是 CUDA,则有许多方法可以让您直接使用支持 GPU 的 PRNG,这可能很方便。从 Numba documentation 查看此页面.

关于python - 尝试实例化 NumPy RandomState 时出现 Numba 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21371704/

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