Является ли 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";
}