Оптимизация графического процессора с помощью Keras - PullRequest
1 голос
/ 27 апреля 2020

Я использую Keras на компьютере Windows 10 с графическим процессором. Я перешел с Tensorflow 1 на Tensorflow 2 и теперь чувствую, что примерка выполняется намного медленнее, и надеюсь на ваш совет.

Я проверяю, видит ли Tensorflow GPU со следующими утверждениями:

from tensorflow.python.client import device_lib
print(device_lib.list_local_devices())

K._get_available_gpus()

дает ответ

[name: "/device:CPU:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 17171012743200670970
, name: "/device:GPU:0"
device_type: "GPU"
memory_limit: 6682068255
locality {
  bus_id: 1
  links {
  }
}
incarnation: 5711519511292622685
physical_device_desc: "device: 0, name: GeForce GTX 1070, pci bus id: 0000:01:00.0, compute capability: 6.1"

Итак, это, кажется, указывает на то, что графический процессор работает?

Я тренирую модифицированную версию ResNet50 с до 10 изображений (257x257x2) в качестве входных данных , Он имеет 4.3M обучаемых параметров. Тренировка очень медленная (может быть несколько дней). Часть кода показана здесь:

import os,cv2,sys
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
import scipy.io
import h5py
import time
from tensorflow.python.keras import backend as K
from tensorflow.python.keras.models import load_model
from tensorflow.python.keras import optimizers
from buildModelReduced_test import buildModelReduced
from tensorflow.keras.utils import plot_model

K.set_image_data_format('channels_last') #set_image_dim_ordering('tf')
sys.setrecursionlimit(10000)

# Check that gpu is running
from tensorflow.python.client import device_lib
print(device_lib.list_local_devices())
K._get_available_gpus()

# Generator to read one batch at a time for large datasets
def imageLoaderLargeFiles(data_path, batch_size, nStars, nDatasets=0):
---
---
---          
yield(train_in,train_target 


# Repository for parameters
nStars = 10
img_rows = 257
img_cols = 257
bit_depth = 16
channels = 2
num_epochs = 1
batch_size = 8
data_path_train = 'E:/TomoA/large/train2'
data_path_validate = 'E:/TomoA/large/validate2'
nDatasets_train = 33000
nDatasets_validate = 8000
nBatches_train = nDatasets_train//(batch_size)
validation_steps = nDatasets_validate//(batch_size)
output_width = 35;   
runSize = 'large'
restartFile =  ‘’

#%% Train model

if restartFile == '':

    model = buildModelReduced(nStars,img_rows, img_cols, output_width,\
               batch_size=batch_size,channels=channels, use_l2_regularizer=True)
    model.summary()
    plot_model(model, to_file='model.png', show_shapes=True)

    all_mae = []

    adam=optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None,
                         decay=0.0, amsgrad=False)

    model.compile(optimizer='adam',loss='MSE',metrics=['mae'])


history = model.fit_generator(imageLoaderLargeFiles(data_path_train,batch_size,nStars,nDatasets_train),
                    steps_per_epoch=nBatches_train,epochs=num_epochs, 
                    validation_data=imageLoaderLargeFiles(data_path_validate,batch_size,nStars,nDatasets_validate),
                    validation_steps=validation_steps,verbose=1,workers=0,
                    use_multiprocessing=False, shuffle=False)

print('\nSaving model...\n')
if runSize == 'large':
    model.save(runID + '_' + runSize + '.h5')

Когда я открываю диспетчер задач Windows и смотрю на графический процессор, я вижу, что выделение памяти составляет 6,5 ГБ, копирование менее 1% и CUDA около 4%. Активность диска низкая, я читаю кэш из 1000 наборов данных одновременно с SSD. Смотрите скриншот ниже. Я думаю, что это показывает, что GPU не работает хорошо. Загрузка процессора составляет 19%. Я использую пакет размером 8, если я go выше, я получаю ошибку исчерпания ресурса.

Есть идеи, как поступить или где найти дополнительную информацию? Есть какие-то практические правила о том, как настроить свой бег, чтобы хорошо использовать графический процессор?

Task manager screen

1 Ответ

0 голосов
/ 27 апреля 2020

Кажется, что где-то в процессе обучения есть узкое место, которое мы не можем обнаружить, посмотрев в диспетчер задач. Это может быть вызвано вводом-выводом, графическим процессором или процессором. Вы должны определить, какая часть обработки медленная, используя расширенный инструмент.

Вы можете использовать TensorFlow Profiler для проверки всех процессов TensorFlow. Кроме того, он дает советы о том, как вы можете ускорить свои процессы. Здесь представляет собой простое видеоурок о нем.

TensorFlow Profiler

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...