2016-11-03 19 views
8

Google ने हाल ही में क्लोल्ड एमएल, https://cloud.google.com/ml/ की घोषणा की और यह बहुत उपयोगी है। हालांकि, एक सीमा यह है कि एक Tensorflow कार्यक्रम के इनपुट/आउट जीएस का समर्थन करना चाहिए: //।क्लाउड एमएल के लिए Google संग्रहण (जीएस) रैपर फ़ाइल इनपुट/आउट?

यदि हम फ़ाइलों को पढ़ने/लिखने के लिए सभी tensorflow एपीआईएस का उपयोग करते हैं, तो यह ठीक होना चाहिए, क्योंकि ये एपीआई gs:// का समर्थन करते हैं।

हालांकि, अगर हम मूल फ़ाइल का उपयोग इस तरह के open के रूप में, यह काम आईओ एपीआई, यह नहीं है क्योंकि वे gs://

उदाहरण के लिए समझ में नहीं आता:

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

इस कोड में काम नहीं करेगा Google क्लाउड एमएल।

हालांकि, सभी मूल फ़ाइल IO API को tensorflow API या Google संग्रहण पायथन API में संशोधित करना वास्तव में कठिन है। क्या ऐसा करने का कोई आसान तरीका है? मूल फ़ाइल IO के शीर्ष पर Google स्टोरेज सिस्टम, gs:// का समर्थन करने के लिए कोई रैपर?

जैसा कि यहां बताया गया है Pickled scipy sparse matrix as input data?, शायद हम file_io.read_file_to_string('gs://...') का उपयोग कर सकते हैं, लेकिन फिर भी यह महत्वपूर्ण कोड संशोधन की आवश्यकता है।

उत्तर

4

एक समाधान प्रोग्राम शुरू होने पर सभी डेटा को स्थानीय डिस्क पर कॉपी करना है।

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 उन्हें लिख सकते हैं: आपको लगता है कि Python स्क्रिप्ट है जो चलाने हो जाता है, जैसे कुछ अंदर gsutil का उपयोग करके कर सकते हैं। (लेकिन, पुनरारंभ को सही ढंग से संभालने के लिए सावधान रहें, क्योंकि आपको एक अलग मशीन पर रखा जा सकता है)।

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 से पढ़ने का प्रयास करना सुनिश्चित करें:

अन्य समाधान बंदर पैच करने के लिए open (: अपरीक्षित नोट) है।

1

apache_beam में gcsio मॉड्यूल है जिसका उपयोग मानक पायथन फ़ाइल ऑब्जेक्ट को जीसीएस ऑब्जेक्ट्स को पढ़ने/लिखने के लिए किया जा सकता है। आप इस ऑब्जेक्ट का उपयोग किसी भी विधि से कर सकते हैं जो पायथन फ़ाइल ऑब्जेक्ट्स के साथ काम करता है। उदाहरण

लिए
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) 
+0

धन्यवाद! यह बहुत अच्छा लग रहा है। मुझे लगता है कि Tensorflow file_io भी एक समाधान हो सकता है। 'file_io.FileIO (file_path, mode = "w") f' के रूप में। क्या आपको लगता है कि यह भी ठीक है? मैंने अभी तक पूरी तरह से परीक्षण नहीं किया है। –

+2

मैंने आपके प्रश्न का अर्थ विशेष कार्यों के साथ सभी खुले() फ़ंक्शन कॉल को प्रतिस्थापित करने से बचने के लिए किया है। यदि ऐसा नहीं है, यानी, आप कॉल को खोलने के लिए प्रतिस्थापित करने के इच्छुक हैं(), तो gcsio.open_local_or_gcs और file_io.FileIO बहुत समान हैं, केवल आपके द्वारा लाई जाने वाली निर्भरताओं को प्रभावित करता है - file_io पहले ही टीएफ का हिस्सा है। लेकिन FileIO कुछ गैर-मानक मोड का उपयोग करता है, जिससे आपके निर्णय को भी प्रभावित हो सकता है। – rhaertel80

3

इस तरह करें:

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) 
संबंधित मुद्दे