我们正在尝试使用Tensorflow服务在Kubernetes上部署我们的模型。早些时候,我们在K8S上部署了我们的模型( bazel固态硬盘+初始),并使用我们使用bazel构建的自己的基映像。K8S配置如下:群集大小-每个节点2个节点配置- 20 GB内存,2个GPU,8vCPU
现在我们已经改变了我们的模型,并将Retinanet与Resnet50一起使用。这一次,我们使用的是具有相同K8S配置的Tensorflow的docker hub (tensorflow/serving:latest-devel-gpu)的基础镜像。
现在的问题是,早些时候我们能够预测每批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在这里指的是哪个内存?
提亚
发布于 2018-09-27 18:30:52
问题是你正在OOMing图形处理器。根据您发布的错误消息,您正在尝试分配GPU内存的150 * 256 * 160 * 160 * 32 / 1024 / 1024 / 1024 = 29.3 GB
。特斯拉显卡带有12/16 GB的vRAM和一些(可能还没有在任何云中提供,因为它们是非常新的) 32位的GV100,但这是一个Quadro卡。
因此,您有两个选择。要么减小批量大小,要么减少您尝试分配的巨大张量的任何其他维度。或者在您的图形中找到特定的操作,并强制它在主内存上运行
with tf.device('cpu:0'):
# operation goes here
然而,第二种方法只会缓解这个问题,而且你会在其他部分中OOM。此外,通过在CPU上运行该操作,即使不计算主内存和GPU内存之间来回传输的数据,您的性能也会大幅下降。
因此,总而言之,您肯定应该考虑减少该张量的一个维度,即批量大小、图像大小之一(或两者)或通道数量。
您之前使用的模型在其卷积层中可能没有使用太多的输出通道。
发布于 2018-09-27 06:46:01
这与Kubernetes消耗多少RAM无关。
这是关于您告诉Kubernetes您的容器将利用多少RAM,而不是它实际利用了多少。
https://stackoverflow.com/questions/52512169
复制相似问题