Является ли режим точности TensorRT с плавающей запятой 16 недетерминированным на Jetson TX2?

Я использую TensorRT режим точности FP16 для оптимизации моей модели глубокого обучения. И я использую эту оптимизированную модель на Jetson TX2. Во время тестирования модели я заметил, что механизм вывода TensorRT недетерминирован. Другими словами, моя оптимизированная модель дает разные значения FPS от 40 до 120 FPS для одних и тех же входных изображений.

Я начал думать, что источником недетерминизма являются операции с плавающей запятой, когда я увидел этот комментарий о CUDA:

«Если в вашем коде используется атомарный алгоритм с плавающей запятой, результаты могут отличаться от запуска к запуску, поскольку операции с плавающей запятой обычно не ассоциативны, а порядок, в котором данные поступают в вычисление (например, сумма), недетерминирован при использовании атомики. "

Влияет ли тип точности, такой как FP16, FP32 и INT8, на детерминизм TensorRT? Или что-нибудь?

Есть ли у вас какие-нибудь мысли?

С наилучшими пожеланиями.


person Klushka    schedule 19.07.2019    source источник


Ответы (1)


Я решил проблему, изменив функцию clock (), которую я использовал для измерения задержек. Функция clock () измеряла задержку времени ЦП, но я хочу измерить задержку в реальном времени. Теперь я использую std :: chrono для измерения задержек. Теперь результаты логического вывода детерминированы по задержке.

Это было неправильно (clock ())

int main ()
{
  clock_t t;
  int f;
  t = clock();
  inferenceEngine(); // Tahmin yapılıyor
  t = clock() - t;
  printf ("It took me %d clicks (%f seconds).\n",t,((float)t)/CLOCKS_PER_SEC);
  return 0;
}

Используйте такие события Cuda Events (CudaEvent)

cudaEvent_t start, stop;
cudaEventCreate(&start);
cudaEventCreate(&stop);

cudaEventRecord(start);
inferenceEngine(); // Do the inference

cudaEventRecord(stop);

cudaEventSynchronize(stop);
float milliseconds = 0;

cudaEventElapsedTime(&milliseconds, start, stop);

Используйте chrono следующим образом: (std :: chrono)

#include <iostream>
#include <chrono>
#include <ctime>
int main()
{
  auto start = std::chrono::system_clock::now();
  inferenceEngine(); // Do the inference
  auto end = std::chrono::system_clock::now();

  std::chrono::duration<double> elapsed_seconds = end-start;
  std::time_t end_time = std::chrono::system_clock::to_time_t(end);

  std::cout << "finished computation at " << std::ctime(&end_time)
            << "elapsed time: " << elapsed_seconds.count() << "s\n";
}
person Klushka    schedule 02.08.2019