Tensorflow: пакетное матричное умножение для огромных массивов - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть матрица A с формой [X,128] и вектор B с формой [128,1] в numpy.

Я хочу выполнить умножение AB, которое приведет к выводу [X,1].

Если бы у меня было достаточно памяти GPU, это было бы легко и быстро, но у меня недостаточно памяти, и я хочу передавать эти данные партиями и максимально сократить время вычислений.

Я не уверен, как мне следует посылать пакетные данные в ОЗУ в графический процессор для максимально быстрой обработки.

Вот код Tensorflow, который я написал, который довольно медленный:

import time

import numpy as np
import tensorflow as tf

NUMBER_OF_SAMPLES = 1097152
NUMBER_OF_DIMENSIONS = 256

print("Initializing Variables...")
Database_size_in_bytes = int(NUMBER_OF_SAMPLES * NUMBER_OF_DIMENSIONS * 4)
GPU_RAM_SIZE = 8192 * 1024 * 1024  # X MB RAM
NUMBER_OF_SAMPLES_GPU_CAN_HANDLE = Database_size_in_bytes // GPU_RAM_SIZE

print("Generating the Data...")
A_Placeholder = tf.placeholder(tf.float32, shape=[None, NUMBER_OF_DIMENSIONS])
B_Constant = tf.constant(np.random.rand(NUMBER_OF_DIMENSIONS, 1).astype(np.float32))
A_Data = np.random.random_sample((NUMBER_OF_SAMPLES, NUMBER_OF_DIMENSIONS)).astype(np.float32)
B_Data = np.random.rand(NUMBER_OF_DIMENSIONS, 1).astype(np.float32)

multiplication_op = tf.matmul(A_Placeholder, B_Constant)

sess = tf.Session()

print("Multiplicating...")

if NUMBER_OF_SAMPLES_GPU_CAN_HANDLE > 0:
    print("Not Enough GPU Memory...")

    A_Data_Splits = np.split(A_Data, NUMBER_OF_SAMPLES_GPU_CAN_HANDLE)

    times = []
    for i in range(0, 100):
        for j, _ in enumerate(A_Data_Splits):
            start_time = time.time()
            output = sess.run(multiplication_op, feed_dict={A_Placeholder: A_Data_Splits[j]})
            # print(output[0])
            times.append(time.time() - start_time)
else:
    print("Enough GPU Memory... Initializing Variables before use...")
    sess.run(tf.global_variables_initializer(), feed_dict={A_Placeholder: A_Data})

    times = []
    for i in range(0, 100):
        start_time = time.time()
        output = sess.run(multiplication_op, feed_dict={A_Placeholder: A_Data})
        # print(output[0])
        times.append(time.time() - start_time)

print("Average Time => %s" % np.mean(times))
sess.close()

Если есть другие быстрые альтернативы пакетному продукту Dot, я бы хотел узнать их, если это возможно.

Спасибо

...