Заставьте TensorFlow использовать данные обучения, сгенерированные на лету с помощью пользовательской процедуры CUDA - PullRequest
11 голосов
/ 26 июня 2019

Предположим, что мы генерируем наши собственные обучающие данные (путем выборки из некоторого процесса распространения и вычисления, например, некоторого количества интересующего его количества) и что у нас есть собственная подпрограмма CUDA под названием generate_data, которая генерирует метки в памяти GPU для данного набора входных данных.

Следовательно, мы находимся в особой настройке, где мы можем генерировать столько пакетов обучающих данных, сколько мы хотим, в режиме «онлайн» (на каждой итерации пакета мы вызываем подпрограмму generate_data для генерации нового пакета иотменить старую партию).

Поскольку данные генерируются на графическом процессоре, есть ли способ заставить TensorFlow (Python API) напрямую использовать его во время процесса обучения?(например, для заполнения заполнителя). Таким образом, такой конвейер будет эффективен.

Насколько я понимаю, в настоящее время вам потребуется такая настройка для копирования ваших данных из GPU в CPU, а затем для копирования TensorFlowэто снова из CPU в GPU, что довольно расточительно при выполнении ненужных копий.

РЕДАКТИРОВАТЬ: если это помогает, мы можем предположить, что подпрограмма CUDA реализована с использованием компилятора CUDA JIT Numba.

1 Ответ

2 голосов
/ 10 июля 2019

Это определенно не полный ответ, но, надеюсь, может помочь.

  • Вы можете интегрировать свою подпрограмму CUDA в TensorFlow, написав пользовательскую операцию . В настоящее время в TensorFlow нет другого способа взаимодействия с другими подпрограммами CUDA.

  • Что касается написания обучающего цикла полностью на GPU, мы можем написать подпрограмму на GPU, используя tf.while_loop, очень похоже на этот SO вопрос :

    i = tf.Variable(0, name='loop_i')
    
    def cond(i):
        return i < n
    
    def body(i):
        # Building the graph for custom routine and our model
        x, ground_truth = CustomCUDARountine(random_seed, ...)
        predictions = MyModel(x, ...)
    
        # Defining the optimizer
        loss = loss_func(ground_truth, predictions)
        optim = tf.train.GradientDescentOptimizer().minimize(loss)
    
        # loop body
        return tf.tuple([tf.add(i, 1)], control_inputs=[optim])
    
    loop = tf.while_loop(cond, body, [i])
    
    # Run the loop
    tf.get_default_session().run(loop)
    
...