Пример отложенной функции кеширования dask - PullRequest
2 голосов
/ 07 мая 2020

Простой пример кеширования dask. Кеш не работает должным образом. Предположим, у нас есть список данных и ряд отложенных функций, ожидаемых от функции, которая встречает тот же ввод, чтобы кэшировать / запоминать результаты в соответствии с оценкой кеширования.
Этот пример демонстрирует, что это не так.

import time
import dask
from dask.cache import Cache
from dask.diagnostics import visualize
from dask.diagnostics import Profiler, ResourceProfiler, CacheProfiler    

def slow_func(x):
    time.sleep(5)
    return x+1

output = []
data = np.ones((100))
for x in data:
    a = dask.delayed(slow_func)(x)
    output.append(a)
total = dask.delayed(sum)(output)

cache = Cache(2e9)
cache.register() 

with Profiler() as prof, ResourceProfiler(dt=0.25) as rprof,CacheProfiler() as cprof:
    total.compute()

visualize([prof, rprof, cprof])  

cache cprof plot

После первоначального параллельного выполнения функции ожидается следующая итерация после вызова функции с тем же значением для использования версии кеша . Но, очевидно, нет, dask_key_name предназначен для обозначения одного и того же вывода, но я хочу оценить эту функцию для различных входов и, если вижу тот же вход, используйте кешированную версию. Мы можем сказать, происходит ли это очень легко с этой функцией из-за 5-секундной задержки, и должны увидеть, что она выполняется примерно через 5 секунд, как только первое значение будет кэшировано после выполнения. В этом примере каждая функция выполняется с задержкой на 5 секунд. Я могу создать мемоизированную версию напрямую с помощью библиотеки cachey, но это должно работать с библиотекой dask.cache.

1 Ответ

0 голосов
/ 23 мая 2020

В dask.delayed вам может потребоваться указать ключевое слово pure=True.

Вы можете убедиться, что это сработало, потому что все ваши отложенные значения dask будут иметь один и тот же ключ.

Вы не нужно использовать Cache для этого, если все они находятся в одном вызове dask.compute.

...