我们正在尝试使用Tensorflow Serving在Kubernetes上部署我们的模型。早些时候,我们将我们的模型( SSD + Inception )部署在K8S上,并为我们使用bazel构建的Docker提供了自己的基础映像。 K8S的配置如下: 群集大小-2个节点 每节点配置-20 GB内存,2个GPU,8vCPU
现在,我们已经更改了模型,并使用了 Retinanet和Resnet50 。这次,我们使用Tensorflow的Docker中心( tensorflow / serving:latest-devel-gpu )中的Docker基本映像,并使用相同的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
答案 0 :(得分:2)
问题是您正在对GPU进行OOM。根据您发布的错误消息,您正在尝试分配150 * 256 * 160 * 160 * 32 / 1024 / 1024 / 1024 = 29.3 GB
的GPU内存。 Tesla卡带有12/16 GB的vRAM,有些(可能是尚未在任何云中使用,因为它们是很新的)带有32个像GV100,但这是Quadro卡。
因此,您有两个选择。减小您要分配的那个张量的批量大小或任何其他尺寸。或在图形中找到特定操作,并使用
强制其在主内存上运行with tf.device('cpu:0'):
# operation goes here
但是,第二种方法只会减轻问题,您将在其他部分进行OOM。另外,通过在CPU上运行操作,即使不计算主内存和GPU内存之间的来回数据传输,您的性能也会大大降低。
因此,总而言之,您绝对应该考虑减小该张量的尺寸之一,即批大小,图像尺寸之一(或两者)或通道数。
您之前使用的模型可能在其卷积层中没有使用太多的输出通道。
答案 1 :(得分:0)
这与Kubernetes消耗的RAM无关。
这是关于您告诉Kubernetes容器将使用的内存量与实际使用的内存量有关。