Tensorflow交错输入管道变得非常缓慢 系统信息 我是否编写了自定义代码(而不是使用TensorFlow中提供的股票示例脚本):是 操作系统平台和发行版(如Linux Ubuntu 16.04):Windows 7 如果问题发生在移动设备上,则移动设备(如iPhone 8、Pixel 2、三星Galaxy): TensorFlow安装自(源代码或二进制文件):二进制文件 TensorFlow版本(使用下面的命令):1.13 Python版本:3.7 Bazel版本(如果从源代码处编译): GCC/编译器版本(如果从源代码处编译): CUDA/cuDNN版本:9 GPU型号和内存:GTX 980 4GB 复制的精确命令: 描述问题

Tensorflow交错输入管道变得非常缓慢 系统信息 我是否编写了自定义代码(而不是使用TensorFlow中提供的股票示例脚本):是 操作系统平台和发行版(如Linux Ubuntu 16.04):Windows 7 如果问题发生在移动设备上,则移动设备(如iPhone 8、Pixel 2、三星Galaxy): TensorFlow安装自(源代码或二进制文件):二进制文件 TensorFlow版本(使用下面的命令):1.13 Python版本:3.7 Bazel版本(如果从源代码处编译): GCC/编译器版本(如果从源代码处编译): CUDA/cuDNN版本:9 GPU型号和内存:GTX 980 4GB 复制的精确命令: 描述问题,python,tensorflow,machine-learning,Python,Tensorflow,Machine Learning,我正在构建一个管道来为DNNRegressor模型提供数据,问题是输入管道在最初的几个100步之后变得非常慢 我有数千个大小不等的TFRecord文件(大小从10MB到3GB)。每个输入有1038列。 我试图从每个TFRecord文件中创建大小为512的批,其中包含1个“行”(每个文件都有相关数据,因此我需要从被交错的512个文件中的每个文件中提取1行,以获得一个“无序”批)。为此,, 我正在使用Data.interleave方法,这似乎非常适合我的情况 问题是输入在开始时非常快,但在前100个

我正在构建一个管道来为DNNRegressor模型提供数据,问题是输入管道在最初的几个100步之后变得非常慢

我有数千个大小不等的TFRecord文件(大小从10MB到3GB)。每个输入有1038列。 我试图从每个TFRecord文件中创建大小为512的批,其中包含1个“行”(每个文件都有相关数据,因此我需要从被交错的512个文件中的每个文件中提取1行,以获得一个“无序”批)。为此,, 我正在使用Data.interleave方法,这似乎非常适合我的情况

问题是输入在开始时非常快,但在前100个步骤后变得非常慢。 CPU使用率从开始时的100%快速上升到接近0%,因为管道速度变慢。但是,磁盘读取速度始终保持在>60 MBps。问题是什么?较小的文件是否以某种方式散落在管道中

我尝试过使用parralel交错,但速度更慢

源代码/日志 日志:

def parse_tf(example):
    with tf.device('/cpu:0'):
        parsed_features = tf.parse_example(example, feature)
        feats = parsed_features
        labels = parsed_features.pop('labels')
        return feats, labels


def tf_input_fn(batch_size):
    with tf.device('/cpu:0'):
        files = os.listdir('D:/data/data')
        files = ['D:/data/data/' + file for file in files]

        dataset = (tf.data.Dataset.from_tensor_slices(files)
                   .interleave(lambda x:
                               tf.data.TFRecordDataset(x),
                               cycle_length=batch_size, block_length=1, num_parallel_calls=8)).batch(batch_size).map(
            parse_tf, num_parallel_calls=1)

        dataset = dataset.prefetch(100)
        return dataset


if __name__ == "__main__":

    batch_size_ = 512

    data = tf_input_fn(batch_size_)
    data_next = data.make_one_shot_iterator().get_next()
    ctr = 0
    with tf.Session() as data_sess:
        data_sess.run(tf.global_variables_initializer())
        tld_start = dt.datetime.now()
        try:
            while True:
                tld_out = data_sess.run(data_next)
                ctr += 1
                if ctr % 100 == 0:
                    tld_end = dt.datetime.now()
                    print("Time for 100 steps: " + str(tld_end - tld_start))
                    tld_start = dt.datetime.now()
                    ctr = 0
        except tf.errors.OutOfRangeError:
            print("Done")
Time for 100 steps: 0:00:04.547647
Time for 100 steps: 0:00:03.132636
Time for 100 steps: 0:00:02.839416
Time for 100 steps: 0:00:02.639220
Time for 100 steps: 0:00:02.492228
Time for 100 steps: 0:00:01.991023
Time for 100 steps: 0:00:12.380473
Time for 100 steps: 0:00:29.162056
Time for 100 steps: 0:00:23.747592
Time for 100 steps: 0:00:28.041797
Time for 100 steps: 0:00:28.309055
Time for 100 steps: 0:00:26.240207
Time for 100 steps: 0:00:27.894402
Time for 100 steps: 0:00:25.832465
Time for 100 steps: 0:00:27.795538
Time for 100 steps: 0:00:28.219248
Time for 100 steps: 0:00:26.962029
Time for 100 steps: 0:00:24.568246
Time for 100 steps: 0:00:29.052262
Time for 100 steps: 0:00:27.003928
Time for 100 steps: 0:00:27.839937
Time for 100 steps: 0:00:28.380154
Time for 100 steps: 0:00:27.109850
Time for 100 steps: 0:00:28.234840