Предварительная загрузка следующей мини-партии массива NumPy во время обучения (чтобы получить 100% использование графического процессора) с помощью tf.Data

У меня есть огромная матрица NumPy, уже загруженная в память. Я хотел бы уместить (выполнить градиентный спуск) 20 000 строк одновременно, но при этом следующие 20 000 строк будут скопированы в память GPU, поэтому GPU будет постоянно снабжаться данными, достигая 100% использования GPU.

Я пытался сделать это с новым tf.Data API. Я написал код ниже, но загрузка едва достигает 50%. Я не совсем уверен, связано ли это с моей ошибкой или это ошибка в Tensorflow.

x = tf.placeholder(shape=[None,xSize], dtype=typ)
y = tf.placeholder(shape=[None,ySize], dtype=typ)

# xT and yT are huge NumPy arrays
def trainOneEpoch(xT, yT):
    batchSize = 20000
    dataset = tf.data.Dataset.from_tensor_slices((x, y))
    dataset = dataset.batch(batchSize).prefetch(2)
    iterator = dataset.make_initializable_iterator()
    sess.run(iterator.initializer, {x: xT, y: yT})

    while True:
        try:
            xS, yS = sess.run(iterator.get_next())
            sess.run(trainer, {x: xS, y: yS})
        except tf.errors.OutOfRangeError:
            break

Как заставить это работать (с tf.Data или без)?

0 ответов

Другие вопросы по тегам