我正在尝试使用python多进程包ray,从类中并行化卷积过程。
这意味着我正在使用@ray.remote
装饰器将函数设置为类函数。
但是,当我这样做时,我收到与参数默认值有关的错误。
我是使用射线和装饰器的新手,所以我想知道是否有人对我出错的地方有一些建议,因为我认为这不像为类函数提供可选的默认参数那么简单,例如None
例如。
下面是代码的简化版本:
import numpy as np
import psutil
import ray
from astropy.convolution import convolve
class test_class:
def __init__(self,cube):
self.cube = cube
@ray.remote
def func(self, cube, psf):
cube = convolve(cube, psf)
return cube
def calculation(self):
num_cpus = psutil.cpu_count(logical=False)
ray.shutdown()
ray.init(num_cpus=num_cpus)
filters = np.array([[0,.5,0],[.5,.7,.5],[0,.5,0]])
results = []
for i in range(self.cube.shape[2]):
results.append(self.func.remote(self.cube[:,:,i],filters))
results = np.array(ray.get(results)).T
ray.shutdown()
return results
运行代码...
cube = np.random.uniform(0,1,(100,100,10))
new_cube = test_class(cube).calculation()
以及由此产生的错误:
类型错误:"psf"参数缺少默认值
我发现了一个类似的帖子,但我不确定这两个问题是否相似,因为处理ray
的执行方式不同,而且我对使用这个包很天真。
提前非常感谢!
这个问题是通过移动类函数来解决的:
@ray.remote
def func(self, cube, psf):
cube = convolve(cube, psf)
return cube
。在类函数self.calculation
和删除self
更新:在这篇文章中可以看到失败的原因