У меня есть матрица 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, я бы хотел узнать их, если это возможно.
Спасибо