Проблема с пакетным прогнозированием при обслуживании Tensorflow - PullRequest
0 голосов
/ 26 сентября 2018

Мы пытаемся развернуть нашу модель в Kubernetes, используя Tensorflow Serving.Ранее мы развернули нашу модель ( SSD + Inception ) на K8S с нашим собственным базовым образом для докера, который мы создали с помощью Bazel.Конфигурация K8S была такой: Размер кластера - 2 узла на узел. Конфигурация - 20 ГБ памяти, 2 графических процессора, 8vCPU

. Теперь мы изменили нашу модель и используем Retinanet с Resnet50 .На этот раз мы используем базовый образ для докера из докерского хаба Tensorflow ( тензор потока / обслуживание: latest-devel-gpu ) с той же конфигурацией K8S.

Теперь проблема возникла раньше, когда мы былимы смогли получить прогноз для 500 изображений в пакете, и мы смогли отправить эти 500 изображений в пакете, используя несколько рабочих (неограниченно), но теперь в новом развертывании мы не можем отправить более 100 изображений в пакете.Мы получаем ошибку OOM следующим образом:

{'error': 'OOM when allocating tensor with shape[150,256,160,160] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc\n\t [[Node: FeatureExtractor/resnet_v1_50/resnet_v1_50/block1/unit_1/bottleneck_v1/conv3/Conv2D = Conv2D[T=DT_FLOAT, data_format="NCHW", dilations=[1, 1, 1, 1], padding="SAME", strides=[1, 1, 1, 1], use_cudnn_on_gpu=true, _device="/job:localhost/replica:0/task:0/device:GPU:0"](FeatureExtractor/resnet_v1_50/resnet_v1_50/block1/unit_1/bottleneck_v1/conv2/Relu6, FeatureExtractor/resnet_v1_50/block1/unit_1/bottleneck_v1/conv3/weights)]]\nHint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info

Мы также проверили использование памяти K8S, и она не была полностью использована (максимум 30%).Может кто-нибудь сказать нам, почему мы получаем эту ошибку «Недостаточно памяти» и какую память ссылается на Tensorflow?

TIA

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Проблема в том, что вы используете OU GPU.Исходя из сообщения об ошибке, вы пытаетесь выделить 150 * 256 * 160 * 160 * 32 / 1024 / 1024 / 1024 = 29.3 GB памяти GPU.Карты Tesla поставляются с 12/16 ГБ vRAM, а некоторые (вероятно, еще не доступны ни в одном облаке, поскольку они очень новые) с 32-мя, как GV100, но это карта Quadro.

Итак, у вас есть дваопции.Либо уменьшите размер пакета, либо любое другое измерение того огромного тензора, который вы пытаетесь выделить.Или найдите конкретную операцию в своем графике и заставьте ее запускаться в основной памяти с помощью

with tf.device('cpu:0'):
    # operation goes here

. Однако этот второй метод просто облегчит проблему, и вы получите OOM в какой-то другой части.Кроме того, запустив операцию на процессоре, вы получите значительное снижение производительности, даже не считая передачи данных между основной памятью и памятью графического процессора.

Итак, подведя итог, вы определенно должны рассмотреть возможность уменьшенияодно из измерений этого тензора, размер пакета, один из размеров изображения (или оба) или количество каналов.

Модель, которую вы использовали ранее, вероятно, не использовала так много выходных каналов в своемсверточные слои.

0 голосов
/ 27 сентября 2018

Речь идет не о том, сколько оперативной памяти Kubernetes потребляет.
Речь идет о том, сколько оперативной памяти вы сказали Kubernetes, что ваш контейнер будет использовать, по сравнению с тем, сколько он фактически использует.

...