0

我正在嘗試在BASIC_GPU分層實例的谷歌ml引擎中訓練計算機視覺的卷積模型,但訓練在表面上似乎拖延了一個小時隨機時間間隔。從張量板的成本函數圖可以看出。 Cost function plotted over timegcloud在訓練期間使用多處理或多線程時,gcloud ML引擎長時間停止

我能想到的這個問題的唯一明顯原因是我使用的多線程或多處理功能(從現在開始都產生相同的問題並且將被稱爲並行處理)。我使用並行處理來並行獲取和預處理圖像,因爲谷歌存儲桶延遲大約爲100ms,增加了一些opencv預處理,如果按順序完成,則每個批次可能需要5/6秒。 並行通過從功能產卵工人獲取作品:

import threading as thr 

def read_image_always_out(self, dirlist, que, seed): 
    found_img = False 
    np.random.seed(seed) 
    number_of_files = len(dirlist) 
    while not found_img: 
     i = np.random.randint(number_of_files) 
     seed = np.random.randint(self.maxInt) 
     ex, se, found_img, _ = self.get_image_set(datapath, annopath, seed) 

    que.put([ex, se]) 
    que.task_done() 

def read_image_batch_thread(self, dirlist,seed): 
    wait_for_thread = 5.0 
    np.random.seed(seed) 
    search_images, exemplars = [], [] 
    que = Queue.Queue((self.batch_size)) 
    process_list = [] 

    for i in range(0, self.batch_size): 
     seed = np.random.randint(self.maxInt) 
     p = thr.Thread(target=self.read_image, 
         args=(dirlist, que, seed)) 
     p.start() 
     process_list.append(p) 

    no_data = [] 

    for i in range(0, self.batch_size): 
     try: 
      images = que.get(wait_for_thread) 
     except: 
      print("timeout waiting for image") 
      no_data.append(i) 
     else: 
      exemplars.append(images[0]) 
      search_images.append(images[1]) 

    for p in process_list: 
     p.join(wait_for_thread) 
    que.join() 
    duration_image_get = time.time() - start_time 
    return exemplars, search_images, duration_image_get, no_data 

每當訓練不拖延就像一個魅力的並行讀取作品,並降低圖像加載時間圍繞第二大大提高了我的模型的訓練速度。

在本地運行培訓時,這些問題都不會顯示出來。這似乎是一個特定於ML引擎的錯誤,或者我錯過了什麼?我對毫升引擎的限制或對這個問題的解決方案的搜索已經出現乾涸。

有沒有人有這個問題的經驗,並知道爲什麼它不工作,或者我可以嘗試什麼?這個問題是一個錯誤還是ML引擎的限制?

我知道有一些解決方法,比如使用更大的文件和大塊的培訓,所以我只需要下載一個文件,而不是多個文件。或者使用tf.train.QueueRunner,雖然我無法進行我在tensorflow API中所需的特定圖像預處理,但必須對所有圖像進行預處理。這兩種解決方案都需要對圖像進行預處理才能正常工作,這是我不惜一切代價避免的,因爲我還沒有建立最佳圖像尺寸,也不想爲我想要的每個實驗創建圖像集試用。

回答

0

沒有足夠的信息,所以只是猜測。您很可能會遇到一些退化的情況,導致您的圖像讀取循環變慢(例如,不設置默認超時,不處理某些故障條件,等待所有線程,爲每次獲取圖像啓動一個新線程)。

理想的解決方法是將所有這些操作移至TensorFlow操作,包括讀取和排隊。這些部件都經過了很好的測試。您確定在TensorFlow中無法完成預處理嗎?我們通常使用TensorFlow操作來達到這個目的。請看這裏例如: https://github.com/tensorflow/models/blob/master/slim/preprocessing/vgg_preprocessing.py

相關問題