首页 > 解决方案 > 有没有办法在没有完整的 tensorflow python 库的情况下仅使用 tensorflow.saved_model.load() 进行推理

问题描述

我需要做推理。没有训练,只是简单的推理。

在 python3 中,现在我非常基本的 tensorflow“仅推理”代码正在执行:

import tensorflow as tf  # This is a 600MB library (at version 2.5)
from PIL import Image
import io

model = tf.saved_model.load('models/some-version')
infer = model.signatures['serving_default']
image = Image.open('someFile.jpg')
bytes = io.BytesIO()
image.save(bytes, format='JPEG')
inputs = [bytes.getvalue()]
predictions = infer(inputs=tf.constant(inputs))

这工作正常。但我的问题是:这个 tensorflow python3 库太大了!现在大约600MB。每次发布新的 tensorflow 版本时,它都会变得越来越大!使用 tensorflow 2.3(使用 swig 而不是 pybind),库大约为 300MB。然后它达到了 400、500 和最近的 600MB(2.5 版)!

当我使用 golang 绑定(而不是 python)进行相同的推理调用时,我需要的只是比当前 600MB 文件夹小得多的 libtensorflow.so.2 (275MB) 和 libtensorflow_framework.so.2 (25MB) 文件( /usr/local/lib/python3.9/site-packages/tensorflow)。

所以我真正的问题是:在 python3 中,我可以使用 tensorflow 进行推理而不会产生所有的膨胀吗?

曾经有一个 contrib.predictor 模块,但它在 tensorflow 中直到 1.15,不再适用于 tensorflow V2。并且肯定总是有 tensorflow_lite,但那些不一样。在 golang 中,我可以使用“真正的” TF 绑定而不会有太多的膨胀(我的意思是,它仍然是 275MB+25MB,但这仍然小于 600MB,而且它不会在每个新版本中都保持增长)。

在 python3 中使用 tensorflow 2.5 仅进行推理(无训练)时,是否有人能够检查库大小?

如果python中有任何“contrib”模块可以这样做,我很乐意使用它。

谢谢!

标签: pythonpython-3.xtensorflowinference

解决方案


我最终围绕 C 绑定构建了一个简单的 python 包装器,只有两个简单的函数:第一个使用 TF_LoadSessionFromSavedModel()“加载”模型,第二个使用 TF_SessionRun()“推断”我的输入。结果是更快的启动时间(使用 python 中的 C 绑定“加载”模型只需要 76 毫秒,而使用完整的 tensorflow python 模块加载它需要超过 5 秒,我猜是因为更多正在执行“检查”?很奇怪,但我会接受它,因为它是一种改进)。生成的 docker 映像大小为 300MB,而不是几乎 1 GB。所以这对我有用,现在。我对 tensorflow 项目似乎不太关心磁盘空间感到有点失望。其他一切似乎都很好!


推荐阅读