我正在尝试使用 tf.data 实现输入管道。特征位于从 matlab 导出的矩阵中,而标签位于需要特定函数才能读取的其他文件中。
必须加载的文件名可以给定一个数字来计算。
这就是我实现它的方式
def load_files(k):
mesh_file = file_path(k, "off", flags.dataset_mesh)
mat_file = file_path(k, "mat", flags.dataset_mat)
mesh = pymesh.load_mesh(mesh_file)
mat = scipy.io.loadmat(mat_file)
return mesh.vertices, mat
def generator_fn():
return (load_files(x) for x in range(1000000 + 1))
def input_fn() -> Dataset:
dataset = tf.data.Dataset.from_generator(generator_fn,
output_types=(tf.as_dtype(tf.float32), tf.as_dtype(tf.float32)), )
dataset = dataset.batch(batch_size=flags.batch_size).repeat()
dataset = dataset.cache()
dataset = dataset.prefetch(buffer_size=flags.prefetch_buffer_size)
return dataset
问题是GPU使用率很低,大约5%(2080 ti)。我不确定瓶颈在哪里。我正在使用简单的 MLP 进行测试,但尽管我添加了每层的层或神经元,但 gpu 的使用似乎没有改变。
我正在以这种方式进行培训:
model = keras.Sequential([
keras.layers.Flatten(input_shape=(n_input,)),
keras.layers.Dense(1024, activation=tf.nn.relu),
.
.
.
keras.layers.Dense(1024, activation=tf.nn.relu),
keras.layers.Dense(n_output, activation=None)
])
model.compile(optimizer='adam', loss='mean_squared_error')
model.fit(input_fn().make_one_shot_iterator(), steps_per_epoch=1000000, epochs=1)
所以,我认为问题可能在于:我如何提供数据(问题不应该只是文件读取,因为我在 SSD NVMe 上),我如何进行培训,或者这只是一个简单的网络尽管我添加了层。
但是,我想知道是否有更有效的方式来提供数据。
我正在使用tensorflow-gpu 2.0.0a0
,我从 lambda-labs 运行了一个基准测试,它能够以 100% 的速度使用 GPU