作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用光线任务方法而不是光线角色方法来并行化类中的方法。原因是后者似乎需要更改类的实例化方式(如图所示 here )。下面是一个玩具代码示例,以及错误
import numpy as np
import ray
class MyClass(object):
def __init__(self):
ray.init(num_cpus=4)
@ray.remote
def func(self, x, y):
return x * y
def my_func(self):
a = [1, 2, 3]
b = np.random.normal(0, 1, 10000)
result = []
# we wish to parallelise over the array `a`
for sub_array in np.array_split(a, 3):
result.append(self.func.remote(sub_array, b))
return result
mc = MyClass()
mc.my_func()
>>> TypeError: missing a required argument: 'y'
出现错误是因为 ray 似乎不“知道”该类,因此它需要一个参数
self
.
@ray.remote
def func(x, y):
return x * y
def my_func():
a = [1, 2, 3, 4]
b = np.random.normal(0, 1, 10000)
result = []
# we wish to parallelise over the list `a`
# split `a` and send each chunk to a different processor
for sub_array in np.array_split(a, 4):
result.append(func.remote(sub_array, b))
return result
res = my_func()
ray.get(res)
>>> [array([-0.41929678, -0.83227786, -2.69814232, ..., -0.67379119,
-0.79057845, -0.06862196]),
array([-0.83859356, -1.66455572, -5.39628463, ..., -1.34758239,
-1.5811569 , -0.13724391]),
array([-1.25789034, -2.49683358, -8.09442695, ..., -2.02137358,
-2.37173535, -0.20586587]),
array([ -1.67718712, -3.32911144, -10.79256927, ..., -2.69516478,
-3.1623138 , -0.27448782])]```
正如预期的那样,我们看到输出是一个包含 4 个数组的列表。我怎样才能得到
MyClass
使用射线处理并行性?
最佳答案
一些提示:
ray.remote
python中函数或类的装饰器(未绑定(bind)方法)。ray.init
在函数的构造函数内部,因为 ray.init
是 不是 幂等(这意味着如果您实例化 MyClass
的多个实例,您的程序将失败)。相反,您应该确保 ray.init
只在你的程序中运行一次。func
在类之外,所以它变成了一个函数而不是一个绑定(bind)方法。请注意,在这种方法中
MyClass
将被序列化,这意味着更改
func
使到
MyClass
不会反射(reflect)在函数之外的任何地方。在您的简化示例中,这似乎不是问题。这种方法可以最容易地实现最多的并行性。
@ray.remote
def func(obj, x, y):
return x * y
class MyClass(object):
def my_func(self):
...
# we wish to parallelise over the array `a`
for sub_array in np.array_split(a, 3):
result.append(func.remote(self, sub_array, b))
return result
您可以考虑的另一种方法是使用
async actors .在这种方法中,射线actor 将通过asyncio 处理并发,但是这个
comes with the limitations of asyncio .
@ray.remote(num_cpus=4)
class MyClass(object):
async def func(self, x, y):
return x * y
def my_func(self):
a = [1, 2, 3]
b = np.random.normal(0, 1, 10000)
result = []
# we wish to parallelise over the array `a`
for sub_array in np.array_split(a, 3):
result.append(self.func.remote(sub_array, b))
return result
关于python-3.x - 如何在python的类中使用光线并行性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64321153/
我是一名优秀的程序员,十分优秀!