分段错误:将 TensorFlow 脚本从 Python 3 反向移植到 Python 2 后出现 11

Segmentation fault: 11 after back-porting TensorFlow script from Python 3 to Python 2

在为 Python 3 创建 TensorFlow 1.4 模型后,我发现 Google Cloud ML Engine 目前仅支持 Python 2.7。

向后移植我的 Python 3 代码起初看起来很简单:当我用 #!/usr/bin/env python 替换它们的 shebang #!/usr/bin/env python3 时,一些脚本仍然按预期工作。 python -V 在我的 (macOS) 环境中报告 2.7.10

然而,有一个脚本并没有如此优雅地做出反应。当我现在 运行 它时,它会产生一个 Segmentation fault: 11,没有任何先前的警告或其他诊断输出。

我怎样才能找出根本原因,以便我知道还需要更改哪些内容才能使该脚本也适合 Python 2?

UPDATE 分段错误显然是在调用 session.run(get_next) 期间发生的,其中 get_next 是从 tf.data.Iterator 中获取的,如下所示:

iterator = dataset.make_initializable_iterator()
get_next = iterator.get_next()

这里有两个问题:一个是关于Python 3 支持,另一个是关于段错误。

Python 3 支持 CloudML Engine 现在支持 Python 3,在提交作业时通过 'pythonVersion' 字段(参见 API reference docs)。

如果您使用的是 gcloud,您将需要像这样创建一个配置文件(我们将其命名为 config.yaml):

trainingInput:
  pythonVersion: "3.5"

提交作业时,将 gcloud 指向该文件,例如

gcloud ml-engine jobs submit training --config=config.yaml ...

段错误 这可能是 运行 内存不足造成的。请在控制台中检查该作业的内存使用情况。也就是说,如果作业突然终止,则可能无法准确反映该作业在失败时的内存使用情况。