web-dev-qa-db-ja.com

KerasModelCheckpointsをGoogleCloudBucketに保存する

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 packageHDF5 binary data formatへのPythonicインターフェースであるため、h5py.File()は、私が知る限り、Fortranで記述された基礎となるHDF5機能を呼び出しているようです: sourcedocumentation

これを修正して、modelCheckpointコールバックをGCSバケットに書き込むにはどうすればよいですか? 「モンキーパッチ」で、hdf5ファイルを開いてGCSのfile_io.FileIO()を使用する方法をなんらかの方法で上書きする方法はありますか?

13
Kevin Katzke

私にとって最も簡単な方法は、gsutilを使用することです。

model.save('model.h5')
!gsutil -m cp model.h5 gs://name-of-cloud-storage/model.h5
0
Aurélien