У нас есть модель обнаружения объекта, разработанная в 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.
Наши цели - понять:
- почему это происходит?
- что мы можем сделать, чтобы предотвратить это?
- Если есть что-то, что мы можем сделать, чтобы предотвратить это, то влечет ли это какой-то компромисс, такой как производительность?
Мы провели следующие эксперименты:
Несколько запусков одной и той же модели на GPU tenorflow с использованием контрольной точки с размером пакета 1
Несколько прогонов одной и той же модели на графическом процессоре с использованием контрольной точки с различными пакетными размерами
- результаты отключены на .001
Несколько запусков одной и той же модели на ЦП с использованием контрольной точки с различными пакетными размерами
Несколько запусков одной и той же модели на графическом процессоре с тензорным потоком с использованием контрольной точки с размером партии 1
Сравнение прогонов с контрольной точкой с прогонами с сохраненной моделью на графическом процессоре
- результаты отключены на .005
Сравнение прогонов с контрольной точкой с прогонами с сохраненной моделью на CPU
Экспериментировал с изменением размера пакета и установкой TF_CUDNN_USE_AUTOTUNE=0
на графическом процессоре
- уменьшает максимальную разницу с .001 до .0005
Эксперимент с добавлением intra_op_parallelism_threads=1
, inter_op_parallelism_threads=1
не имел никакого значения при использовании с TF_CUDNN_USE_AUTOTUNE=0
- результаты не отличаются от указанных выше
Вкратце: у нас есть несколько случаев, когда результаты выполнения вывода на GPU отличаются:
- Использование контрольной точки в сравнении с сохраненной моделью.
- Размер партии = 1 по сравнению с различными размерами партии
- Настройка
TF_CUDNN_USE_AUTOTUNE=0
уменьшает разницу при использовании разных размеров партии
Это происходит с TF 1.10 И 1.13.1
Опять же, наши цели - понять:
- Почему это происходит?
- Есть ли что-нибудь, что мы можем сделать, чтобы предотвратить это?
- Если есть что-то, что мы можем сделать, чтобы предотвратить это, то влечет ли это какой-то компромисс, такой как производительность?