私は、TensorFlowバックエンドでKerasを使用してGoogle Cloud Machine Learning EngineでLSTMネットワークをトレーニングするために取り組んでいます。私はモデルを展開し、gcloudと私のpythonスクリプトを調整して、うまくいくトレーニングタスクを実行しました。Keras ModelCheckpointsをGoogle Cloud Bucketに保存
それから、Keras modelCheckpoint callbackを使用して、各エポック後にモデルの保存チェックポイントを作成しようとしました。 Google Cloudでのローカルトレーニングの仕事は、期待通りに機能します。ウェイトは、各エポック後に指定されたパスに格納されます。しかし、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)
が、私はこの問題を調査し、それがKeras Tensorboard callbackが作業罰金を行い、同じバケツに期待される出力を書き込みとして、バケット自体に問題がないことを、判明しました。私はまた、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)
私は問題があるという事実に降りてくると思います代わりにカスタム実装を提供するため、PySons 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!")
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
にPython的インターフェイスであるようh5py.File()
が呼ぶようだ:Keras modelCheckpointコールバックは、実際のファイルの書き込みを実装し、I/Oのためのh5py.File()を使用していることを、どうなったかチェックした後私が言うことができる限り、Fortranで書かれた基礎となるHDF5
の機能:source、documentation。
これを修正し、modelCheckpointコールバックをGCSバケットに書き込むにはどうすればよいですか?どのようにhdf5ファイルを開いてGCSのfile_io.FileIO()
を使用するかを "monkey patching"の方法で上書きする方法はありますか?
これはCloudMLには当てはまらないかもしれませんが、あなたが検討したいことは、GCSFUSEユーティリティです。 CloudMLのコンテキストで使用できるかどうかはわかりませんが、通常はUbuntuを実行する通常のGoogle Cloud VMでTFを実行するときに使用します。Gcsfuseでは、Ubuntu VMのローカルディレクトリをGoogle Cloud Bucketにマップすることができます。そのため、Pythonでは、クラウドバケットが通常のdirのように見えます。繰り返しますが、CloudMLで使用することはできますか?それについて考えてみてください。 –
ありがとう@VS_FFあなたの提案を調査し、フィードバックをお送りします。 –