Определите, сколько раз в сумерках что-то вычислили - PullRequest
0 голосов
/ 13 ноября 2018

Вопрос

Мне интересно, возможно ли с помощью dask (в частности, dask-массивов) узнать, вычислено ли и когда что-то. Я думаю о модульных тестах, желающих узнать, сколько раз dask вычислял массив. Похоже на ложные объекты, зная, сколько раз они были вызваны. Что-то подобное уже существует? Если нет, то есть ли лучший способ, чем сделать пользовательский обратный вызов ? Если этого не существует, это то, что разработчики ядра dask хотели бы добавить в базовый dask для тестирования?

Любая помощь очень ценится.

Подробнее

Скажем, у меня есть функция, которая принимает xarray DataArray, делает с ним что-то и возвращает его. В некоторых случаях dask-массивы неявно преобразуются в numy-массивы, включая нового пользователя dask, который не знает лучшего способа что-либо сделать, дружественного к dask. Я хотел бы написать свои модульные тесты, чтобы убедиться, что я или другой участник случайно не повредят производительности функции. Это особенно важно, учитывая, что тестовые данные часто представляют собой упрощенную / небольшую версию реальных случаев, и прирост производительности при вычислении массива dask несколько раз может не наблюдаться в этих случаях.

Редактировать: Решение

Вот что я в итоге сделал как простое решение, основанное на ответе MRocklin.

class CustomScheduler(object):
    def __init__(self, max_computes=1):
        self.max_computes = max_computes
        self.total_computes = 0

    def __call__(self, dsk, keys, **kwargs):
        self.total_computes += 1
        if self.total_computes > self.max_computes:
            raise RuntimeError("Too many dask computations were scheduled: {}".format(self.total_computes))
        return dask.get(dsk, keys, **kwargs)

Затем я использую это так:

with dask.config.set(scheduler=CustomScheduler(0)):
    # dask array stuff

1 Ответ

0 голосов
/ 17 ноября 2018

Существует множество способов запуска при исполнении.

Можно указать пользовательский планировщик:

def my_scheduler(dsk, keys, **kwargs):
    print('computing!')
    return dask.get(dsk, keys, **kwargs)

with dask.config.set(scheduler=my_scheduler):
    ...

Настраиваемые обратные вызовы , как и то, что вы предлагаете, также довольно легко реализовать.

Если вы используете исключительно массив dask, вы можете взглянуть на плагины массива

Существует множество других подходов, используемых в наборе тестов.

...