Недетерминированные результаты с использованием графических процессоров с Tensorflow и Tensorflow Serving. .. Зачем? - PullRequest
3 голосов
/ 03 мая 2019

У нас есть модель обнаружения объекта, разработанная в Tensorflow (1.10 и 1.3), которая использует стандартный CNN и некоторые дополнительные слои. Мы размещаем модель в Tensorflow Serving 1.13.0, используя сохраненный формат модели, на графических процессорах Nvidia Tesla V100 с Cuda 10 и CUDNN 7.4.x. (Мы используем изображения контейнеров Google и / или файлы Docker для обслуживания Tensorflow.)

Мы запускаем модульные тесты, чтобы убедиться, что результаты прогноза соответствуют нашим ожиданиям. Все это прекрасно работает на процессоре. Но когда мы запускаем их в приведенной выше конфигурации GPU / CUDA / CUDNN, мы получаем различия в вероятностях прогнозирования в диапазоне от 0,001 до 0,005.

Наши цели - понять:

  • почему это происходит?
  • что мы можем сделать, чтобы предотвратить это?
  • Если есть что-то, что мы можем сделать, чтобы предотвратить это, то влечет ли это какой-то компромисс, такой как производительность?

Мы провели следующие эксперименты:

  1. Несколько запусков одной и той же модели на GPU tenorflow с использованием контрольной точки с размером пакета 1

    • результаты идентичны
  2. Несколько прогонов одной и той же модели на графическом процессоре с использованием контрольной точки с различными пакетными размерами

    • результаты отключены на .001
  3. Несколько запусков одной и той же модели на ЦП с использованием контрольной точки с различными пакетными размерами

    • результаты идентичны
  4. Несколько запусков одной и той же модели на графическом процессоре с тензорным потоком с использованием контрольной точки с размером партии 1

    • результаты идентичны
  5. Сравнение прогонов с контрольной точкой с прогонами с сохраненной моделью на графическом процессоре

    • результаты отключены на .005
  6. Сравнение прогонов с контрольной точкой с прогонами с сохраненной моделью на CPU

    • результаты идентичны
  7. Экспериментировал с изменением размера пакета и установкой TF_CUDNN_USE_AUTOTUNE=0 на графическом процессоре

    • уменьшает максимальную разницу с .001 до .0005
  8. Эксперимент с добавлением intra_op_parallelism_threads=1, inter_op_parallelism_threads=1 не имел никакого значения при использовании с TF_CUDNN_USE_AUTOTUNE=0

    • результаты не отличаются от указанных выше

Вкратце: у нас есть несколько случаев, когда результаты выполнения вывода на GPU отличаются:

  1. Использование контрольной точки в сравнении с сохраненной моделью.
  2. Размер партии = 1 по сравнению с различными размерами партии
  3. Настройка TF_CUDNN_USE_AUTOTUNE=0 уменьшает разницу при использовании разных размеров партии

Это происходит с TF 1.10 И 1.13.1

Опять же, наши цели - понять:

  1. Почему это происходит?
  2. Есть ли что-нибудь, что мы можем сделать, чтобы предотвратить это?
  3. Если есть что-то, что мы можем сделать, чтобы предотвратить это, то влечет ли это какой-то компромисс, такой как производительность?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...