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

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

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

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

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

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

С уважением.

1 ответ

Решение

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

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

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";
}
Другие вопросы по тегам