TensorFlowバックエンドでKerasを使用して、Google Cloud Machine LearningEngineでLSTMネットワークのトレーニングに取り組んでいます。 gcloudとpythonスクリプトを調整した後、モデルをデプロイしてトレーニングタスクを成功させるために管理しました。
次に、Keras modelCheckpointコールバック を使用して、エポックごとにモデルにチェックポイントを保存させようとしました。 Google Cloudでローカルトレーニングジョブを実行すると、期待どおりに完全に機能します。重みは、各エポックの後に指定されたパスに格納されます。しかし、Google Cloud Machine Learning Engineで同じジョブをオンラインで実行しようとすると、weights.hdf5
がGoogle CloudBucketに書き込まれません。代わりに、次のエラーが発生します。
...
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)
この問題を調査したところ、Keras Tensorboardコールバック は正常に機能し、期待される出力を同じバケットに書き込むため、バケット自体に問題はないことがわかりました。また、次の場所にある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がカスタム実装を提供するため、I/O用のPythonopen
ではアクセスできないという事実にあると思います。
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コールバックが実際のファイル書き込みをどのように実装しているかを確認した後、I/Oに h5py.File() を使用していることが判明しました。
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()
を使用する方法をなんらかの方法で上書きする方法はありますか?
私にとって最も簡単な方法は、gsutilを使用することです。
model.save('model.h5')
!gsutil -m cp model.h5 gs://name-of-cloud-storage/model.h5