многопроцессорность лучей внутри класса (TypeError: параметр не имеет значения по умолчанию)

Я пытаюсь использовать многопроцессорный пакет 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()

И полученная ошибка:

TypeError: параметр 'psf' не имеет значения по умолчанию


Я нашел похожий пост, но я не уверен, так ли похожи эти две проблемы из-за разной обработки выполнения ray и моей наивности в использовании этого пакета.

Спасибо заранее!


person user8188120    schedule 10.01.2020    source источник


Ответы (1)


Эта проблема была решена перемещением функции класса:

@ray.remote
    def func(self, cube, psf):
        cube = convolve(cube, psf)
        return cube

... внутри функции класса self.calculation и удаление self


Обновление: причину, по которой это не удается, можно увидеть в этом сообщении

person user8188120    schedule 16.01.2020