web-dev-qa-db-ja.com

CloudMLのGoogleStorage(gs)ラッパーファイルの入力/出力?

Googleは最近ClouldMLを発表しました https://cloud.google.com/ml/ そしてそれは非常に便利です。ただし、1つの制限は、Tensorflowプログラムの入力/出力がgs://をサポートする必要があることです。

すべてのテンソルフローAPIを使用してファイルの読み取り/書き込みを行う場合、これらのAPIは_gs://_をサポートしているため、問題ありません。

ただし、ネイティブファイルIO openなどのAPIを使用する場合、_gs://_を理解しないため、機能しません。

例えば:

_ with open(vocab_file, 'wb') as f:
        cPickle.dump(self.words, f)
_

このコードはGoogleCloudMLでは機能しません。

ただし、すべてのネイティブファイルを変更するIO APIをtensorflowAPIまたはGoogleStorageに変更するPython APIは本当に面倒です。これを行う簡単な方法はありますか?ネイティブファイルIOの上に_gs://_、グーグルストレージシステムをサポートしますか?

ここで提案されているように 入力データとしてピクルスのscipyスパース行列? 、おそらくfile_io.read_file_to_string('gs://...')を使用できますが、それでもこれには大幅なコード変更が必要です。

16
Sung Kim

1つの解決策は、プログラムの起動時にすべてのデータをローカルディスクにコピーすることです。これは、実行されるPythonスクリプト内でgsutilを使用して、次のように実行できます。

vocab_file = 'vocab.pickled'
subprocess.check_call(['gsutil', '-m' , 'cp', '-r',
                       os.path.join('gs://path/to/', vocab_file), '/tmp'])

with open(os.path.join('/tmp', vocab_file), 'wb') as f:
  cPickle.dump(self.words, f)

また、出力がある場合は、それらをローカルディスクに書き込んでgsutil rsyncそれら。 (ただし、別のマシンに配置される可能性があるため、再起動を正しく処理するように注意してください)。

もう1つの解決策は、モンキーパッチopen(注:テストされていません)です。

import __builtin__

# NB: not all modes are compatible; should handle more carefully.
# Probably should be reported on
# https://github.com/tensorflow/tensorflow/issues/4357
def new_open(name, mode='r', buffering=-1):
  return file_io.FileIO(name, mode)

__builtin__.open = new_open

モジュールが実際にGCSから読み取ろうとする前に、必ずこれを行ってください。

9
rhaertel80

このようにしてください:

from tensorflow.python.lib.io import file_io

with file_io.FileIO('gs://.....', mode='w+') as f:
    cPickle.dump(self.words, f)

または、次のようにピクルスファイルを読み取ることができます。

file_stream = file_io.FileIO(train_file, mode='r')
x_train, y_train, x_test, y_test  = pickle.load(file_stream)
16
Fuyang Liu

Apache_beam には gcsio モジュールがあり、標準のPythonファイルオブジェクトをGCSオブジェクトの読み取り/書き込みに返すために使用できます。これを使用できます。 Pythonファイルオブジェクトで動作する任意のメソッドを持つオブジェクト。たとえば、

def open_local_or_gcs(path, mode):
  """Opens the given path."""
  if path.startswith('gs://'):
    try:
      return gcsio.GcsIO().open(path, mode)
    except Exception as e:  # pylint: disable=broad-except
      # Currently we retry exactly once, to work around flaky gcs calls.
      logging.error('Retrying after exception reading gcs file: %s', e)
      time.sleep(10)
      return gcsio.GcsIO().open(path, mode)
  else:
    return open(path, mode)

 with open_local_or_gcs(vocab_file, 'wb') as f:
   cPickle.dump(self.words, f)
2
Jeremy Lewi