我希望在Python 3.7环境中的云函数上使用Fbprophet,但它未能构建,并给我带来以下错误。
Build failed: `pip_download_wheels` had stderr output:
ERROR: Command errored out with exit status 1:
command: /opt/python3.7/bin/python3.7 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-wheel-srnqu7b5/fbprophet/setup.py'"'"'; __file__='"'"'/tmp/pip-wheel-srnqu7b5/fbprophet/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'rn'"'"', '"'"'n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /tmp/pip-wheel-3_5khs54
cwd: /tmp/pip-wheel-srnqu7b5/fbprophet/
Complete output (40 lines):
running bdist_wheel
running build
running build_py
creating build
creating build/lib
creating build/lib/fbprophet
creating build/lib/fbprophet/stan_model
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/tmp/pip-wheel-srnqu7b5/fbprophet/setup.py", line 148, in <module>
"""
File "/opt/python3.7/lib/python3.7/site-packages/setuptools/__init__.py", line 140, in setup
return distutils.core.setup(**attrs)
File "/opt/python3.7/lib/python3.7/distutils/core.py", line 148, in setup
dist.run_commands()
File "/opt/python3.7/lib/python3.7/distutils/dist.py", line 966, in run_commands
self.run_command(cmd)
File "/opt/python3.7/lib/python3.7/distutils/dist.py", line 985, in run_command
cmd_obj.run()
File "/opt/python3.7/lib/python3.7/site-packages/wheel/bdist_wheel.py", line 202, in run
self.run_command('build')
File "/opt/python3.7/lib/python3.7/distutils/cmd.py", line 313, in run_command
self.distribution.run_command(command)
File "/opt/python3.7/lib/python3.7/distutils/dist.py", line 985, in run_command
cmd_obj.run()
File "/opt/python3.7/lib/python3.7/distutils/command/build.py", line 135, in run
self.run_command(cmd_name)
File "/opt/python3.7/lib/python3.7/distutils/cmd.py", line 313, in run_command
self.distribution.run_command(command)
File "/opt/python3.7/lib/python3.7/distutils/dist.py", line 985, in run_command
cmd_obj.run()
File "/tmp/pip-wheel-srnqu7b5/fbprophet/setup.py", line 48, in run
build_models(target_dir)
File "/tmp/pip-wheel-srnqu7b5/fbprophet/setup.py", line 36, in build_models
from fbprophet.models import StanBackendEnum
File "/tmp/pip-wheel-srnqu7b5/fbprophet/fbprophet/__init__.py", line 8, in <module>
from fbprophet.forecaster import Prophet
File "/tmp/pip-wheel-srnqu7b5/fbprophet/fbprophet/forecaster.py", line 14, in <module>
import numpy as np
ModuleNotFoundError: No module named 'numpy'
----------------------------------------
ERROR: Failed building wheel for fbprophet
ERROR: Failed to build one or more wheels
error: `pip_download_wheels` returned code: 1; Error ID: 618AA8E7
这就是我的requirements.txt
文件的样子:
cython
pystan
numpy
pandas==1.0.3
google-cloud-storage==1.29.0
fbprophet
geopy==1.22.0
google-cloud-bigquery==1.25.0
在jupyter笔记本电脑上的Python 3.7虚拟环境中,一切都可以在本地完美工作。非常感谢任何帮助,因为我花了几乎一整天的时间试图解决这个问题,但没有成功。
我遇到了类似的问题。我的目标是部署一个函数,当传递一些输入时,该函数将把这些输入输入到Prophet模型中,以便在将预测传递到我的系统的另一部分之前进行预测。
据我所知,有一些事情使这件事变得复杂。
首先,@mgoya在上面的评论中提到了构建依赖关系的问题。这在安装Prophet和安装Pystan(Prophet的依赖项(时都会体现出来。在我的cloudbuild.yaml
中,我试图通过按顺序安装依赖项来避免这种情况,如下所示:
steps:
- name: 'docker.io/library/python:3.9'
entrypoint: /bin/sh
# Run pip install and pytest in the same build step
# (pip packages won't be preserved in future steps!)
args: [-c, 'pip uninstall pystan; pip install convertdate==2.1.2 lunarcalendar==0.0.9 holidays==0.10.3 pgen tqdm cython pandas numpy setuptools; pip install pystan==2.19.1.1; pip install -r requirements.txt']
timeout: 1200s
这首先卸载Pystan(如果本地存在(,然后安装Pystan的构建依赖项(Prophet的构建依赖性(,再安装Prophet(包含在我的requirements.txt
中(。
注意分号。我在使用双安培数时遇到了问题(即pip install ... && pip install ... etc.
.i认为这可能是由于安装的程序包进入本地文件系统并可用于以下命令的方式。通过使用&&
运行它们,这似乎是尝试同时运行所有程序包,这不会给安装的早期部分传播时间,也不会让后续步骤发现。使用分号似乎有助于是的,但这充其量只是传闻证据。
您也可以尝试使用python -m pip install ...
而不是pip install
,尽管我对Python不够熟悉,无法直接告诉您其中的区别。
其次,安装Pystan需要内存。我在某个地方读到Pystan需要4GB的内存才能安装。cloudbuild的默认machine_type
没有那么多。你可以试着通过改变机器的类型来增加机器的尺寸。
最后,还有分配给函数执行的资源。再次,我在某个地方读到Prophet/Pystan需要2GB的内存才能运行其中一个模型。因此,如果您的云函数没有这个功能,它在尝试执行时可能会遇到内存问题。根据我目前的经验,内存问题在谷歌云中并不是透明的。
--
考虑到依赖关系的重要性,我目前的想法(也许我会向阅读这篇文章的其他人推荐(是考虑云函数是否是实现这一目标的正确工具。考虑到Pystan和Prophet的构建和运行时资源需求,它们是非常特殊的依赖关系。
我选择做的是(在本地(构建一个包含这些依赖项的容器,并将其推送到谷歌的容器注册表中。我的计划是将该容器用作Cloud Run应用程序的基本映像,这样部署起来就容易多了。这有明显的缺点,但如果我的基本图像很少改变(它会改变(,我认为这种方法会很好。不幸的是,这种模型("自带容器"(不受云函数的支持——它是在你只带代码的情况下设计的。