gcloud ML-engine在训练期间使用多处理或多线程时长时间停止

时间:2017-04-04 13:36:07

标签: google-app-engine opencv tensorflow multiprocessing google-cloud-ml-engine

我正在尝试在BASIC_GPU分层实例上的谷歌ml引擎中训练计算机视觉的卷积模型,但训练在看似随机的时间间隔内停滞长达一个小时。从图中可以看出成本函数取自tensorboard。 Cost function plotted over time

我能想到的这个问题的唯一明显原因是我使用的多线程或多处理功能(两者产生相同的问题,从现在开始称为并行处理)。我使用并行处理来并行获取和预处理我的图像,因为谷歌存储桶延迟大约是100毫秒加上这个一些opencv预处理,如果顺序完成,每批可能需要5/6秒。 并行获取通过从函数中生成worker来实现:

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发动机的限制或这个问题的解决方案的搜索已经枯竭了。

有没有人有这个问题的经验,知道为什么它不起作用或我还能尝试什么?这个问题是一个错误,还是ML引擎的限制?

我知道有一些工作,比如使用大块的训练文件,所以我只需要每批下载一个文件,而不是多次。或者使用tf.train.QueueRunner虽然我无法在tensorflow api中进行我需要的特定图像预处理,但必须预处理所有图像。这两种解决方案都需要对图像进行预处理,这是我想要不惜一切代价避免的,因为我还没有建立最佳的图像尺寸,也不想为我想要的每个实验制作一个图像集。试用。

1 个答案:

答案 0 :(得分:0)

信息不足,所以只是猜测。您可能会遇到一些使您的图像获取循环变慢的退化情况(例如,不设置默认超时,不处理某些故障情况,等待所有线程,为每次图像提取启动新线程)。

理想的解决方法是将所有这些操作移至TensorFlow操作,包括读取和排队。这些部件经过了很好的测试。您确定在TensorFlow中无法完成预处理吗?我们通常将TensorFlow操作用于此目的。在这里看到例如: https://github.com/tensorflow/models/blob/master/slim/preprocessing/vgg_preprocessing.py