2017-08-09 19 views
3

私は、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 packageHDF5 binary data formatにPython的インターフェイスであるようh5py.File()が呼ぶようだ:Keras modelCheckpointコールバックは、実際のファイルの書き込みを実装し、I/Oのためのh5py.File()を使用していることを、どうなったかチェックした後私が言うことができる限り、Fortranで書かれた基礎となるHDF5の機能:sourcedocumentation

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

+1

これはCloudMLには当てはまらないかもしれませんが、あなたが検討したいことは、GCSFUSEユーティリティです。 CloudMLのコンテキストで使用できるかどうかはわかりませんが、通常はUbuntuを実行する通常のGoogle Cloud VMでTFを実行するときに使用します。Gcsfuseでは、Ubuntu VMのローカルディレクトリをGoogle Cloud Bucketにマップすることができます。そのため、Pythonでは、クラウドバケットが通常のdirのように見えます。繰り返しますが、CloudMLで使用することはできますか?それについて考えてみてください。 –

+0

ありがとう@VS_FFあなたの提案を調査し、フィードバックをお送りします。 –

答えて

2

問題は、次のコードで解決することができます。

# Save Keras ModelCheckpoints locally 
model.save('model.h5') 

# Copy model.h5 over to Google Cloud Storage 
with file_io.FileIO('model.h5', mode='r') as input_f: 
    with file_io.FileIO('model.h5', mode='w+') as output_f: 
     output_f.write(input_f.read()) 
     print("Saved model.h5 to GCS") 

model.h5は、ローカルファイルシステム上に保存し、GCSにコピーされます。 Jochenが指摘しているように、現在のところ、GCSにHDF5モデルのチェックポイントを書くのは容易ではありません。このハックを使用すると、より簡単なソリューションが提供されるまでデータを書き込むことができます。

2

ローカルファイルシステムに保存して、TF IO APIを使用してコピーすることで回避できます。私は、GoogleCloudPlatform MLサンプルのKerasサンプルに例を追加しました。

基本的に、ターゲットディレクトリがGCSパス( "gs://")であるかどうかをチェックして、ローカルファイルシステムにh5pyを強制的に書き込んだ後、TF file_io APIを使用してGCSにコピーします。例えば参照:https://github.com/GoogleCloudPlatform/cloudml-samples/blob/master/census/keras/trainer/task.py#L146

+0

Thanks Jochen、GoogleCloudPlatformへのプルリクエストのコードが実際にこの問題を解決しました。答えを編集して、ハッキングがどのように動作しているかの説明と完全な作業コードの例を含めると、私はそれを受け入れたものとしてマークします。 –

+0

次のコード例があります:) – Jochen

関連する問題