Обучение нейронной сети на массиве данных с использованием тензорного потока идет медленно - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь обучить DNNRegressor, используя API оценки тензорного потока с массивным набором данных около 1,2 ТБ, состоящим из 50 000 сжатых GZIP CSV-файлов.Я знаю, что использование файлов TFRecord намного быстрее, но преобразование 50 000 файлов займет много времени.

Каждая строка данных состоит из 1035 объектов с плавающей точкой и 2 меток с плавающей точкой, которые я пытаюсь предсказать (да, это огромно).Функция map создает входные данные, а также выполняет нормализацию с использованием файла масштабирования, содержащего значения Max & Min для каждой функции.

Я использую parralel_interleave для моего входного конвейера, поскольку содержимое каждого файла содержит аналогичные данные с небольшими изменениями.Чтобы создать перемешанные пакеты, я прочитал 5 строк из 10 разных файлов, чтобы создать несколько случайных пакетов размером 50.

def tf_input_function():
  files = tf.data.Dataset.list_files('D:/Data/training/*gz')
  dataset = files.apply(
      tf.data.experimental.parallel_interleave(
          lambda filename: (tf.data.TextLineDataset(filename, compression_type="GZIP")).map(parse_csv,
                                                                                          num_parallel_calls=8).batch(
            batch_size).prefetch(1),
        cycle_length=10,
        sloppy=True,
        buffer_output_elements=10,
        prefetch_input_elements=1))
  iterator = dataset.make_one_shot_iterator()

  features, labels = iterator.get_next()

  return features, labels



def parse_csv(line):
  fields = tf.decode_csv(line, FIELD_DEFAULTS)
  labels = fields[-2:]
  del fields[-2:]

  # Pack the result into a dictionary
  feats = dict(zip(COLUMNS, fields))
  # Separate the label from the features

  return scaleFeatures(feats), labels

def scaleFeatures(features):
  index = 0
  for x in features:     
          min_x = minmax[index][0]
          max_x = minmax[index][1]
          if max_x != min_x:
              features[x] = (features[x] - min_x) / (max_x - min_x)
          index += 1
  return features

def run_model():
  feature_columns = [
    tf.feature_column.numeric_column(name)
    for name in COLUMNS]

  est = tf.estimator.DNNRegressor(
    config=tf.estimator.RunConfig(
        save_checkpoints_steps=100000,
        keep_checkpoint_max=5000,
    ),
    feature_columns=feature_columns,
    hidden_units=[1500],
    label_dimension=2,
    optimizer=lambda: tf.train.AdamOptimizer(learning_rate=0.0001),
    dropout=0.5,
    activation_fn=tf.nn.leaky_relu,
    model_dir="D:/Stock Data/n1"
)
  train_spec = tf.estimator.TrainSpec(input_fn=lambda: tf_input_function('train'),
                                    max_steps=TRAIN_STEPS)

  eval_spec = tf.estimator.EvalSpec(input_fn=lambda: tf_input_function('validation'), steps=EVAL_STEPS)

  tf.estimator.train_and_evaluate(est, train_spec, eval_spec)

Проблема в том, что конвейер, который я использую для подачи в мою сеть, очень медленный.Для 100 шагов (каждый шаг имеет размер пакета 50), обучение занимает ~ 6 секунд.Вот результат обучения DNNRegressor:

INFO:tensorflow:loss = 40.882965, step = 6365506 (13.298 sec)
INFO:tensorflow:global_step/sec: 19.33
INFO:tensorflow:loss = 25.407375, step = 6365606 (5.189 sec)
INFO:tensorflow:global_step/sec: 19.8323
INFO:tensorflow:loss = 80.53043, step = 6365706 (5.032 sec)
INFO:tensorflow:global_step/sec: 19.943
INFO:tensorflow:loss = 542.24744, step = 6365806 (5.011 sec)
INFO:tensorflow:global_step/sec: 19.9351
INFO:tensorflow:loss = 21.753256, step = 6365906 (5.046 sec)
INFO:tensorflow:global_step/sec: 23.0136
INFO:tensorflow:loss = 50.146282, step = 6366006 (4.321 sec)
INFO:tensorflow:global_step/sec: 19.9311
INFO:tensorflow:loss = 38.326336, step = 6366106 (5.012 sec)
INFO:tensorflow:global_step/sec: 14.869
INFO:tensorflow:loss = 56.946716, step = 6366206 (6.724 sec)
INFO:tensorflow:global_step/sec: 18.1742
INFO:tensorflow:loss = 33.119816, step = 6366306 (5.500 sec)

Файлы хранятся на жестком диске со скоростью чтения не менее 50 МБ / с, но при мониторинге во время обучения он читает файлы с комбинированной скоростью 2 МБ / с.... это потому, что он должен читать несколько файлов, таким образом, непоследовательные чтения?(накладные расходы на перемещение головки жесткого диска и т. д.) Я пытался использовать SSD (SATA 3), и он стал еще медленнее ...

enter image description here Также тренируется с использованием parrallel_interleave100% моего процессора.

Итак, мой самый важный вопрос: есть ли способ значительно ускорить обучение?

Обучение таким образом займет у меня 30 дней, чтобы завершить 1 отдельную эпоху ...

Примечание. Использование GPU немного медленнее, чем использование CPU, поэтому я считаю, что проблема в том, как настроен мой конвейер

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