медленный файл Pillow, читаемый на Google Cloud machine - PullRequest
0 голосов
/ 06 ноября 2019

Я запускаю обучение переносу (keras и Tensorflow) с использованием алгоритма Inception Resnet V2, на GCP, с 4 графическими процессорами Nvidia K80, и CPU с 128 ГБ оперативной памяти и 80 ГБ постоянного диска. Данные обучения составляют около 83000 изображений размером 512 x 512, а проверка - около 20000 изображений. Я использую удаленную сессию Pycharm SSH. Я обнаружил 2 проблемы:

  1. Генератор подгонки Keras выдавал ошибку, из-за ошибки Подушки при чтении файла изображения. Тот же файл будет открыт с помощью Pillow (та же версия на GCP, что и на моей локальной машине) или даже openCV локально, но не на GCP. Я часами пытался найти причину, но не смог, поэтому в итоге удалил проблемные файлы. есть идеи, почему это произошло?
  2. Что более важно, даже после замораживания всех слоев 1 эпоха занимала больше часа. Я подозревал, что проблема с Подушкой под капотом. Итак, я написал фрагмент кода для его проверки. Код приведен ниже:

    import os
    import glob
    import timeit
    from PIL import Image as pil_image
    from tqdm import tqdm
    
    # SOME CODE HERE FOR TRAINING DIRECTORY SPECIFICATION 
    
    def get_file_list(ip_pth):
        # read all the file names in list
        pth_aud = []
        for path, subdirs_categ, files in os.walk(ip_pth):
            if len(files) != 0:
            a = glob.glob(path + "//*.png")
            pth_aud = pth_aud + a
    return pth_aud
    
    def get_files(ip_path):
        pth_aud = glob.glob(ip_path + "//*.png")
    return pth_aud
    
    def check_img(img_pth,cnt): 
        img = None
        # print('processing '+ img_pth )
        try:
            img = pil_image.open(img_pth)  # open the image file
            img.verify()  # verify that it is, in fact an image
            cnt = cnt + 1
        except (IOError, SyntaxError) as e:
            cnt = cnt -1
            print('Bad file:', img_pth)
        finally:
            if img is not None:
            img.close()
        return
    
    tr_lst = get_file_list(train_dir)
    subdir = os.listdir(train_dir)
    print(" There are " + str(len(tr_lst))  + " files in training dir: " + train_dir)
    
    # get each file in respective folder
    for each_dir in subdir:
        pt = train_dir+ "//" + each_dir
        tr_lst_each = get_files(pt)
        cnt = 0
        for pth in tqdm(tr_lst_each):
            check_img(pth,cnt)
        print("sucessfully opened and closed " + str(len(tr_lst_each))  + " files in train subir " + 
        each_dir)        
    

    Итак, приведенный выше код проходит через 13 подпапок в моих обучающих данных, и в целом потребовалось 5 минут, чтобы прочитать и проверить 83000 изображений со средней итерацией / секунду> 330на моем ПК. Тот же код на удаленной машине, занимает около 1 часа и работает со скоростью 10-15 итераций в секунду. Почему это случилось? У моей машины SSD, а постоянный диск на GCP не SSD. Может ли это вызвать такую ​​огромную разницу?

Любая помощь с благодарностью.

Спасибо
Седьма

...