Я пытаюсь обучить 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), и он стал еще медленнее ...
Также тренируется с использованием parrallel_interleave100% моего процессора.
Итак, мой самый важный вопрос: есть ли способ значительно ускорить обучение?
Обучение таким образом займет у меня 30 дней, чтобы завершить 1 отдельную эпоху ...
Примечание. Использование GPU немного медленнее, чем использование CPU, поэтому я считаю, что проблема в том, как настроен мой конвейер