【问题标题】:Google Cloud Function: "Error: memory limit exceeded. Function invocation was interrupted." when deploying NLP modelGoogle Cloud Function:“错误:超出内存限制。函数调用被中断。”部署 NLP 模型时
【发布时间】:2019-09-18 00:33:11
【问题描述】:

我正在尝试部署一个已在 Tesorflow 2.0 beta 中训练过的 NLP 模型。我使用model.save('pb_model') 以 .pb 格式保存模型(这给了我 pb_model.pb 和变量文件夹像往常一样)。

我将 pb 文件放在 Google Cloud 存储桶中,总共大约 370Mb。我正在使用 Google Cloud Functions,因为这是目前唯一支持 TF 2.0 的无服务器平台。对于我的 GCP 函数,我选择了当前可用的最高内存分配 2Gb。我使用 HTTP 请求触发我的函数。

我的main.py 代码如下所示:

import sys
import os
import psutil
import shutil
import tensorflow as tf

import googleapiclient.discovery
from google.cloud import storage

model = None

class CustomModel():
    def __init__(self):
        print('Starting CustomModel build...')
        print('1:', psutil.virtual_memory())
        dirName = '/tmp/model_dir/variables/'

        # Create target directory & all intermediate directories if don't exists
        os.makedirs(dirName, exist_ok=True)

        pb_model_dir = 'gs://<cloud_bucket_name>/model_dir'  # storage bucket file path of pb files
        model = tf.saved_model.load(pb_model_dir)
        shutil.rmtree('/tmp/model_dir', ignore_errors=True) # remove tmp files to maintain low memory
        print('loaded model')
        return model

def handler(request):
    global model

    # Model load which only happens during cold starts
    if model is None:
        model = CustomModel()

    model_inputs = <some input text>
    predictions = model(model_inputs)
    print(predictions)

    return predictions

查看日志时,打印语句print('1:', psutil.virtual_memory()) 的输出显示在加载模型之前,我在分配的 2Gb 内存中有 1.9Gb 空闲空间。

当我在 Google Colab 上运行这个确切的代码时,加载的模型占用的最大内存量约为 0.9Gb。因此,原则上,这意味着当我在 GCP Function 中部署模型时,2Gb 对于我的模型来说已经绰绰有余了,但是我不断收到超出内存限制的错误:

错误:超出内存限制。函数调用被中断。

有人知道我为什么会收到这个错误吗?我是否正确构建 GCP 功能?我对 GCP 还是有点陌生​​。顺便说一句,我什至尝试将存储桶中的 pb 模型文件导入到我的 Function /tmp/ 文件夹中,而不是指向存储桶路径(pb_model_dir = 'gs://&lt;cloud_bucket_name&gt;/model_dir'),但这也给了我超出内存限制的错误。 不知道还有什么可以尝试...提前感谢您的帮助!

【问题讨论】:

  • Cloud Function 并不是唯一一个以无服务器方式服务模型的平台。 I wrote an article with Tensorflow1 and Cloud Run。您可以尝试与您的模型等效的东西。我必须在 Tensorflow2 中更新我的模型,并使用 Tensorflow2 发布本文的新版本。但我现在没有时间......告诉我这是否有帮助
  • 感谢您提供链接并建议使用 Cloud Run 无服务器平台。我查看了 Cloud Run,他们也有 2Gb 的最大内存分配。从技术上讲,我的 Tensorflow 2.0 pb 文件应该与 Cloud Function 一起使用,但我一直遇到 memory limit exceeded 错误,我认为 Cloud Run 也会遇到同样的错误,因为它也有 2Gb 内存限制。

标签: python tensorflow google-cloud-platform google-cloud-functions tensorflow2.0


【解决方案1】:

遇到这种情况可能有更多原因。正如我所看到的,您已经意识到,临时文件可能是导致内存泄漏的原因。临时文件也可以从错误或警告中创建。首先,我会检查我的函数日志是否有错误和警告,然后我会尝试修复它们。

正如我所见,您的 Cloud Function 正在与存储桶进行大量交互。这会导致每秒查询次数过多,这可能是 Cloud Function 实例失败的一个可能原因,因为 GCS 错误。之前遇到过这个问题,如您所见here,它通过处理 GCS 错误得到缓解。所以,我建议按照这条路径进行更多调查,去你的函数与存储桶交互的地方,并尝试处理来自存储桶的可能错误。

您可以做的另一件事是调查一下您的函数中使用内存的方式。为此,您可以使用一些不错的工具,例如 Heap CheckerPympler

如果这些不是问题,我会要求您显示一些日志(来自 CF 和存储桶)和对该功能的一些测试,因为乍一看,您的代码对我来说看起来不错。

您也可以考虑使用其他方法来实现您的技术目的。您拥有的here 信息比您拥有的所有选项都多。

【讨论】:

  • 谢谢。这是我的 CF 的日志: > 功能执行开始 > 开始 CustomModel 构建... > 1: svmem(total=2147483648, available=1925939200, percent=10.3, used=119214080, free=1925939200, active=170369024, inactive= 51163136,buffers=0,cached=102330368,shared=4096,slab=0) > 错误:超出内存限制。函数调用被中断。在行 model = tf.saved_model.load(pb_model_dir) 引发超出内存限制错误。我的 CF 应该只在调用开始时加载模型一次。加载模型时如何使用 Heap Checker 或 Pymler?
  • 对于 Pymler,在我的答案的链接中有一个使用示例。你可以通过这行代码查看模型的内存:asizeof.asized(model, detail=1).format()。也可以在本地测试。
猜你喜欢
  • 2019-01-08
  • 1970-01-01
  • 2019-07-07
  • 1970-01-01
  • 2020-03-01
  • 2019-04-16
  • 2021-10-17
  • 1970-01-01
  • 2020-05-23
相关资源
最近更新 更多