gcloud ml-engine local predict RuntimeError: Bad magic number in .pyc file

gcloud ml-engine local predict RuntimeError: Bad magic number in .pyc file

我的 objective 是在 google 云 ml 引擎上进行预测。

我在 Google instructions 之后的 linux ubuntu 16.04LT 上安装了 gcloud sdk。 我已经有一个经过机器学习训练的模型。 我使用 python 版本的 anaconda python 3.5。

我运行:

gcloud ml-engine local predict --model-dir={MY_MODEL_DIR} --json-instances={MY_INPUT_JSON_INSTANCE}

我收到消息:错误:

(gcloud.ml-engine.local.predict) RuntimeError: Bad magic number in .pyc file

下面是所有堆栈跟踪:

DEBUG: (gcloud.ml-engine.local.predict) RuntimeError: Bad magic number in .pyc file
Traceback (most recent call last):
  File "/usr/lib/google-cloud-sdk/lib/googlecloudsdk/calliope/cli.py", line 797, in Execute
    resources = calliope_command.Run(cli=self, args=args)
  File "/usr/lib/google-cloud-sdk/lib/googlecloudsdk/calliope/backend.py", line 757, in Run
    resources = command_instance.Run(args)
  File "/usr/lib/google-cloud-sdk/lib/surface/ml_engine/local/predict.py", line 65, in Run
    args.text_instances)
  File "/usr/lib/google-cloud-sdk/lib/googlecloudsdk/command_lib/ml_engine/local_utils.py", line 89, in RunPredict
    raise LocalPredictRuntimeError(err)
LocalPredictRuntimeError: RuntimeError: Bad magic number in .pyc file
ERROR: (gcloud.ml-engine.local.predict) RuntimeError: Bad magic number in .pyc file
Evaluation ended**

事实上我自己 post 这个问题是为了帮助有同样问题的人,因为我找不到一个简单简洁的答案。

还有其他解决方案,在我看来甚至比我的更好,但这就是为我解决的问题。

我的解决方案是 google cloud sdk 不适用于 python 3,至少在我的配置中是这样。求解:

  1. 安装 anaconda 虚拟环境 python 2(在我的例子中是 2.7.14)
  2. 激活环境
  3. 再次执行gcloud命令

如果您的导出 ml 模型和输入都正常,那将有效。

简单的问题,却给我造成了很大的痛苦,只是因为我无法轻易找到这个 pre-requirement 或者我只是错过了它。

希望对大家有帮助。

实际上它适用于python3,你只需要删除google个云文件夹中的pyc文件,这样预测调用就可以用python3编译它们。

为了知道 pyc 文件的位置,我确实在预测调用中启用了标志 --verbosity debug

gcloud ml-engine local predict --model-dir=${MODEL_LOCATION} --json-instances=data/new-data2.json --verbosity debug

trackback 将为您提供有关 gcloud ml 引擎文件路径的信息,在我的机器中是:

/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/lib/googlecloudsdk/command_lib/ml_engine/

转到该目录并删除 pyc 文件。

查找并删除google SDK中的所有pyc文件。它们是在错误的 python 环境下编译的。它们将在下次需要时自动重新编译。

%%bash
find "/tools/google-cloud-sdk/lib/" -name '*.pyc' -delete

以下是 Ubuntu 中解决此问题的步骤:

1.Navigate 到 ml_engine 路径

cd /usr/lib/google-cloud-sdk/lib/googlecloudsdk/command_lib/ml_engine

2.Remove 个以 .pyc 结尾的文件

sudo rm -rf *.pyc

在笔记本中 运行 以下单元格:

%%bash
sudo find "/usr/lib/google-cloud-sdk/lib/googlecloudsdk/command_lib/ml_engine" -name '*.pyc' -delete

上述技巧有效,但我发现了另一个似乎是永久性的选项,即使用 GCP SDK 和 python 3.

例如使用 anaconda 创建一个 python 3 env 或使用现有的 python 3 安装。

创建文件 gcp-sdk.yaml:

name: env_gcp_sdk
channels:
- defaults
- conda-forge
dependencies:
  # core packages
  - python=3.7.5
  - pip=20.0.2
  - pip:
    - google-cloud-storage
    - google-cloud-bigquery
    - google-cloud-kms
    - google-cloud-pubsub

然后创建环境:

conda env create -f gcp-sdk.yaml 

现在设置以下偶数变量,在我的例子中,我不再需要删除 *.pyc 文件:

os.environ['CLOUDSDK_PYTHON']='path_to_env/env_gcp_sdk/bin/python'
os.environ['CLOUDSDK_GSUTIL_PYTHON']='path_to_env/env_gcp_sdk/bin/python'