我正在尝试使用python多进程程序包ray,从一个类内部并行化卷积过程。
这意味着我正在使用@ray.remote
装饰器将函数设置为类函数。
但是,执行此操作时,我会遇到与参数默认值有关的错误。
我不熟悉ray和装饰器,所以我想知道是否有人对我要去哪里提出建议,因为我不认为这像为类函数提供可选的默认参数(如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()
以及由此产生的错误:
TypeError:'psf'参数缺少默认值
我发现了类似的帖子,但是由于对ray
的执行方式不同,以及我对使用此程序包的幼稚态度,我不确定两个问题是否相同。
非常感谢!
此问题通过移动类函数解决:
@ray.remote
def func(self, cube, psf):
cube = convolve(cube, psf)
return cube
...在类函数self.calculation
内,并删除self
更新:失败的原因可以在this post中看到