针对Cloud ML的Google Storage(gs)包装文件输入/输出?

Sun*_*Kim 15 google-cloud-storage tensorflow google-cloud-ml

谷歌最近宣布了Clould ML,https: //cloud.google.com/ml/,这非常有用.但是,一个限制是Tensorflow程序的输入/输出应该支持gs://.

如果我们使用所有tensorflow APIS来读/写文件,它应该没问题,因为这些API支持gs://.

但是,如果我们使用本机文件IO API open,它不起作用,因为它们不理解gs://

例如:

 with open(vocab_file, 'wb') as f:
        cPickle.dump(self.words, f)
Run Code Online (Sandbox Code Playgroud)

此代码不适用于Google Cloud ML.

但是,将所有本机文件IO API修改为tensorflow API或Google Storage Python API实际上非常繁琐.有没有简单的方法来做到这一点?gs://在本机文件IO之上支持谷歌存储系统的任何包装器?

正如这里建议的那样,Pickled scipy稀疏矩阵作为输入数据?,也许我们可以使用file_io.read_file_to_string('gs://...'),但仍然需要重要的代码修改.

Fuy*_*Liu 15

像这样做:

from tensorflow.python.lib.io import file_io

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

或者您可以像这样阅读pickle文件:

file_stream = file_io.FileIO(train_file, mode='r')
x_train, y_train, x_test, y_test  = pickle.load(file_stream)
Run Code Online (Sandbox Code Playgroud)


rha*_*l80 9

一种解决方案是在程序启动时将所有数据复制到本地磁盘.你可以在运行的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)
Run Code Online (Sandbox Code Playgroud)

如果您有任何输出,您可以将它们写入本地磁盘和gsutil rsync它们.(但是,请小心处理正确的重启,因为您可能会被放在不同的机器上).

另一个解决方案是猴子补丁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
Run Code Online (Sandbox Code Playgroud)

在任何模块实际尝试从GCS读取之前,请务必执行此操作.


归档时间:

查看次数:

5081 次

最近记录:

6 年,5 月 前