tensorflow - Tensorflow 服务的批量预测问题

标签 tensorflow kubernetes google-cloud-platform tensorflow-serving google-kubernetes-engine

我们正在尝试使用 Tensorflow Serving 在 Kubernetes 上部署我们的模型。早些时候,我们在 K8S 上部署了我们的模型(SSD + Inception),并使用我们使用 bazel 构建的 自己的 docker 基础镜像。 K8S配置如下: 集群大小 - 2 个节点 每个节点配置 - 20 GB 内存、2 个 GPU、8 个 vCPU

现在我们更改了模型,并使用Retinanet 和 Resnet50。这次我们使用来自 Tensorflow docker hub (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

最佳答案

问题在于您正在对 GPU 进行 OOM。根据您发布的错误消息,您正在尝试分配 150 * 256 * 160 * 160 * 32/1024/1024/1024 = 29.3 GB 的 GPU 内存。 Tesla 卡配备 12/16 GB vRAM,还有一些(可能尚未在任何云中提供,因为它们非常新)配备 32 GB vRAM(如 GV100),但那是一张 Quadro 卡。

所以,你有两个选择。减少批量大小或您尝试分配的巨大张量的任何其他维度。或者在图表中找到特定操作,并使用以下命令强制其在主内存上运行

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

但是,第二种方法只会缓解问题,并且您会在其他部分出现 OOM。另外,通过在 CPU 上运行该操作,即使不计算主内存和 GPU 内存之间的数据来回传输,性能也会大幅下降。

因此,总而言之,您绝对应该考虑减少该张量的维度之一,即批量大小、图像大小之一(或两者)或 channel 数。

您之前使用的模型可能在其卷积层中没有使用这么多输出 channel 。

关于tensorflow - Tensorflow 服务的批量预测问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52512169/

相关文章:

python - 属性错误 : module 'boto' has no attribute 'plugin'

ubuntu - Jenkins 没有通过谷歌云在 Ubuntu 上显示

python - 零维数组无法串联,但我的数组不是零维

python-3.x - Wasserstein GAN 批评者训练歧义

库伯内斯 : Deploy only in one node-pool

kubernetes - 如何从 Kubernetes 的命令行运行一次性容器(如 docker run)?

php - Kubernetes 集群中的 Laravel ENV 变量冲突

python-3.x - 从张量中获取值的随机索引

tensorflow - 两个不同长度的张量之间的交集

google-cloud-storage - Google 云存储文件上传 - 找不到请求的页面。 【404】