在尝试缓存结果时出现了Joblib用户警告

64

使用joblib缓存结果时,我遇到以下UserWarning

import numpy
from tempfile import mkdtemp
cachedir = mkdtemp()
from joblib import Memory
memory = Memory(cachedir=cachedir, verbose=0)

@memory.cache
def get_nc_var3d(path_nc, var, year):
    """
    Get value from netcdf for variable var for year
    :param path_nc:
    :param var:
    :param year:
    :return:
    """
    try:
        hndl_nc = open_or_die(path_nc)
        val = hndl_nc.variables[var][int(year), :, :]
    except:
        val = numpy.nan
        logger.info('Error in getting var ' + var + ' for year ' + str(year) + ' from netcdf ')
    
    hndl_nc.close()
    return val

当我使用参数调用此函数时,我收到以下警告:

UserWarning: Persisting input arguments took 0.58s to run.
If this happens often in your code, it can cause performance problems 
(results will be correct in all cases). 
The reason for this is probably some large input arguments for a wrapped function (e.g. large strings).
THIS IS A JOBLIB ISSUE. If you can, kindly provide the joblib's team with an example so that they can fix the problem.

输入参数:C:/Users/rit/Documents/PhD/Projects/\GLA/Input/LUWH/\LUWLAN_v1.0h\transit_model.nc range_to_large 1150

我该如何消除警告?为什么会出现这种情况?毕竟输入参数并不是太长吧?


1
@jadelord 我的理解是,lru_cache 适用于小输入/输出,但 joblib.Memory 更适合大输入/输出。 - Michael
3
你给出的输入是字符串,还是更复杂的对象?如果只是字符串或其他简单类型,joblib就不会出现警告信息。 - K. P.
1
FYI:相关的GitHub问题:https://github.com/joblib/joblib/issues?q=%22Persisting+input+arguments+took%22 - wovano
4
open_or_die 是一个未定义的函数,logger 也未被定义。 - D.L
2
你能分享一下你用来调用这个函数的确切代码吗?这将有助于其他人复制结果。 - Yaakov Bressler
显示剩余9条评论
5个回答

1

UserWarning: 持久化输入参数运行时间为0.58秒。 如果您的代码经常出现这种情况,可能会导致性能问题(结果在所有情况下都是正确的)。 原因可能是一些被包装函数的大型输入参数(例如大字符串)。 这是一个JOBLIB问题。如果可以,请提供给joblib团队一个示例,以便他们可以解决这个问题。

就我个人而言,警告本身已经很清楚了。这可能是您代码中的问题,您可以尝试减少输入大小,或者您可以与joblib团队分享您的报告,以便他们可以帮助改进joblib或建议更好的使用方法以避免此类性能警告。


1

您收到的警告信息表明将输入参数持久化(缓存)到函数get_nc_var3d中需要相对较长的时间才能完成。警告信息表明,这很可能是由于传递给函数的大型输入参数(例如大字符串)导致的。

消除警告的一种方法是尽可能向函数传递较小的输入参数。或者,您可以增加缓存的大小以减少需要持久化输入参数的次数。您可以通过将Memory对象的max_size参数设置为较大的值来实现此目的。例如:

memory = Memory(cachedir=cachedir, verbose=0, max_size=1024*1024*100)

这将缓存的最大大小设置为100MB。

警告信息也可能是由于joblib本身存在问题引起的。在这种情况下,您可能需要向joblib团队提供更多信息,以帮助他们诊断和解决问题。您可以通过在joblib GitHub存储库上提交问题并提供一个最小的示例来重现警告。


1

我对于“为什么这个不起作用?”部分的问题没有答案。然而,要忽略警告,您可以使用warnings.catch_warningswarnings.simplefilter,如此处所示。

import warnings

with warnings.catch_warnings():
  warnings.simplefilter("ignore")
  your_code()

显然,我不建议忽略警告,除非你确定它是无害的,但如果你要这样做,这种方式只会抑制上下文管理器内部的警告,并且直接来自Python文档。


0
警告发生是因为joblib试图将输入参数持续存储到磁盘以进行缓存,但此操作需要太长时间。问题的原因可能是由于一些大型输入参数(例如长字符串)导致序列化需要较长时间。
要解决此问题,您可以禁用cache方法的persist参数,这将导致无缓存,或者在调用cache方法之前尝试对输入参数进行预处理以减少其大小。
@memory.cache(persist=False)

0

为了消除警告:

memory = Memory(cachedir=cachedir, verbose=0, ignore=["verbose"])

1
joblib.Memory 对象上没有 ignore 参数。 - Stanislav Modrák

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接