在 Google 云平台上部署通过 Numba 编译的 Python 函数:必须维护状态

问题描述 投票:0回答:1

我正在使用 Nixtla 的 StatsForecast 库运行多个产品的时间序列预测。这是一座辉煌的图书馆。其最吸引人的特点是其 autoARIMA 脚本的速度和可靠性。根据文档,它的速度归功于使用 Numba 编译 Python 函数的底层函数。

它在我的本地计算机上以承诺的速度运行预测。但是,我在第二代 Google Cloud 函数中部署了相同的脚本,很明显,每次调用 autoARIMA 时都会对其进行编译。

据我所知,这是因为 Google Cloud Functions 的无服务器特性不允许函数维护状态。因此,它永远不会保持编译状态。

我需要最简单的方法将脚本部署到Google Cloud平台,以便autoARIMA函数可以编译。换句话说,我需要最简单的方法来维护函数的状态。我的建议是使用 Compute Engine 中的预定虚拟机 (VM)。我相信它应该保持状态并允许该函数仅编译一个。

请验证这种方法是否可行,分享类似的经验并提出比当前提案更好的解决方案。

编辑:

虚拟机方法肯定会起作用。但是,我正在考虑不同的方法。似乎可以按照

here的说明缓存已编译的函数。因此,对于云功能,我也许可以使用外部缓存服务,例如 Redis 或 Memcached。向此类缓存客户端调用 API 的开销可能会导致运行时间无法改善。另一种方法可能是序列化已编译的函数并从云存储导入它。

python google-cloud-platform virtual-machine google-compute-engine numba
1个回答
0
投票
我正在发布我自己问题的答案,因为我找到了一个快速但有些粗糙的解决方案来解决我的问题。也许有人可以从我的解决方案中获得价值。

因此 Nixtla StatsForecast 提供了多种执行预测的方法。人们可以通过单个函数调用预测一个时间序列,通过单个调用预测多个时间序列,甚至可以使用其与 Dask、Ray 和 Spark 的集成来实现进一步的并发优化。我对前两个感兴趣。

每次第一次调用 Nixtla 预测对象时,它都会使用 Numba 编译其 Python 组件,并将编译后的函数缓存在

__pycache__

 目录中。云函数不提供这样做的选项。

没有什么可以阻止人们在编译后重复使用同一个预测对象。如果人们只是对训练模型并推出预测和残差感兴趣,那么这种方法就很有效。我确信预测对象维护其自身内部状态可能会带来限制。目前,我还没有遇到这样的限制,因为

fit

 方法会重置我的应用程序所需的一切。我认为使用保角预测区间可能会出现问题。

因此,对于前两种方法,只需运行一次预测对象即可进行编译,然后它就会以令人印象深刻的 Numba 速度运行。应注意在只有一个时间序列的小数据集上进行编译,否则编译时间太长。

© www.soinside.com 2019 - 2024. All rights reserved.