我想以超快的速度将TFRecords输入到我的模型中。但是,目前,我的GPU(GCP上为Single K80)的负载为0%,这在 CloudML 上非常慢。
我在GCS中有TFRecords:train_directory = gs://bucket/train/*.tfrecord
(大约100个文件,大小在30mb-800mb之间),但是由于某种原因,它很难将数据足够快地送入我的模型以支持GPU。
有趣的是,将数据加载到内存中并使用fit_generator()
使用numpy数组的速度快7倍。在这里,我可以指定多处理和多工作者。
我当前的设置是解析tf记录并加载无限tf.Dataset
。理想情况下,该解决方案将在内存中保存/完善一些批次,以供gpu按需使用。
def _parse_func(record):
""" Parses TF Record"""
keys_to_features = {}
for _ in feature_list: # 300 features ['height', 'weights', 'salary']
keys_to_features[_] = tf.FixedLenFeature([TIME_STEPS], tf.float32)
parsed = tf.parse_single_example(record, keys_to_features)
t = [tf.manip.reshape(parsed[_], [-1, 1]) for _ in feature_list]
numeric_tensor = tf.concat(values=t, axis=1)
x = dict()
x['numeric'] = numeric_tensor
y = ...
w = ...
return x, y, w
def input_fn(file_pattern, b=BATCH_SIZE):
"""
:param file_pattern: GCS bucket to read from
:param b: Batch size, defaults to BATCH_SIZE in hparams.py
:return: And infinitely iterable data set using tf records of tf.data.Dataset class
"""
files = tf.data.Dataset.list_files(file_pattern=file_pattern)
d = files.apply(
tf.data.experimental.parallel_interleave(
lambda filename: tf.data.TFRecordDataset(filename),
cycle_length=4,
block_length=16,
buffer_output_elements=16,
prefetch_input_elements=16,
sloppy=True))
d = d.apply(tf.contrib.data.map_and_batch(
map_func=_parse_func, batch_size=b,
num_parallel_batches=4))
d = d.cache()
d = d.repeat()
d = d.prefetch(1)
return d
获取火车数据
# get files from GCS bucket and load them into dataset
train_data = input_fn(train_directory, b=BATCH_SIZE)
适合模型
model.fit(x=train_data.make_one_shot_iterator())
我正在CloudML上运行它,因此GCS和CloudML应该很快。
如下所示,CPU占70%,内存不超过10%。那么dataset.cache()
会做什么?
如下所示,GPU似乎已关闭!内存也为0mb。缓存存储在哪里?
没有进程在GPU上运行!
似乎确实没有在GPU上运行的进程。我试图明确声明:
tf.keras.backend.set_session(tf.Session(config=tf.ConfigProto(
allow_soft_placement=True,
log_device_placement=True)))
train_data = input_fn(file_pattern=train_directory, b=BATCH_SIZE)
model = create_model()
with tf.device('/gpu:0'):
model.fit(x=train_data.make_one_shot_iterator(),
epochs=EPOCHS,
steps_per_epoch=STEPS_PER_EPOCH,
validation_data=test_data.make_one_shot_iterator(),
validation_steps=VALIDATION_STEPS)
但是一切仍然利用CPU!
答案 0 :(得分:0)
就我而言,我使用的是自定义setup.py
文件,该文件使用仅CPU的Tensorflow版本。
我在踢自己,请安装tensorflow-gpu
。