【发布时间】:2018-01-17 00:20:38
【问题描述】:
我正在使用带有 TensorFlow 后端的 Keras 在 Google Cloud 机器学习引擎上训练 LSTM 网络。在对 gcloud 和我的 python 脚本进行一些调整后,我管理它来部署我的模型并执行成功的训练任务。
然后我尝试使用 Keras modelCheckpoint callback 让我的模型在每个 epoch 后保存检查点。使用 Google Cloud 运行本地培训作业可以按预期完美运行。在每个 epoch 之后,权重都存储在指定的路径中。但是,当我尝试在 Google Cloud Machine Learning Engine 上在线运行相同的作业时,weights.hdf5 不会被写入我的 Google Cloud Bucket。相反,我收到以下错误:
...
File "h5f.pyx", line 71, in h5py.h5f.open (h5py/h5f.c:1797)
IOError: Unable to open file (Unable to open file: name =
'gs://.../weights.hdf5', errno = 2, error message = 'no such file or
directory', flags = 0, o_flags = 0)
我调查了这个问题,结果证明 Bucket 本身没有问题,因为 Keras Tensorboard callback 确实可以正常工作并将预期的输出写入同一个 bucket。我还确保 h5py 被包含在 setup.py 中,位于:
├── setup.py
└── trainer
├── __init__.py
├── ...
setup.py 中的实际包含如下所示:
# setup.py
from setuptools import setup, find_packages
setup(name='kerasLSTM',
version='0.1',
packages=find_packages(),
author='Kevin Katzke',
install_requires=['keras','h5py','simplejson'],
zip_safe=False)
我想问题归结为这样一个事实,即 GCS 无法使用 Python open 进行 I/O 访问,因为它提供了自定义实现:
import tensorflow as tf
from tensorflow.python.lib.io import file_io
with file_io.FileIO("gs://...", 'r') as f:
f.write("Hi!")
在检查 Keras modelCheckpoint 回调如何实现实际的文件写入后,发现它使用h5py.File() 进行 I/O:
with h5py.File(filepath, mode='w') as f:
f.attrs['keras_version'] = str(keras_version).encode('utf8')
f.attrs['backend'] = K.backend().encode('utf8')
f.attrs['model_config'] = json.dumps({
'class_name': model.__class__.__name__,
'config': model.get_config()
}, default=get_json_type).encode('utf8')
由于h5py package 是HDF5 binary data format 的Pythonic 接口,所以据我所知h5py.File() 似乎调用了用Fortran 编写的底层HDF5 功能:source、documentation。
如何解决这个问题并让 modelCheckpoint 回调写入我的 GCS 存储桶?有没有办法让“猴子补丁”以某种方式覆盖 hdf5 文件的打开方式以使其使用 GCS 的 file_io.FileIO()?
【问题讨论】:
-
这可能不适用于 CloudML,但您可能想要探索的一件事是 GCSFUSE 实用程序。我不知道你是否可以在 CloudML 的上下文中使用它,但我通常在运行 Ubuntu 的常规 Google Cloud VM 上运行 TF 时使用它。 Gcsfuse 允许您将 Ubuntu VM 上的本地目录映射到 Google Cloud Bucket,因此对于 Python,云存储桶开始看起来像一个常规目录。同样,不确定您是否可以将它与 CloudML 一起使用,但请考虑一下......
-
谢谢@VS_FF 我会调查你的建议并给你反馈。
-
把这个留给仍然有同样问题的人。我能够通过创建自定义回调以在每个时期后将检查点复制到 GCS 存储桶中来解决(嗯,一种解决方法)这个问题。我已经在 stackoverflow 的另一个问题上回答了这个问题。请在这里找到它 -> stackoverflow.com/a/69226186/15319462
标签: tensorflow google-cloud-platform keras hdf5 h5py