Простой пример API пользовательского слоя (TensorRT 2.1)?

Я использую TensorRT 2.1 и хочу реализовать простой пользовательский слой. (Цель состоит в том, чтобы запустить Single Shot Detector с помощью TensorRT в системе встраивания.)

Для практики я хотел создать слой Inc (просто добавив 1.0 к входным значениям тензора и сохранив размерность прежней).

Я реализую класс Inc, следуя примеру class Reshape : public Iplugin в sampleFasterRNN.cpp. Я оставил все почти таким же, кроме getOutputDimensions(), чтобы сохранить тот же размер. (это кажется прекрасным.)

Где я должен реализовать часть "добавление 1.0"? Думаю, это должно быть в "enqueue()". Итак, я попытался

int enqueue(int batchSize, const void*const *inputs, void** outputs, void*, cudaStream_t stream) override
{
  # the below is from the Reshape class. seems to copy from input to output
  CHECK(cudaMemcpyAsync(outputs[0], inputs[0], mCopySize * batchSize, cudaMemcpyDeviceToDevice, stream));
  # add 1.0 to first ten values
  float* foutputs = (float*) outputs[0];
  int i; for (i = 0; i < 10; i++) foutputs[i] += 1.0;   
  return 0;
}

Однако эта часть приводит к ошибке «ошибка сегментации».

Мои вопросы:

  1. Где и как я могу реализовать некоторый расчет между вводом и выводом?
  2. Кто-нибудь может привести простой пример?

person YW P Kwon    schedule 10.08.2017    source источник


Ответы (1)


Обратитесь к файлу samples/samplePlugin/samplePlugin.cpp и посмотрите на класс FCPlugin. Ваши фактические вычисления должны войти в метод enqueue. Возможно, вам придется написать ядро ​​CUDA, которое выполняет приращение.

person Ashwin Nanjappa    schedule 24.08.2017