Как количественно определить, сколько данных копируется в графический процессор в сценарии Theano?

Как правило, часто предпочтительнее избегать многократного копирования данных из ОЗУ в память графического процессора, если вместо этого данные могут оставаться в памяти графического процессора. В результате некоторые коды хранят наборы данных в памяти графического процессора как общую переменную (пример).

Есть ли в Theano какой-либо способ количественно определить, сколько данных копируется в графический процессор при выполнении скрипта? Моя цель - оценить, в какой степени отсутствие объявления набора данных как общей переменной замедляет работу программы из-за копирования данных из ОЗУ в память графического процессора. (объявление набора данных в качестве общей переменной в скрипте, который я сейчас профилирую, потребует некоторых изменений кода, поэтому я предпочел бы получить оценку, прежде чем погружаться в код).


person Franck Dernoncourt    schedule 22.12.2015    source источник
comment
Так был ли мой ответ ответом на вашу проблему? Вы пробовали это?   -  person Amir    schedule 01.01.2016


Ответы (1)


Насколько мне известно, вы не можете вычислить объем памяти, необходимый для функции или сценария. Предполагая, что вы знаете количество элементов, которые будут храниться на графическом процессоре, вы можете легко вычислить объем памяти, необходимый для хранения этих элементов.

Простой пример:

import numpy as np
import theano.tensor as T
T.config.floatX = 'float32'
dataPoints = np.random.random((5000, 256 * 256)).astype(T.config.floatX)
#float32 data type requires 4 bytes
sizeinGBs = 5000 * 256 * 256 * 4 / 1024. / 1024 / 1024 + (some small over-head constant which we can ignore safely)

Это примерно 1,22 ГБ

ОБНОВЛЕНИЕ

Я нашел ответ на ваш вопрос. Вы можете легко получить объем свободной памяти на графическом процессоре, используя CUDA libray. Ниже приведен код, который может помочь вам вычислить, сколько памяти графического процессора было выделено для задачи до и после выполнения функции.

import theano.sandbox.cuda.basic_ops as sbcuda
import numpy as np
import theano.tensor as T
T.config.floatX = 'float32'
freeGPUMemInGBs = sbcuda.cuda_ndarray.cuda_ndarray.mem_info()[0]/1024./1024/1024
print "Your GPU has %s GBs of free memory" % str(freeGPUMemInGBs)
#An operation is to be executed below
testData = shared(np.random.random((5000, 256 * 256)).astype(T.config.floatX), borrow = True)
print "The tasks above used %s GBs of your GPU memory. The available memory is %s GBs" % (str(freeGPUMemInGBs - sbcuda.cuda_ndarray.cuda_ndarray.mem_info()[0]/1024./1024/1024), str(sbcuda.cuda_ndarray.cuda_ndarray.mem_info()[0]/1024./1024/1024))

Тогда вывод (для моей машины):

>>> Your GPU has 11.2557678223 GBs of free memory
>>> The tasks above used 1.22077941895 GBs of your GPU memory. The available memory is 10.0349884033 GBs
person Amir    schedule 25.12.2015