16

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

すべての tensorflow API を使用してファイルを読み書きする場合、これらの API は をサポートしているため、問題ありませんgs://

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

例えば:

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

このコードは Google Cloud ML では機能しません。

ただし、すべてのネイティブ ファイル IO API を tensorflow API または Google Storage Python API に変更するのは非常に面倒です。これを行う簡単な方法はありますか?gs://ネイティブ ファイル IO に加えて、Google ストレージ システムをサポートするラッパーはありますか?

ここで提案されているように、入力データとして scipy sparse matrix を漬けましたか? 、おそらく を使用できますfile_io.read_file_to_string('gs://...')が、それでも大幅なコード変更が必要です。

4

3 に答える 3

9

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から読み取ろうとする前に、必ずそれを行ってください。

于 2016-11-03T08:42:52.003 に答える
2

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)
于 2016-11-03T14:23:42.503 に答える