Cannot read pickle file in Cloud Run App. TypeError: __cinit__() takes at least 2 positional arguments
Cannot read pickle file in Cloud Run App. TypeError: __cinit__() takes at least 2 positional arguments
我有一个部署到 GCP Cloud 运行 的快速 API 应用程序。直到昨天它一直运行良好,我真的不知道出了什么问题。当我读入 .pkl
文件
时,问题似乎从这一行开始
model = pickle.load(open(os.path.join('models', 'appartementen.pkl'), 'rb'))
回溯:
File "pandas/_libs/internals.pyx", line 572, in pandas._libs.internals.BlockManager.__cinit__: TypeError: __cinit__() takes at least 2 positional arguments (0 given) at <module> (/app/src/api/util.py:25)
at <module> (/app/src/api/main.py:8) at
_call_with_frames_removed (<frozen importlib._bootstrap>:219) at exec_module (<frozen importlib._bootstrap_external>:728)
at _load_unlocked (<frozen importlib._bootstrap>:677)
at _find_and_load_unlocked (<frozen importlib._bootstrap>:967)
at _find_and_load (<frozen importlib._bootstrap>:983)
at _gcd_import (<frozen importlib._bootstrap>:1006)
at import_module (/usr/local/lib/python3.7/importlib/__init__.py:127)
at import_app (/usr/local/lib/python3.7/site-packages/gunicorn/util.py:358) at load_wsgiapp (/usr/local/lib/python3.7/site-packages/gunicorn/app/wsgiapp.py:39)
at load (/usr/local/lib/python3.7/site-packages/gunicorn/app/wsgiapp.py:49)
at wsgi (/usr/local/lib/python3.7/site-packages/gunicorn/app/base.py:67)
at load_wsgi (/usr/local/lib/python3.7/site-packages/gunicorn/workers/base.py:144)
at init_process (/usr/local/lib/python3.7/site-packages/gunicorn/workers/base.py:119)
at spawn_worker (/usr/local/lib/python3.7/site-packages/gunicorn/arbiter.py:583)
请注意,当我在本地部署此应用程序时,一切正常。
我的 Dockerfile:
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.7
WORKDIR /app
COPY . ./
COPY src ./src/
COPY models ./models/
RUN pip install -r requirements.txt
COPY setup.py ./
CMD exec gunicorn src.api.main:app
我如何部署到云端 运行:
gcloud builds submit --tag gcr.io/project-id/api --timeout=3600
gcloud run deploy api --image gcr.io/project-id/api --platform managed --project=project-id --region=europe-west4
requirements.txt
:
fastapi==0.63.0
google-cloud-bigquery[bqstorage,pandas]==1.24.0
sentry_sdk==1.0.0
xgboost==1.3.3
scikit-learn==0.23.1
shap==0.39.0
matplotlib==3.4.1
我尝试根据 this suggestion 使用相同版本的 scikit-learn
,但问题仍然存在。
我今天在构建新容器时 运行 遇到了同样的问题。目前不确定 确切的 原因(可能是 pickled 对象的 pandas
版本与容器的 pandas
版本不兼容),但恢复 pandas
版本对我有用。 pickle 是用 1.2.5
构建的,容器是 1.3.0
安装的。所以:
pip uninstall pandas
pip install pandas==1.2.5
这是 bug with pandas 1.3.0, and is fixed with pandas 1.3.1。
作为解决方法,将 pickle.load
替换为 pandas.read_pickle
。
我有一个部署到 GCP Cloud 运行 的快速 API 应用程序。直到昨天它一直运行良好,我真的不知道出了什么问题。当我读入 .pkl
文件
model = pickle.load(open(os.path.join('models', 'appartementen.pkl'), 'rb'))
回溯:
File "pandas/_libs/internals.pyx", line 572, in pandas._libs.internals.BlockManager.__cinit__: TypeError: __cinit__() takes at least 2 positional arguments (0 given) at <module> (/app/src/api/util.py:25)
at <module> (/app/src/api/main.py:8) at
_call_with_frames_removed (<frozen importlib._bootstrap>:219) at exec_module (<frozen importlib._bootstrap_external>:728)
at _load_unlocked (<frozen importlib._bootstrap>:677)
at _find_and_load_unlocked (<frozen importlib._bootstrap>:967)
at _find_and_load (<frozen importlib._bootstrap>:983)
at _gcd_import (<frozen importlib._bootstrap>:1006)
at import_module (/usr/local/lib/python3.7/importlib/__init__.py:127)
at import_app (/usr/local/lib/python3.7/site-packages/gunicorn/util.py:358) at load_wsgiapp (/usr/local/lib/python3.7/site-packages/gunicorn/app/wsgiapp.py:39)
at load (/usr/local/lib/python3.7/site-packages/gunicorn/app/wsgiapp.py:49)
at wsgi (/usr/local/lib/python3.7/site-packages/gunicorn/app/base.py:67)
at load_wsgi (/usr/local/lib/python3.7/site-packages/gunicorn/workers/base.py:144)
at init_process (/usr/local/lib/python3.7/site-packages/gunicorn/workers/base.py:119)
at spawn_worker (/usr/local/lib/python3.7/site-packages/gunicorn/arbiter.py:583)
请注意,当我在本地部署此应用程序时,一切正常。
我的 Dockerfile:
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.7
WORKDIR /app
COPY . ./
COPY src ./src/
COPY models ./models/
RUN pip install -r requirements.txt
COPY setup.py ./
CMD exec gunicorn src.api.main:app
我如何部署到云端 运行:
gcloud builds submit --tag gcr.io/project-id/api --timeout=3600
gcloud run deploy api --image gcr.io/project-id/api --platform managed --project=project-id --region=europe-west4
requirements.txt
:
fastapi==0.63.0
google-cloud-bigquery[bqstorage,pandas]==1.24.0
sentry_sdk==1.0.0
xgboost==1.3.3
scikit-learn==0.23.1
shap==0.39.0
matplotlib==3.4.1
我尝试根据 this suggestion 使用相同版本的 scikit-learn
,但问题仍然存在。
我今天在构建新容器时 运行 遇到了同样的问题。目前不确定 确切的 原因(可能是 pickled 对象的 pandas
版本与容器的 pandas
版本不兼容),但恢复 pandas
版本对我有用。 pickle 是用 1.2.5
构建的,容器是 1.3.0
安装的。所以:
pip uninstall pandas
pip install pandas==1.2.5
这是 bug with pandas 1.3.0, and is fixed with pandas 1.3.1。
作为解决方法,将 pickle.load
替换为 pandas.read_pickle
。